From 80ef3946d016eeeef1682e73eddffb222d8db149 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 18 Feb 2010 06:36:32 -0500 Subject: more work on salmon --- plugins/OStatus/actions/salmon.php | 140 +++++++++++++++++++++++++++++++++++-- 1 file changed, 133 insertions(+), 7 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php index c79d09c95..9ca019826 100644 --- a/plugins/OStatus/actions/salmon.php +++ b/plugins/OStatus/actions/salmon.php @@ -62,20 +62,146 @@ class SalmonAction extends Action // XXX: check the signature $this->act = new Activity($dom->documentElement); + + return true; } function handle($args) { - common_log(LOG_DEBUG, 'Salmon: incoming post for user: '. $user_id); + common_log(LOG_INFO, 'Salmon: incoming post for user '. $this->user->id); // TODO : Insert new $xml -> notice code - switch ($this->act->verb) - { - case Activity::POST: - case Activity::SHARE: - case Activity::FAVORITE: - case Activity::FOLLOW: + if (Event::handle('StartHandleSalmon', array($this->user, $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::FOLLOW: + case ActivityVerb::FRIEND: + $this->handleFollow(); + break; + } + Event::handle('EndHandleSalmon', array($this->user, $this->activity)); + } + } + + 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 Exception("Can't handle that kind of post."); + } + + $profile = $this->ensureProfile(); + } + + function handleFollow() + { + } + + function handleFavorite() + { + } + + function handleShare() + { + } + + function ensureProfile() + { + $actor = $this->act->actor; + + if (empty($actor->id)) { + throw new Exception("Received a salmon slap from unidentified actor."); + } + + $ostatusProfile = Ostatus_profile::staticGet('homeuri', $actor->id); + + if (empty($ostatusProfile)) { + return $this->createProfile(); + } else { + // XXX: can we receive a salmon slap from a group...? + assert(!empty($ostatusProfile->profile_id)); + return Profile::staticGet($ostatusProfile->profile_id); + } + } + + function createProfile() + { + $actor = $this->act->actor; + + $profile = new Profile(); + + $profile->nickname = $this->nicknameFromURI($actor->id); + + if (empty($profile->nickname)) { + $profile->nickname = common_nicknamize($actor->title); + } + + $profile->fullname = $actor->title; + $profile->bio = $actor->summary; // XXX: is that right? + $profile->profileurl = $actor->link; // XXX: is that right? + $profile->created = common_sql_now(); + + $id = $profile->insert(); + + if (empty($id)) { + common_log_db_error($profile, 'INSERT', __FILE__); + throw new Exception("Couldn't save new profile for $actor->id\n"); + } + + // XXX: add avatars + + $op = new Ostatus_profile(); + + $op->profile_id = $id; + $op->homeuri = $actor->id; + $op->created = $profile->created; + + // XXX: determine feed URI from source or Webfinger or whatever + + $id = $op->insert(); + + if (empty($id)) { + common_log_db_error($op, 'INSERT', __FILE__); + throw new Exception("Couldn't save new ostatus profile for $actor->id\n"); + } + + return $profile; + } + + 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; } } } -- cgit v1.2.3-54-g00ecf From 22ff358ba8d1fd0396136e1de570d788dd0727b6 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 18 Feb 2010 18:20:48 +0000 Subject: OStatus sub/unsub updates: - fix for PuSH unsub verification - send Salmon notification on unsub --- lib/atom10entry.php | 5 +-- lib/atom10feed.php | 11 +++++- lib/atomnoticefeed.php | 8 ++-- plugins/OStatus/OStatusPlugin.php | 55 ++++++++++++++++++++++++--- plugins/OStatus/actions/pushcallback.php | 2 +- plugins/OStatus/actions/pushhub.php | 9 +++-- plugins/OStatus/actions/salmon.php | 2 + plugins/OStatus/classes/HubSub.php | 11 ++---- plugins/OStatus/classes/Ostatus_profile.php | 44 +++++++++++---------- plugins/OStatus/lib/activity.php | 6 +++ plugins/OStatus/lib/hubverifyqueuehandler.php | 3 +- 11 files changed, 108 insertions(+), 48 deletions(-) (limited to 'plugins/OStatus') diff --git a/lib/atom10entry.php b/lib/atom10entry.php index 5710c80fc..f8f16d594 100644 --- a/lib/atom10entry.php +++ b/lib/atom10entry.php @@ -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() { } diff --git a/lib/atom10feed.php b/lib/atom10feed.php index 14a3beb83..5e17b20d3 100644 --- a/lib/atom10feed.php +++ b/lib/atom10feed.php @@ -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'); } /** @@ -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); diff --git a/lib/atomnoticefeed.php b/lib/atomnoticefeed.php index b7a60bde6..7653f9154 100644 --- a/lib/atomnoticefeed.php +++ b/lib/atomnoticefeed.php @@ -50,23 +50,23 @@ 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/' ); // XXX: What should the uri be? $this->addNamespace( - 'xmlns:ostatus', + 'ostatus', 'http://ostatus.org/schema/1.0' ); } diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index b6c9fa1d4..e548a151c 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -112,7 +112,7 @@ 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; @@ -171,6 +171,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') { @@ -253,18 +259,45 @@ class OStatusPlugin extends Plugin } /** - * Garbage collect unused feeds on unsubscribe + * Notify remote server when one of our users subscribes. + * @fixme Check and restart the PuSH subscription if needed + * + * @param User $user + * @param Profile $other + * @return hook return value + */ + function onEndSubscribe($user, $other) + { + $oprofile = Ostatus_profile::staticGet('profile_id', $other->id); + if ($oprofile) { + // Notify the remote server of the unsub, if supported. + $oprofile->notify($user->getProfile(), ActivityVerb::FOLLOW, $oprofile); + } + 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($user, $other) { - $profile = Ostatus_profile::staticGet('profile_id', $other->id); - if ($feed) { + $oprofile = Ostatus_profile::staticGet('profile_id', $other->id); + if ($oprofile) { + // Notify the remote server of the unsub, if supported. + $oprofile->notify($user->getProfile(), ActivityVerb::UNFOLLOW, $oprofile); + + // Drop the PuSH subscription if there are no other subscribers. $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(); + common_log(LOG_INFO, "Unsubscribing from now-unused feed $oprofile->feeduri on hub $oprofile->huburi"); + $oprofile->unsubscribe(); } } return true; @@ -290,6 +323,16 @@ class OStatusPlugin extends Plugin return true; } + /** + * Override the "from ostatus" bit in notice lists to link to the + * original post and show the domain it came from. + * + * @param Notice in $notice + * @param string out &$name + * @param string out &$url + * @param string out &$title + * @return mixed hook return code + */ function onStartNoticeSourceLink($notice, &$name, &$url, &$title) { if ($notice->source == 'ostatus') { diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index 388c8f9c3..ed859a32f 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -89,7 +89,7 @@ class PushCallbackAction extends Action 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); + throw new ServerException("Bogus hub callback: bad token", 404); } if ($mode != $profile->sub_state) { diff --git a/plugins/OStatus/actions/pushhub.php b/plugins/OStatus/actions/pushhub.php index 13ec09d52..19599d815 100644 --- a/plugins/OStatus/actions/pushhub.php +++ b/plugins/OStatus/actions/pushhub.php @@ -83,6 +83,7 @@ class PushHubAction extends Action { $feed = $this->argUrl('hub.topic'); $callback = $this->argUrl('hub.callback'); + $token = $this->arg('hub.verify_token', null); common_log(LOG_DEBUG, __METHOD__ . ": checking sub'd to $feed $callback"); if ($this->getSub($feed, $callback)) { @@ -96,7 +97,6 @@ class PushHubAction extends Action $sub = new HubSub(); $sub->topic = $feed; $sub->callback = $callback; - $sub->verify_token = $this->arg('hub.verify_token', null); $sub->secret = $this->arg('hub.secret', null); if (strlen($sub->secret) > 200) { throw new ClientException("hub.secret must be no longer than 200 chars", 400); @@ -115,7 +115,7 @@ class PushHubAction extends Action // @fixme check errors ;) - $data = array('sub' => $sub, 'mode' => 'subscribe'); + $data = array('sub' => $sub, 'mode' => 'subscribe', 'token' => $token); $qm = QueueManager::get(); $qm->enqueue($data, 'hubverify'); @@ -130,6 +130,8 @@ class PushHubAction extends Action * 202 Accepted - request saved and awaiting verification * 204 No Content - already subscribed * 400 Bad Request - invalid params or rejected feed + * + * @fixme background this */ function unsubscribe() { @@ -138,7 +140,8 @@ class PushHubAction extends Action $sub = $this->getSub($feed, $callback); if ($sub) { - if ($sub->verify('unsubscribe')) { + $token = $this->arg('hub.verify_token', null); + if ($sub->verify('unsubscribe', $token)) { $sub->delete(); common_log(LOG_INFO, "PuSH unsubscribed $feed for $callback"); } else { diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php index 9ca019826..224134cd7 100644 --- a/plugins/OStatus/actions/salmon.php +++ b/plugins/OStatus/actions/salmon.php @@ -34,6 +34,8 @@ class SalmonAction extends Action function prepare($args) { + parent::prepare($args); + if ($_SERVER['REQUEST_METHOD'] != 'POST') { $this->clientError(_('This method requires a POST.')); } diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index 7071ee5b4..0cd4281f8 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -30,7 +30,6 @@ class HubSub extends Memcached_DataObject public $topic; public $callback; public $secret; - public $verify_token; public $challenge; public $lease; public $sub_start; @@ -62,7 +61,6 @@ 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, @@ -84,8 +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', @@ -154,8 +150,9 @@ class HubSub extends Memcached_DataObject /** * Send a verification ping to subscriber * @param string $mode 'subscribe' or 'unsubscribe' + * @param string $token hub.verify_token value, if provided by client */ - function verify($mode) + function verify($mode, $token=null) { assert($mode == 'subscribe' || $mode == 'unsubscribe'); @@ -172,8 +169,8 @@ class HubSub extends Memcached_DataObject 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 diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index be01cdfe1..486417617 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -484,7 +484,7 @@ class Ostatus_profile extends Memcached_DataObject } else { $this->sub_end = null; } - $this->lastupdate = common_sql_date(); + $this->lastupdate = common_sql_now(); return $this->update($original); } @@ -497,12 +497,13 @@ class Ostatus_profile extends Memcached_DataObject { $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(); + // @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->lastupdate = common_sql_now(); return $this->update($original); } @@ -527,24 +528,25 @@ class Ostatus_profile extends Memcached_DataObject ':' . $actor->id . ':' . time(); // @fixme - $entry = new Atom10Entry(); + //$entry = new Atom10Entry(); + $entry = new XMLStringer(); $entry->elementStart('entry'); $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(time())); $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->initFeed(); $feed->addEntry($entry); - $feed->renderEntries(); - $feed->endFeed(); + #$feed->renderEntries(); + #$feed->endFeed(); $xml = $feed->getString(); common_log(LOG_INFO, "Posting to Salmon endpoint $salmon: $xml"); @@ -568,7 +570,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'); @@ -579,14 +581,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')); diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index f137946ab..3ed613dc7 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -303,6 +303,12 @@ class ActivityVerb 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'; } /** diff --git a/plugins/OStatus/lib/hubverifyqueuehandler.php b/plugins/OStatus/lib/hubverifyqueuehandler.php index 125d13a77..7ce9e1431 100644 --- a/plugins/OStatus/lib/hubverifyqueuehandler.php +++ b/plugins/OStatus/lib/hubverifyqueuehandler.php @@ -33,13 +33,14 @@ class HubVerifyQueueHandler extends QueueHandler { $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); + $sub->verify($mode, $token); } catch (Exception $e) { common_log(LOG_ERR, "Failed PuSH $mode verify to $sub->callback for $sub->topic: " . $e->getMessage()); -- cgit v1.2.3-54-g00ecf From 0dac13d197248bf24ea51cb7911d32286764c0c8 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 18 Feb 2010 21:22:21 +0000 Subject: OStatus refactoring to clean up profile vs feed and fix up subscription issues. PuSH subscription maintenance broken back out to FeedSub, letting Ostatus_profile deal with the profile level (user or group, with unique id URI) --- plugins/OStatus/OStatusPlugin.php | 53 +-- plugins/OStatus/actions/feedsubsettings.php | 99 ++--- plugins/OStatus/actions/pushcallback.php | 22 +- plugins/OStatus/actions/salmon.php | 32 +- plugins/OStatus/classes/FeedSub.php | 443 ++++++++++++++++++++++ plugins/OStatus/classes/Ostatus_profile.php | 544 +++++++++------------------- plugins/OStatus/lib/feeddiscovery.php | 50 ++- plugins/OStatus/lib/feedmunger.php | 350 ------------------ 8 files changed, 741 insertions(+), 852 deletions(-) create mode 100644 plugins/OStatus/classes/FeedSub.php delete mode 100644 plugins/OStatus/lib/feedmunger.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index e548a151c..4ebe4551e 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -1,17 +1,7 @@ -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,17 +18,12 @@ Author URI: http://status.net/ */ /** - * @package FeedSubPlugin + * @package OStatusPlugin * @maintainer Brion Vibber */ 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'); - class FeedSubException extends Exception { } @@ -258,24 +243,6 @@ class OStatusPlugin extends Plugin } } - /** - * Notify remote server when one of our users subscribes. - * @fixme Check and restart the PuSH subscription if needed - * - * @param User $user - * @param Profile $other - * @return hook return value - */ - function onEndSubscribe($user, $other) - { - $oprofile = Ostatus_profile::staticGet('profile_id', $other->id); - if ($oprofile) { - // Notify the remote server of the unsub, if supported. - $oprofile->notify($user->getProfile(), ActivityVerb::FOLLOW, $oprofile); - } - return true; - } - /** * Notify remote server and garbage collect unused feeds on unsubscribe. * @fixme send these operations to background queues @@ -309,6 +276,7 @@ class OStatusPlugin extends Plugin function onCheckSchema() { $schema = Schema::get(); $schema->ensureTable('ostatus_profile', Ostatus_profile::schemaDef()); + $schema->ensureTable('feedsub', FeedSub::schemaDef()); $schema->ensureTable('hubsub', HubSub::schemaDef()); return true; } @@ -345,4 +313,19 @@ class OStatusPlugin extends Plugin 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); + } + } } diff --git a/plugins/OStatus/actions/feedsubsettings.php b/plugins/OStatus/actions/feedsubsettings.php index 6933c9bf2..3e1d0aa82 100644 --- a/plugins/OStatus/actions/feedsubsettings.php +++ b/plugins/OStatus/actions/feedsubsettings.php @@ -26,7 +26,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } class FeedSubSettingsAction extends ConnectSettingsAction { - protected $feedurl; + protected $profile_uri; protected $preview; protected $munger; @@ -88,7 +88,10 @@ class FeedSubSettingsAction extends ConnectSettingsAction $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->input('profile_uri', + _m('Feed URL'), + $this->profile_uri, + _m('Enter the profile URL of a PubSubHubbub-enabled feed')); $this->elementEnd('li'); $this->elementEnd('ul'); @@ -145,79 +148,55 @@ class FeedSubSettingsAction extends ConnectSettingsAction */ function validateFeed() { - $feedurl = trim($this->arg('feedurl')); + $profile_uri = trim($this->arg('profile_uri')); - if ($feedurl == '') { - $this->showForm(_m('Empty feed URL!')); + if ($profile_uri == '') { + $this->showForm(_m('Empty remote profile URL!')); return; } - $this->feedurl = $feedurl; + $this->profile_uri = $profile_uri; - // Get the canonical feed URI and check it + // @fixme validate, normalize bla bla try { - $discover = new FeedDiscovery(); - $uri = $discover->discoverFromURL($feedurl); + $oprofile = Ostatus_profile::ensureProfile($this->profile_uri); + $this->oprofile = $oprofile; + return true; } catch (FeedSubBadURLException $e) { - $this->showForm(_m('Invalid URL or could not reach server.')); - return false; + $err = _m('Invalid URL or could not reach server.'); } catch (FeedSubBadResponseException $e) { - $this->showForm(_m('Cannot read feed; server returned error.')); - return false; + $err = _m('Cannot read feed; server returned error.'); } catch (FeedSubEmptyException $e) { - $this->showForm(_m('Cannot read feed; server returned an empty page.')); - return false; + $err = _m('Cannot read feed; server returned an empty page.'); } catch (FeedSubBadHTMLException $e) { - $this->showForm(_m('Bad HTML, could not find feed link.')); - return false; + $err = _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; + $err = _m('Could not find a feed linked from this URL.'); } catch (FeedSubUnrecognizedTypeException $e) { - $this->showForm(_m('Not a recognized feed type.')); - return false; + $err = _m('Not a recognized feed type.'); } catch (FeedSubException $e) { // Any new ones we forgot about - $this->showForm(_m('Bad feed URL.')); - return false; + $err = 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 == '' && !common_config('feedsub', 'nohub')) { - $this->showForm(_m('Feed is not PuSH-enabled; cannot subscribe.')); - return false; - } - - return true; + $this->showForm($err); + return false; } 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 (!$this->oprofile->subscribe()) { + $this->showForm(_m("Failed to set up server-to-server subscription.")); + return; + } + + if ($this->oprofile->isGroup()) { + $group = $this->oprofile->localGroup(); if ($user->isMember($group)) { $this->showForm(_m('Already a member!')); } elseif (Group_member::join($this->profile->group_id, $user->id)) { @@ -226,13 +205,13 @@ class FeedSubSettingsAction extends ConnectSettingsAction $this->showForm(_m('Remote group join failed!')); } } else { - $local = $this->profile->localProfile(); + $local = $this->oprofile->localProfile(); if ($user->isSubscribed($local)) { $this->showForm(_m('Already subscribed!')); - } elseif ($user->subscribeTo($local)) { - $this->showForm(_m('Feed subscribed!')); + } elseif ($this->oprofile->subscribeLocalToRemote($user)) { + $this->showForm(_m('Remote user subscribed!')); } else { - $this->showForm(_m('Feed subscription failed!')); + $this->showForm(_m('Remote subscription failed!')); } } } @@ -248,17 +227,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction 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.'); - } + $this->text('Profile preview should go here'); } function showScripts() diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index ed859a32f..7e1227a66 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -48,9 +48,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 = ''; @@ -62,7 +62,7 @@ class PushCallbackAction extends Action // @fixme Queue this to a background process; we should return // as quickly as possible from a distribution POST. - $profile->postUpdates($post, $hmac); + $feedsub->receive($post, $hmac); } /** @@ -81,29 +81,29 @@ class PushCallbackAction extends Action throw new ServerException("Bogus hub callback: bad mode", 404); } - $profile = Ostatus_profile::staticGet('feeduri', $topic); - if (!$profile) { + $feedsub = FeedSub::staticGet('uri', $topic); + if (!$feedsub) { common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback for unknown feed $topic"); throw new ServerException("Bogus hub callback: unknown feed", 404); } - if ($profile->verify_token !== $verify_token) { + if ($feedsub->verify_token !== $verify_token) { common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad token \"$verify_token\" for feed $topic"); throw new ServerException("Bogus hub callback: bad token", 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}\""); + if ($mode != $feedsub->sub_state) { + common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad mode \"$mode\" for feed $topic in state \"{$feedsub->sub_state}\""); throw new ServerException("Bogus hub callback: mode doesn't match subscription state.", 404); } // OK! if ($mode == 'subscribe') { common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); - $profile->confirmSubscribe($lease_seconds); + $feedsub->confirmSubscribe($lease_seconds); } else { common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic"); - $profile->confirmUnsubscribe(); + $feedsub->confirmUnsubscribe(); } print $challenge; } diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php index 224134cd7..ea5b8e4ea 100644 --- a/plugins/OStatus/actions/salmon.php +++ b/plugins/OStatus/actions/salmon.php @@ -68,6 +68,9 @@ class SalmonAction extends Action return true; } + /** + * @fixme probably call Ostatus_profile::processFeed + */ function handle($args) { common_log(LOG_INFO, 'Salmon: incoming post for user '. $this->user->id); @@ -95,6 +98,9 @@ class SalmonAction extends Action } } + /** + * @fixme probably call Ostatus_profile::processFeed + */ function handlePost() { switch ($this->act->object->type) { @@ -111,14 +117,23 @@ class SalmonAction extends Action $profile = $this->ensureProfile(); } + /** + * @fixme probably call Ostatus_profile::processFeed + */ function handleFollow() { } + /** + * @fixme probably call Ostatus_profile::processFeed + */ function handleFavorite() { } + /** + * @fixme probably call Ostatus_profile::processFeed + */ function handleShare() { } @@ -131,17 +146,13 @@ class SalmonAction extends Action throw new Exception("Received a salmon slap from unidentified actor."); } - $ostatusProfile = Ostatus_profile::staticGet('homeuri', $actor->id); - - if (empty($ostatusProfile)) { - return $this->createProfile(); - } else { - // XXX: can we receive a salmon slap from a group...? - assert(!empty($ostatusProfile->profile_id)); - return Profile::staticGet($ostatusProfile->profile_id); - } + $ostatusProfile = Ostatus_profile::ensureActorProfile($this->act); + return $oprofile->localProfile(); } + /** + * @fixme anything new in here probably should be merged into Ostatus_profile::ensureActorProfile and friends + */ function createProfile() { $actor = $this->act->actor; @@ -186,6 +197,9 @@ class SalmonAction extends Action return $profile; } + /** + * @fixme should be merged into Ostatus_profile + */ function nicknameFromURI($uri) { preg_match('/(\w+):/', $uri, $matches); diff --git a/plugins/OStatus/classes/FeedSub.php b/plugins/OStatus/classes/FeedSub.php new file mode 100644 index 000000000..dc2c0b710 --- /dev/null +++ b/plugins/OStatus/classes/FeedSub.php @@ -0,0 +1,443 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer Brion Vibber + */ + +/* +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 + 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() + { + 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' => 'async', + 'hub.verify_token' => $this->verify_token, + 'hub.secret' => $this->secret, + //'hub.lease_seconds' => 0, + '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 = null; + $this->sub_state = null; + $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->lastupdate = 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->lastupdate = 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. + * + * @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; + } + + 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; + } + +} diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 486417617..1ce8ac491 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -18,62 +18,24 @@ */ /** - * @package FeedSubPlugin + * @package OStatusPlugin * @maintainer Brion Vibber */ -/* -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 $created; - public $lastupdate; + public $modified; public /*static*/ function staticGet($k, $v=null) { @@ -91,56 +53,30 @@ 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, 'salmonuri' => 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), new ColumnDef('salmonuri', 'text', null, true), new ColumnDef('created', 'datetime', null, false), - new ColumnDef('lastupdate', 'datetime', + new ColumnDef('modified', 'datetime', null, false)); } @@ -169,12 +105,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); } /** @@ -201,101 +137,6 @@ class Ostatus_profile extends Memcached_DataObject return null; } - /** - * @param FeedMunger $munger - * @param boolean $isGroup is this a group record? - * @return Ostatus_profile - */ - public static function ensureProfile($munger) - { - $profile = $munger->ostatusProfile(); - - $current = self::staticGet('feeduri', $profile->feeduri); - if ($current) { - // @fixme we should probably update info as necessary - return $current; - } - - $profile->query('BEGIN'); - - try { - $local = $munger->profile(); - - if ($profile->isGroup()) { - $group = new User_group(); - $group->nickname = $local->nickname . '@remote'; // @fixme - $group->fullname = $local->fullname; - $group->homepage = $local->homepage; - $group->location = $local->location; - $group->created = $local->created; - $group->insert(); - if (empty($result)) { - throw new FeedDBException($group); - } - $profile->group_id = $group->id; - } else { - $result = $local->insert(); - if (empty($result)) { - throw new FeedDBException($local); - } - $profile->profile_id = $local->id; - } - - $profile->created = common_sql_now(); - $profile->lastupdate = common_sql_now(); - $result = $profile->insert(); - if (empty($result)) { - throw new FeedDBException($profile); - } - - $profile->query('COMMIT'); - } catch (FeedDBException $e) { - common_log_db_error($e->obj, 'INSERT', __FILE__); - $profile->query('ROLLBACK'); - return false; - } - - $avatar = $munger->getAvatar(); - if ($avatar) { - try { - $profile->updateAvatar($avatar); - } catch (Exception $e) { - common_log(LOG_ERR, "Exception setting OStatus avatar: " . - $e->getMessage()); - } - } - - return $profile; - } - - /** - * Download and update given avatar image - * @param string $url - * @throws Exception in various failure cases - */ - 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); - - // @fixme should we be using different ids? - $imagefile = new ImageFile($this->id, $temp_filename); - $filename = Avatar::filename($this->id, - image_type_to_extension($imagefile->type), - null, - common_timestamp()); - rename($temp_filename, Avatar::path($filename)); - if ($this->isGroup()) { - $group = $this->localGroup(); - $group->setOriginal($filename); - } else { - $profile = $this->localProfile(); - $profile->setOriginal($filename); - } - } - /** * Returns an XML string fragment with profile information as an * Activity Streams noun object with the given element type. @@ -345,7 +186,7 @@ class Ostatus_profile extends Memcached_DataObject $xs->element( 'id', null, - $this->homeuri); // ? + $this->uri); // ? $xs->element('title', null, $self->getBestName()); $xs->element( @@ -370,142 +211,95 @@ class Ostatus_profile extends Memcached_DataObject } /** - * 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 - * @throws ServerException if feed state is not valid + * @param User $user + * @return boolean success + * @throws FeedException */ - public function subscribe($mode='subscribe') + public function subscribeLocalToRemote(User $user) { - if ($this->sub_state != '') { - throw new ServerException("Attempting to start PuSH subscription to feed in state $this->sub_state"); + if ($this->isGroup()) { + throw new ServerException("Can't subscribe to a remote group"); } - if (empty($this->huburi)) { - if (common_config('feedsub', 'nohub')) { - // Fake it! We're just testing remote feeds w/o hubs. + + if ($this->subscribe()) { + if ($user->subscribeTo($this->localProfile())) { + $this->notify($user->getProfile(), ActivityVerb::FOLLOW, $this); return true; - } else { - throw new ServerException("Attempting to start PuSH subscription for feed with no hub"); } } - - return $this->doSubscribe('subscribe'); + return false; } /** - * Send a PuSH unsubscription request to the hub for this feed. - * The hub will later send us a confirmation POST to /main/push/callback. + * Mark this remote profile as subscribing to the given local user, + * and send appropriate notifications to the user. * - * @return bool true on success, false on failure - * @throws ServerException if feed state is not valid + * 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 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) + public function subscribeRemoteToLocal(User $user) { - $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' => 'async', - 'hub.verify_token' => $this->verify_token, - 'hub.secret' => $this->secret, - //'hub.lease_seconds' => 0, - 'hub.topic' => $this->feeduri); - $client = new HTTPClient(); - $response = $client->post($this->huburi, $headers, $post); - $status = $response->getStatus(); - if ($status == 202) { - common_log(LOG_INFO, __METHOD__ . ': sub req ok, awaiting verification callback'); - return true; - } else if ($status == 204) { - common_log(LOG_INFO, __METHOD__ . ': sub req ok and verified'); - return true; - } else if ($status >= 200 && $status < 300) { - common_log(LOG_ERR, __METHOD__ . ": sub req returned unexpected HTTP $status: " . $response->getBody()); - return false; - } else { - common_log(LOG_ERR, __METHOD__ . ": sub req failed with HTTP $status: " . $response->getBody()); - return false; - } - } catch (Exception $e) { - // wtf! - common_log(LOG_ERR, __METHOD__ . ": error \"{$e->getMessage()}\" hitting hub $this->huburi subscribing to $this->feeduri"); + if ($this->isGroup()) { + throw new ServerException("Remote groups can't subscribe to local users"); + } - $orig = clone($this); - $this->verify_token = null; - $this->sub_state = null; - $this->update($orig); - unset($orig); + // @fixme use regular channels for subbing, once they accept remote profiles + $sub = new Subscription(); + $sub->subscriber = $this->profile_id; + $sub->subscribed = $user->id; + $sub->created = common_sql_now(); // current time - return false; + if ($sub->insert()) { + // @fixme use subs_notify() if refactored to take profiles? + mail_subscribe_notify_profile($user, $this->localProfile()); + return true; } + return false; } /** - * Save PuSH subscription confirmation. - * Sets approximate lease start and end times and finalizes state. + * Send a subscription request to the hub for this feed. + * The hub will later send us a confirmation POST to /main/push/callback. * - * @param int $lease_seconds provided hub.lease_seconds parameter, if given + * @return bool true on success, false on failure + * @throws ServerException if feed state is not valid */ - public function confirmSubscribe($lease_seconds=0) + public function subscribe($mode='subscribe') { - $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; + $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..."); } - $this->lastupdate = common_sql_now(); - - return $this->update($original); } /** - * Save PuSH unsubscription confirmation. - * Wipes active PuSH sub info and resets state. + * 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 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->lastupdate = common_sql_now(); - - return $this->update($original); + public function 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..."); + } } /** @@ -543,10 +337,7 @@ class Ostatus_profile extends Memcached_DataObject $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"); @@ -600,36 +391,10 @@ class Ostatus_profile extends Memcached_DataObject * Currently assumes that all items in the feed are new, * coming from a PuSH hub. * - * @param string $post source of Atom or RSS feed - * @param string $hmac X-Hub-Signature header, if present + * @param DOMDocument $feed */ - public function postUpdates($post, $hmac) + public function processFeed($feed) { - common_log(LOG_INFO, __METHOD__ . ": packet for \"$this->feeduri\"! $hmac $post"); - - if ($this->sub_state != 'active') { - common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH for inactive feed $this->feeduri (in state '$this->sub_state')"); - return; - } - - if ($post === '') { - common_log(LOG_ERR, __METHOD__ . ": ignoring empty post"); - return; - } - - if (!$this->validatePushSig($post, $hmac)) { - // Per spec we silently drop input with a bad sig, - // while reporting receipt to the server. - return; - } - - $feed = new DOMDocument(); - if (!$feed->loadXML($post)) { - // @fixme might help to include the err message - common_log(LOG_ERR, __METHOD__ . ": ignoring invalid XML"); - return; - } - $entries = $feed->getElementsByTagNameNS(Activity::ATOM, 'entry'); if ($entries->length == 0) { common_log(LOG_ERR, __METHOD__ . ": no entries in feed update, ignoring"); @@ -642,40 +407,6 @@ class Ostatus_profile extends Memcached_DataObject } } - /** - * 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; - } - /** * Process a posted entry from this feed source. * @@ -704,14 +435,14 @@ class Ostatus_profile extends Memcached_DataObject { if ($this->isGroup()) { // @fixme validate these profiles in some way! - $oprofile = $this->ensureActorProfile($activity); + $oprofile = self::ensureActorProfile($activity); } else { - $actorUri = $this->getActorProfileURI($activity); - if ($actorUri == $this->homeuri) { + $actorUri = self::getActorProfileURI($activity); + if ($actorUri == $this->uri) { // @fixme check if profile info has changed and update it } else { // @fixme drop or reject the messages once we've got the canonical profile URI recorded sanely - common_log(LOG_INFO, "OStatus: Warning: non-group post with unexpected author: $actorUri expected $this->homeuri"); + common_log(LOG_INFO, "OStatus: Warning: non-group post with unexpected author: $actorUri expected $this->uri"); //return; } $oprofile = $this; @@ -787,6 +518,65 @@ class Ostatus_profile extends Memcached_DataObject return false; } + /** + * @param string $profile_url + * @return Ostatus_profile + * @throws FeedSubException + */ + public static function ensureProfile($profile_uri) + { + // 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(); + } + + // Ok this is going to be a terrible hack! + // Won't be suitable for groups, empty feeds, or getting + // info that's only available on the profile page. + $entries = $discover->feed->getElementsByTagNameNS(Activity::ATOM, 'entry'); + if (!$entries || $entries->length == 0) { + throw new FeedSubException('empty feed'); + } + $first = new Activity($entries->item(0), $discover->feed); + return self::ensureActorProfile($first, $feeduri); + } + + /** + * Download and update given avatar image + * @param string $url + * @throws Exception in various failure cases + */ + protected 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); + + // @fixme should we be using different ids? + $imagefile = new ImageFile($this->id, $temp_filename); + $filename = Avatar::filename($this->id, + image_type_to_extension($imagefile->type), + null, + common_timestamp()); + rename($temp_filename, Avatar::path($filename)); + if ($this->isGroup()) { + $group = $this->localGroup(); + $group->setOriginal($filename); + } else { + $profile = $this->localProfile(); + $profile->setOriginal($filename); + } + } + /** * Get an appropriate avatar image source URL, if available. * @@ -794,7 +584,7 @@ class Ostatus_profile extends Memcached_DataObject * @param DOMElement $feed * @return string */ - function getAvatar($actor, $feed) + protected static function getAvatar($actor, $feed) { $url = ''; $icon = ''; @@ -833,13 +623,18 @@ class Ostatus_profile extends Memcached_DataObject } /** - * @fixme move off of ostatus_profile or static? + * Fetch, or build if necessary, an Ostatus_profile for the actor + * in a given Activity Streams activity. + * + * @param Activity $activity + * @param string $feeduri if we already know the canonical feed URI! + * @return Ostatus_profile */ - function ensureActorProfile($activity) + public static function ensureActorProfile($activity, $feeduri=null) { - $profile = $this->getActorProfile($activity); + $profile = self::getActorProfile($activity); if (!$profile) { - $profile = $this->createActorProfile($activity); + $profile = self::createActorProfile($activity, $feeduri); } return $profile; } @@ -848,10 +643,10 @@ class Ostatus_profile extends Memcached_DataObject * @param Activity $activity * @return mixed matching Ostatus_profile or false if none known */ - function getActorProfile($activity) + protected static function getActorProfile($activity) { - $homeuri = $this->getActorProfileURI($activity); - return Ostatus_profile::staticGet('homeuri', $homeuri); + $homeuri = self::getActorProfileURI($activity); + return self::staticGet('uri', $homeuri); } /** @@ -859,7 +654,7 @@ class Ostatus_profile extends Memcached_DataObject * @return string * @throws ServerException */ - function getActorProfileURI($activity) + protected static function getActorProfileURI($activity) { $opts = array('allowed_schemes' => array('http', 'https')); $actor = $activity->actor; @@ -873,14 +668,19 @@ class Ostatus_profile extends Memcached_DataObject } /** - * + * @fixme validate stuff somewhere */ - function createActorProfile($activity) + protected static function createActorProfile($activity, $feeduri=null) { - $actor = $activity->actor(); - $homeuri = $this->getActivityProfileURI($activity); - $nickname = $this->getAuthorNick($activity); - $avatar = $this->getAvatar($actor, $feed); + $actor = $activity->actor; + $homeuri = self::getActorProfileURI($activity); + $nickname = self::getAuthorNick($activity); + $avatar = self::getAvatar($actor, $feed); + + if (!$homeuri) { + common_log(LOG_DEBUG, __METHOD__ . " empty actor profile URI: " . var_export($activity, true)); + throw new ServerException("No profile URI"); + } $profile = new Profile(); $profile->nickname = $nickname; @@ -894,9 +694,7 @@ class Ostatus_profile extends Memcached_DataObject // @todo lat/lon/location? $ok = $profile->insert(); - if ($ok) { - $this->updateAvatar($profile, $avatar); - } else { + if (!$ok) { throw new ServerException("Can't save local profile"); } @@ -904,11 +702,15 @@ class Ostatus_profile extends Memcached_DataObject // or need to split out some of the feed stuff // so we can leave it empty until later. $oprofile = new Ostatus_profile(); - $oprofile->homeuri = $homeuri; + $oprofile->uri = $homeuri; + if ($feeduri) { + $oprofile->feeduri = $feeduri; + } $oprofile->profile_id = $profile->id; $ok = $oprofile->insert(); if ($ok) { + $oprofile->updateAvatar($avatar); return $oprofile; } else { throw new ServerException("Can't save OStatus profile"); @@ -920,13 +722,13 @@ class Ostatus_profile extends Memcached_DataObject * @param Activity $activity * @return string */ - function getAuthorNick($activity) + protected static function getAuthorNick($activity) { // @fixme not technically part of the actor? foreach (array($activity->entry, $activity->feed) as $source) { - $author = ActivityUtil::child($source, 'author', Activity::ATOM); + $author = ActivityUtils::child($source, 'author', Activity::ATOM); if ($author) { - $name = ActivityUtil::child($author, 'name', Activity::ATOM); + $name = ActivityUtils::child($author, 'name', Activity::ATOM); if ($name) { return trim($name->textContent); } diff --git a/plugins/OStatus/lib/feeddiscovery.php b/plugins/OStatus/lib/feeddiscovery.php index 39985fc90..7afb71bdc 100644 --- a/plugins/OStatus/lib/feeddiscovery.php +++ b/plugins/OStatus/lib/feeddiscovery.php @@ -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 index e8c46de90..000000000 --- a/plugins/OStatus/lib/feedmunger.php +++ /dev/null @@ -1,350 +0,0 @@ -. - */ - -/** - * @package FeedSubPlugin - * @maintainer Brion Vibber - */ - -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 elements. - $dom = $item->model; - - // Note that RSS feeds would embed an so this should work for both. - /// http://code.google.com/p/pubsubhubbub/wiki/RssFeeds - // - $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 elements. - $dom = $item->model; - - // Note that RSS feeds would embed an so this should work for both. - /// http://code.google.com/p/pubsubhubbub/wiki/RssFeeds - // - $links = $dom->getElementsByTagName('link'); - for ($i = 0; $i < $links->length; $i++) { - $node = $links->item($i); - if (!$node->hasAttributes()) { - return $node->textContent; - } - } - return false; - } - - function getAltLink($item) - { - // Check for an atom link... - $link = $this->getAtomLink($item, array('rel' => 'alternate', 'type' => 'text/html')); - if (!$link) { - $link = $this->getRssLink($item); - } - return $link; - } - - function getHubLink() - { - return $this->getAtomLink($this->feed, array('rel' => 'hub')); - } - - function getSalmonLink() - { - return $this->getAtomLink($this->feed, array('rel' => 'salmon')); - } - - function getSelfLink() - { - return $this->getAtomLink($this->feed, array('rel' => 'self')); - } - - /** - * Get an appropriate avatar image source URL, if available. - * @return mixed string or false - */ - function getAvatar() - { - $logo = $this->feed->logo; - if ($logo) { - return $logo; - } - $icon = $this->feed->icon; - if ($icon) { - return $icon; - } - return common_path('plugins/OStatus/images/48px-Feed-icon.svg.png'); - } - - function profile($preview=false) - { - if ($preview) { - $profile = new FeedSubPreviewProfile(); - } else { - $profile = new Profile(); - } - - // @todo validate/normalize nick? - $profile->nickname = $this->feed->title; - $profile->fullname = $this->feed->title; - $profile->homepage = $this->getAltLink($this->feed); - $profile->bio = $this->feed->description; - $profile->profileurl = $this->getAltLink($this->feed); - - if ($preview) { - $profile->avatar = $this->getAvatar(); - } - - // @todo tags from categories - // @todo lat/lon/location? - - return $profile; - } - - function notice($index=1, $preview=false) - { - $entry = $this->feed->getEntryByOffset($index); - if (!$entry) { - return null; - } - - if ($preview) { - $notice = new FeedSubPreviewNotice($this->profile(true)); - $notice->id = -1; - } else { - $notice = new Notice(); - $notice->profile_id = $this->profileIdForEntry($index); - } - - $link = $this->getAltLink($entry); - if (empty($link)) { - if (preg_match('!^https?://!', $entry->id)) { - $link = $entry->id; - common_log(LOG_DEBUG, "No link on entry, using URL from id: $link"); - } - } - $notice->uri = $link; - $notice->url = $link; - $notice->content = $this->noticeFromEntry($entry); - $notice->rendered = common_render_content($notice->content, $notice); // @fixme this is failing on group posts - $notice->created = common_sql_date($entry->updated); // @fixme - $notice->is_local = Notice::GATEWAY; - $notice->source = 'feed'; - - $location = $this->getLocation($entry); - if ($location) { - if ($location->location_id) { - $notice->location_ns = $location->location_ns; - $notice->location_id = $location->location_id; - } - $notice->lat = $location->lat; - $notice->lon = $location->lon; - } - - return $notice; - } - - function profileIdForEntry($index=1) - { - // hack hack hack - // should get profile for this entry's author... - $feeduri = $this->getSelfLink(); - $remote = Ostatus_profile::staticGet('feeduri', $feeduri); - if ($remote) { - return $remote->profile_id; - } else { - throw new Exception("Can't find feed profile for $feeduri"); - } - } - - /** - * Parse location given as a GeoRSS-simple point, if provided. - * http://www.georss.org/simple - * - * @param feed item $entry - * @return mixed Location or false - */ - function getLocation($entry) - { - $dom = $entry->model; - $points = $dom->getElementsByTagNameNS('http://www.georss.org/georss', 'point'); - - for ($i = 0; $i < $points->length; $i++) { - $point = $points->item(0)->textContent; - $point = str_replace(',', ' ', $point); // per spec "treat commas as whitespace" - $point = preg_replace('/\s+/', ' ', $point); - $point = trim($point); - $coords = explode(' ', $point); - if (count($coords) == 2) { - list($lat, $lon) = $coords; - if (is_numeric($lat) && is_numeric($lon)) { - common_log(LOG_INFO, "Looking up location for $lat $lon from georss"); - return Location::fromLatLon($lat, $lon); - } - } - common_log(LOG_ERR, "Ignoring bogus georss:point value $point"); - } - - return false; - } - - /** - * @param XML_Feed_Type $entry - * @return string notice text, within post size limit - */ - function noticeFromEntry($entry) - { - $max = Notice::maxContent(); - $ellipsis = "\xe2\x80\xa6"; // U+2026 HORIZONTAL ELLIPSIS - $title = $entry->title; - $link = $entry->link; - - // @todo We can get 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; - } -} -- cgit v1.2.3-54-g00ecf From 48edade751cca3ac7363808264a76c470a520528 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 18 Feb 2010 22:18:14 -0500 Subject: add ActivityContext class and test it --- plugins/OStatus/actions/salmon.php | 1 + plugins/OStatus/classes/Ostatus_profile.php | 32 +---------- plugins/OStatus/lib/activity.php | 85 +++++++++++++++++++++++++++- plugins/OStatus/tests/ActivityParseTests.php | 53 ++++++++++++++++- 4 files changed, 138 insertions(+), 33 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php index ea5b8e4ea..e9d6015f4 100644 --- a/plugins/OStatus/actions/salmon.php +++ b/plugins/OStatus/actions/salmon.php @@ -71,6 +71,7 @@ class SalmonAction extends Action /** * @fixme probably call Ostatus_profile::processFeed */ + function handle($args) { common_log(LOG_INFO, 'Salmon: incoming post for user '. $this->user->id); diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 1ce8ac491..e0cb467e5 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -488,36 +488,6 @@ class Ostatus_profile extends Memcached_DataObject $params); } - /** - * 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('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 string $profile_url * @return Ostatus_profile @@ -560,7 +530,7 @@ class Ostatus_profile extends Memcached_DataObject // ripped from oauthstore.php (for old OMB client) $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar'); copy($url, $temp_filename); - + // @fixme should we be using different ids? $imagefile = new ImageFile($this->id, $temp_filename); $filename = Avatar::filename($this->id, diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index 3ed613dc7..5bc8f78e5 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -311,6 +311,87 @@ class ActivityVerb const LEAVE = 'http://ostatus.org/schema/1.0/leave'; } +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 * @@ -426,7 +507,9 @@ class Activity $contextEl = $this->_child($entry, self::CONTEXT); if (!empty($contextEl)) { - $this->context = new ActivityObject($contextEl); + $this->context = new ActivityContext($contextEl); + } else { + $this->context = new ActivityContext($entry); } $targetEl = $this->_child($entry, self::TARGET); diff --git a/plugins/OStatus/tests/ActivityParseTests.php b/plugins/OStatus/tests/ActivityParseTests.php index fa8bcdda2..35b4b0f9d 100644 --- a/plugins/OStatus/tests/ActivityParseTests.php +++ b/plugins/OStatus/tests/ActivityParseTests.php @@ -57,12 +57,35 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $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->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->actor)); + } } $_example1 = << EXAMPLE3; + +$_example4 = << + + @evan now is the time for all good men to come to the aid of their country. #thetime + @evan now is the time for all good men to come to the aid of their country. #thetime + + spock + http://example.net/user/2 + + + http://activitystrea.ms/schema/1.0/person + http://example.net/user/2 + spock + + + + http://example.net/notice/14 + 2010-02-19T02:52:38+00:00 + 2010-02-19T02:52:38+00:00 + + + + + @<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> + + +EXAMPLE4; -- cgit v1.2.3-54-g00ecf From 114eb310ca4f53e09c98f2337850829a9036c133 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 19 Feb 2010 10:29:06 -0800 Subject: OStatus: fix up Salmon endpoint detection/saving, timestamp fixes. --- plugins/OStatus/actions/salmon.php | 2 +- plugins/OStatus/classes/FeedSub.php | 2 +- plugins/OStatus/classes/Ostatus_profile.php | 18 +++++++++++++----- 3 files changed, 15 insertions(+), 7 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php index e9d6015f4..2da9db9eb 100644 --- a/plugins/OStatus/actions/salmon.php +++ b/plugins/OStatus/actions/salmon.php @@ -142,7 +142,7 @@ class SalmonAction extends Action function ensureProfile() { $actor = $this->act->actor; - + common_log(LOG_DEBUG, "Received salmon bit: " . var_export($this->act, true)); if (empty($actor->id)) { throw new Exception("Received a salmon slap from unidentified actor."); } diff --git a/plugins/OStatus/classes/FeedSub.php b/plugins/OStatus/classes/FeedSub.php index dc2c0b710..bf9d063fa 100644 --- a/plugins/OStatus/classes/FeedSub.php +++ b/plugins/OStatus/classes/FeedSub.php @@ -99,7 +99,7 @@ class FeedSub extends Memcached_DataObject '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 + DB_DATAOBJECT_NOTNULL, + '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); } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index e0cb467e5..319b76a66 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -328,7 +328,7 @@ class Ostatus_profile extends Memcached_DataObject $entry->element('id', null, $id); $entry->element('title', null, $text); $entry->element('summary', null, $text); - $entry->element('published', null, common_date_w3dtf(time())); + $entry->element('published', null, common_date_w3dtf(common_sql_now())); $entry->element('activity:verb', null, $verb); $entry->raw($actor->asAtomAuthor()); @@ -516,7 +516,7 @@ class Ostatus_profile extends Memcached_DataObject throw new FeedSubException('empty feed'); } $first = new Activity($entries->item(0), $discover->feed); - return self::ensureActorProfile($first, $feeduri); + return self::ensureActorProfile($first, $feeduri, $salmonuri); } /** @@ -598,13 +598,14 @@ class Ostatus_profile extends Memcached_DataObject * * @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) + public static function ensureActorProfile($activity, $feeduri=null, $salmonuri=null) { $profile = self::getActorProfile($activity); if (!$profile) { - $profile = self::createActorProfile($activity, $feeduri); + $profile = self::createActorProfile($activity, $feeduri, $salmonuri); } return $profile; } @@ -640,7 +641,7 @@ class Ostatus_profile extends Memcached_DataObject /** * @fixme validate stuff somewhere */ - protected static function createActorProfile($activity, $feeduri=null) + protected static function createActorProfile($activity, $feeduri=null, $salmonuri=null) { $actor = $activity->actor; $homeuri = self::getActorProfileURI($activity); @@ -674,10 +675,17 @@ class Ostatus_profile extends Memcached_DataObject $oprofile = new Ostatus_profile(); $oprofile->uri = $homeuri; if ($feeduri) { + // If we don't have these, we can look them up later. $oprofile->feeduri = $feeduri; + if ($salmonuri) { + $oprofile->salmonuri = $salmonuri; + } } $oprofile->profile_id = $profile->id; + $oprofile->created = common_sql_now(); + $oprofile->modified = common_sql_now(); + $ok = $oprofile->insert(); if ($ok) { $oprofile->updateAvatar($avatar); -- cgit v1.2.3-54-g00ecf From a1a3ab1c58cf8636c4e9ac6b9d44bdc18946a547 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 19 Feb 2010 12:08:07 -0800 Subject: OStatus: hooked up follow/unfollow events on Salmon endpoint to create/destroy remote subscriber relationships --- plugins/OStatus/OStatusPlugin.php | 9 +++- plugins/OStatus/actions/feedsubsettings.php | 8 ---- plugins/OStatus/actions/salmon.php | 66 +++++++++++++++++++++++++---- plugins/OStatus/classes/Ostatus_profile.php | 22 +++++++--- 4 files changed, 81 insertions(+), 24 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 4ebe4551e..4c43d8a30 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -253,17 +253,22 @@ class OStatusPlugin extends Plugin */ function onEndUnsubscribe($user, $other) { + if ($user instanceof Profile) { + $profile = $user; + } else if ($user instanceof Profile) { + $profile = $user->getProfile(); + } $oprofile = Ostatus_profile::staticGet('profile_id', $other->id); if ($oprofile) { // Notify the remote server of the unsub, if supported. - $oprofile->notify($user->getProfile(), ActivityVerb::UNFOLLOW, $oprofile); + $oprofile->notify($profile, ActivityVerb::UNFOLLOW, $oprofile); // Drop the PuSH subscription if there are no other subscribers. $sub = new Subscription(); $sub->subscribed = $other->id; $sub->limit(1); if (!$sub->find(true)) { - common_log(LOG_INFO, "Unsubscribing from now-unused feed $oprofile->feeduri on hub $oprofile->huburi"); + common_log(LOG_INFO, "Unsubscribing from now-unused feed $oprofile->feeduri"); $oprofile->unsubscribe(); } } diff --git a/plugins/OStatus/actions/feedsubsettings.php b/plugins/OStatus/actions/feedsubsettings.php index 3e1d0aa82..aee4cee9a 100644 --- a/plugins/OStatus/actions/feedsubsettings.php +++ b/plugins/OStatus/actions/feedsubsettings.php @@ -68,14 +68,6 @@ class FeedSubSettingsAction extends ConnectSettingsAction $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', diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php index 2da9db9eb..1ed322ed2 100644 --- a/plugins/OStatus/actions/salmon.php +++ b/plugins/OStatus/actions/salmon.php @@ -63,13 +63,17 @@ class SalmonAction extends Action // XXX: check that document element is Atom entry // XXX: check the signature - $this->act = new Activity($dom->documentElement); + $entries = $dom->getElementsByTagNameNS(Activity::ATOM, 'entry'); + if ($entries && $entries->length) { + // @fixme is it legit to have multiple entries? + $this->act = new Activity($entries->item(0), $dom->documentElement); + } return true; } /** - * @fixme probably call Ostatus_profile::processFeed + * Check the posted activity type and break out to appropriate processing. */ function handle($args) @@ -94,13 +98,19 @@ class SalmonAction extends Action case ActivityVerb::FRIEND: $this->handleFollow(); break; + case ActivityVerb::UNFOLLOW: + $this->handleUnfollow(); + break; } Event::handle('EndHandleSalmon', array($this->user, $this->activity)); } } /** - * @fixme probably call Ostatus_profile::processFeed + * 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() { @@ -116,43 +126,81 @@ class SalmonAction extends Action } $profile = $this->ensureProfile(); + // @fixme do something with the post } /** - * @fixme probably call Ostatus_profile::processFeed + * 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}"); + $oprofile->subscribeRemoteToLocal($this->user); + } 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"); + } } /** - * @fixme probably call Ostatus_profile::processFeed + * Remote user likes one of our posts. + * Confirm the post is ours, and save a local favorite event. */ function handleFavorite() { } /** - * @fixme probably call Ostatus_profile::processFeed + * Remote user doesn't like one of our posts after all! + * Confirm the post is ours, and save a local favorite event. + */ + function handleUnfavorite() + { + } + + /** + * Hmmmm */ function handleShare() { } + /** + * @return Ostatus_profile + */ function ensureProfile() { $actor = $this->act->actor; common_log(LOG_DEBUG, "Received salmon bit: " . var_export($this->act, true)); if (empty($actor->id)) { + common_log(LOG_ERR, "broken actor: " . var_export($actor, true)); throw new Exception("Received a salmon slap from unidentified actor."); } - $ostatusProfile = Ostatus_profile::ensureActorProfile($this->act); - return $oprofile->localProfile(); + return Ostatus_profile::ensureActorProfile($this->act); } /** - * @fixme anything new in here probably should be merged into Ostatus_profile::ensureActorProfile and friends + * @fixme merge into Ostatus_profile::ensureActorProfile and friends */ function createProfile() { diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 319b76a66..97d8eec10 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -310,8 +310,15 @@ class Ostatus_profile extends Memcached_DataObject * @param $verb eg Activity::SUBSCRIBE or Activity::JOIN * @param $object object of the action; if null, the remote entity itself is assumed */ - 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; } @@ -340,7 +347,7 @@ class Ostatus_profile extends Memcached_DataObject $feed->addEntry($entry); $xml = $feed->getString(); - common_log(LOG_INFO, "Posting to Salmon endpoint $salmon: $xml"); + common_log(LOG_INFO, "Posting to Salmon endpoint $this->salmonuri: $xml"); $salmon = new Salmon(); // ? $salmon->post($this->salmonuri, $xml); @@ -531,9 +538,14 @@ class Ostatus_profile extends Memcached_DataObject $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar'); copy($url, $temp_filename); + if ($this->isGroup()) { + $id = $this->group_id; + } else { + $id = $this->profile_id; + } // @fixme should we be using different ids? - $imagefile = new ImageFile($this->id, $temp_filename); - $filename = Avatar::filename($this->id, + $imagefile = new ImageFile($id, $temp_filename); + $filename = Avatar::filename($id, image_type_to_extension($imagefile->type), null, common_timestamp()); @@ -646,7 +658,7 @@ class Ostatus_profile extends Memcached_DataObject $actor = $activity->actor; $homeuri = self::getActorProfileURI($activity); $nickname = self::getAuthorNick($activity); - $avatar = self::getAvatar($actor, $feed); + $avatar = self::getAvatar($actor, $activity->feed); if (!$homeuri) { common_log(LOG_DEBUG, __METHOD__ . " empty actor profile URI: " . var_export($activity, true)); -- cgit v1.2.3-54-g00ecf From b0327506a491f029b239ae703e1acb1d42ae299c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 19 Feb 2010 16:37:07 -0500 Subject: some more salmon stuff --- plugins/OStatus/actions/salmon.php | 90 +++++++++++++++++++++++++++++++++++++- 1 file changed, 89 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php index e9d6015f4..7356c489a 100644 --- a/plugins/OStatus/actions/salmon.php +++ b/plugins/OStatus/actions/salmon.php @@ -112,24 +112,112 @@ class SalmonAction extends Action case ActivityObject::COMMENT: break; default: - throw new Exception("Can't handle that kind of post."); + 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($context->attention, $this->user->uri)) { + throw new ClientException("To the attention of user(s) not including this one!"); + } + } else { + throw new ClientException("Not to anyone in reply to anything!"); } $profile = $this->ensureProfile(); + } /** * @fixme probably call Ostatus_profile::processFeed */ + function handleFollow() { + $object = $this->act->object; + + if ($object->id != $this->user->uri) { + throw new ClientException("Subscription notice not for this user."); + } + + $profile = $this->ensureProfile(); + + $sub = Subscription::pkeyGet(array('subscriber' => $profile->id, + 'subscribed' => $this->user->id)); + + if (!empty($sub)) { + throw new ClientException("Already subscribed."); + } + + if ($this->user->hasBlocked($profile)) { + throw new ClientException("Already subscribed."); + } + } /** * @fixme probably call Ostatus_profile::processFeed */ + function handleFavorite() { + // WORST VARIABLE NAME EVER + $object = $this->act->object; + + 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 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."); + } + + $profile = $this->ensureProfile(); + + $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!"); + } + + $fave = new Fave(); + + // @fixme need to change this attribute name, maybe references + $fave->user_id = $profile->id; + $fave->notice_id = $notice->id; + + $result = $fave->insert(); + + if (!$result) { + common_log_db_error($fave, 'INSERT', __FILE__); + throw new ServerException('Could not save new favorite.'); + } } /** -- cgit v1.2.3-54-g00ecf From 557df3d3f78dbfce656c4c8e3ddf82ee0e34da0a Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 19 Feb 2010 16:21:17 -0800 Subject: OStatus: sub/unsub notifications working again. Fixed up autodetection of feed info at profile setup time --- plugins/OStatus/OStatusPlugin.php | 2 ++ plugins/OStatus/actions/salmon.php | 13 +++++++++--- plugins/OStatus/classes/Ostatus_profile.php | 31 +++++++++++++++++++---------- plugins/OStatus/lib/salmon.php | 3 +++ 4 files changed, 35 insertions(+), 14 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 4c43d8a30..1b58d3c35 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -331,6 +331,8 @@ class OStatusPlugin extends Plugin $oprofile = Ostatus_profile::staticGet('feeduri', $feedsub->uri); if ($oprofile) { $oprofile->processFeed($feed); + } else { + common_log(LOG_DEBUG, "No ostatus profile for incoming feed $feedsub->uri"); } } } diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php index 7a4474ff6..43d79cf4a 100644 --- a/plugins/OStatus/actions/salmon.php +++ b/plugins/OStatus/actions/salmon.php @@ -34,6 +34,8 @@ class SalmonAction extends Action function prepare($args) { + StatusNet::setApi(true); // Send smaller error pages + parent::prepare($args); if ($_SERVER['REQUEST_METHOD'] != 'POST') { @@ -63,8 +65,12 @@ class SalmonAction extends Action // XXX: check that document element is Atom entry // XXX: check the signature - $this->act = new Activity($dom->documentElement); - + // We need to run an entry into Activity, so get the first one + $entries = $dom->getElementsByTagNameNS(Activity::ATOM, 'entry'); + if ($entries && $entries->length) { + // @fixme is it legit to have multiple entries? + $this->act = new Activity($entries->item(0), $dom->documentElement); + } return true; } @@ -74,7 +80,9 @@ class SalmonAction extends Action function handle($args) { + StatusNet::setApi(true); // Send smaller error pages common_log(LOG_INFO, 'Salmon: incoming post for user '. $this->user->id); + common_log(LOG_DEBUG, "Received salmon bit: " . var_export($this->act, true)); // TODO : Insert new $xml -> notice code @@ -254,7 +262,6 @@ class SalmonAction extends Action function ensureProfile() { $actor = $this->act->actor; - common_log(LOG_DEBUG, "Received salmon bit: " . var_export($this->act, true)); if (empty($actor->id)) { common_log(LOG_ERR, "broken actor: " . var_export($actor, true)); throw new Exception("Received a salmon slap from unidentified actor."); diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 97d8eec10..5fe135f96 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -56,7 +56,7 @@ class Ostatus_profile extends Memcached_DataObject 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, + 'feeduri' => DB_DATAOBJECT_STR, 'salmonuri' => DB_DATAOBJECT_STR, '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); @@ -71,7 +71,7 @@ class Ostatus_profile extends Memcached_DataObject new ColumnDef('group_id', 'integer', null, true, 'UNI'), new ColumnDef('feeduri', 'varchar', - 255, false, 'UNI'), + 255, true, 'UNI'), new ColumnDef('salmonuri', 'text', null, true), new ColumnDef('created', 'datetime', @@ -272,7 +272,7 @@ class Ostatus_profile extends Memcached_DataObject * @return bool true on success, false on failure * @throws ServerException if feed state is not valid */ - public function subscribe($mode='subscribe') + public function subscribe() { $feedsub = FeedSub::ensureFeed($this->feeduri); if ($feedsub->sub_state == 'active' || $feedsub->sub_state == 'subscribe') { @@ -506,7 +506,7 @@ class Ostatus_profile extends Memcached_DataObject $discover = new FeedDiscovery(); $feeduri = $discover->discoverFromURL($profile_uri); - $feedsub = FeedSub::ensureFeed($feeduri, $discover->feed); + //$feedsub = FeedSub::ensureFeed($feeduri, $discover->feed); $huburi = $discover->getAtomLink('hub'); $salmonuri = $discover->getAtomLink('salmon'); @@ -665,6 +665,20 @@ class Ostatus_profile extends Memcached_DataObject throw new ServerException("No profile URI"); } + 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(); + } + } + $profile = new Profile(); $profile->nickname = $nickname; $profile->fullname = $actor->displayName; @@ -686,13 +700,8 @@ class Ostatus_profile extends Memcached_DataObject // so we can leave it empty until later. $oprofile = new Ostatus_profile(); $oprofile->uri = $homeuri; - if ($feeduri) { - // If we don't have these, we can look them up later. - $oprofile->feeduri = $feeduri; - if ($salmonuri) { - $oprofile->salmonuri = $salmonuri; - } - } + $oprofile->feeduri = $feeduri; + $oprofile->salmonuri = $salmonuri; $oprofile->profile_id = $profile->id; $oprofile->created = common_sql_now(); diff --git a/plugins/OStatus/lib/salmon.php b/plugins/OStatus/lib/salmon.php index 8c77222a6..df17a7006 100644 --- a/plugins/OStatus/lib/salmon.php +++ b/plugins/OStatus/lib/salmon.php @@ -41,9 +41,12 @@ class Salmon $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; } -- cgit v1.2.3-54-g00ecf From 50db2d5d69a8769dc2ddcc937afb130bcce0971d Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 19 Feb 2010 17:01:38 -0800 Subject: OStatus: Salmon notifications now being generated moderately correctly. :) Needs to be an not a . --- plugins/OStatus/actions/salmon.php | 12 +++++------- plugins/OStatus/classes/Ostatus_profile.php | 15 +++++++++------ 2 files changed, 14 insertions(+), 13 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php index 43d79cf4a..f7c86dc0c 100644 --- a/plugins/OStatus/actions/salmon.php +++ b/plugins/OStatus/actions/salmon.php @@ -62,15 +62,13 @@ class SalmonAction extends Action $dom = DOMDocument::loadXML($xml); - // XXX: check that document element is Atom entry + if ($dom->documentElement->namespaceURI != Activity::ATOM || + $dom->documentElement->localName != 'entry') { + $this->clientError(_m('Salmon post must be an Atom entry.')); + } // XXX: check the signature - // We need to run an entry into Activity, so get the first one - $entries = $dom->getElementsByTagNameNS(Activity::ATOM, 'entry'); - if ($entries && $entries->length) { - // @fixme is it legit to have multiple entries? - $this->act = new Activity($entries->item(0), $dom->documentElement); - } + $this->act = new Activity($dom->documentElement); return true; } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 5fe135f96..b14b4c9a3 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -329,9 +329,15 @@ class Ostatus_profile extends Memcached_DataObject ':' . $actor->id . ':' . time(); // @fixme - //$entry = new Atom10Entry(); + // @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'); + $entry = new XMLStringer(); - $entry->elementStart('entry'); + $entry->elementStart('entry', $attributes); $entry->element('id', null, $id); $entry->element('title', null, $text); $entry->element('summary', null, $text); @@ -343,10 +349,7 @@ class Ostatus_profile extends Memcached_DataObject $entry->raw($object->asActivityNoun('object')); $entry->elementEnd('entry'); - $feed = $this->atomFeed($actor); - $feed->addEntry($entry); - - $xml = $feed->getString(); + $xml = $entry->getString(); common_log(LOG_INFO, "Posting to Salmon endpoint $this->salmonuri: $xml"); $salmon = new Salmon(); // ? -- cgit v1.2.3-54-g00ecf From 2df3bbc80b6c9dd44134bcf3b5b4a09ea1a803d1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 20 Feb 2010 11:12:43 -0500 Subject: Move some salmon processing to a superclass Moved some salmon processing to a superclass so we could handle group salmon posts, too. --- plugins/OStatus/OStatusPlugin.php | 4 +- plugins/OStatus/actions/groupsalmon.php | 108 ++++++++++ plugins/OStatus/actions/salmon.php | 341 -------------------------------- plugins/OStatus/actions/usersalmon.php | 0 plugins/OStatus/lib/salmonaction.php | 231 ++++++++++++++++++++++ 5 files changed, 341 insertions(+), 343 deletions(-) create mode 100644 plugins/OStatus/actions/groupsalmon.php delete mode 100644 plugins/OStatus/actions/salmon.php create mode 100644 plugins/OStatus/actions/usersalmon.php create mode 100644 plugins/OStatus/lib/salmonaction.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 1b58d3c35..e1f3fd9d3 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -63,10 +63,10 @@ class OStatusPlugin extends Plugin // 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; } diff --git a/plugins/OStatus/actions/groupsalmon.php b/plugins/OStatus/actions/groupsalmon.php new file mode 100644 index 000000000..64ae9f3cc --- /dev/null +++ b/plugins/OStatus/actions/groupsalmon.php @@ -0,0 +1,108 @@ +. + */ + +/** + * @package OStatusPlugin + * @author James Walker + */ + +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.')); + } + + 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($context->attention, $uri)) { + throw new ClientException("Not to the attention of this group."); + } + } + + $profile = $this->ensureProfile(); + // @fixme save the post + } + + /** + * We've gotten a follow/subscribe notification from a remote user. + * Save a subscription relationship for them. + */ + + function handleFollow() + { + $this->handleJoin(); // ??? + } + + function handleUnfollow() + { + } + + /** + * A remote user joined our group. + */ + + function handleJoin() + { + } + +} diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php deleted file mode 100644 index f7c86dc0c..000000000 --- a/plugins/OStatus/actions/salmon.php +++ /dev/null @@ -1,341 +0,0 @@ -. - */ - -/** - * @package OStatusPlugin - * @author James Walker - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -class SalmonAction extends Action -{ - var $user = null; - 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(_('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); - - if ($dom->documentElement->namespaceURI != Activity::ATOM || - $dom->documentElement->localName != 'entry') { - $this->clientError(_m('Salmon post must be an Atom entry.')); - } - // XXX: check the signature - - $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_INFO, 'Salmon: incoming post for user '. $this->user->id); - common_log(LOG_DEBUG, "Received salmon bit: " . var_export($this->act, true)); - - // TODO : Insert new $xml -> notice code - - if (Event::handle('StartHandleSalmon', array($this->user, $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::FOLLOW: - case ActivityVerb::FRIEND: - $this->handleFollow(); - break; - case ActivityVerb::UNFOLLOW: - $this->handleUnfollow(); - break; - } - Event::handle('EndHandleSalmon', array($this->user, $this->activity)); - } - } - - /** - * 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() - { - 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($context->attention, $this->user->uri)) { - throw new ClientException("To the attention of user(s) not including this one!"); - } - } else { - throw new ClientException("Not to anyone in reply to anything!"); - } - - $profile = $this->ensureProfile(); - // @fixme do something with the post - } - - /** - * 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}"); - $oprofile->subscribeRemoteToLocal($this->user); - } 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() - { - // WORST VARIABLE NAME EVER - $object = $this->act->object; - - 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 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."); - } - - $profile = $this->ensureProfile(); - - $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!"); - } - - $fave = new Fave(); - - // @fixme need to change this attribute name, maybe references - $fave->user_id = $profile->id; - $fave->notice_id = $notice->id; - - $result = $fave->insert(); - - if (!$result) { - common_log_db_error($fave, 'INSERT', __FILE__); - throw new ServerException('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() - { - } - - /** - * Hmmmm - */ - function handleShare() - { - } - - /** - * @return Ostatus_profile - */ - function ensureProfile() - { - $actor = $this->act->actor; - if (empty($actor->id)) { - common_log(LOG_ERR, "broken actor: " . var_export($actor, true)); - throw new Exception("Received a salmon slap from unidentified actor."); - } - - return Ostatus_profile::ensureActorProfile($this->act); - } - - /** - * @fixme merge into Ostatus_profile::ensureActorProfile and friends - */ - function createProfile() - { - $actor = $this->act->actor; - - $profile = new Profile(); - - $profile->nickname = $this->nicknameFromURI($actor->id); - - if (empty($profile->nickname)) { - $profile->nickname = common_nicknamize($actor->title); - } - - $profile->fullname = $actor->title; - $profile->bio = $actor->summary; // XXX: is that right? - $profile->profileurl = $actor->link; // XXX: is that right? - $profile->created = common_sql_now(); - - $id = $profile->insert(); - - if (empty($id)) { - common_log_db_error($profile, 'INSERT', __FILE__); - throw new Exception("Couldn't save new profile for $actor->id\n"); - } - - // XXX: add avatars - - $op = new Ostatus_profile(); - - $op->profile_id = $id; - $op->homeuri = $actor->id; - $op->created = $profile->created; - - // XXX: determine feed URI from source or Webfinger or whatever - - $id = $op->insert(); - - if (empty($id)) { - common_log_db_error($op, 'INSERT', __FILE__); - throw new Exception("Couldn't save new ostatus profile for $actor->id\n"); - } - - return $profile; - } - - /** - * @fixme should be merged into Ostatus_profile - */ - 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; - } - } -} diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php new file mode 100644 index 000000000..e69de29bb diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php new file mode 100644 index 000000000..7085e4583 --- /dev/null +++ b/plugins/OStatus/lib/salmonaction.php @@ -0,0 +1,231 @@ +. + */ + +/** + * @package OStatusPlugin + * @author James Walker + */ + +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(_('This method requires a POST.')); + } + + if ($_SERVER['CONTENT_TYPE'] != 'application/atom+xml') { + $this->clientError(_('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') { + $this->clientError(_m('Salmon post must be an Atom entry.')); + } + // XXX: check the signature + + $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 + + // TODO : Insert new $xml -> notice code + + 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::FOLLOW: + case ActivityVerb::FRIEND: + $this->handleFollow(); + break; + case ActivityVerb::UNFOLLOW: + $this->handleUnfollow(); + break; + case ActivityVerb::JOIN: + $this->handleJoin(); + break; + default: + throw new ClientException(_("Unimplemented.")); + } + Event::handle('EndHandleSalmon', array($this->activity)); + } + } + + function handlePost() + { + throw new ClientException(_("Unimplemented!")); + } + + function handleFollow() + { + throw new ClientException(_("Unimplemented!")); + } + + function handleUnfollow() + { + throw new ClientException(_("Unimplemented!")); + } + + function handleFavorite() + { + throw new ClientException(_("Unimplemented!")); + } + + /** + * Remote user doesn't like one of our posts after all! + * Confirm the post is ours, and delete a local favorite event. + */ + + function handleUnfavorite() + { + throw new ClientException(_("Unimplemented!")); + } + + /** + * Hmmmm + */ + function handleShare() + { + throw new ClientException(_("Unimplemented!")); + } + + /** + * Hmmmm + */ + function handleJoin() + { + throw new ClientException(_("Unimplemented!")); + } + + /** + * @return Ostatus_profile + */ + function ensureProfile() + { + $actor = $this->act->actor; + if (empty($actor->id)) { + common_log(LOG_ERR, "broken actor: " . var_export($actor, true)); + throw new Exception("Received a salmon slap from unidentified actor."); + } + + return Ostatus_profile::ensureActorProfile($this->act); + } + + /** + * @fixme merge into Ostatus_profile::ensureActorProfile and friends + */ + function createProfile() + { + $actor = $this->act->actor; + + $profile = new Profile(); + + $profile->nickname = $this->nicknameFromURI($actor->id); + + if (empty($profile->nickname)) { + $profile->nickname = common_nicknamize($actor->title); + } + + $profile->fullname = $actor->title; + $profile->bio = $actor->summary; // XXX: is that right? + $profile->profileurl = $actor->link; // XXX: is that right? + $profile->created = common_sql_now(); + + $id = $profile->insert(); + + if (empty($id)) { + common_log_db_error($profile, 'INSERT', __FILE__); + throw new Exception("Couldn't save new profile for $actor->id\n"); + } + + // XXX: add avatars + + $op = new Ostatus_profile(); + + $op->profile_id = $id; + $op->homeuri = $actor->id; + $op->created = $profile->created; + + // XXX: determine feed URI from source or Webfinger or whatever + + $id = $op->insert(); + + if (empty($id)) { + common_log_db_error($op, 'INSERT', __FILE__); + throw new Exception("Couldn't save new ostatus profile for $actor->id\n"); + } + + return $profile; + } + + /** + * @fixme should be merged into Ostatus_profile + */ + 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; + } + } +} -- cgit v1.2.3-54-g00ecf From ed45df045f661e9c3b85e0657986c99c320914f0 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 20 Feb 2010 11:17:54 -0500 Subject: Cool bug! Technically good PHP syntax --- plugins/OStatus/classes/Ostatus_profile.php | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index b14b4c9a3..9f5c60561 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -149,7 +149,6 @@ class Ostatus_profile extends Memcached_DataObject function asActivityNoun($element) { $xs = new XMLStringer(true); - $avatarHref = Avatar::defaultImage(AVATAR_PROFILE_SIZE); $avatarType = 'image/png'; if ($this->isGroup()) { @@ -173,8 +172,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); @@ -672,10 +671,10 @@ class Ostatus_profile extends Memcached_DataObject // 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(); -- cgit v1.2.3-54-g00ecf From ab4ec095e811f86c50fbc1cd71144b11d6b86d50 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 20 Feb 2010 11:38:05 -0500 Subject: adjust URI, URL, and location in Ostatus_profile::processPost --- plugins/OStatus/classes/Ostatus_profile.php | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 9f5c60561..4dd565288 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -457,28 +457,33 @@ class Ostatus_profile extends Memcached_DataObject $oprofile = $this; } - if ($activity->object->link) { - $sourceUri = $activity->object->link; - } else if (preg_match('!^https?://!', $activity->object->id)) { - $sourceUri = $activity->object->id; - } else { - common_log(LOG_INFO, "OStatus: ignoring post with no source link: id $activity->object->id"); - return; - } + $sourceUri = $activity->object->id; $dupe = Notice::staticGet('uri', $sourceUri); + if ($dupe) { - common_log(LOG_INFO, "OStatus: ignoring duplicate post: $noticeLink"); + common_log(LOG_INFO, "OStatus: ignoring duplicate post: $sourceUri"); return; } + $sourceUrl = null; + + if ($activity->object->link) { + $sourceUrl = $activity->object->link; + } else if (preg_match('!^https?://!', $activity->object->id)) { + $sourceUrl = $activity->object->id; + } + // @fixme sanitize and save HTML content if available + $content = $activity->object->title; $params = array('is_local' => Notice::REMOTE_OMB, + 'url' => $sourceUrl, 'uri' => $sourceUri); - $location = $this->getEntryLocation($activity->entry); + $location = $activity->context->location; + if ($location) { $params['lat'] = $location->lat; $params['lon'] = $location->lon; -- cgit v1.2.3-54-g00ecf From 866b6470629b570b9f817553f85f6d8e801f0d43 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 20 Feb 2010 11:48:42 -0500 Subject: add hooks for OStatus notification on subscribe/unsubscribe --- plugins/OStatus/OStatusPlugin.php | 44 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index e1f3fd9d3..9e6d03177 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -335,4 +335,48 @@ class OStatusPlugin extends Plugin common_log(LOG_DEBUG, "No ostatus profile for incoming feed $feedsub->uri"); } } + + 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; + } + + // We have a local user subscribing to a remote profile; make the + // magic happen! + + $oprofile->notify($subscriber, ActivityVerb::FOLLOW); + + return true; + } + + function onEndUnsubscribe($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; + } + + // We have a local user subscribing to a remote profile; make the + // magic happen! + + $oprofile->notify($subscriber, ActivityVerb::UNFOLLOW); + + return true; + } } -- cgit v1.2.3-54-g00ecf From 97b01432e7903797e39205e46a51394feac54292 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sat, 20 Feb 2010 10:06:28 -0800 Subject: drop no-longer-used XML_Feed_Parser extlib package from OStatus plugin --- plugins/OStatus/extlib/README | 9 - plugins/OStatus/extlib/XML/Feed/Parser.php | 351 ---------------- plugins/OStatus/extlib/XML/Feed/Parser/Atom.php | 365 ---------------- .../OStatus/extlib/XML/Feed/Parser/AtomElement.php | 261 ------------ .../OStatus/extlib/XML/Feed/Parser/Exception.php | 42 -- plugins/OStatus/extlib/XML/Feed/Parser/RSS09.php | 214 ---------- .../extlib/XML/Feed/Parser/RSS09Element.php | 62 --- plugins/OStatus/extlib/XML/Feed/Parser/RSS1.php | 277 ------------ plugins/OStatus/extlib/XML/Feed/Parser/RSS11.php | 276 ------------ .../extlib/XML/Feed/Parser/RSS11Element.php | 151 ------- .../OStatus/extlib/XML/Feed/Parser/RSS1Element.php | 116 ----- plugins/OStatus/extlib/XML/Feed/Parser/RSS2.php | 335 --------------- .../OStatus/extlib/XML/Feed/Parser/RSS2Element.php | 171 -------- plugins/OStatus/extlib/XML/Feed/Parser/Type.php | 467 --------------------- .../extlib/XML/Feed/samples/atom10-entryonly.xml | 28 -- .../extlib/XML/Feed/samples/atom10-example1.xml | 20 - .../extlib/XML/Feed/samples/atom10-example2.xml | 45 -- .../OStatus/extlib/XML/Feed/samples/delicious.feed | 177 -------- .../OStatus/extlib/XML/Feed/samples/flickr.feed | 184 -------- .../extlib/XML/Feed/samples/grwifi-atom.xml | 7 - plugins/OStatus/extlib/XML/Feed/samples/hoder.xml | 102 ----- .../extlib/XML/Feed/samples/illformed_atom10.xml | 13 - .../extlib/XML/Feed/samples/rss091-complete.xml | 47 --- .../XML/Feed/samples/rss091-international.xml | 30 -- .../extlib/XML/Feed/samples/rss091-simple.xml | 15 - .../extlib/XML/Feed/samples/rss092-sample.xml | 103 ----- .../extlib/XML/Feed/samples/rss10-example1.xml | 62 --- .../extlib/XML/Feed/samples/rss10-example2.xml | 67 --- .../OStatus/extlib/XML/Feed/samples/rss2sample.xml | 42 -- .../extlib/XML/Feed/samples/sixapart-jp.xml | 226 ---------- .../extlib/XML/Feed/samples/technorati.feed | 54 --- plugins/OStatus/extlib/XML/Feed/schemas/atom.rnc | 338 --------------- plugins/OStatus/extlib/XML/Feed/schemas/rss10.rnc | 113 ----- plugins/OStatus/extlib/XML/Feed/schemas/rss11.rnc | 218 ---------- .../OStatus/extlib/xml-feed-parser-bug-16416.patch | 14 - plugins/OStatus/tests/FeedMungerTest.php | 147 ------- 36 files changed, 5149 deletions(-) delete mode 100644 plugins/OStatus/extlib/README delete mode 100755 plugins/OStatus/extlib/XML/Feed/Parser.php delete mode 100644 plugins/OStatus/extlib/XML/Feed/Parser/Atom.php delete mode 100755 plugins/OStatus/extlib/XML/Feed/Parser/AtomElement.php delete mode 100755 plugins/OStatus/extlib/XML/Feed/Parser/Exception.php delete mode 100755 plugins/OStatus/extlib/XML/Feed/Parser/RSS09.php delete mode 100755 plugins/OStatus/extlib/XML/Feed/Parser/RSS09Element.php delete mode 100755 plugins/OStatus/extlib/XML/Feed/Parser/RSS1.php delete mode 100755 plugins/OStatus/extlib/XML/Feed/Parser/RSS11.php delete mode 100755 plugins/OStatus/extlib/XML/Feed/Parser/RSS11Element.php delete mode 100755 plugins/OStatus/extlib/XML/Feed/Parser/RSS1Element.php delete mode 100644 plugins/OStatus/extlib/XML/Feed/Parser/RSS2.php delete mode 100755 plugins/OStatus/extlib/XML/Feed/Parser/RSS2Element.php delete mode 100644 plugins/OStatus/extlib/XML/Feed/Parser/Type.php delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/atom10-entryonly.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/atom10-example1.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/atom10-example2.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/delicious.feed delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/flickr.feed delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/grwifi-atom.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/hoder.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/illformed_atom10.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/rss091-complete.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/rss091-international.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/rss091-simple.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/rss092-sample.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/rss10-example1.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/rss10-example2.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/rss2sample.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/sixapart-jp.xml delete mode 100755 plugins/OStatus/extlib/XML/Feed/samples/technorati.feed delete mode 100755 plugins/OStatus/extlib/XML/Feed/schemas/atom.rnc delete mode 100755 plugins/OStatus/extlib/XML/Feed/schemas/rss10.rnc delete mode 100755 plugins/OStatus/extlib/XML/Feed/schemas/rss11.rnc delete mode 100644 plugins/OStatus/extlib/xml-feed-parser-bug-16416.patch delete mode 100644 plugins/OStatus/tests/FeedMungerTest.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/extlib/README b/plugins/OStatus/extlib/README deleted file mode 100644 index 799b40c47..000000000 --- a/plugins/OStatus/extlib/README +++ /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 - 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 index ffe8220a5..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser.php +++ /dev/null @@ -1,351 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index c7e218a1e..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/Atom.php +++ /dev/null @@ -1,365 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index 063ecb617..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/AtomElement.php +++ /dev/null @@ -1,261 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index 1e76e3f85..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/Exception.php +++ /dev/null @@ -1,42 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index 07f38f911..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/RSS09.php +++ /dev/null @@ -1,214 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index d41f36e8d..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/RSS09Element.php +++ /dev/null @@ -1,62 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index 60c9938ba..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/RSS1.php +++ /dev/null @@ -1,277 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index 3cd1ef15d..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/RSS11.php +++ /dev/null @@ -1,276 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index 75918beda..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/RSS11Element.php +++ /dev/null @@ -1,151 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index 8e36d5a9b..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/RSS1Element.php +++ /dev/null @@ -1,116 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index 0936bd2f5..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/RSS2.php +++ /dev/null @@ -1,335 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index 6edf910dc..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/RSS2Element.php +++ /dev/null @@ -1,171 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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 index 75052619b..000000000 --- a/plugins/OStatus/extlib/XML/Feed/Parser/Type.php +++ /dev/null @@ -1,467 +0,0 @@ - - * @copyright 2005 James Stewart - * @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 - * @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: - * PEAR and: - * - * 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 .= '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 index 02e1c5800..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/atom10-entryonly.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - Atom draft-07 snapshot - - - tag:example.org,2003:3.2397 - 2005-07-10T12:29:29Z - 2003-12-13T08:29:29-04:00 - - Mark Pilgrim - http://example.org/ - f8dy@example.com - - - Sam Ruby - - - Joe Gregorio - - -
-

[Update: The Atom draft is finished.]

-
-
-
\ 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 index d181d2b6f..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/atom10-example1.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - Example Feed - - 2003-12-13T18:30:02Z - - John Doe - - urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6 - - - Atom-Powered Robots Run Amok - - urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a - 2003-12-13T18:30:02Z - Some text. - - - \ 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 index 98abf9d54..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/atom10-example2.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - dive into mark - - A <em>lot</em> of effort - went into making this effortless - - 2005-07-31T12:29:29Z - tag:example.org,2003:3 - - - Copyright (c) 2003, Mark Pilgrim - - Example Toolkit - - - Atom draft-07 snapshot - - - tag:example.org,2003:3.2397 - 2005-07-31T12:29:29Z - 2003-12-13T08:29:29-04:00 - - Mark Pilgrim - http://example.org/ - f8dy@example.com - - - Sam Ruby - - - Joe Gregorio - - -
-

[Update: The Atom draft is finished.]

-
-
-
-
\ 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 index 32f9fa493..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/delicious.feed +++ /dev/null @@ -1,177 +0,0 @@ - - - - -del.icio.us/tag/greenbelt -http://del.icio.us/tag/greenbelt -Text - - - - - - - - - - - - - - - - -Greenbelt - Homepage Section -http://www.greenbelt.org.uk/ -jonnybaker -2005-05-16T16:30:38Z -greenbelt - - - - - - - - -Greenbelt festival (uk) -http://www.greenbelt.org.uk/ -sssshhhh -2005-05-14T18:19:40Z -audiology festival gigs greenbelt - - - - - - - - - - - -Natuerlichwien.at - Rundumadum -http://www.natuerlichwien.at/rundumadum/dergruenguertel/ -egmilman47 -2005-05-06T21:33:41Z -Austria Vienna Wien greenbelt nature walking - - - - - - - - - - - - - -Tank - GBMediaWiki -http://www.flickerweb.co.uk/wiki/index.php/Tank#Seminars -jystewart -2005-03-21T22:44:11Z -greenbelt - - - - - - - - -Greenbelt homepage -http://www.greenbelt.ca/home.htm -Gooberoo -2005-03-01T22:43:17Z -greenbelt ontario - - - - - - - - - -Pip Wilson bhp ...... blog -http://pipwilsonbhp.blogspot.com/ -sssshhhh -2004-12-27T11:20:51Z -Greenbelt friend ideas links thinking weblog - - - - - - - - - - - - - -maggi dawn -http://maggidawn.typepad.com/maggidawn/ -sssshhhh -2004-12-27T11:20:11Z -Greenbelt ideas links thinking weblog - - - - - - - - - - - - -John Davies -http://www.johndavies.org/ -sssshhhh -2004-12-27T11:18:37Z -Greenbelt ideas links thinking weblog - - - - - - - - - - - - -jonnybaker -http://jonnybaker.blogs.com/ -sssshhhh -2004-12-27T11:18:17Z -Greenbelt event ideas links resources thinking weblog youth - - - - - - - - - - - - - - - diff --git a/plugins/OStatus/extlib/XML/Feed/samples/flickr.feed b/plugins/OStatus/extlib/XML/Feed/samples/flickr.feed deleted file mode 100755 index 57e83af57..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/flickr.feed +++ /dev/null @@ -1,184 +0,0 @@ - - - - jamesstewart - Everyone's Tagged Photos - - - A feed of jamesstewart - Everyone's Tagged Photos - 2005-08-01T18:50:26Z - Flickr - - - Oma and James - - - tag:flickr.com,2004:/photo/30367516 - 2005-08-01T18:50:26Z - 2005-08-01T18:50:26Z - <p><a href="http://www.flickr.com/people/30484029@N00/">kstewart</a> posted a photo:</p> - -<p><a href="http://www.flickr.com/photos/30484029@N00/30367516/" title="Oma and James"><img src="http://photos23.flickr.com/30367516_1f685a16e8_m.jpg" width="240" height="180" alt="Oma and James" style="border: 1px solid #000000;" /></a></p> - -<p>I have a beautiful Oma and a gorgeous husband.</p> - - kstewart - http://www.flickr.com/people/30484029@N00/ - - jamesstewart oma stoelfamily - - - - - tag:flickr.com,2004:/photo/21376174 - 2005-06-25T02:00:35Z - 2005-06-25T02:00:35Z - <p><a href="http://www.flickr.com/people/buddscreek/">Lan Rover</a> posted a photo:</p> - -<p><a href="http://www.flickr.com/photos/buddscreek/21376174/" title=""><img src="http://photos17.flickr.com/21376174_4314fd8d5c_m.jpg" width="240" height="160" alt="" style="border: 1px solid #000000;" /></a></p> - -<p>AMA Motocross Championship 2005, Budds Creek, Maryland</p> - - Lan Rover - http://www.flickr.com/people/buddscreek/ - - amamotocrosschampionship buddscreek maryland 2005 fathersday motocrossnational rickycarmichael 259 jamesstewart 4 - - - - - tag:flickr.com,2004:/photo/21375650 - 2005-06-25T01:56:24Z - 2005-06-25T01:56:24Z - <p><a href="http://www.flickr.com/people/buddscreek/">Lan Rover</a> posted a photo:</p> - -<p><a href="http://www.flickr.com/photos/buddscreek/21375650/" title=""><img src="http://photos16.flickr.com/21375650_5c60e0dab1_m.jpg" width="240" height="160" alt="" style="border: 1px solid #000000;" /></a></p> - - - - Lan Rover - http://www.flickr.com/people/buddscreek/ - - amamotocrosschampionship buddscreek maryland 2005 fathersday motocrossnational 259 jamesstewart - - - - - tag:flickr.com,2004:/photo/21375345 - 2005-06-25T01:54:11Z - 2005-06-25T01:54:11Z - <p><a href="http://www.flickr.com/people/buddscreek/">Lan Rover</a> posted a photo:</p> - -<p><a href="http://www.flickr.com/photos/buddscreek/21375345/" title=""><img src="http://photos15.flickr.com/21375345_4205fdd22b_m.jpg" width="160" height="240" alt="" style="border: 1px solid #000000;" /></a></p> - - - - Lan Rover - http://www.flickr.com/people/buddscreek/ - - amamotocrosschampionship buddscreek maryland 2005 fathersday motocrossnational 259 jamesstewart - - - Lunch with Kari & James, café in the crypt of St Martin in the fields - - tag:flickr.com,2004:/photo/16516618 - 2005-05-30T21:56:39Z - 2005-05-30T21:56:39Z - <p><a href="http://www.flickr.com/people/fidothe/">fidothe</a> posted a photo:</p> - -<p><a href="http://www.flickr.com/photos/fidothe/16516618/" title="Lunch with Kari &amp; James, café in the crypt of St Martin in the fields"><img src="http://photos14.flickr.com/16516618_afaa4a395e_m.jpg" width="240" height="180" alt="Lunch with Kari &amp; James, café in the crypt of St Martin in the fields" style="border: 1px solid #000000;" /></a></p> - - - - fidothe - http://www.flickr.com/people/fidothe/ - - nokia7610 london stmartininthefields clarepatterson jamesstewart parvinstewart jimstewart susanstewart - - - Stewart keeping it low over the obstacle. - - tag:flickr.com,2004:/photo/10224728 - 2005-04-21T07:30:29Z - 2005-04-21T07:30:29Z - <p><a href="http://www.flickr.com/people/pqbon/">pqbon</a> posted a photo:</p> - -<p><a href="http://www.flickr.com/photos/pqbon/10224728/" title="Stewart keeping it low over the obstacle."><img src="http://photos7.flickr.com/10224728_b756341957_m.jpg" width="240" height="180" alt="Stewart keeping it low over the obstacle." style="border: 1px solid #000000;" /></a></p> - - - - pqbon - http://www.flickr.com/people/pqbon/ - - ama hangtown motocross jamesstewart bubba - - - king james stewart - - tag:flickr.com,2004:/photo/7152910 - 2005-03-22T21:53:37Z - 2005-03-22T21:53:37Z - <p><a href="http://www.flickr.com/people/jjlook/">jj look</a> posted a photo:</p> - -<p><a href="http://www.flickr.com/photos/jjlook/7152910/" title="king james stewart"><img src="http://photos7.flickr.com/7152910_a02ab5a750_m.jpg" width="180" height="240" alt="king james stewart" style="border: 1px solid #000000;" /></a></p> - -<p>11th</p> - - jj look - http://www.flickr.com/people/jjlook/ - - dilomar05 eastside austin texas 78702 kingjames stewart jamesstewart borrowed - - - It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson) - - tag:flickr.com,2004:/photo/1586562 - 2004-11-20T09:34:28Z - 2004-11-20T09:34:28Z - <p><a href="http://www.flickr.com/people/fidothe/">fidothe</a> posted a photo:</p> - -<p><a href="http://www.flickr.com/photos/fidothe/1586562/" title="It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson)"><img src="http://photos2.flickr.com/1586562_0bc5313a3e_m.jpg" width="240" height="180" alt="It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson)" style="border: 1px solid #000000;" /></a></p> - - - - fidothe - http://www.flickr.com/people/fidothe/ - - holiday grandrapids jamesstewart - - - It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson) - - tag:flickr.com,2004:/photo/1586539 - 2004-11-20T09:28:16Z - 2004-11-20T09:28:16Z - <p><a href="http://www.flickr.com/people/fidothe/">fidothe</a> posted a photo:</p> - -<p><a href="http://www.flickr.com/photos/fidothe/1586539/" title="It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson)"><img src="http://photos2.flickr.com/1586539_c51e5f2e7a_m.jpg" width="240" height="180" alt="It's a Grind, downtown Grand Rapids (James, Susan, Jim, Harv, Lawson)" style="border: 1px solid #000000;" /></a></p> - - - - fidothe - http://www.flickr.com/people/fidothe/ - - holiday grandrapids jamesstewart - - - It's a Grind, James and Jim can't decide) - - tag:flickr.com,2004:/photo/1586514 - 2004-11-20T09:25:05Z - 2004-11-20T09:25:05Z - <p><a href="http://www.flickr.com/people/fidothe/">fidothe</a> posted a photo:</p> - -<p><a href="http://www.flickr.com/photos/fidothe/1586514/" title="It's a Grind, James and Jim can't decide)"><img src="http://photos2.flickr.com/1586514_733c2dfa3e_m.jpg" width="240" height="180" alt="It's a Grind, James and Jim can't decide)" style="border: 1px solid #000000;" /></a></p> - - - - fidothe - http://www.flickr.com/people/fidothe/ - - holiday grandrapids jamesstewart johnkentish - - - \ 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 index c351d3c16..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/grwifi-atom.xml +++ /dev/null @@ -1,7 +0,0 @@ - Updates to Grand Rapids WiFi hotspot details 2005-09-01T15:43:01-05:00 WiFi Hotspots in Grand Rapids, MI http://grwifi.net/atom/locations Creative Commons Attribution-NonCommercial-ShareAlike 2.0 http://creativecommons.org/licenses/by-nc-sa/2.0/ Hotspot Details Updated: Sweetwaters http://grwifi.net/location/sweetwaters 2005-09-01T15:43:01-05:00 The details of the WiFi hotspot at: Sweetwaters have been updated. Find out more at: -http://grwifi.net/location/sweetwaters James http://jystewart.net james@jystewart.net wifi hotspot Hotspot Details Updated: Common Ground Coffee Shop http://grwifi.net/location/common-ground 2005-09-01T15:42:39-05:00 The details of the WiFi hotspot at: Common Ground Coffee Shop have been updated. Find out more at: -http://grwifi.net/location/common-ground James http://jystewart.net james@jystewart.net wifi hotspot Hotspot Details Updated: Grand Rapids Public Library, Main Branch http://grwifi.net/location/grpl-main-branch 2005-09-01T15:42:20-05:00 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 James http://jystewart.net james@jystewart.net wifi hotspot Hotspot Details Updated: Four Friends Coffee House http://grwifi.net/location/four-friends 2005-09-01T15:41:35-05:00 The details of the WiFi hotspot at: Four Friends Coffee House have been updated. Find out more at: -http://grwifi.net/location/four-friends James http://jystewart.net james@jystewart.net wifi hotspot Hotspot Details Updated: Barnes and Noble, Rivertown Crossings http://grwifi.net/location/barnes-noble-rivertown 2005-09-01T15:40:41-05:00 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 James http://jystewart.net james@jystewart.net wifi hotspot Hotspot Details Updated: The Boss Sports Bar & Grille http://grwifi.net/location/boss-sports-bar 2005-09-01T15:40:19-05:00 The details of the WiFi hotspot at: The Boss Sports Bar & Grille have been updated. Find out more at: -http://grwifi.net/location/boss-sports-bar James http://jystewart.net james@jystewart.net wifi hotspot \ 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 index 099463570..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/hoder.xml +++ /dev/null @@ -1,102 +0,0 @@ - - - - -Editor: Myself (Persian) -http://editormyself.info -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. -en-us -hoder@hotmail.com -2005-10-12T19:45:32-05:00 - -hourly -1 -2000-01-01T12:00+00:00 - - - -لينکدونی‌ | جلسه‌ی امریکن انترپرایز برای تقسیم قومی ایران -http://www.aei.org/events/type.upcoming,eventID.1166,filter.all/event_detail.asp -چطور بعضی‌ها فکر می‌کنند دست راستی‌های آمریکا از خامنه‌ای ملی‌گراترند -14645@http://i.hoder.com/ -iran -2005-10-12T19:45:32-05:00 - - - -لينکدونی‌ | به صبحانه آگهی بدهید -http://www.adbrite.com/mb/commerce/purchase_form.php?opid=24346&afsid=1 -خیلی ارزان و راحت است -14644@http://i.hoder.com/ -media/journalism -2005-10-12T17:23:15-05:00 - - - -لينکدونی‌ | نیروی انتظامی چگونه تابوهای هم‌جنس‌گرایانه را می‌شکند؛ فرنگوپولیس -http://farangeopolis.blogspot.com/2005/10/blog-post_08.html -از پس و پیش و حاشیه‌ی این ماجرا می‌توان یک مستند بی‌نظیر ساخت -14643@http://i.hoder.com/ -soc_popculture -2005-10-12T17:06:40-05:00 - - - -لينکدونی‌ | بازتاب توقیف شد -http://www.baztab.com/news/30201.php -اگر گفتید یک وب‌سایت را چطور توقیف می‌کنند؟ لابد ماوس‌شان را قایم می‌کنند. -14642@http://i.hoder.com/ -media/journalism -2005-10-12T14:41:57-05:00 - - - -لينکدونی‌ | رشد وب در سال 2005 از همیشه بیشتر بوده است" بی.بی.سی -http://news.bbc.co.uk/2/hi/technology/4325918.stm - -14640@http://i.hoder.com/ -tech -2005-10-12T13:04:46-05:00 - - - - - -==قرعه کشی گرین کارد به زودی شروع می‌شود== -http://nice.newsxphotos.biz/05/09/2007_dv_lottery_registration_to_begin_oct_5_14589.php - -14613@http://vagrantly.com -ads03 -2005-09-27T04:49:22-05:00 - - - - - - - - -پروژه‌ی هاروارد، قدم دوم -http://editormyself.info/archives/2005/10/051012_014641.shtml -اگر یادتان باشد چند وقت پیش نوشتم که دانشگاه هاروارد پروژه‌ای دارد با نام آواهای جهانی که در آن به وبلاگ‌های غیر انگلیسی‌زبان می‌پردازد. خواشتم که اگر کسی علاقه دارد ایمیل بزند. تعداد زیادی جواب دادند و ابراز علاقه کردند. حالا وقت قدم دوم است.

- -

قدم دوم این است که برای اینکه مسوولین پروژه بتوانند تصمیم بگیرند که با چه کسی کار کنند، می‌خواهند نمونه‌ی کارهای علاقمندان مشارکت در این پرزو‌ه را ببینند.

- -

برای همین از همه‌ی علاقماندان، حتی کسانی که قبلا اعلام آمادگی نکرده بودند، می‌‌خواهم که یک موضوع رایج این روزهای وبلاگستان فارسی را انتخاب کنند و در هفتصد کلمه، به انگلیسی، بنویسند که وبلاگ‌دارهای درباره‌اش چه می‌گویند. لینک به پنج، شش وبلاگ و بازنویسی آنچه آنها از جنبه‌های گوناگون درباره‌ی آن موضوع نوشته‌اند با نقل قول مستقیم از آنها (البته ترجمه شده از فارسی) کافی است. دو سه جمله هم اول کار توضیح دهید که چرا این موضوع مهم است.

- -

متن نمونه را به آدرس ایمیل من hoder@hoder.com و نیز برای افراد زیر تا روز دوشنبه بفرستید:
-ربکا : rmackinnon@cyber.law.harvard.edu
-هیثم: haitham.sabbah@gmail.com

]]>
-14641@http://editormyself.info -weblog -2005-10-12T14:04:23-05:00 -
- - - -
-
\ 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 index 612186897..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/illformed_atom10.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - Example author - me@example.com - http://example.com/ - - - - - - -Copyright 1997-1999 UserLand Software, Inc. -Thu, 08 Jul 1999 07:00:00 GMT -Thu, 08 Jul 1999 16:20:26 GMT -http://my.userland.com/stories/storyReader$11 -News and commentary from the cross-platform scripting community. -http://www.scripting.com/ -Scripting News - -http://www.scripting.com/ -Scripting News -http://www.scripting.com/gifs/tinyScriptingNews.gif -40 -78 -What is this used for? - -dave@userland.com (Dave Winer) -dave@userland.com (Dave Winer) -en-us - -6 -7 -8 -9 -10 -11 - - -Sunday - -(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)) - -stuff -http://bar -This is an article about some stuff - - -Search Now! -Enter your search <terms> -find -http://my.site.com/search.cgi - - - \ 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 index cfe91691f..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/rss091-international.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - -膮ŸÛë´é´Ì´×´è´ŒÁ¹´Õ -http://www.mozilla.org -膮ŸÛë´é´Ì´×´è´ŒÁ¹´Õ -ja - -NYÒ™Á¢¸»ÌêÛì15285.25´ƒ´‘Á£´Û´—´ÀÁ¹´ê´Ì´éÒ™Ûì¡êçÒÕ‰ÌêÁ£ -http://www.mozilla.org/status/ -This is an item description... - - -‚§±Çç¡ËßÛÂҏéøÓ¸Á£Ë²®Ÿè†Ûè危ÇÌ’¡Íæ—éøë‡Á£ -http://www.mozilla.org/status/ -This is an item description... - - -ËÜË”ïÌëÈšÁ¢È†Ë§æàÀ豎ˉۂÁ¢Ë‚åܼšÛ˜íËüËÁ£ -http://www.mozilla.org/status/ -This is an item description... - - -2000‚øíŠåÁ¢«‘¦éÛ빏ېçéÛ§ÛÂè†ÒæÓ¸Á£Ì¾«…æ—ÕÝéøƒ¸Á£ -http://www.mozilla.org/status/ -This is an item description... - - - \ 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 index f0964a227..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/rss091-simple.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - -en -News and commentary from the cross-platform scripting community. -http://www.scripting.com/ -Scripting News - -http://www.scripting.com/ -Scripting News -http://www.scripting.com/gifs/tinyScriptingNews.gif - - - \ 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 index 5d75c352b..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/rss092-sample.xml +++ /dev/null @@ -1,103 +0,0 @@ - - - - - Dave Winer: Grateful Dead - http://www.scripting.com/blog/categories/gratefulDead.html - A high-fidelity Grateful Dead song every day. This is where we're experimenting with enclosures on RSS news items that download when you'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. - Fri, 13 Apr 2001 19:23:02 GMT - http://backend.userland.com/rss092 - dave@userland.com (Dave Winer) - dave@userland.com (Dave Winer) - - - It'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's #16 on the hotlist of upstreaming Radio users, there's no way of knowing how many non-upstreaming users are subscribing, have to do something about this..). Anyway, tonight's song is a live version of Weather Report Suite from Dick's Picks Volume 7. It's wistful music. Of course a beautiful song, oft-quoted here on Scripting News. <i>A little change, the wind and rain.</i> - - - - - Kevin Drennan started a <a href="http://deadend.editthispage.com/">Grateful Dead Weblog</a>. Hey it's cool, he even has a <a href="http://deadend.editthispage.com/directory/61">directory</a>. <i>A Frontier 7 feature.</i> - Scripting News - - - <a href="http://arts.ucsc.edu/GDead/AGDL/other1.html">The Other One</a>, live instrumental, One From The Vault. Very rhythmic very spacy, you can listen to it many times, and enjoy something new every time. - - - - This is a test of a change I just made. Still diggin.. - - - The HTML rendering almost <a href="http://validator.w3.org/check/referer">validates</a>. 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't know. If you're blind send me an email if u cn rd ths. - - - <a href="http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/Franklin's_Tower.txt">Franklin's Tower</a>, a live version from One From The Vault. - - - - Moshe Weitzman says Shakedown Street is what I'm lookin for for tonight. I'm listening right now. It's one of my favorites. "Don't tell me this town ain't got no heart." Too bright. I like the jazziness of Weather Report Suite. Dreamy and soft. How about The Other One? "Spanish lady come to me.." - Scripting News - - - <a href="http://www.scripting.com/mp3s/youWinAgain.mp3">The news is out</a>, all over town..<p> -You've been seen, out runnin round. <p> -The lyrics are <a href="http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/You_Win_Again.txt">here</a>, short and sweet. <p> -<i>You win again!</i> - - - - - <a href="http://www.getlyrics.com/lyrics/grateful-dead/wake-of-the-flood/07.htm">Weather Report Suite</a>: "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." - - - - <a href="http://arts.ucsc.edu/gdead/agdl/darkstar.html">Dark Star</a> crashes, pouring its light into ashes. - - - - DaveNet: <a href="http://davenet.userland.com/2001/01/21/theUsBlues">The U.S. Blues</a>. - - - Still listening to the US Blues. <i>"Wave that flag, wave it wide and high.."</i> Mistake made in the 60s. We gave our country to the assholes. Ah ah. Let's take it back. Hey I'm still a hippie. <i>"You could call this song The United States Blues."</i> - - - <a href="http://www.sixties.com/html/garcia_stack_0.html"><img src="http://www.scripting.com/images/captainTripsSmall.gif" height="51" width="42" border="0" hspace="10" vspace="10" align="right"></a>In celebration of today'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 <a href="http://searchlyrics2.homestead.com/gd_usblues.html">lyrics</a>. Click on the audio icon to the left to give it a listen. "Red and white, blue suede shoes, I'm Uncle Sam, how do you do?" It's a different kind of patriotic music, but man I love my country and I love Jerry and the band. <i>I truly do!</i> - - - - Grateful Dead: "Tennessee, Tennessee, ain't no place I'd rather be." - - - - Ed Cone: "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'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." - - - - <a href="http://arts.ucsc.edu/GDead/AGDL/fotd.html">Tonight's Song</a>: "If I get home before daylight I just might get some sleep tonight." - - - - <a href="http://arts.ucsc.edu/GDead/AGDL/uncle.html">Tonight's song</a>: "Come hear Uncle John's Band by the river side. Got some things to talk about here beside the rising tide." - - - - <a href="http://www.cs.cmu.edu/~mleone/gdead/dead-lyrics/Me_and_My_Uncle.txt">Me and My Uncle</a>: "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." - - - - - Truckin, like the doo-dah man, once told me gotta play your hand. Sometimes the cards ain't worth a dime, if you don't lay em down. - - - - Two-Way-Web: <a href="http://www.thetwowayweb.com/payloadsForRss">Payloads for RSS</a>. "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't want to hear about it." - - - A touch of gray, kinda suits you anyway.. - - - - <a href="http://www.sixties.com/html/garcia_stack_0.html"><img src="http://www.scripting.com/images/captainTripsSmall.gif" height="51" width="42" border="0" hspace="10" vspace="10" align="right"></a>In celebration of today'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 <a href="http://searchlyrics2.homestead.com/gd_usblues.html">lyrics</a>. Click on the audio icon to the left to give it a listen. "Red and white, blue suede shoes, I'm Uncle Sam, how do you do?" It's a different kind of patriotic music, but man I love my country and I love Jerry and the band. <i>I truly do!</i> - - - - \ 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 index 0edecf58e..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/rss10-example1.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - XML.com - http://xml.com/pub - - XML.com features a rich mix of information and services - for the XML community. - - - - - - - - - - - - - - - - - XML.com - http://www.xml.com - http://xml.com/universal/images/xml_tiny.gif - - - - Processing Inclusions with XSLT - http://xml.com/pub/2000/08/09/xslt/xslt.html - - Processing document inclusions with general XML tools can be - problematic. This article proposes a way of preserving inclusion - information through SAX-based processing. - - - - - Putting RDF to Work - http://xml.com/pub/2000/08/09/rdfdb/index.html - - 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. - - - - - Search XML.com - Search XML.com's XML collection - s - http://search.xml.com - - - \ 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 index 26235f78f..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/rss10-example2.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - Meerkat - http://meerkat.oreillynet.com - Meerkat: An Open Wire Service - The O'Reilly Network - Rael Dornfest (mailto:rael@oreilly.com) - Copyright © 2000 O'Reilly & Associates, Inc. - 2000-01-01T12:00+00:00 - hourly - 2 - 2000-01-01T12:00+00:00 - - - - - - - - - - - - - - - Meerkat Powered! - http://meerkat.oreillynet.com/icons/meerkat-powered.jpg - http://meerkat.oreillynet.com - - - - XML: A Disruptive Technology - http://c.moreover.com/click/here.pl?r123 - - XML is placing increasingly heavy loads on the existing technical - infrastructure of the Internet. - - The O'Reilly Network - Simon St.Laurent (mailto:simonstl@simonstl.com) - Copyright © 2000 O'Reilly & Associates, Inc. - XML - XML.com - NASDAQ - XML - - - - Search Meerkat - Search Meerkat's RSS Database... - s - http://meerkat.oreillynet.com/ - search - regex - - - \ 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 index 53483cc51..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/rss2sample.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - Liftoff News - http://liftoff.msfc.nasa.gov/ - Liftoff to Space Exploration. - en-us - Tue, 10 Jun 2003 04:00:00 GMT - Tue, 10 Jun 2003 09:41:01 GMT - http://blogs.law.harvard.edu/tech/rss - Weblog Editor 2.0 - editor@example.com - webmaster@example.com - - Star City - http://liftoff.msfc.nasa.gov/news/2003/news-starcity.asp - 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 <a href="http://howe.iki.rssi.ru/GCTC/gctc_e.htm">Star City</a>. - Tue, 03 Jun 2003 09:39:21 GMT - http://liftoff.msfc.nasa.gov/2003/06/03.html#item573 - - - Sky watchers in Europe, Asia, and parts of Alaska and Canada will experience a <a href="http://science.nasa.gov/headlines/y2003/30may_solareclipse.htm">partial eclipse of the Sun</a> on Saturday, May 31st. - Fri, 30 May 2003 11:06:42 GMT - http://liftoff.msfc.nasa.gov/2003/05/30.html#item572 - - - The Engine That Does More - http://liftoff.msfc.nasa.gov/news/2003/news-VASIMR.asp - 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. - Tue, 27 May 2003 08:37:32 GMT - http://liftoff.msfc.nasa.gov/2003/05/27.html#item571 - Test content

]]>
-
- - Astronauts' Dirty Laundry - http://liftoff.msfc.nasa.gov/news/2003/news-laundry.asp - Compared to earlier spacecraft, the International Space Station has many luxuries, but laundry facilities are not one of them. Instead, astronauts have other options. - Tue, 20 May 2003 08:56:02 GMT - http://liftoff.msfc.nasa.gov/2003/05/20.html#item570 - -
-
\ 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 index f8a04bba5..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/sixapart-jp.xml +++ /dev/null @@ -1,226 +0,0 @@ - - - -Six Apart - News -http://www.sixapart.jp/ - -ja -Copyright 2005 -Fri, 07 Oct 2005 19:09:34 +0900 -http://www.movabletype.org/?v=3.2-ja -http://blogs.law.harvard.edu/tech/rss - - -ファイブ・ディーが、Movable Typeでブログプロモーションをスタート -MIYAZAWAblog_banner.jpg
-ファイブ・ディーは、Movable Typeで構築したプロモーション ブログ『宮沢和史 中南米ツアーblog Latin America 2005』を開設しました。

- -

9月21日に開設されたこのブログは、ブラジル、ホンジュラス、ニカラグア、メキシコ、キューバの5か国を巡る「Latin America 2005」ツアーに合わせ、そのツアーの模様を同行マネージャーがレポートしていきます。
-さらに今月2日からは宮沢和史自身が日々録音した声をPodcastingするという点でも、ブログを使ったユニークなプロモーションとなっています。

- -

「宮沢和史 中南米ツアーblog Latin America 2005」

- -

※シックス・アパートではこうしたブログを使ったプロモーションに最適な製品をご用意しております。
-

]]>
-http://www.sixapart.jp/news/2005/10/07-1909.html -http://www.sixapart.jp/news/2005/10/07-1909.html -news -Fri, 07 Oct 2005 19:09:34 +0900 -
- -Movable Type 3.2日本語版の提供を開始 -Movable Type Logo

-

シックス・アパートは、Movable Type 3.2日本語版の提供を開始いたしました。
-ベータテストにご協力いただいた多くの皆様に、スタッフ一同、心から感謝いたします。

-

製品概要など、詳しくはプレスリリースをご参照下さい。

-

ご購入のご検討は、Movable Typeのご購入からどうぞ。

]]>
-http://www.sixapart.jp/news/2005/09/29-1530.html -http://www.sixapart.jp/news/2005/09/29-1530.html -news -Thu, 29 Sep 2005 15:30:00 +0900 -
- -シックス・アパートが、スパム対策強化の「Movable Type 3.2 日本語版」を提供開始 -<プレスリリース資料>

- -

シックス・アパートが、スパム対策強化の「Movable Type 3.2 日本語版」を提供開始 ~ スパムの自動判別機能や新ユーザー・インターフェースで、運用管理の機能を強化 ~

-

2005年9月29日
-シックス・アパート株式会社

-

ブログ・ソフトウェア大手のシックス・アパート株式会社(本社:東京都港区、代表取締役:関 信浩)は、「Movable Type(ムーバブル・タイプ) 3.2 日本語版」(URL:http://www.sixapart.jp/movabletype/)を9月29日より提供開始いたします。

]]>
-http://www.sixapart.jp/press_releases/2005/09/29-1529.html -http://www.sixapart.jp/press_releases/2005/09/29-1529.html -Press Releases -Thu, 29 Sep 2005 15:29:00 +0900 -
- -スタッフを募集しています -シックス・アパートはMovable TypeやTypePadの開発エンジニアなど、スタッフを広く募集しています。具体的な募集職種は次の通りです。

- - - -

拡大を続ける、日本のブログ市場を積極的にリードする人材を、シックス・アパートは募集しています。上記以外の職種につきましても、お気軽にお問い合わせください。詳しい募集要項や応募方法については、求人情報のページをご覧ください。
-

]]>
-http://www.sixapart.jp/news/2005/09/27-0906.html -http://www.sixapart.jp/news/2005/09/27-0906.html -news -Tue, 27 Sep 2005 09:06:10 +0900 -
- -サイト接続不具合に関するお詫びと復旧のお知らせ -9月24日(土)の14:45ごろから、同日18:30ごろまで、シックス・アパート社のウェブサイトが不安定になっており、断続的に接続できない不具合が発生しておりました。このため、この期間中にウェブサイトの閲覧や製品のダウンロードができませんでした。

- -

なお現在は不具合は解消しております。みなさまにご迷惑をおかけしたことをお詫びいたします。

]]>
-http://www.sixapart.jp/news/2005/09/26-1000.html -http://www.sixapart.jp/news/2005/09/26-1000.html -news -Mon, 26 Sep 2005 10:00:56 +0900 -
- -企業ブログ向けパッケージ「TypePad Promotion」を新発売 -シックス・アパートは、ウェブログ・サービスTypePadの企業ブログ向けパッケージ「TypePad Promotion」(タイプパッド・プロモーションの発売を10月下旬から開始いたします。

- -

詳しくは、プレスリリースをご参照下さい。

]]>
-http://www.sixapart.jp/news/2005/09/20-1500.html -http://www.sixapart.jp/news/2005/09/20-1500.html -news -Tue, 20 Sep 2005 15:00:01 +0900 -
- -シックス・アパートが、法人向けブログパッケージ「TypePad Promotion」を発売 -<プレスリリース資料>
-印刷用(PDF版)

- -


-シックス・アパートが、法人向けブログパッケージ「TypePad Promotion」を発売
-~PR/IRサイトやキャンペーンサイトなど企業のプロモーションニーズに特化~
-

-2005年9月20日
-シックス・アパート株式会社

- -

ブログ・サービス大手のシックス・アパート株式会社(本社:東京都港区、代表取締役:関 信浩)は、法人向けプロモーションブログ・パッケージ「TypePad Promotion(タイプパッド・プロモーション)」(URL:http://www.sixapart.jp/typepad/typepad_promotion.html)を10月下旬より販売開始いたします。

]]>
-http://www.sixapart.jp/press_releases/2005/09/20-1500.html -http://www.sixapart.jp/press_releases/2005/09/20-1500.html -Press Releases -Tue, 20 Sep 2005 15:00:00 +0900 -
- -Six [days] Apart Week -本日、9月16日はSix Apartの創業者ミナ・トロットの誕生日です。
-私たちの会社は、創業者のトロット夫妻(ベンとミナ)の誕生日が、6日離れていることからSix [days] Apart →Six Apartという風に名付けられています。本日から22日までの6日間を社名の由来となる Six [days] Apart Weekとして、私たちのプロダクトをご紹介させていただきます。

- -

今日は、ブログ・サービスのTypePad(タイプパッド)をご紹介します。
-tp-logo.gif

- -

TypePadは、米国PC MAGAZINE誌の2003年EDITOR'S CHOICE とBEST OF THE YEARに選ばれております。
-pcmag-ad.gif
-

]]>
-http://www.sixapart.jp/news/2005/09/16-1941.html -http://www.sixapart.jp/news/2005/09/16-1941.html -news -Fri, 16 Sep 2005 19:41:47 +0900 -
- -ハイパーワークスが商用フォントを利用できるMovable Typeホスティングサービスを開始 -ソフト開発会社の有限会社ハイパーワークスは、商用フォントなど多彩なフォントをブログ上で利用できるブログ・サービス「Glyph-On!(グリフォン) Movable Type ホスティング サービス」の提供を開始しました。
-

]]>
-http://www.sixapart.jp/news/2005/09/14-1700.html -http://www.sixapart.jp/news/2005/09/14-1700.html -news -Wed, 14 Sep 2005 17:00:00 +0900 -
- -Movable Type開発エンジニアの募集 - -勤務形態: フルタイム
-勤務地: 東京 (赤坂)
-職種: ソフトウェア・エンジニア
-職務内容: Movable Typeの開発業務全般
-募集人数: 若干名 -

]]>
-http://www.sixapart.jp/jobs/2005/09/13-0007.html -http://www.sixapart.jp/jobs/2005/09/13-0007.html -Jobs -Tue, 13 Sep 2005 00:07:00 +0900 -
- -TypePad開発エンジニアの募集 - -勤務形態: フルタイム
-勤務地: 東京 (赤坂)
-職種: アプリケーション・エンジニア
-職務内容: TypePadのカスタマイズ、周辺開発
-募集人数: 若干名 -

]]>
-http://www.sixapart.jp/jobs/2005/09/13-0004.html -http://www.sixapart.jp/jobs/2005/09/13-0004.html -Jobs -Tue, 13 Sep 2005 00:04:00 +0900 -
- -カスタマーサポート・ディレクターの募集 -勤務形態: フルタイム
-勤務地: 東京(赤坂)
-職種: カスタマーサポート・ディレクター
-職務内容: TypePadやMovable Typeのカスタマーサポート業務の統括
-募集人数: 若干名 -

-]]>
-http://www.sixapart.jp/jobs/2005/09/13-0003.html -http://www.sixapart.jp/jobs/2005/09/13-0003.html -Jobs -Tue, 13 Sep 2005 00:03:30 +0900 -
- -アルバイト(マーケティング・広報アシスタント)の募集 -勤務形態: アルバイト
-勤務地: 東京(港区)
-職種:マーケティング・PRのアシスタント業務
-募集人数: 若干名
-時給:1000円~(但し、試用期間終了後に応相談)。交通費支給
-時間:平日10時30分~18時30分まで。週3日以上(応相談)
-

]]>
-http://www.sixapart.jp/jobs/2005/09/13-0002.html -http://www.sixapart.jp/jobs/2005/09/13-0002.html -Jobs -Tue, 13 Sep 2005 00:02:00 +0900 -
- -アルバイト(開発アシスタント)の募集 -勤務形態: アルバイト
-勤務地: 東京(港区)
-職種: アプリケーション開発のアシスタント業務
-募集人数: 若干名
-時給:1000円~(但し、試用期間終了後に応相談)。交通費支給
-時間:平日10時30分~18時30分まで。週3日以上(応相談) -

]]>
-http://www.sixapart.jp/jobs/2005/09/13-0001.html -http://www.sixapart.jp/jobs/2005/09/13-0001.html -Jobs -Tue, 13 Sep 2005 00:01:00 +0900 -
- -TypePad Japan がバージョンアップしました。 -「TypePad Japan(タイプパッドジャパン)」において、本日、「TypePad 1.6 日本語版」へのバージョンアップを行いました。最新版となる「TypePad 1.6 日本語版」では、ブログデザインの機能強化、ポッドキャスティング対応、モブログ対応に加え、今回新たに大幅な容量アップが行われております。皆様、新しくなったTypePad Japanにどうぞご期待ください。

- -

なお、TypePadの携帯対応強化に関しましては、本日よりTypePad Japanのお客様を対象にオープン・ベータを開始しております。

- -

2005年9月5日発表のTypePad日本語版 1.6プレスリリースはこちらをご覧下さい。

]]>
-http://www.sixapart.jp/news/2005/09/12-1953.html -http://www.sixapart.jp/news/2005/09/12-1953.html -news -Mon, 12 Sep 2005 19:53:07 +0900 -
- - -
-
\ 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 index 6274a32cd..000000000 --- a/plugins/OStatus/extlib/XML/Feed/samples/technorati.feed +++ /dev/null @@ -1,54 +0,0 @@ - - - - [Technorati] Tag results for greenbelt - http://www.technorati.com/tag/greenbelt - Posts tagged with "greenbelt" on Technorati. - Mon, 08 Aug 2005 15:15:08 GMT - greenbelt - 2 - 2 - - Technorati v1.0 - - http://static.technorati.com/pix/logos/logo_reverse_sm.gif - Technorati logo - http://www.technorati.com - - - 1 - 7 - 9 - - support@technorati.com (Technorati Support) - http://blogs.law.harvad.edu/tech/rss - 60 - - Greenbelt - http://maggidawn.typepad.com/maggidawn/2005/07/greenbelt.html - So if the plan goes according to plan (!)... I'll be speaking at Greenbelt at these times: Slot 1... - http://maggidawn.typepad.com/maggidawn/2005/07/greenbelt.html - Mon, 18 Jul 2005 02:11:42 GMT - James - 2005-07-11 02:08:12 - http://www.technorati.com/cosmos/search.html?url=http%3A%2F%2Fmaggidawn.typepad.com%2Fmaggidawn%2F2005%2F07%2Fgreenbelt.html - 190 - 237 - maggi dawn - - - - Walking along the Greenbelt - http://pictureshomeless.blogspot.com/2005/06/walking-along-greenbelt.html - [IMG] Photo of homeless man walking near the greenbelt in Boise, Idaho Tags: photo homeless greenbelt Boise Idaho picture - http://pictureshomeless.blogspot.com/2005/06/walking-along-greenbelt.html - Tue, 28 Jun 2005 01:41:24 GMT - 2005-06-26 17:24:03 - http://www.technorati.com/cosmos/search.html?url=http%3A%2F%2Fpictureshomeless.blogspot.com%2F2005%2F06%2Fwalking-along-greenbelt.html - 2 - 2 - - - - diff --git a/plugins/OStatus/extlib/XML/Feed/schemas/atom.rnc b/plugins/OStatus/extlib/XML/Feed/schemas/atom.rnc deleted file mode 100755 index e662d2626..000000000 --- a/plugins/OStatus/extlib/XML/Feed/schemas/atom.rnc +++ /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 index 725094788..000000000 --- a/plugins/OStatus/extlib/XML/Feed/schemas/rss10.rnc +++ /dev/null @@ -1,113 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/plugins/OStatus/extlib/XML/Feed/schemas/rss11.rnc b/plugins/OStatus/extlib/XML/Feed/schemas/rss11.rnc deleted file mode 100755 index c8633766f..000000000 --- a/plugins/OStatus/extlib/XML/Feed/schemas/rss11.rnc +++ /dev/null @@ -1,218 +0,0 @@ - - - - - - - - http://purl.org/net/rss1.1#Channel - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - http://purl.org/net/rss1.1#title - - - - - - - - - - - - - - http://purl.org/net/rss1.1#link - - - - - - - - - - http://purl.org/net/rss1.1#description - - - - - - - - - - - - - http://purl.org/net/rss1.1#image - - - - - - - - - - - - - - - - - - - - - - - - - http://purl.org/net/rss1.1#url - - - - - - - - - - http://purl.org/net/rss1.1#items - - - - - - - - - - - - - - - - - http://purl.org/net/rss1.1#item - - - - - - - - - - - - - - - - - - - - - - - - - - - - http://purl.org/net/rss1.1#Any - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Resource - - - - - Collection - - - - 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 index c53bd9737..000000000 --- a/plugins/OStatus/extlib/xml-feed-parser-bug-16416.patch +++ /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; diff --git a/plugins/OStatus/tests/FeedMungerTest.php b/plugins/OStatus/tests/FeedMungerTest.php deleted file mode 100644 index 0ce24c9fb..000000000 --- a/plugins/OStatus/tests/FeedMungerTest.php +++ /dev/null @@ -1,147 +0,0 @@ -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('A fairly short titlehttp://example.com/short/link', 0, - 'New post: "A fairly short title" http://example.com/short/link'), - // Requires URL shortening ... - array('A fairly short titlehttp://example.com/but/a/very/long/link/indeed/this/is/far/too/long/for/mere/humans/to/comprehend/oh/my/gosh', 0, - 'New post: "A fairly short title" http://ur1.ca/g2o1'), - array('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...http://example.com/but/a/very/long/link/indeed/this/is/far/too/long/for/mere/humans/to/comprehend/oh/my/gosh', 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 . << - - - leŭksman - - http://leuksman.com/log - reticula, electronica, & oddities - - Thu, 12 Nov 2009 17:44:42 +0000 - http://wordpress.org/?v=2.8.6 - en - hourly - 1 - - - Compiling PHP on Snow Leopard - http://leuksman.com/log/2009/11/12/compiling-php-on-snow-leopard/ - http://leuksman.com/log/2009/11/12/compiling-php-on-snow-leopard/#comments - Thu, 12 Nov 2009 17:44:42 +0000 - brion - - - - - http://leuksman.com/log/?p=649 - - If you’ve been having trouble compiling your own PHP installations on Mac OS X 10.6, here’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 should work from here…

-

For reference, here’s the whole configure line I currently use; MySQL is installed from the downloadable installer; other deps from MacPorts:

-

‘./configure’ ‘–prefix=/opt/php52′ ‘–with-mysql=/usr/local/mysql’ ‘–with-zlib’ ‘–with-bz2′ ‘–enable-mbstring’ ‘–enable-exif’ ‘–enable-fastcgi’ ‘–with-xmlrpc’ ‘–with-xsl’ ‘–with-readline=/opt/local’ –without-iconv –with-gd –with-png-dir=/opt/local –with-jpeg-dir=/opt/local –with-curl –with-gettext=/opt/local –with-mysqli=/usr/local/mysql/bin/mysql_config –with-tidy=/opt/local –enable-pcntl –with-openssl

-]]>
- http://leuksman.com/log/2009/11/12/compiling-php-on-snow-leopard/feed/ - 0 -
-
- -END; - return $samplefeed; - } - - static protected function samplefeedBlogspot() - { - return <<tag:blogger.com,1999:blog-77800835085316971672009-11-19T12:56:11.233-08:00Brion's Cool Test Blogbrionhttp://www.blogger.com/profile/12932299467049762017noreply@blogger.comBlogger2125tag:blogger.com,1999:blog-7780083508531697167.post-84566718790002906772009-11-19T12:55:00.000-08:002009-11-19T12:56:11.241-08:00I love postingIt's pretty awesome, if you like that sort of thing.<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7780083508531697167-8456671879000290677?l=briontest.blogspot.com' alt='' /></div>brionhttp://www.blogger.com/profile/12932299467049762017noreply@blogger.com0tag:blogger.com,1999:blog-7780083508531697167.post-82022969178973466332009-11-18T13:52:00.001-08:002009-11-18T13:52:48.444-08:00Hey dudetestingggggggggg<div class="blogger-post-footer"><img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7780083508531697167-8202296917897346633?l=briontest.blogspot.com' alt='' /></div>brionhttp://www.blogger.com/profile/12932299467049762017noreply@blogger.com0 -END; - } -} -- cgit v1.2.3-54-g00ecf From f891b135fbbf79bee6f9753e6a9cded65f219ab7 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sat, 20 Feb 2010 10:20:42 -0800 Subject: OStatus: fix regressions in plugin & usersalmon action. Sub/unsub notifications are working again. --- plugins/OStatus/OStatusPlugin.php | 22 ---- plugins/OStatus/actions/usersalmon.php | 189 +++++++++++++++++++++++++++++++++ 2 files changed, 189 insertions(+), 22 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 9e6d03177..e78e658a6 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -357,26 +357,4 @@ class OStatusPlugin extends Plugin return true; } - - function onEndUnsubscribe($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; - } - - // We have a local user subscribing to a remote profile; make the - // magic happen! - - $oprofile->notify($subscriber, ActivityVerb::UNFOLLOW); - - return true; - } } diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php index e69de29bb..4363488dd 100644 --- a/plugins/OStatus/actions/usersalmon.php +++ b/plugins/OStatus/actions/usersalmon.php @@ -0,0 +1,189 @@ +. + */ + +/** + * @package OStatusPlugin + * @author James Walker + */ + +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() + { + 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($context->attention, $this->user->uri)) { + throw new ClientException("To the attention of user(s) not including this one!"); + } + } else { + throw new ClientException("Not to anyone in reply to anything!"); + } + + $profile = $this->ensureProfile(); + // @fixme do something with the post + } + + /** + * 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}"); + $oprofile->subscribeRemoteToLocal($this->user); + } 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() + { + // WORST VARIABLE NAME EVER + $object = $this->act->object; + + 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 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."); + } + + $profile = $this->ensureProfile(); + + $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!"); + } + + $fave = new Fave(); + + // @fixme need to change this attribute name, maybe references + $fave->user_id = $profile->id; + $fave->notice_id = $notice->id; + + $result = $fave->insert(); + + if (!$result) { + common_log_db_error($fave, 'INSERT', __FILE__); + throw new ServerException('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() + { + } + +} -- cgit v1.2.3-54-g00ecf From ea9d6f21ecaff6e26ebe30775d1ddcd6d68d0a11 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sat, 20 Feb 2010 12:46:48 -0800 Subject: OStatus subscription page fixups; works but needs lots of UI loving! - ostatussub via subscribe button now works again (changed to take profile instead of feed, patched up to the new discovery) - added a quickie hack to allow putting your remote profile URI in place of webfinger acct through the remote-sub button (needs to be patched up to do proper discovery via XRDS or a link or something) --- plugins/OStatus/actions/ostatusinit.php | 78 ++++++++---- plugins/OStatus/actions/ostatussub.php | 218 +++++++++++++++++++------------- plugins/OStatus/actions/webfinger.php | 2 +- 3 files changed, 181 insertions(+), 117 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatusinit.php b/plugins/OStatus/actions/ostatusinit.php index d21774420..4afde2c36 100644 --- a/plugins/OStatus/actions/ostatusinit.php +++ b/plugins/OStatus/actions/ostatusinit.php @@ -37,7 +37,7 @@ 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; } @@ -55,7 +55,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 +73,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 +91,78 @@ 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('acct', _m('Profile Account'), $this->acct, + _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->acct, $opts)) { + $bits = parse_url($this->acct); + if ($bits['scheme'] == 'acct') { + $this->connectWebfinger($bits['path']); + } else { + $this->connectProfile($this->acct); + } + } elseif (strpos('@', $this->acct) !== false) { + $this->connectWebfinger($this->acct); + } + } + + function connectWebfinger($acct) + { + $w = new Webfinger; + + $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! + + $user = User::staticGet('nickname', $this->nickname); + $target_profile = common_local_url('userbyid', array('id' => $user->id)); - $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! + $url = $w->applyTemplate($link['template'], $feed_url); - $user = User::staticGet('nickname', $this->nickname); + common_redirect($url, 303); + } + + } + + } - $feed_url = common_local_url('ApiTimelineUser', - array('id' => $user->id, - 'format' => 'atom')); - $url = $w->applyTemplate($link['template'], $feed_url); + function connectProfile($subscriber_profile) + { + $user = User::staticGet('nickname', $this->nickname); + $target_profile = common_local_url('userbyid', array('id' => $user->id)); - common_redirect($url, 303); - } + // @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_redirect($suburl, 303); } - + function title() { - return _('OStatus Connect'); + return _m('OStatus Connect'); } } diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 239122501..524403143 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -1,7 +1,7 @@ + * @maintainer Brion Vibber */ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } class OStatusSubAction extends Action { + protected $profile_uri; + protected $preview; + protected $munger; + + /** + * Title of the page + * + * @return string Title of the page + */ - protected $feedurl; - function title() { - return _m("OStatus Subscribe"); + return _m('Authorize subscription'); } - function handle($args) - { - if ($this->validateFeed()) { - $this->showForm(); - } - - return true; + /** + * 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 showForm($err = null) + function showForm($error=null) { - $this->err = $err; + $this->error = $error; $this->showPage(); } + /** + * Content area of the page + * + * Shows a form for associating a remote OStatus account with this + * StatusNet account. + * + * @return void + */ + function showContent() { + // @fixme is this right place? + if ($this->error) { + $this->text($this->error); + } + $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' => 'ostatus_sub', 'class' => 'form_settings', 'action' => - common_local_url('feedsubsettings'))); + common_local_url('ostatussub'))); $this->hidden('token', common_session_token()); @@ -77,17 +91,47 @@ 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')); + if ($this->preview) { + $this->submit('subscribe', _m('Subscribe')); + } else { + $this->submit('validate', _m('Continue')); + } $this->elementEnd('fieldset'); $this->elementEnd('form'); - $this->previewFeed(); + if ($this->preview) { + $this->previewFeed(); + } + } + + function prepare($args) + { + parent::prepare($args); + $this->profile_uri = $this->arg('profile'); + return true; + } + + function handle($args) + { + parent::handle($args); + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $this->handlePost(); + } else { + if ($this->profile_uri) { + $this->validateAndPreview(); + } else { + $this->showPage(); + } + } } /** @@ -111,14 +155,15 @@ class OStatusSubAction extends Action return; } - if ($this->arg('subscribe')) { + 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 * @@ -127,100 +172,91 @@ class OStatusSubAction extends Action */ function validateFeed() { - $feedurl = $this->trimmed('feed'); + $profile_uri = trim($this->arg('profile')); - if ($feedurl == '') { - $this->showForm(_m('Empty feed URL!')); + if ($profile_uri == '') { + $this->showForm(_m('Empty remote profile URL!')); return; } - $this->feedurl = $feedurl; + $this->profile_uri = $profile_uri; - // Get the canonical feed URI and check it + // @fixme validate, normalize bla bla try { - $discover = new FeedDiscovery(); - $uri = $discover->discoverFromURL($feedurl); + $oprofile = Ostatus_profile::ensureProfile($this->profile_uri); + $this->oprofile = $oprofile; + return true; } catch (FeedSubBadURLException $e) { - $this->showForm(_m('Invalid URL or could not reach server.')); - return false; + $err = _m('Invalid URL or could not reach server.'); } catch (FeedSubBadResponseException $e) { - $this->showForm(_m('Cannot read feed; server returned error.')); - return false; + $err = _m('Cannot read feed; server returned error.'); } catch (FeedSubEmptyException $e) { - $this->showForm(_m('Cannot read feed; server returned an empty page.')); - return false; + $err = _m('Cannot read feed; server returned an empty page.'); } catch (FeedSubBadHTMLException $e) { - $this->showForm(_m('Bad HTML, could not find feed link.')); - return false; + $err = _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; + $err = _m('Could not find a feed linked from this URL.'); } catch (FeedSubUnrecognizedTypeException $e) { - $this->showForm(_m('Not a recognized feed type.')); - return false; + $err = _m('Not a recognized feed type.'); } catch (FeedSubException $e) { // Any new ones we forgot about - $this->showForm(_m('Bad feed URL.')); - return false; + $err = 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; + $this->showForm($err); + return false; } function saveFeed() { if ($this->validateFeed()) { $this->preview = true; - $this->profile = Ostatus_profile::ensureProfile($this->munger); - // 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(); - $profile = $this->profile->getProfile(); - - if ($user->isSubscribed($profile)) { - $this->showForm(_m('Already subscribed!')); - } elseif ($user->subscribeTo($profile)) { - $this->showForm(_m('Feed subscribed!')); + + if (!$this->oprofile->subscribe()) { + $this->showForm(_m("Failed to set up server-to-server subscription.")); + return; + } + + if ($this->oprofile->isGroup()) { + $group = $this->oprofile->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 { - $this->showForm(_m('Feed subscription failed!')); + $local = $this->oprofile->localProfile(); + if ($user->isSubscribed($local)) { + $this->showForm(_m('Already subscribed!')); + } elseif ($this->oprofile->subscribeLocalToRemote($user)) { + $this->showForm(_m('Remote user subscribed!')); + } else { + $this->showForm(_m('Remote subscription failed!')); + } } } } - - function previewFeed() + function validateAndPreview() { - $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.'); + if ($this->validateFeed()) { + $this->preview = true; + $this->showForm(_m('Previewing feed:')); } } + function previewFeed() + { + $this->text('Profile preview should go here'); + } + function showScripts() + { + parent::showScripts(); + $this->autofocus('feedurl'); + } } diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php index 75ba16638..f4dc61b7d 100644 --- a/plugins/OStatus/actions/webfinger.php +++ b/plugins/OStatus/actions/webfinger.php @@ -66,7 +66,7 @@ class WebfingerAction extends Action 'href' => $salmon_url); // 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 ); -- cgit v1.2.3-54-g00ecf From 9c2fe8492f7dae183e0369f8d43f124fd80e4433 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sat, 20 Feb 2010 15:56:36 -0800 Subject: OStatus: send favorite/unfavorite notifications to remote authors --- classes/Notice.php | 32 ++++++++++++++++++++++++++++++++ plugins/OStatus/OStatusPlugin.php | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) (limited to 'plugins/OStatus') diff --git a/classes/Notice.php b/classes/Notice.php index a52cfed70..8b8f90474 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1104,6 +1104,38 @@ 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) + { + $xs = new XMLStringer(true); + + $xs->elementStart('activity:' . $element); + $xs->element('activity:object-type', + null, + 'http://activitystrea.ms/schema/1.0/note'); + $xs->element('id', + null, + $this->uri); + $xs->element('content', + array('type' => 'text/html'), + $this->rendered); + $xs->element('link', + array('type' => 'text/html', + 'rel' => 'permalink', + 'href' => $this->bestUrl())); + $xs->elementEnd('activity:' . $element); + + return $xs->getString(); + } + function bestUrl() { if (!empty($this->url)) { diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index e78e658a6..4cbf78e63 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -357,4 +357,39 @@ class OStatusPlugin extends Plugin return true; } + + /** + * 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, Notice $notice) + { + if ($profile instanceof User) { + // @fixme upstream function should clarify its parameters + $profile = $profile->getProfile(); + } + $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id); + if ($oprofile) { + $oprofile->notify($profile, ActivityVerb::FAVORITE, $notice); + } + } + + /** + * Notify remote users when their notices get de-favorited. + * + * @param Profile or User $profile of local user doing the de-faving + * @param Notice $notice being favored + * @return hook return value + */ + function onEndDisfavorNotice(Profile $profile, Notice $notice) + { + $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id); + if ($oprofile) { + $oprofile->notify($profile, ActivityVerb::UNFAVORITE, $notice); + } + } + } -- cgit v1.2.3-54-g00ecf From 145a19954f6f993714cb8b65aaf9d54996503664 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sat, 20 Feb 2010 16:45:30 -0800 Subject: OStatus: Salmon favorite & unfavorite events now handled --- plugins/OStatus/actions/usersalmon.php | 77 ++++++++++++++++++++-------------- plugins/OStatus/lib/salmonaction.php | 3 ++ 2 files changed, 48 insertions(+), 32 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php index 4363488dd..20c6c2942 100644 --- a/plugins/OStatus/actions/usersalmon.php +++ b/plugins/OStatus/actions/usersalmon.php @@ -131,10 +131,51 @@ class UsersalmonAction extends SalmonAction function handleFavorite() { - // WORST VARIABLE NAME EVER - $object = $this->act->object; + $notice = $this->getNotice($this->act->object); + $profile = $this->ensureProfile()->localProfile(); - switch ($this->act->object->type) { + $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: @@ -155,35 +196,7 @@ class UsersalmonAction extends SalmonAction throw new ClientException("Notice with ID $object->id not posted by $this->user->id."); } - $profile = $this->ensureProfile(); - - $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!"); - } - - $fave = new Fave(); - - // @fixme need to change this attribute name, maybe references - $fave->user_id = $profile->id; - $fave->notice_id = $notice->id; - - $result = $fave->insert(); - - if (!$result) { - common_log_db_error($fave, 'INSERT', __FILE__); - throw new ServerException('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() - { + return $notice; } } diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 7085e4583..c83890507 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -81,6 +81,9 @@ class SalmonAction extends Action case ActivityVerb::FAVORITE: $this->handleFavorite(); break; + case ActivityVerb::UNFAVORITE: + $this->handleUnfavorite(); + break; case ActivityVerb::FOLLOW: case ActivityVerb::FRIEND: $this->handleFollow(); -- cgit v1.2.3-54-g00ecf From 96c6019638f6407b38fbc5a45485a3797af47adb Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 20 Feb 2010 19:58:20 -0500 Subject: Add support for favor and disfavor notification Added support for favoring and disfavoring in OStatusPlugin. Needed to represent the Notice as an activity:object, so added some code for that in lib/activity.php. Also, made some small changes to OStatusPlugin so it handled having a non-default argument $object correctly. --- plugins/OStatus/OStatusPlugin.php | 50 +++++++++++++++++++++----- plugins/OStatus/classes/Ostatus_profile.php | 6 ++-- plugins/OStatus/lib/activity.php | 55 +++++++++++++++++++++++++++-- 3 files changed, 98 insertions(+), 13 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 9e6d03177..98e048c14 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -255,7 +255,7 @@ class OStatusPlugin extends Plugin { if ($user instanceof Profile) { $profile = $user; - } else if ($user instanceof Profile) { + } else if ($user instanceof User) { $profile = $user->getProfile(); } $oprofile = Ostatus_profile::staticGet('profile_id', $other->id); @@ -353,30 +353,64 @@ class OStatusPlugin extends Plugin // We have a local user subscribing to a remote profile; make the // magic happen! - $oprofile->notify($subscriber, ActivityVerb::FOLLOW); + $oprofile->notify($subscriber, ActivityVerb::FOLLOW, $oprofile); return true; } - function onEndUnsubscribe($subscriber, $other) + function onEndFavor($profile, $notice) { - $user = User::staticGet('id', $subscriber->id); + // is the favorer a local user? + + $user = User::staticGet('id', $profile->id); if (empty($user)) { return true; } - $oprofile = Ostatus_profile::staticGet('profile_id', $other->id); + // is the author an OStatus remote user? + + $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id); if (empty($oprofile)) { return true; } - // We have a local user subscribing to a remote profile; make the - // magic happen! + // Local user faved an Ostatus profile's notice; notify them! + + $obj = ActivityObject::fromNotice($notice); + + $oprofile->notify($profile, + ActivityVerb::FAVORITE, + $obj->asString()); + return true; + } + + function onEndDisfavor($profile, $notice) + { + // is the favorer a local user? + + $user = User::staticGet('id', $profile->id); + + if (empty($user)) { + return true; + } + + // is the author an OStatus remote user? + + $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id); + + if (empty($oprofile)) { + return true; + } + + // Local user faved an Ostatus profile's notice; notify them! - $oprofile->notify($subscriber, ActivityVerb::UNFOLLOW); + $obj = ActivityObject::fromNotice($notice); + $oprofile->notify($profile, + ActivityVerb::UNFAVORITE, + $obj->asString()); return true; } } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 4dd565288..5bd899bc4 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -307,7 +307,7 @@ class Ostatus_profile extends Memcached_DataObject * * @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 string $object object of the action; if null, the remote entity itself is assumed */ public function notify($actor, $verb, $object=null) { @@ -319,7 +319,7 @@ class Ostatus_profile extends Memcached_DataObject throw new ServerException("Invalid actor passed to " . __METHOD__ . ": " . $type); } if ($object == null) { - $object = $this; + $object = $this->asActivityNoun('object'); } if ($this->salmonuri) { $text = 'update'; // @fixme @@ -345,7 +345,7 @@ class Ostatus_profile extends Memcached_DataObject $entry->element('activity:verb', null, $verb); $entry->raw($actor->asAtomAuthor()); $entry->raw($actor->asActivityActor()); - $entry->raw($object->asActivityNoun('object')); + $entry->raw($object); $entry->elementEnd('entry'); $xml = $entry->getString(); diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index 5bc8f78e5..6d15f85b0 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -199,7 +199,7 @@ class ActivityObject public $link; public $source; - /** + /** * Constructor * * This probably needs to be refactored @@ -209,8 +209,12 @@ class ActivityObject * @param DOMElement $element DOM thing to turn into an Activity thing */ - function __construct($element) + function __construct($element = null) { + if (empty($element)) { + return; + } + $this->element = $element; if ($element->tagName == 'author') { @@ -279,6 +283,53 @@ class ActivityObject } } } + + static 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; + } + + 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(self::CONTENT, array('type' => 'html'), $this->content); + } + + if (!empty($this->link)) { + $xs->element('link', array('rel' => 'alternate', 'type' => 'text/html'), + $this->content); + } + + $xs->elementEnd($tag); + + return $xs->getString(); + } } /** -- cgit v1.2.3-54-g00ecf From 0c62c686756de0752cdd44b63c10cf6e4047860f Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 20 Feb 2010 20:34:29 -0500 Subject: do some double-checks on favor and disfavor handlers in OStatusPlugin --- plugins/OStatus/OStatusPlugin.php | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 5081c4d98..29799b0dc 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -365,16 +365,21 @@ class OStatusPlugin extends Plugin * @param Notice $notice being favored * @return hook return value */ - function onEndFavorNotice($profile, Notice $notice) + function onEndFavorNotice(Profile $profile, Notice $notice) { - if ($profile instanceof User) { - // @fixme upstream function should clarify its parameters - $profile = $profile->getProfile(); + $user = User::staticGet('id', $profile->id); + + if (empty($user)) { + return true; } + $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id); + if ($oprofile) { $oprofile->notify($profile, ActivityVerb::FAVORITE, $notice); } + + return true; } /** @@ -386,10 +391,18 @@ class OStatusPlugin extends Plugin */ 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 ($oprofile) { $oprofile->notify($profile, ActivityVerb::UNFAVORITE, $notice); } - } + return true; + } } -- cgit v1.2.3-54-g00ecf From 6f1ccfc5770776c39bfe28543629e63a566ab541 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 20 Feb 2010 20:36:54 -0500 Subject: Subscription::start() should be enough, right? --- plugins/OStatus/actions/usersalmon.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php index 20c6c2942..020ca597c 100644 --- a/plugins/OStatus/actions/usersalmon.php +++ b/plugins/OStatus/actions/usersalmon.php @@ -101,7 +101,8 @@ class UsersalmonAction extends SalmonAction $oprofile = $this->ensureProfile(); if ($oprofile) { common_log(LOG_INFO, "Setting up subscription from remote {$oprofile->uri} to local {$this->user->nickname}"); - $oprofile->subscribeRemoteToLocal($this->user); + Subscription::start($oprofile->localProfile(), + $this->user->getProfile()); } else { common_log(LOG_INFO, "Can't set up subscription from remote; missing profile."); } -- cgit v1.2.3-54-g00ecf From 5df61141d28426329d2f4e50e61c131d43d1e405 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sat, 20 Feb 2010 18:25:40 -0800 Subject: OStatus: fix regressions from merge --- plugins/OStatus/classes/Ostatus_profile.php | 4 ++-- plugins/OStatus/lib/activity.php | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 5bd899bc4..d9cb7a6e1 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -319,7 +319,7 @@ class Ostatus_profile extends Memcached_DataObject throw new ServerException("Invalid actor passed to " . __METHOD__ . ": " . $type); } if ($object == null) { - $object = $this->asActivityNoun('object'); + $object = $this; } if ($this->salmonuri) { $text = 'update'; // @fixme @@ -345,7 +345,7 @@ class Ostatus_profile extends Memcached_DataObject $entry->element('activity:verb', null, $verb); $entry->raw($actor->asAtomAuthor()); $entry->raw($actor->asActivityActor()); - $entry->raw($object); + $entry->raw($object->asActivityNoun('object')); $entry->elementEnd('entry'); $xml = $entry->getString(); diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index 6d15f85b0..7563488b7 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -284,7 +284,7 @@ class ActivityObject } } - static fromNotice($notice) + static function fromNotice($notice) { $object = new ActivityObject(); -- cgit v1.2.3-54-g00ecf From 229f9bd069a25af9635a9eaaa822a614bf6e9348 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 09:15:57 -0500 Subject: more complete content retrieval in ActivityObject::__construct() --- plugins/OStatus/lib/activity.php | 67 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index 6d15f85b0..5f174d86f 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -183,6 +183,8 @@ class ActivityObject const TITLE = 'title'; const SUMMARY = 'summary'; const CONTENT = 'content'; + const TYPE = 'type'; + const SRC = 'src'; const ID = 'id'; const SOURCE = 'source'; @@ -199,7 +201,7 @@ class ActivityObject public $link; public $source; - /** + /** * Constructor * * This probably needs to be refactored @@ -243,10 +245,11 @@ class ActivityObject $this->id = $this->_childContent($element, self::ID); $this->title = $this->_childContent($element, self::TITLE); $this->summary = $this->_childContent($element, self::SUMMARY); - $this->content = $this->_childContent($element, self::CONTENT); $this->source = $this->_getSource($element); + $this->content = $this->_getContent($element); + $this->link = ActivityUtils::getPermalink($element); // XXX: grab PoCo stuff @@ -284,7 +287,65 @@ class ActivityObject } } - static fromNotice($notice) + /** + * 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 -< is HTML." + * + * @todo handle remote content + * @todo handle embedded XML mime types + * @todo handle base64-encoded non-XML and non-text mime types + */ + + private 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.")); + } + } + } + + static function fromNotice($notice) { $object = new ActivityObject(); -- cgit v1.2.3-54-g00ecf From 6169d8a877fb0e76ee17187f74a6747fe7f2c97d Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 09:16:27 -0500 Subject: saving notices in salmon actions --- plugins/OStatus/lib/salmonaction.php | 45 ++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index c83890507..41e8322e8 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -231,4 +231,49 @@ class SalmonAction extends Action return null; } } + + function saveNotice() + { + $oprofile = $this->ensureProfile(); + + // Get (safe!) HTML and text versions of the content + + require_once(INSTALLDIR.'/extlib/HTMLPurifier/HTMLPurifier.auto.php'); + + $html = $this->act->object->content; + + $rendered = HTMLPurifier::purify($html); + $content = html_entity_decode(strip_tags($rendered)); + + $options = array('is_local' => Notice::REMOTE_OMB, + 'uri' => $this->act->object->id, + 'url' => $this->act->object->link, + 'rendered' => $rendered); + + if (!empty($this->act->context->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; + } + } + + if (!empty($this->act->context->replyToID)) { + $orig = Notice::staticGet('uri', + $this->act->context->replyToID); + if (!empty($orig)) { + $options['reply_to'] = $orig->id; + } + } + + if (!empty($this->act->time)) { + $options['created'] = common_sql_time($this->act->time); + } + + return Notice::saveNew($oprofile->profile_id, + $content, + 'ostatus+salmon', + $options); + } } -- cgit v1.2.3-54-g00ecf From 4a4c34de3221eb8000e911addad039cd170faaa1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 09:17:35 -0500 Subject: Save posted notices in usersalmon --- plugins/OStatus/actions/usersalmon.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php index 020ca597c..12c74798f 100644 --- a/plugins/OStatus/actions/usersalmon.php +++ b/plugins/OStatus/actions/usersalmon.php @@ -87,8 +87,7 @@ class UsersalmonAction extends SalmonAction throw new ClientException("Not to anyone in reply to anything!"); } - $profile = $this->ensureProfile(); - // @fixme do something with the post + $this->saveNotice(); } /** -- cgit v1.2.3-54-g00ecf From 7f471bde231071e3512f203ceca4b830ac2204a1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 09:17:52 -0500 Subject: more tests for Activity parsing --- plugins/OStatus/tests/ActivityParseTests.php | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/tests/ActivityParseTests.php b/plugins/OStatus/tests/ActivityParseTests.php index 35b4b0f9d..d7305dede 100644 --- a/plugins/OStatus/tests/ActivityParseTests.php +++ b/plugins/OStatus/tests/ActivityParseTests.php @@ -22,8 +22,15 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $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() @@ -84,6 +91,10 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $this->assertEquals('http://example.net/conversation/11', $act->context->conversation); $this->assertEquals(array('http://example.net/user/1'), $act->context->attention); + $this->assertFalse(empty($act->object)); + $this->assertEquals($act->object->content, + '@evan now is the time for all good men to come to the aid of their country. #'); + $this->assertFalse(empty($act->actor)); } } -- cgit v1.2.3-54-g00ecf From ff2efd314f15bf5e4b42fe02d56217a996a7c692 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 10:50:51 -0500 Subject: let activities generate their own XML --- plugins/OStatus/lib/activity.php | 192 ++++++++++++++++++++++++++------------- 1 file changed, 129 insertions(+), 63 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index 5f174d86f..5da6c7585 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -55,6 +55,9 @@ class ActivityUtils const TYPE = 'type'; const HREF = 'href'; + const CONTENT = 'content'; + const SRC = 'src'; + /** * Get the permalink for an Activity object * @@ -139,6 +142,64 @@ class ActivityUtils 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 -< is HTML." + * + * @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.")); + } + } + } } /** @@ -182,9 +243,6 @@ class ActivityObject const TITLE = 'title'; const SUMMARY = 'summary'; - const CONTENT = 'content'; - const TYPE = 'type'; - const SRC = 'src'; const ID = 'id'; const SOURCE = 'source'; @@ -248,7 +306,7 @@ class ActivityObject $this->source = $this->_getSource($element); - $this->content = $this->_getContent($element); + $this->content = ActivityUtils::getContent($element); $this->link = ActivityUtils::getPermalink($element); @@ -287,64 +345,6 @@ class ActivityObject } } - /** - * 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 -< is HTML." - * - * @todo handle remote content - * @todo handle embedded XML mime types - * @todo handle base64-encoded non-XML and non-text mime types - */ - - private 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.")); - } - } - } - static function fromNotice($notice) { $object = new ActivityObject(); @@ -359,6 +359,18 @@ class ActivityObject return $object; } + static function fromProfile($profile) + { + $object = new ActivityObject(); + + $object->type = ActivityObject::PERSON; + $object->id = $profile->getUri(); + $object->title = $this->getBestName(); + $object->link = $profile->profileurl; + + return $object; + } + function asString($tag='activity:object') { $xs = new XMLStringer(true); @@ -550,6 +562,11 @@ class Activity 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 into a magical activity * @@ -557,8 +574,12 @@ class Activity * @param DOMElement $feed Atom feed, for context */ - function __construct($entry, $feed = null) + function __construct($entry = null, $feed = null) { + if (is_null($entry)) { + return; + } + $this->entry = $entry; $this->feed = $feed; @@ -629,6 +650,10 @@ class Activity 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); } /** @@ -642,6 +667,47 @@ class Activity 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:ostatus' => 'http://ostatus.org/schema/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 + // XXX: add target + + $xs->raw($this->actor->asString()); + $xs->element('activity:verb', null, $this->verb); + $xs->raw($this->object->asString()); + + $xs->elementEnd('entry'); + + return $xs->getString(); + } + private function _child($element, $tag, $namespace=self::SPEC) { return ActivityUtils::child($element, $tag, $namespace); -- cgit v1.2.3-54-g00ecf From 4e90bd34e9aff1abd97a92b62fc7c48bf1ee5a9c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 10:53:11 -0500 Subject: activity notification in Ostatus_profile --- plugins/OStatus/classes/Ostatus_profile.php | 31 +++++++++++++++++++++-------- 1 file changed, 23 insertions(+), 8 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index d9cb7a6e1..55f347a02 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -305,9 +305,9 @@ class Ostatus_profile extends Memcached_DataObject * 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 string $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($actor, $verb, $object=null) { @@ -322,11 +322,12 @@ class Ostatus_profile extends Memcached_DataObject $object = $this; } if ($this->salmonuri) { - $text = 'update'; // @fixme - $id = 'tag:' . common_config('site', 'server') . - ':' . $verb . - ':' . $actor->id . - ':' . time(); // @fixme + + $text = 'update'; + $id = TagURI::mint('%s:%s:%s', + $verb, + $actor->getURI(), + common_date_iso8601(date())); // @fixme consolidate all these NS settings somewhere $attributes = array('xmlns' => Activity::ATOM, @@ -356,6 +357,20 @@ class Ostatus_profile extends Memcached_DataObject } } + public function notifyActivity($activity) + { + if ($this->salmonuri) { + + $xml = $activity->asString(); + + $salmon = new Salmon(); // ? + + $salmon->post($this->salmonuri, $xml); + } + + return; + } + function getBestName() { if ($this->isGroup()) { -- cgit v1.2.3-54-g00ecf From df7c6b37c8b8f548a56193181acd5b2d8ee9bd9e Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 10:53:32 -0500 Subject: use notifyActivity() for notifications in OStatusPlugin --- plugins/OStatus/OStatusPlugin.php | 122 ++++++++++++++++++++++++++++++-------- 1 file changed, 98 insertions(+), 24 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 29799b0dc..3aaa769db 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -251,27 +251,47 @@ class OStatusPlugin extends Plugin * @param Profile $other * @return hook return value */ - function onEndUnsubscribe($user, $other) + function onEndUnsubscribe($profile, $other) { - if ($user instanceof Profile) { - $profile = $user; - } else if ($user instanceof User) { - $profile = $user->getProfile(); + $user = User::staticGet('id', $profile->id); + + if (empty($user)) { + return true; } + $oprofile = Ostatus_profile::staticGet('profile_id', $other->id); - if ($oprofile) { - // Notify the remote server of the unsub, if supported. - $oprofile->notify($profile, ActivityVerb::UNFOLLOW, $oprofile); - - // Drop the PuSH subscription if there are no other subscribers. - $sub = new Subscription(); - $sub->subscribed = $other->id; - $sub->limit(1); - if (!$sub->find(true)) { - common_log(LOG_INFO, "Unsubscribing from now-unused feed $oprofile->feeduri"); - $oprofile->unsubscribe(); - } + + if (empty($oprofile)) { + return true; } + + // Drop the PuSH subscription if there are no other subscribers. + + if ($other->subscriberCount() == 0) { + common_log(LOG_INFO, "Unsubscribing from now-unused feed $oprofile->feeduri"); + $oprofile->unsubscribe(); + } + + $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($subscriber); + $act->object = ActivityObject::fromProfile($other); + + $oprofile->notifyActivity($act); + return true; } @@ -350,10 +370,25 @@ class OStatusPlugin extends Plugin return true; } - // We have a local user subscribing to a remote profile; make the - // magic happen! + $act = new Activity(); + + $act->verb = ActivityVerb::FOLLOW; - $oprofile->notify($subscriber, ActivityVerb::FOLLOW, $oprofile); + $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; } @@ -365,6 +400,7 @@ class OStatusPlugin extends Plugin * @param Notice $notice being favored * @return hook return value */ + function onEndFavorNotice(Profile $profile, Notice $notice) { $user = User::staticGet('id', $profile->id); @@ -375,10 +411,29 @@ class OStatusPlugin extends Plugin $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id); - if ($oprofile) { - $oprofile->notify($profile, ActivityVerb::FAVORITE, $notice); + 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; } @@ -389,6 +444,7 @@ class OStatusPlugin extends Plugin * @param Notice $notice being favored * @return hook return value */ + function onEndDisfavorNotice(Profile $profile, Notice $notice) { $user = User::staticGet('id', $profile->id); @@ -399,10 +455,28 @@ class OStatusPlugin extends Plugin $oprofile = Ostatus_profile::staticGet('profile_id', $notice->profile_id); - if ($oprofile) { - $oprofile->notify($profile, ActivityVerb::UNFAVORITE, $notice); + 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; } } -- cgit v1.2.3-54-g00ecf From 727773cdfa8f229babbfe8a620645f2f4db9bbd8 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 11:24:04 -0500 Subject: redirect ostatussub if not logged in --- plugins/OStatus/actions/ostatussub.php | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 524403143..bbbd1b7e6 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -58,7 +58,6 @@ class OStatusSubAction extends Action $this->showPage(); } - /** * Content area of the page * @@ -116,7 +115,18 @@ class OStatusSubAction extends Action function prepare($args) { parent::prepare($args); + + if (!common_logged_in()) { + // XXX: selfURL() didn't work. :< + common_set_returnto($_SERVER['REQUEST_URI']); + if (Event::handle('RedirectToLogin', array($this, null))) { + common_redirect(common_local_url('login'), 303); + } + return false; + } + $this->profile_uri = $this->arg('profile'); + return true; } @@ -173,13 +183,13 @@ class OStatusSubAction extends Action function validateFeed() { $profile_uri = trim($this->arg('profile')); - + if ($profile_uri == '') { $this->showForm(_m('Empty remote profile URL!')); return; } $this->profile_uri = $profile_uri; - + // @fixme validate, normalize bla bla try { $oprofile = Ostatus_profile::ensureProfile($this->profile_uri); -- cgit v1.2.3-54-g00ecf From 09e2d181be3b72b1d8134273b9fdfa280895627c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 12:54:52 -0500 Subject: remove unused profile code from salmonaction --- plugins/OStatus/lib/salmonaction.php | 71 ------------------------------------ 1 file changed, 71 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 41e8322e8..abd8d4c83 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -161,77 +161,6 @@ class SalmonAction extends Action return Ostatus_profile::ensureActorProfile($this->act); } - /** - * @fixme merge into Ostatus_profile::ensureActorProfile and friends - */ - function createProfile() - { - $actor = $this->act->actor; - - $profile = new Profile(); - - $profile->nickname = $this->nicknameFromURI($actor->id); - - if (empty($profile->nickname)) { - $profile->nickname = common_nicknamize($actor->title); - } - - $profile->fullname = $actor->title; - $profile->bio = $actor->summary; // XXX: is that right? - $profile->profileurl = $actor->link; // XXX: is that right? - $profile->created = common_sql_now(); - - $id = $profile->insert(); - - if (empty($id)) { - common_log_db_error($profile, 'INSERT', __FILE__); - throw new Exception("Couldn't save new profile for $actor->id\n"); - } - - // XXX: add avatars - - $op = new Ostatus_profile(); - - $op->profile_id = $id; - $op->homeuri = $actor->id; - $op->created = $profile->created; - - // XXX: determine feed URI from source or Webfinger or whatever - - $id = $op->insert(); - - if (empty($id)) { - common_log_db_error($op, 'INSERT', __FILE__); - throw new Exception("Couldn't save new ostatus profile for $actor->id\n"); - } - - return $profile; - } - - /** - * @fixme should be merged into Ostatus_profile - */ - 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; - } - } - function saveNotice() { $oprofile = $this->ensureProfile(); -- cgit v1.2.3-54-g00ecf From d372a352ec16f7fabd9059e283c98bd45d7272f0 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 12:55:40 -0500 Subject: make avatar attribute explicit for ActivityObject --- plugins/OStatus/lib/activity.php | 1 + 1 file changed, 1 insertion(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index 5da6c7585..ea1303f19 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -258,6 +258,7 @@ class ActivityObject public $content; public $link; public $source; + public $avatar; /** * Constructor -- cgit v1.2.3-54-g00ecf From 1a86bf9c65d2579d9245c6edcc968fed3d674f39 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 12:56:46 -0500 Subject: try different ways to get a profile from a feed --- plugins/OStatus/classes/Ostatus_profile.php | 177 +++++++++++++++++++++------- 1 file changed, 132 insertions(+), 45 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 55f347a02..793d45112 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -537,18 +537,58 @@ class Ostatus_profile extends Memcached_DataObject throw new FeedSubNoHubException(); } - // Ok this is going to be a terrible hack! - // Won't be suitable for groups, empty feeds, or getting - // info that's only available on the profile page. + // 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); + } + + // 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); + } + + // Sheesh. Not a very nice feed! Let's try fingerpoken in the + // entries. + $entries = $discover->feed->getElementsByTagNameNS(Activity::ATOM, 'entry'); - if (!$entries || $entries->length == 0) { - throw new FeedSubException('empty feed'); + + 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); + + } + + $author = ActivityUtils::child($entry, Activity::AUTHOR, Activity::ATOM); + + if (!empty($author)) { + $authorObject = new ActivityObject($author); + return self::ensureActivityObjectProfile($authorObject, $feeduri, $salmonuri); + } } - $first = new Activity($entries->item(0), $discover->feed); - return self::ensureActorProfile($first, $feeduri, $salmonuri); + + // 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 @@ -581,6 +621,12 @@ class Ostatus_profile extends Memcached_DataObject } } + protected static function getActivityObjectAvatar($object) + { + // XXX: go poke around in the feed + return $object->avatar; + } + /** * Get an appropriate avatar image source URL, if available. * @@ -588,6 +634,7 @@ class Ostatus_profile extends Memcached_DataObject * @param DOMElement $feed * @return string */ + protected static function getAvatar($actor, $feed) { $url = ''; @@ -635,11 +682,17 @@ class Ostatus_profile extends Memcached_DataObject * @param string $salmonuri if we already know the salmon return channel URI * @return Ostatus_profile */ + public static function ensureActorProfile($activity, $feeduri=null, $salmonuri=null) { - $profile = self::getActorProfile($activity); + return self::ensureActivityObjectProfile($activity->actor, $feeduri, $salmonuri); + } + + public static function ensureActivityObjectProfile($object, $feeduri=null, $salmonuri=null) + { + $profile = self::getActivityObjectProfile($object); if (!$profile) { - $profile = self::createActorProfile($activity, $feeduri, $salmonuri); + $profile = self::createActivityObjectProfile($object, $feeduri, $salmonuri); } return $profile; } @@ -650,8 +703,18 @@ class Ostatus_profile extends Memcached_DataObject */ protected static function getActorProfile($activity) { - $homeuri = self::getActorProfileURI($activity); - return self::staticGet('uri', $homeuri); + return self::getActivityObjectProfile($activity->actor); + } + + protected static function getActivityObjectProfile($object) + { + $uri = self::getActivityObjectProfileURI($object); + return Ostatus_profile::staticGet('homeuri', $uri); + } + + protected static function getActorProfileURI($activity) + { + return self::getActivityObjectProfileURI($activity->actor); } /** @@ -659,15 +722,14 @@ class Ostatus_profile extends Memcached_DataObject * @return string * @throws ServerException */ - protected static function getActorProfileURI($activity) + protected static function getActivityObjectProfileURI($object) { $opts = array('allowed_schemes' => array('http', 'https')); - $actor = $activity->actor; - if ($actor->id && Validate::uri($actor->id, $opts)) { - return $actor->id; + if ($object->id && Validate::uri($object->id, $opts)) { + return $object->id; } - if ($actor->link && Validate::uri($actor->link, $opts)) { - return $actor->link; + if ($object->link && Validate::uri($object->link, $opts)) { + return $object->link; } throw new ServerException("No author ID URI found"); } @@ -675,12 +737,19 @@ class Ostatus_profile extends Memcached_DataObject /** * @fixme validate stuff somewhere */ + protected static function createActorProfile($activity, $feeduri=null, $salmonuri=null) { $actor = $activity->actor; - $homeuri = self::getActorProfileURI($activity); - $nickname = self::getAuthorNick($activity); - $avatar = self::getAvatar($actor, $activity->feed); + + self::createActivityObjectProfile($actor, $feeduri, $salmonuri); + } + + protected static function createActivityObjectProfile($object, $feeduri=null, $salmonuri=null) + { + $homeuri = self::getActivityObjectProfileURI($object); + $nickname = self::getActivityObjectNickname($object); + $avatar = self::getActivityObjectAvatar($object); if (!$homeuri) { common_log(LOG_DEBUG, __METHOD__ . " empty actor profile URI: " . var_export($activity, true)); @@ -703,9 +772,10 @@ class Ostatus_profile extends Memcached_DataObject $profile = new Profile(); $profile->nickname = $nickname; - $profile->fullname = $actor->displayName; - $profile->homepage = $actor->link; // @fixme - $profile->profileurl = $homeuri; + $profile->fullname = $object->title; + $profile->profileurl = $object->link; + $profile->created = common_sql_now(); + // @fixme bio // @fixme tags/categories // @fixme location? @@ -713,6 +783,7 @@ class Ostatus_profile extends Memcached_DataObject // @todo lat/lon/location? $ok = $profile->insert(); + if (!$ok) { throw new ServerException("Can't save local profile"); } @@ -720,16 +791,19 @@ class Ostatus_profile extends Memcached_DataObject // @fixme either need to do feed discovery here // or need to split out some of the feed stuff // so we can leave it empty until later. + $oprofile = new Ostatus_profile(); - $oprofile->uri = $homeuri; - $oprofile->feeduri = $feeduri; - $oprofile->salmonuri = $salmonuri; + + $oprofile->uri = $homeuri; + $oprofile->feeduri = $feeduri; + $oprofile->salmonuri = $salmonuri; $oprofile->profile_id = $profile->id; - $oprofile->created = common_sql_now(); - $oprofile->modified = common_sql_now(); + $oprofile->created = common_sql_now(); + $oprofile->modified = common_sql_now(); $ok = $oprofile->insert(); + if ($ok) { $oprofile->updateAvatar($avatar); return $oprofile; @@ -738,24 +812,37 @@ class Ostatus_profile extends Memcached_DataObject } } - /** - * @fixme move this into Activity? - * @param Activity $activity - * @return string - */ - protected static function getAuthorNick($activity) - { - // @fixme not technically part of the actor? - foreach (array($activity->entry, $activity->feed) as $source) { - $author = ActivityUtils::child($source, 'author', Activity::ATOM); - if ($author) { - $name = ActivityUtils::child($author, 'name', Activity::ATOM); - if ($name) { - return trim($name->textContent); - } - } + protected static function getActivityObjectNickname($object) + { + // XXX: check whatever PoCo calls a nickname first + + $nickname = self::nicknameFromURI($object->id); + + if (empty($nickname)) { + $nickname = common_nicknamize($object->title); } - return false; + + 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; + } + } } -- cgit v1.2.3-54-g00ecf From 5aeed9e04110c34bca12e601836797afd5acadba Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 13:11:00 -0500 Subject: add activity:subject to atom feeds --- plugins/OStatus/OStatusPlugin.php | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 3aaa769db..b5cfb5cae 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -102,16 +102,21 @@ class OStatusPlugin extends Plugin $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. @@ -123,6 +128,8 @@ class OStatusPlugin extends Plugin $salmon = common_local_url($salmonAction, array('id' => $id)); $feed->addLink($salmon, array('rel' => 'salmon')); } + + return true; } /** -- cgit v1.2.3-54-g00ecf From f83941a67baab8acf3bb381ec7fce5480f9c8626 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 13:31:31 -0500 Subject: correct name check in ActivityObject::fromProfile() --- plugins/OStatus/lib/activity.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index ea1303f19..f25a843c3 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -366,7 +366,7 @@ class ActivityObject $object->type = ActivityObject::PERSON; $object->id = $profile->getUri(); - $object->title = $this->getBestName(); + $object->title = $profile->getBestName(); $object->link = $profile->profileurl; return $object; -- cgit v1.2.3-54-g00ecf From 068d8f92200e6fcef31db2fdca956a745422a1ac Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 13:31:58 -0500 Subject: correct call to time() in Ostatus_profile::notify() --- plugins/OStatus/classes/Ostatus_profile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 793d45112..aab316c34 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -327,7 +327,7 @@ class Ostatus_profile extends Memcached_DataObject $id = TagURI::mint('%s:%s:%s', $verb, $actor->getURI(), - common_date_iso8601(date())); + common_date_iso8601(time())); // @fixme consolidate all these NS settings somewhere $attributes = array('xmlns' => Activity::ATOM, -- cgit v1.2.3-54-g00ecf From de093537f6c7f3b83817146247fbd9edbed16935 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 13:32:24 -0500 Subject: correct actor for OStatusPlugin::onEndUnsubscribe() --- plugins/OStatus/OStatusPlugin.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index b5cfb5cae..b966661db 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -294,7 +294,7 @@ class OStatusPlugin extends Plugin $profile->getBestName(), $other->getBestName()); - $act->actor = ActivityObject::fromProfile($subscriber); + $act->actor = ActivityObject::fromProfile($profile); $act->object = ActivityObject::fromProfile($other); $oprofile->notifyActivity($act); @@ -447,8 +447,9 @@ class OStatusPlugin extends Plugin /** * Notify remote users when their notices get de-favorited. * - * @param Profile or User $profile of local user doing the de-faving - * @param Notice $notice being favored + * @param Profile $profile Profile person doing the de-faving + * @param Notice $notice Notice being favored + * * @return hook return value */ -- cgit v1.2.3-54-g00ecf From 588fe5d603abe40c45a1147eba18c8b5143babc4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sun, 21 Feb 2010 10:48:48 -0800 Subject: OStatus: debug aid - log the received Salmon post when it can't be parsed properly as an --- plugins/OStatus/lib/salmonaction.php | 1 + 1 file changed, 1 insertion(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index abd8d4c83..4e5ed7fe6 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -51,6 +51,7 @@ class SalmonAction extends Action 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.')); } // XXX: check the signature -- cgit v1.2.3-54-g00ecf From 16a43b1154baf967183279c5e291a080cb2d5868 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 14:14:45 -0500 Subject: slightly more robust remote profile creation --- plugins/OStatus/classes/Ostatus_profile.php | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index aab316c34..3b79f32c6 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -709,7 +709,7 @@ class Ostatus_profile extends Memcached_DataObject protected static function getActivityObjectProfile($object) { $uri = self::getActivityObjectProfileURI($object); - return Ostatus_profile::staticGet('homeuri', $uri); + return Ostatus_profile::staticGet('uri', $uri); } protected static function getActorProfileURI($activity) @@ -747,9 +747,9 @@ class Ostatus_profile extends Memcached_DataObject protected static function createActivityObjectProfile($object, $feeduri=null, $salmonuri=null) { - $homeuri = self::getActivityObjectProfileURI($object); + $homeuri = $object->id; $nickname = self::getActivityObjectNickname($object); - $avatar = self::getActivityObjectAvatar($object); + $avatar = self::getActivityObjectAvatar($object); if (!$homeuri) { common_log(LOG_DEBUG, __METHOD__ . " empty actor profile URI: " . var_export($activity, true)); @@ -782,9 +782,9 @@ class Ostatus_profile extends Memcached_DataObject // @todo tags from categories // @todo lat/lon/location? - $ok = $profile->insert(); + $profile_id = $profile->insert(); - if (!$ok) { + if (!$profile_id) { throw new ServerException("Can't save local profile"); } @@ -797,7 +797,7 @@ class Ostatus_profile extends Memcached_DataObject $oprofile->uri = $homeuri; $oprofile->feeduri = $feeduri; $oprofile->salmonuri = $salmonuri; - $oprofile->profile_id = $profile->id; + $oprofile->profile_id = $profile_id; $oprofile->created = common_sql_now(); $oprofile->modified = common_sql_now(); -- cgit v1.2.3-54-g00ecf From ad3406a919d950315ed1381ffb4dd8d47baf2c24 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 14:17:37 -0500 Subject: use Ostatus_profile::ensureActivityObjectProfile() in SalmonAction::ensureProfile() --- plugins/OStatus/lib/salmonaction.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index abd8d4c83..87e98ad35 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -155,10 +155,11 @@ class SalmonAction extends Action $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::ensureActorProfile($this->act); + return Ostatus_profile::ensureActivityObjectProfile($actor); } function saveNotice() -- cgit v1.2.3-54-g00ecf From 10f6c023f4573868326c4b6599bdfb66cffdd7d6 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 16:23:55 -0500 Subject: include namespaces in posted activities in notifyActivity() --- plugins/OStatus/classes/Ostatus_profile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 3b79f32c6..b67e20202 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -361,7 +361,7 @@ class Ostatus_profile extends Memcached_DataObject { if ($this->salmonuri) { - $xml = $activity->asString(); + $xml = $activity->asString(true); $salmon = new Salmon(); // ? -- cgit v1.2.3-54-g00ecf From 5349aa420ed45c2f5bf773d10c7709826ae6babd Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sun, 21 Feb 2010 13:40:59 -0800 Subject: OStatus feedsub fixlets: - actually udpate feedsub.last_update when we get a new PuSH update in - move incoming PuSH processing to a queue handler to minimize time spent before POST return, as recommended by PuSH spec. When queues are disabled this'll still be handled immediately. --- plugins/OStatus/OStatusPlugin.php | 4 +++ plugins/OStatus/actions/pushcallback.php | 9 +++-- plugins/OStatus/classes/FeedSub.php | 10 ++++++ plugins/OStatus/lib/pushinputqueuehandler.php | 49 +++++++++++++++++++++++++++ 4 files changed, 70 insertions(+), 2 deletions(-) create mode 100644 plugins/OStatus/lib/pushinputqueuehandler.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index b966661db..c5a2db3d8 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -78,9 +78,13 @@ class OStatusPlugin extends Plugin */ function onEndInitializeQueueManager(QueueManager $qm) { + // Outgoing from our internal PuSH hub $qm->connect('hubverify', 'HubVerifyQueueHandler'); $qm->connect('hubdistrib', 'HubDistribQueueHandler'); $qm->connect('hubout', 'HubOutQueueHandler'); + + // Incoming from a foreign PuSH hub + $qm->connect('pushinput', 'PushInputQueueHandler'); return true; } diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index 7e1227a66..9e976a80d 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -60,9 +60,14 @@ class PushCallbackAction extends Action $post = file_get_contents('php://input'); - // @fixme Queue this to a background process; we should return + // Queue this to a background process; we should return // as quickly as possible from a distribution POST. - $feedsub->receive($post, $hmac); + // If queues are disabled this'll process immediately. + $data = array('feedsub_id' => $feedsub->id, + 'post' => $post, + 'hmac' => $hmac); + $qm = QueueManager::get(); + $qm->enqueue($data, 'pushinput'); } /** diff --git a/plugins/OStatus/classes/FeedSub.php b/plugins/OStatus/classes/FeedSub.php index bf9d063fa..31241d3de 100644 --- a/plugins/OStatus/classes/FeedSub.php +++ b/plugins/OStatus/classes/FeedSub.php @@ -372,6 +372,12 @@ class FeedSub extends Memcached_DataObject * 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 */ @@ -402,6 +408,10 @@ class FeedSub extends Memcached_DataObject 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)); } diff --git a/plugins/OStatus/lib/pushinputqueuehandler.php b/plugins/OStatus/lib/pushinputqueuehandler.php new file mode 100644 index 000000000..cbd9139b5 --- /dev/null +++ b/plugins/OStatus/lib/pushinputqueuehandler.php @@ -0,0 +1,49 @@ +. + */ + +/** + * Process a feed distribution POST from a PuSH hub. + * @package FeedSub + * @author Brion Vibber + */ + +class PushInputQueueHandler extends QueueHandler +{ + function transport() + { + return 'pushinput'; + } + + 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; + } +} -- cgit v1.2.3-54-g00ecf From 1c22bf20f1e99664b02d71318592b73e7fb4d4b5 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 17:00:05 -0500 Subject: fixup activity serialization so salmon notifications work --- plugins/OStatus/lib/activity.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index f25a843c3..af83f8bc6 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -392,7 +392,7 @@ class ActivityObject if (!empty($this->content)) { // XXX: assuming HTML content here - $xs->element(self::CONTENT, array('type' => 'html'), $this->content); + $xs->element(ActivityUtils::CONTENT, array('type' => 'html'), $this->content); } if (!empty($this->link)) { @@ -700,7 +700,7 @@ class Activity // XXX: add context // XXX: add target - $xs->raw($this->actor->asString()); + $xs->raw($this->actor->asString('activity:actor')); $xs->element('activity:verb', null, $this->verb); $xs->raw($this->object->asString()); -- cgit v1.2.3-54-g00ecf From aa0b2ce81ad4a99fb55a36feda54e70bcd0808be Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sun, 21 Feb 2010 14:28:06 -0800 Subject: OStatus PuSH fixlets: - set minimal error page output on PuSH callback - allow hub to retry ($config['ostatus']['hub_retries']), simplify internal iface a bit. Retries are pushed to end of queue but otherwise not delayed yet; makes delivery more robust to one-off transitory errors but not yet against downtime. --- plugins/OStatus/actions/pushcallback.php | 1 + plugins/OStatus/classes/HubSub.php | 47 +++++++++++++++++--------- plugins/OStatus/lib/hubdistribqueuehandler.php | 5 +-- plugins/OStatus/lib/huboutqueuehandler.php | 18 +++++++--- 4 files changed, 46 insertions(+), 25 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index 9e976a80d..35c92c732 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -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(); diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index 0cd4281f8..a81de68e6 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -226,6 +226,26 @@ class HubSub extends Memcached_DataObject return parent::insert(); } + /** + * 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. @@ -234,6 +254,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) { @@ -245,24 +266,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/lib/hubdistribqueuehandler.php b/plugins/OStatus/lib/hubdistribqueuehandler.php index 245a57f72..30a427e3f 100644 --- a/plugins/OStatus/lib/hubdistribqueuehandler.php +++ b/plugins/OStatus/lib/hubdistribqueuehandler.php @@ -124,10 +124,7 @@ class HubDistribQueueHandler extends QueueHandler 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'); + $sub->distribute($atom); } } diff --git a/plugins/OStatus/lib/huboutqueuehandler.php b/plugins/OStatus/lib/huboutqueuehandler.php index 0791c7e5d..3ad94646e 100644 --- a/plugins/OStatus/lib/huboutqueuehandler.php +++ b/plugins/OStatus/lib/huboutqueuehandler.php @@ -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; } } - -- cgit v1.2.3-54-g00ecf From fde64ddf2688fa0bd78e3d59f4003c3392fe2d30 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 21:36:36 -0500 Subject: make some of the Webfinger magic strings constants --- plugins/OStatus/lib/webfinger.php | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/webfinger.php b/plugins/OStatus/lib/webfinger.php index 417d54904..0386881d1 100644 --- a/plugins/OStatus/lib/webfinger.php +++ b/plugins/OStatus/lib/webfinger.php @@ -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) { @@ -140,4 +145,3 @@ class Webfinger } } - -- cgit v1.2.3-54-g00ecf From bf23c35495bf713ec662649b2e8964e90da93239 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 21:37:12 -0500 Subject: Add OStatus_profile::ensureWebfinger() --- plugins/OStatus/classes/Ostatus_profile.php | 103 ++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index b67e20202..700168c11 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -845,4 +845,107 @@ class Ostatus_profile extends Memcached_DataObject 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; + } + } + + // If we got a feed URL, try that + + if (isset($feedUrl)) { + try { + $oprofile = self::ensureProfile($feedUrl); + 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); + 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(); + + $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(); + + $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; + } } -- cgit v1.2.3-54-g00ecf From bd74f05a665df73078134c37f059cc1797d1a0ea Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 21:38:16 -0500 Subject: Do mention lookup for Webfinger accounts in OStatusPlugin --- plugins/OStatus/OStatusPlugin.php | 79 ++++++++++++++++++--------------------- 1 file changed, 37 insertions(+), 42 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index c5a2db3d8..60bb144a8 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -136,25 +136,6 @@ class OStatusPlugin extends Plugin return true; } - /** - * 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; - } - /** * Automatically load the actions and libraries used by the plugin * @@ -215,33 +196,16 @@ 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) { + $mentioned = $notice->getReplies(); - // FIXME: look up locally first + foreach ($mentioned as $profile) { - // Check to see if we've got an actual webfinger - $w = new Webfinger; + $oprofile = Ostatus_profile::staticGet('profile_id', $profile->id); - $endpoint_uri = ''; - - $result = $w->lookup($webfinger); - if (empty($result)) { - continue; - } - - foreach ($result->links as $link) { - if ($link['rel'] == 'salmon') { - $endpoint_uri = $link['href']; - } - } - - if (empty($endpoint_uri)) { - continue; - } + if (!empty($oprofile) && !empty($oprofile->salmonuri)) { // FIXME: this needs to go out in a queue handler @@ -249,9 +213,40 @@ class OStatusPlugin extends Plugin $xml .= $notice->asAtomEntry(); $salmon = new Salmon(); - $salmon->post($endpoint_uri, $xml); + $salmon->post($oprofile->salmonuri, $xml); + } + } + } + + /** + * + */ + + function onEndFindMentions($sender, $text, &$mentions) + { + preg_match_all('/(?:^|\s+)@((?:\w+\.)*\w+@(?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+)/', + $text, + $wmatches, + PREG_OFFSET_CAPTURE); + + foreach ($wmatches[1] as $wmatch) { + + $webfinger = $wmatch[0]; + + $oprofile = Ostatus_profile::ensureWebfinger($webfinger); + + if (!empty($oprofile)) { + + $profile = $oprofile->localProfile(); + + $mentions[] = array('mentioned' => array($profile), + 'text' => $wmatch[0], + 'position' => $wmatch[1], + 'url' => $profile->profileurl); } } + + return true; } /** -- cgit v1.2.3-54-g00ecf From 912814fb7f3580e6925b5fae7092966df9bf3aab Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 21:38:59 -0500 Subject: use some constants and do some extra output in webfinger output --- plugins/OStatus/actions/webfinger.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php index f4dc61b7d..cf60b8069 100644 --- a/plugins/OStatus/actions/webfinger.php +++ b/plugins/OStatus/actions/webfinger.php @@ -37,7 +37,7 @@ class WebfingerAction extends Action return true; } - + function handle() { $acct = Webfinger::normalize($this->uri); @@ -55,16 +55,22 @@ 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'); + $salmon_url = common_local_url('salmon', array('id' => $this->user->id)); $xrd->links[] = array('rel' => 'salmon', 'href' => $salmon_url); - + // TODO - finalize where the redirect should go on the publisher $url = common_local_url('ostatussub') . '?profile={uri}'; $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe', -- cgit v1.2.3-54-g00ecf From 78ca45c7a05dea911c58097a8c57be470dafee01 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sun, 21 Feb 2010 14:46:26 -0800 Subject: OStatus PuSH fixes: - hub now defers subscription state updates until after verification, per spec - hub now supports synchronous verification when requested (if async is not requested after) - client now requests synchronous verification (it's a bit safer) - cleanup on subscription logging/error responses --- plugins/OStatus/actions/pushcallback.php | 34 +++++--- plugins/OStatus/actions/pushhub.php | 141 ++++++++++++++++++------------- plugins/OStatus/classes/FeedSub.php | 11 ++- plugins/OStatus/classes/HubSub.php | 123 ++++++++++++++++----------- 4 files changed, 177 insertions(+), 132 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index 35c92c732..4184f0e0c 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -72,7 +72,7 @@ class PushCallbackAction extends Action } /** - * Handler for GET verification requests from the hub + * Handler for GET verification requests from the hub. */ function handleGet() { @@ -81,31 +81,37 @@ 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); } - + $feedsub = FeedSub::staticGet('uri', $topic); if (!$feedsub) { - common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback for unknown feed $topic"); - throw new ServerException("Bogus hub callback: unknown feed", 404); + throw new ClientException("Bad hub.topic feed $topic", 404); } if ($feedsub->verify_token !== $verify_token) { - common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad token \"$verify_token\" for feed $topic"); - throw new ServerException("Bogus hub callback: bad token", 404); + throw new ClientException("Bad hub.verify_token $token for $topic", 404); } - if ($mode != $feedsub->sub_state) { - common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad mode \"$mode\" for feed $topic in state \"{$feedsub->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'); + 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"); diff --git a/plugins/OStatus/actions/pushhub.php b/plugins/OStatus/actions/pushhub.php index 19599d815..f33690bc4 100644 --- a/plugins/OStatus/actions/pushhub.php +++ b/plugins/OStatus/actions/pushhub.php @@ -59,102 +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'); - $token = $this->arg('hub.verify_token', null); - common_log(LOG_DEBUG, __METHOD__ . ": checking sub'd to $feed $callback"); - if ($this->getSub($feed, $callback)) { - // Already subscribed; return 204 per spec. - header('HTTP/1.1 204 No Content'); - common_log(LOG_DEBUG, __METHOD__ . ': already subscribed'); - return; + $topic = $this->argUrl('hub.topic'); + if (!$this->recognizedFeed($topic)) { + throw new ClientException("Unsupported hub.topic $topic; this hub only serves local user and group Atom feeds."); } - common_log(LOG_DEBUG, __METHOD__ . ': setting up'); - $sub = new HubSub(); - $sub->topic = $feed; - $sub->callback = $callback; - $sub->secret = $this->arg('hub.secret', null); - if (strlen($sub->secret) > 200) { - throw new ClientException("hub.secret must be no longer than 200 chars", 400); + $verify = $this->arg('hub.verify'); // @fixme may be multiple + if ($verify != 'sync' && $verify != 'async') { + throw new ClientException("Invalid hub.verify $verify; must be sync or async."); } - $sub->setLease(intval($this->arg('hub.lease_seconds'))); - // @fixme check for feeds we don't manage - // @fixme check the verification mode, might want a return immediately? + $lease = $this->arg('hub.lease_seconds', null); + if ($mode == 'subscribe' && $lease != '' && !preg_match('/^\d+$/', $lease)) { + throw new ClientException("Invalid hub.lease $lease; must be empty or positive integer."); + } + + $token = $this->arg('hub.verify_token', null); - common_log(LOG_DEBUG, __METHOD__ . ': inserting'); - $ok = $sub->insert(); - - if (!$ok) { - throw new ServerException("Failed to save subscription record", 500); + $secret = $this->arg('hub.secret', null); + if ($secret != '' && strlen($secret) >= 200) { + throw new ClientException("Invalid hub.secret $secret; must be under 200 bytes."); } - // @fixme check errors ;) + $sub = HubSub::staticGet($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', 'token' => $token); - $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. - * - * HTTP return codes: - * 202 Accepted - request saved and awaiting verification - * 204 No Content - already subscribed - * 400 Bad Request - invalid params or rejected feed + * Check whether the given URL represents one of our canonical + * user or group Atom feeds. * - * @fixme background this + * @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) { - $token = $this->arg('hub.verify_token', null); - if ($sub->verify('unsubscribe', $token)) { - $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) { @@ -164,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/classes/FeedSub.php b/plugins/OStatus/classes/FeedSub.php index 31241d3de..b848b6b1d 100644 --- a/plugins/OStatus/classes/FeedSub.php +++ b/plugins/OStatus/classes/FeedSub.php @@ -291,10 +291,9 @@ class FeedSub extends Memcached_DataObject $headers = array('Content-Type: application/x-www-form-urlencoded'); $post = array('hub.mode' => $mode, 'hub.callback' => $callback, - 'hub.verify' => 'async', + 'hub.verify' => 'sync', 'hub.verify_token' => $this->verify_token, 'hub.secret' => $this->secret, - //'hub.lease_seconds' => 0, 'hub.topic' => $this->uri); $client = new HTTPClient(); $response = $client->post($this->huburi, $headers, $post); @@ -317,8 +316,8 @@ class FeedSub extends Memcached_DataObject common_log(LOG_ERR, __METHOD__ . ": error \"{$e->getMessage()}\" hitting hub $this->huburi subscribing to $this->uri"); $orig = clone($this); - $this->verify_token = null; - $this->sub_state = null; + $this->verify_token = ''; + $this->sub_state = 'inactive'; $this->update($orig); unset($orig); @@ -343,7 +342,7 @@ class FeedSub extends Memcached_DataObject } else { $this->sub_end = null; } - $this->lastupdate = common_sql_now(); + $this->modified = common_sql_now(); return $this->update($original); } @@ -362,7 +361,7 @@ class FeedSub extends Memcached_DataObject $this->sub_state = ''; $this->sub_start = ''; $this->sub_end = ''; - $this->lastupdate = common_sql_now(); + $this->modified = common_sql_now(); return $this->update($original); } diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index a81de68e6..eae2928c3 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -30,11 +30,11 @@ class HubSub extends Memcached_DataObject public $topic; public $callback; public $secret; - public $challenge; public $lease; public $sub_start; public $sub_end; public $created; + public $modified; public /*static*/ function staticGet($topic, $callback) { @@ -61,11 +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, - '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() @@ -82,8 +82,6 @@ class HubSub extends Memcached_DataObject 255, false), new ColumnDef('secret', 'text', null, true), - new ColumnDef('challenge', 'varchar', - 32, true), new ColumnDef('lease', 'int', null, true), new ColumnDef('sub_start', 'datetime', @@ -91,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)); } @@ -148,84 +148,105 @@ 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 scheduleVerify($mode, $token=null, $retries=null) + { + 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, 'hubverify'); + } + + /** + * 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'); - // Is this needed? data object fun... - $clone = clone($this); - $clone->challenge = common_good_rand(16); - $clone->update($this); - $this->challenge = $clone->challenge; - unset($clone); - + $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 ($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. -- cgit v1.2.3-54-g00ecf From be70dd3677242fe46d41a0a8882abe6e46428b5f Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 21:57:09 -0500 Subject: work harder to preserve info when creating new Ostatus_profile --- plugins/OStatus/classes/Ostatus_profile.php | 67 +++++++++++++++++++++++------ 1 file changed, 54 insertions(+), 13 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 700168c11..3bed1c2aa 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -522,7 +522,7 @@ class Ostatus_profile extends Memcached_DataObject * @return Ostatus_profile * @throws FeedSubException */ - public static function ensureProfile($profile_uri) + public static function ensureProfile($profile_uri, $hints=array()) { // Get the canonical feed URI and check it $discover = new FeedDiscovery(); @@ -545,7 +545,7 @@ class Ostatus_profile extends Memcached_DataObject if (!empty($subject)) { $subjObject = new ActivityObject($subject); - return self::ensureActivityObjectProfile($subjObject, $feeduri, $salmonuri); + return self::ensureActivityObjectProfile($subjObject, $feeduri, $salmonuri, $hints); } // Otherwise, try the feed author @@ -554,7 +554,7 @@ class Ostatus_profile extends Memcached_DataObject if (!empty($author)) { $authorObject = new ActivityObject($author); - return self::ensureActivityObjectProfile($authorObject, $feeduri, $salmonuri); + return self::ensureActivityObjectProfile($authorObject, $feeduri, $salmonuri, $hints); } // Sheesh. Not a very nice feed! Let's try fingerpoken in the @@ -570,7 +570,7 @@ class Ostatus_profile extends Memcached_DataObject if (!empty($actor)) { $actorObject = new ActivityObject($actor); - return self::ensureActivityObjectProfile($actorObject, $feeduri, $salmonuri); + return self::ensureActivityObjectProfile($actorObject, $feeduri, $salmonuri, $hints); } @@ -578,7 +578,7 @@ class Ostatus_profile extends Memcached_DataObject if (!empty($author)) { $authorObject = new ActivityObject($author); - return self::ensureActivityObjectProfile($authorObject, $feeduri, $salmonuri); + return self::ensureActivityObjectProfile($authorObject, $feeduri, $salmonuri, $hints); } } @@ -688,11 +688,11 @@ class Ostatus_profile extends Memcached_DataObject return self::ensureActivityObjectProfile($activity->actor, $feeduri, $salmonuri); } - public static function ensureActivityObjectProfile($object, $feeduri=null, $salmonuri=null) + public static function ensureActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array()) { $profile = self::getActivityObjectProfile($object); if (!$profile) { - $profile = self::createActivityObjectProfile($object, $feeduri, $salmonuri); + $profile = self::createActivityObjectProfile($object, $feeduri, $salmonuri, $hints); } return $profile; } @@ -745,10 +745,10 @@ class Ostatus_profile extends Memcached_DataObject self::createActivityObjectProfile($actor, $feeduri, $salmonuri); } - protected static function createActivityObjectProfile($object, $feeduri=null, $salmonuri=null) + protected static function createActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array()) { $homeuri = $object->id; - $nickname = self::getActivityObjectNickname($object); + $nickname = self::getActivityObjectNickname($object, $hints); $avatar = self::getActivityObjectAvatar($object); if (!$homeuri) { @@ -756,6 +756,18 @@ class Ostatus_profile extends Memcached_DataObject 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(); @@ -773,7 +785,11 @@ class Ostatus_profile extends Memcached_DataObject $profile = new Profile(); $profile->nickname = $nickname; $profile->fullname = $object->title; - $profile->profileurl = $object->link; + if (!empty($object->link)) { + $profile->profileurl = $object->link; + } else if (array_key_exists('profileurl', $hints)) { + $profile->profileurl = $hints['profileurl']; + } $profile->created = common_sql_now(); // @fixme bio @@ -812,12 +828,24 @@ class Ostatus_profile extends Memcached_DataObject } } - protected static function getActivityObjectNickname($object) + protected static function getActivityObjectNickname($object, $hints=array()) { // XXX: check whatever PoCo calls a nickname first + // 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); } @@ -883,11 +911,16 @@ class Ostatus_profile extends Memcached_DataObject } } + $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); + $oprofile = self::ensureProfile($feedUrl, $hints); return $oprofile; } catch (Exception $e) { common_log(LOG_WARNING, "Failed creating profile from feed URL '$feedUrl': " . $e->getMessage()); @@ -899,7 +932,7 @@ class Ostatus_profile extends Memcached_DataObject if (isset($profileUrl)) { try { - $oprofile = self::ensureProfile($profileUrl); + $oprofile = self::ensureProfile($profileUrl, $hints); return $oprofile; } catch (Exception $e) { common_log(LOG_WARNING, "Failed creating profile from profile URL '$profileUrl': " . $e->getMessage()); @@ -922,6 +955,10 @@ class Ostatus_profile extends Memcached_DataObject $profile->nickname = self::nicknameFromUri($uri); $profile->created = common_sql_now(); + if (isset($profileUrl)) { + $profile->profileurl = $profileUrl; + } + $profile_id = $profile->insert(); if (!$profile_id) { @@ -936,6 +973,10 @@ class Ostatus_profile extends Memcached_DataObject $oprofile->profile_id = $profile_id; $oprofile->created = common_sql_now(); + if (isset($feedUrl)) { + $profile->feeduri = $feedUrl; + } + $result = $oprofile->insert(); if (!$result) { -- cgit v1.2.3-54-g00ecf From ad10e6e8da5d1bc238fb90d7d9ef168c2525ceb4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sun, 21 Feb 2010 19:01:32 -0800 Subject: OStatus: drop the remnants of feedsubsettings, replaced by ostatussub and no longer linked in UI --- plugins/OStatus/OStatusPlugin.php | 2 - plugins/OStatus/actions/feedsubsettings.php | 230 ---------------------------- 2 files changed, 232 deletions(-) delete mode 100644 plugins/OStatus/actions/feedsubsettings.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 60bb144a8..304cf14ae 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -58,8 +58,6 @@ 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', diff --git a/plugins/OStatus/actions/feedsubsettings.php b/plugins/OStatus/actions/feedsubsettings.php deleted file mode 100644 index aee4cee9a..000000000 --- a/plugins/OStatus/actions/feedsubsettings.php +++ /dev/null @@ -1,230 +0,0 @@ -. - */ - -/** - * @package FeedSubPlugin - * @maintainer Brion Vibber - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } - -class FeedSubSettingsAction extends ConnectSettingsAction -{ - protected $profile_uri; - 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(); - - $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('profile_uri', - _m('Feed URL'), - $this->profile_uri, - _m('Enter the profile 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() - { - $profile_uri = trim($this->arg('profile_uri')); - - if ($profile_uri == '') { - $this->showForm(_m('Empty remote profile URL!')); - return; - } - $this->profile_uri = $profile_uri; - - // @fixme validate, normalize bla bla - try { - $oprofile = Ostatus_profile::ensureProfile($this->profile_uri); - $this->oprofile = $oprofile; - return true; - } catch (FeedSubBadURLException $e) { - $err = _m('Invalid URL or could not reach server.'); - } catch (FeedSubBadResponseException $e) { - $err = _m('Cannot read feed; server returned error.'); - } catch (FeedSubEmptyException $e) { - $err = _m('Cannot read feed; server returned an empty page.'); - } catch (FeedSubBadHTMLException $e) { - $err = _m('Bad HTML, could not find feed link.'); - } catch (FeedSubNoFeedException $e) { - $err = _m('Could not find a feed linked from this URL.'); - } catch (FeedSubUnrecognizedTypeException $e) { - $err = _m('Not a recognized feed type.'); - } catch (FeedSubException $e) { - // Any new ones we forgot about - $err = sprintf(_m('Bad feed URL: %s %s'), get_class($e), $e->getMessage()); - } - - $this->showForm($err); - return false; - } - - function saveFeed() - { - if ($this->validateFeed()) { - $this->preview = true; - - // And subscribe the current user to the local profile - $user = common_current_user(); - - if (!$this->oprofile->subscribe()) { - $this->showForm(_m("Failed to set up server-to-server subscription.")); - return; - } - - if ($this->oprofile->isGroup()) { - $group = $this->oprofile->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->oprofile->localProfile(); - if ($user->isSubscribed($local)) { - $this->showForm(_m('Already subscribed!')); - } elseif ($this->oprofile->subscribeLocalToRemote($user)) { - $this->showForm(_m('Remote user subscribed!')); - } else { - $this->showForm(_m('Remote subscription failed!')); - } - } - } - } - - function validateAndPreview() - { - if ($this->validateFeed()) { - $this->preview = true; - $this->showForm(_m('Previewing feed:')); - } - } - - function previewFeed() - { - $this->text('Profile preview should go here'); - } - - function showScripts() - { - parent::showScripts(); - $this->autofocus('feedurl'); - } -} -- cgit v1.2.3-54-g00ecf From bd21f48ceed83699ca4c4613805b1edc1bf49f8c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 22:34:40 -0500 Subject: Notice::getReplies() returns array of profile IDs --- plugins/OStatus/OStatusPlugin.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 60bb144a8..fdc07b813 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -201,9 +201,9 @@ class OStatusPlugin extends Plugin { $mentioned = $notice->getReplies(); - foreach ($mentioned as $profile) { + foreach ($mentioned as $profile_id) { - $oprofile = Ostatus_profile::staticGet('profile_id', $profile->id); + $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id); if (!empty($oprofile) && !empty($oprofile->salmonuri)) { -- cgit v1.2.3-54-g00ecf From de522d7978e0a843e338561b35a98b3e47a1e93c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 22:38:18 -0500 Subject: Wasn't putting in namespaces for reply salmons --- plugins/OStatus/OStatusPlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index ec6f3f3b0..641765dae 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -208,7 +208,7 @@ class OStatusPlugin extends Plugin // FIXME: this needs to go out in a queue handler $xml = ''; - $xml .= $notice->asAtomEntry(); + $xml .= $notice->asAtomEntry(true, true); $salmon = new Salmon(); $salmon->post($oprofile->salmonuri, $xml); -- cgit v1.2.3-54-g00ecf From 13fb7bef783faae497069485546b92b897662987 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 22:41:02 -0500 Subject: reversed in_array() arguments in UsersalmonAction --- plugins/OStatus/actions/usersalmon.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php index 12c74798f..3c0f72855 100644 --- a/plugins/OStatus/actions/usersalmon.php +++ b/plugins/OStatus/actions/usersalmon.php @@ -80,7 +80,7 @@ class UsersalmonAction extends SalmonAction throw new ClientException("In reply to a notice not by this user"); } } else if (!empty($context->attention)) { - if (!in_array($context->attention, $this->user->uri)) { + if (!in_array($this->user->uri, $context->attention)) { throw new ClientException("To the attention of user(s) not including this one!"); } } else { -- cgit v1.2.3-54-g00ecf From 232b5efa7e5d2771ef50b8a5da90147bbff7af3f Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 22:44:58 -0500 Subject: Add error info for missing URI in attention --- plugins/OStatus/actions/usersalmon.php | 1 + 1 file changed, 1 insertion(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php index 3c0f72855..ca0370bb4 100644 --- a/plugins/OStatus/actions/usersalmon.php +++ b/plugins/OStatus/actions/usersalmon.php @@ -81,6 +81,7 @@ class UsersalmonAction extends SalmonAction } } 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 { -- cgit v1.2.3-54-g00ecf From cc18f757a8e6ef854cae89d8947efac505b1fd7c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 22:52:52 -0500 Subject: hook in OStatusPlugin to return Ostatus_profile URIs where applicable --- plugins/OStatus/OStatusPlugin.php | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 641765dae..a8c292301 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -484,4 +484,14 @@ class OStatusPlugin extends Plugin return true; } + + function onStartGetProfileUri($profile, &$uri) + { + $oprofile = Ostatus_profile::staticGet('profile_id', $profile->id); + if (!empty($oprofile)) { + $uri = $oprofile->uri; + return false; + } + return true; + } } -- cgit v1.2.3-54-g00ecf From 5207783765328a3d6f0101f143edb8807247bcfe Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Sun, 21 Feb 2010 19:51:11 -0800 Subject: OStatus: record source profile & saving method in ostatus_source table; this allows us to distinguish posts that have come through an unverified group feed --- plugins/OStatus/OStatusPlugin.php | 1 + plugins/OStatus/classes/Ostatus_profile.php | 4 +- plugins/OStatus/classes/Ostatus_source.php | 114 ++++++++++++++++++++++++++++ plugins/OStatus/lib/salmonaction.php | 13 +++- 4 files changed, 127 insertions(+), 5 deletions(-) create mode 100644 plugins/OStatus/classes/Ostatus_source.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 641765dae..5b9e3be2b 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -305,6 +305,7 @@ 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()); return true; diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 3bed1c2aa..71885bcdc 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -508,13 +508,15 @@ class Ostatus_profile extends Memcached_DataObject } } - // @fixme save detailed ostatus source info // @fixme ensure that groups get handled correctly $saved = Notice::saveNew($oprofile->localProfile()->id, $content, 'ostatus', $params); + + // Record which feed this came through... + Ostatus_source::saveNew($saved, $this, 'push'); } /** diff --git a/plugins/OStatus/classes/Ostatus_source.php b/plugins/OStatus/classes/Ostatus_source.php new file mode 100644 index 000000000..e6ce7d442 --- /dev/null +++ b/plugins/OStatus/classes/Ostatus_source.php @@ -0,0 +1,114 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer Brion Vibber + */ + +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/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 11c411c7d..d93cc9aa4 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -202,9 +202,14 @@ class SalmonAction extends Action $options['created'] = common_sql_time($this->act->time); } - return Notice::saveNew($oprofile->profile_id, - $content, - 'ostatus+salmon', - $options); + $saved = Notice::saveNew($oprofile->profile_id, + $content, + 'ostatus+salmon', + $options); + + // Record that this was saved through a validated Salmon source + // @fixme actually do the signature validation! + Ostatus_source::saveNew($saved, $oprofile, 'salmon'); + return $saved; } } -- cgit v1.2.3-54-g00ecf From 17c329ba89f575c7fcbf05522a0cf50db6d6a74a Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 23:07:46 -0500 Subject: add HTMLPurifier config --- plugins/OStatus/lib/salmonaction.php | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 11c411c7d..8734223c6 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -173,7 +173,10 @@ class SalmonAction extends Action $html = $this->act->object->content; - $rendered = HTMLPurifier::purify($html); + $htmlConfig = HTMLPurifier_Config::createDefault(); + + $rendered = HTMLPurifier::purify($html, $htmlConfig); + $content = html_entity_decode(strip_tags($rendered)); $options = array('is_local' => Notice::REMOTE_OMB, -- cgit v1.2.3-54-g00ecf From e39e6cdcc590a5330ab5a20a2519346bfc7965e0 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 23:16:42 -0500 Subject: was using HTMLPurifier::purify() as a static method, which it is not --- plugins/OStatus/lib/salmonaction.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 273be588b..08bfa332f 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -173,9 +173,9 @@ class SalmonAction extends Action $html = $this->act->object->content; - $htmlConfig = HTMLPurifier_Config::createDefault(); + $purifier = new HTMLPurifier(); - $rendered = HTMLPurifier::purify($html, $htmlConfig); + $rendered = $purifier->purify($html); $content = html_entity_decode(strip_tags($rendered)); -- cgit v1.2.3-54-g00ecf From 48839a1fcf0c94b877c7c3232cf3e34eb0a9f23e Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 23:19:29 -0500 Subject: change erroneous common_sql_time() to common_sql_date() --- plugins/OStatus/lib/salmonaction.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 08bfa332f..b128cbd13 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -202,7 +202,7 @@ class SalmonAction extends Action } if (!empty($this->act->time)) { - $options['created'] = common_sql_time($this->act->time); + $options['created'] = common_sql_date($this->act->time); } $saved = Notice::saveNew($oprofile->profile_id, -- cgit v1.2.3-54-g00ecf From e4c4f90c8a303e566fa117fadb0004694b89ccc8 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 23:32:20 -0500 Subject: don't save Notices that already exist in Salmon --- plugins/OStatus/actions/usersalmon.php | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php index ca0370bb4..8368eeccf 100644 --- a/plugins/OStatus/actions/usersalmon.php +++ b/plugins/OStatus/actions/usersalmon.php @@ -88,6 +88,12 @@ class UsersalmonAction extends SalmonAction 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."); + } + $this->saveNotice(); } -- cgit v1.2.3-54-g00ecf From a9599d53c5e33eff2927f02393b9ae6984ba3a6e Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 23:39:52 -0500 Subject: some info code for usersalmon.php --- plugins/OStatus/OStatusPlugin.php | 2 ++ plugins/OStatus/actions/usersalmon.php | 3 +++ 2 files changed, 5 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 548c87711..3ac2bb87d 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -205,6 +205,8 @@ class OStatusPlugin extends Plugin if (!empty($oprofile) && !empty($oprofile->salmonuri)) { + common_log(LOG_INFO, "Sending notice '{$notice->uri}' to remote profile '{$oprofile->uri}'."); + // FIXME: this needs to go out in a queue handler $xml = ''; diff --git a/plugins/OStatus/actions/usersalmon.php b/plugins/OStatus/actions/usersalmon.php index 8368eeccf..c8a16e06f 100644 --- a/plugins/OStatus/actions/usersalmon.php +++ b/plugins/OStatus/actions/usersalmon.php @@ -55,6 +55,8 @@ class UsersalmonAction extends SalmonAction */ 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: @@ -92,6 +94,7 @@ class UsersalmonAction extends SalmonAction if (!empty($existing)) { common_log(LOG_ERR, "Not saving notice '{$existing->uri}'; already exists."); + return; } $this->saveNotice(); -- cgit v1.2.3-54-g00ecf From 891e0028838e51788e917d947cc280dbd53c1792 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sun, 21 Feb 2010 23:56:48 -0500 Subject: don't calculate replies for remote notices --- classes/Notice.php | 27 +++++++++++++++++++++++++++ lib/distribqueuehandler.php | 4 ++-- plugins/OStatus/lib/salmonaction.php | 3 ++- 3 files changed, 31 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/classes/Notice.php b/classes/Notice.php index 6f1ef81fc..a12839d72 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -333,8 +333,15 @@ 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(); + } + $notice->distribute(); return $notice; @@ -817,6 +824,26 @@ class Notice extends Memcached_DataObject return true; } + 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; + } + /** * @return array of integer profile IDs */ diff --git a/lib/distribqueuehandler.php b/lib/distribqueuehandler.php index 4477468d0..c31b675c1 100644 --- a/lib/distribqueuehandler.php +++ b/lib/distribqueuehandler.php @@ -75,7 +75,7 @@ class DistribQueueHandler } try { - $recipients = $notice->saveReplies(); + $recipients = $notice->getReplies(); } catch (Exception $e) { $this->logit($notice, $e); } @@ -107,7 +107,7 @@ class DistribQueueHandler return true; } - + protected function logit($notice, $e) { common_log(LOG_ERR, "Distrib queue exception saving notice $notice->id: " . diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index b128cbd13..4aba20cc4 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -182,7 +182,8 @@ class SalmonAction extends Action $options = array('is_local' => Notice::REMOTE_OMB, 'uri' => $this->act->object->id, 'url' => $this->act->object->link, - 'rendered' => $rendered); + 'rendered' => $rendered, + 'replies' => $this->act->context->attention); if (!empty($this->act->context->location)) { $options['lat'] = $location->lat; -- cgit v1.2.3-54-g00ecf From 17ed30dffc1c05259baf2f0387089547e39684d7 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 22 Feb 2010 06:00:13 +0000 Subject: OStatus: fix remote subscription when putting webfinger address in the little box --- plugins/OStatus/actions/ostatusinit.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatusinit.php b/plugins/OStatus/actions/ostatusinit.php index 4afde2c36..abd8cb541 100644 --- a/plugins/OStatus/actions/ostatusinit.php +++ b/plugins/OStatus/actions/ostatusinit.php @@ -119,7 +119,7 @@ class OStatusInitAction extends Action } else { $this->connectProfile($this->acct); } - } elseif (strpos('@', $this->acct) !== false) { + } elseif (strpos($this->acct, '@') !== false) { $this->connectWebfinger($this->acct); } } @@ -139,7 +139,7 @@ class OStatusInitAction extends Action $user = User::staticGet('nickname', $this->nickname); $target_profile = common_local_url('userbyid', array('id' => $user->id)); - $url = $w->applyTemplate($link['template'], $feed_url); + $url = $w->applyTemplate($link['template'], $target_profile); common_redirect($url, 303); } -- cgit v1.2.3-54-g00ecf From effa4f5d1efffcb52d4a95562e0b4831f7bd3435 Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 01:39:00 -0500 Subject: adding extlib for Crypt_RSA --- plugins/OStatus/OStatusPlugin.php | 2 ++ 1 file changed, 2 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 60bb144a8..24ed23a00 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -24,6 +24,8 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } +set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/'); + class FeedSubException extends Exception { } -- cgit v1.2.3-54-g00ecf From f54c9b70dbabb70de93fcdd896297adfff5494f4 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 22 Feb 2010 11:53:34 +0100 Subject: Fixed error/warning message location in OStatus autorize subscription page --- plugins/OStatus/actions/ostatussub.php | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index bbbd1b7e6..8cb8e2ae7 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -58,6 +58,13 @@ class OStatusSubAction extends Action $this->showPage(); } + function showPageNotice() + { + if ($this->error) { + $this->element('p', 'error', $this->error); + } + } + /** * Content area of the page * @@ -69,11 +76,6 @@ class OStatusSubAction extends Action function showContent() { - // @fixme is this right place? - if ($this->error) { - $this->text($this->error); - } - $user = common_current_user(); $profile = $user->getProfile(); @@ -255,7 +257,7 @@ class OStatusSubAction extends Action { if ($this->validateFeed()) { $this->preview = true; - $this->showForm(_m('Previewing feed:')); + $this->showForm(); } } -- cgit v1.2.3-54-g00ecf From 75fdef209245bf9424d4b995a42e4dfd980469d2 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 22 Feb 2010 07:57:44 -0500 Subject: handle poco nicknames in Ostatus_profile --- plugins/OStatus/classes/Ostatus_profile.php | 4 +++- plugins/OStatus/lib/activity.php | 9 ++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 71885bcdc..0e12f8fc6 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -832,7 +832,9 @@ class Ostatus_profile extends Memcached_DataObject protected static function getActivityObjectNickname($object, $hints=array()) { - // XXX: check whatever PoCo calls a nickname first + if (!empty($object->nickname)) { + return common_nicknamize($object->nickname); + } // Try the definitive ID diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index af83f8bc6..a26248f19 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -31,6 +31,12 @@ if (!defined('STATUSNET')) { exit(1); } +class PoCo +{ + const NS = 'http://portablecontacts.net/spec/1.0'; + const USERNAME = 'preferredUsername'; +} + /** * Utilities for turning DOMish things into Activityish things * @@ -319,7 +325,8 @@ class ActivityObject $this->displayName = $this->title; // @fixme we may have multiple avatars with different resolutions specified - $this->avatar = ActivityUtils::getLink($element, 'avatar'); + $this->avatar = ActivityUtils::getLink($element, 'avatar'); + $this->nickname = ActivityUtils::childContent($element, PoCo::USERNAME, PoCo::NS); } } -- cgit v1.2.3-54-g00ecf From e0388cc1d3922002596c2ec0531ac2f06d91806a Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 09:05:32 -0500 Subject: adding magic sig stuff --- plugins/OStatus/extlib/Crypt/RSA.php | 524 ++++++++++++++ plugins/OStatus/extlib/Crypt/RSA/ErrorHandler.php | 234 +++++++ plugins/OStatus/extlib/Crypt/RSA/Key.php | 315 +++++++++ plugins/OStatus/extlib/Crypt/RSA/KeyPair.php | 804 ++++++++++++++++++++++ plugins/OStatus/extlib/Crypt/RSA/Math/BCMath.php | 482 +++++++++++++ plugins/OStatus/extlib/Crypt/RSA/Math/BigInt.php | 313 +++++++++ plugins/OStatus/extlib/Crypt/RSA/Math/GMP.php | 361 ++++++++++ plugins/OStatus/extlib/Crypt/RSA/MathLoader.php | 135 ++++ plugins/OStatus/lib/magicenvelope.php | 174 +++++ plugins/OStatus/lib/magicsig.php | 159 +++++ 10 files changed, 3501 insertions(+) create mode 100644 plugins/OStatus/extlib/Crypt/RSA.php create mode 100644 plugins/OStatus/extlib/Crypt/RSA/ErrorHandler.php create mode 100644 plugins/OStatus/extlib/Crypt/RSA/Key.php create mode 100644 plugins/OStatus/extlib/Crypt/RSA/KeyPair.php create mode 100644 plugins/OStatus/extlib/Crypt/RSA/Math/BCMath.php create mode 100644 plugins/OStatus/extlib/Crypt/RSA/Math/BigInt.php create mode 100644 plugins/OStatus/extlib/Crypt/RSA/Math/GMP.php create mode 100644 plugins/OStatus/extlib/Crypt/RSA/MathLoader.php create mode 100644 plugins/OStatus/lib/magicenvelope.php create mode 100644 plugins/OStatus/lib/magicsig.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/extlib/Crypt/RSA.php b/plugins/OStatus/extlib/Crypt/RSA.php new file mode 100644 index 000000000..16dfa54d4 --- /dev/null +++ b/plugins/OStatus/extlib/Crypt/RSA.php @@ -0,0 +1,524 @@ + + * @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 + * @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 index 000000000..8f39741e0 --- /dev/null +++ b/plugins/OStatus/extlib/Crypt/RSA/ErrorHandler.php @@ -0,0 +1,234 @@ + + * @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 + * @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 index 000000000..659530229 --- /dev/null +++ b/plugins/OStatus/extlib/Crypt/RSA/Key.php @@ -0,0 +1,315 @@ + + * @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 + * @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 index 000000000..ecc0b7dc7 --- /dev/null +++ b/plugins/OStatus/extlib/Crypt/RSA/KeyPair.php @@ -0,0 +1,804 @@ + + * @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 + * @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 index 000000000..646ff6710 --- /dev/null +++ b/plugins/OStatus/extlib/Crypt/RSA/Math/BCMath.php @@ -0,0 +1,482 @@ + + * @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 + * @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 index 000000000..b7ac24cb6 --- /dev/null +++ b/plugins/OStatus/extlib/Crypt/RSA/Math/BigInt.php @@ -0,0 +1,313 @@ + + * @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 + * @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 index 000000000..54e4c34fc --- /dev/null +++ b/plugins/OStatus/extlib/Crypt/RSA/Math/GMP.php @@ -0,0 +1,361 @@ + + * @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 + * @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 index 000000000..de6c94642 --- /dev/null +++ b/plugins/OStatus/extlib/Crypt/RSA/MathLoader.php @@ -0,0 +1,135 @@ + + * @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 + * @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/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php new file mode 100644 index 000000000..1ae80d70c --- /dev/null +++ b/plugins/OStatus/lib/magicenvelope.php @@ -0,0 +1,174 @@ +. + * + * @package StatusNet + * @author James Walker + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +require_once 'magicsig.php'; + +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 = new MagicsigRsaSha256($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 = new MagicsigRsaSha256($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/magicsig.php b/plugins/OStatus/lib/magicsig.php new file mode 100644 index 000000000..af65bad04 --- /dev/null +++ b/plugins/OStatus/lib/magicsig.php @@ -0,0 +1,159 @@ +. + * + * @package StatusNet + * @author James Walker + * @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'; + +interface Magicsig +{ + + public function sign($bytes); + + public function verify($signed, $signature_b64); +} + +class MagicsigRsaSha256 +{ + + public $keypair; + + public function __construct($init = null) + { + if (is_null($init)) { + $this->generate(); + } else { + $this->fromString($init); + } + } + + + public function generate($key_length = 512) + { + $keypair = new Crypt_RSA_KeyPair($key_length); + $params['public_key'] = $keypair->getPublicKey(); + $params['private_key'] = $keypair->getPrivateKey(); + + $this->keypair = new Crypt_RSA($params); + } + + + public function toString($full_pair = true) + { + $public_key = $this->keypair->_public_key; + $private_key = $this->keypair->_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 function fromString($text) + { + // 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(); + print $error->getMessage(); + exit; + } + if ($private_exp) { + $params['private_key'] = new Crypt_RSA_KEY($mod, $private_exp, 'private'); + if ($params['private_key']->isError()) { + $error = $params['private_key']->getLastError(); + print $error->getMessage(); + exit; + } + } + + $this->keypair = new Crypt_RSA($params); + } + + public function getName() + { + return 'RSA-SHA256'; + } + + public function sign($bytes) + { + $sig = $this->keypair->createSign($bytes, null, 'sha256'); + if ($this->keypair->isError()) { + $error = $this->keypair->getLastError(); + common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); + } + + return $sig; + } + + public function verify($signed_bytes, $signature) + { + $result = $this->keypair->validateSign($signed_bytes, $signature, null, 'sha256'); + if ($this->keypair->isError()) { + $error = $this->keypair->getLastError(); + //common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); + print $error->getMessage(); + } + 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 -- cgit v1.2.3-54-g00ecf From 2f65fa646acc9a0739e779de9e472b9957c2e7eb Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 09:05:52 -0500 Subject: wiring in magicsig --- plugins/OStatus/lib/salmon.php | 17 ++++++++++++++--- plugins/OStatus/lib/salmonaction.php | 8 +++++++- 2 files changed, 21 insertions(+), 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/salmon.php b/plugins/OStatus/lib/salmon.php index df17a7006..53925dc3f 100644 --- a/plugins/OStatus/lib/salmon.php +++ b/plugins/OStatus/lib/salmon.php @@ -34,6 +34,8 @@ class Salmon return FALSE; } + $xml = $this->createMagicEnv($xml); + $headers = array('Content-type: application/atom+xml'); try { @@ -52,16 +54,25 @@ class Salmon } - 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 index 4aba20cc4..09a042975 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -54,8 +54,14 @@ class SalmonAction extends Action common_log(LOG_DEBUG, "Got invalid Salmon post: $xml"); $this->clientError(_m('Salmon post must be an Atom entry.')); } - // XXX: check the signature + // Check the signature + $salmon = new Salmon; + 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; } -- cgit v1.2.3-54-g00ecf From e6ce04cbce08b9f7d0d74f6fbf86e199af8b865d Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 22 Feb 2010 17:05:43 +0100 Subject: Generalised Subscription XHR dialogbox --- plugins/OStatus/js/ostatus.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/js/ostatus.js b/plugins/OStatus/js/ostatus.js index 671795558..4b4c32910 100644 --- a/plugins/OStatus/js/ostatus.js +++ b/plugins/OStatus/js/ostatus.js @@ -1,14 +1,15 @@ 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(); } else { + a[0].href = (a[0].href.match(/[\\?]/) == null) ? a[0].href+'?' : a[0].href+'&'; $.ajax({ type: 'GET', dataType: 'xml', - url: a[0].href+'&ajax=1', + url: a[0].href+'ajax=1', beforeSend: function(formData) { a.addClass('processing'); }, @@ -19,7 +20,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') @@ -40,6 +41,7 @@ SN.U.DialogBox = { }); form.find('#acct').focus(); + form.find('#profile').focus(); } a.removeClass('processing'); @@ -50,11 +52,9 @@ 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(); }); -- cgit v1.2.3-54-g00ecf From 3569493ba7e77a1a9f19bdbbf3f2d5f262ea8484 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 22 Feb 2010 17:07:48 +0100 Subject: Added link to Subscriptions page to XHR get the ostatus sub form --- plugins/OStatus/OStatusPlugin.php | 17 +++++++++++++++++ plugins/OStatus/actions/ostatussub.php | 19 ++++++++++++++++--- plugins/OStatus/theme/base/css/ostatus.css | 30 ++++++++++++++++++++++++------ 3 files changed, 57 insertions(+), 9 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 3ac2bb87d..0b0317316 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -497,4 +497,21 @@ class OStatusPlugin extends Plugin } return true; } + + 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; + } } diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 8cb8e2ae7..95dec19af 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -55,7 +55,20 @@ class OStatusSubAction extends Action function showForm($error=null) { $this->error = $error; - $this->showPage(); + 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(); + } } function showPageNotice() @@ -81,7 +94,7 @@ class OStatusSubAction extends Action $profile = $user->getProfile(); $this->elementStart('form', array('method' => 'post', - 'id' => 'ostatus_sub', + 'id' => 'form_ostatus_sub', 'class' => 'form_settings', 'action' => common_local_url('ostatussub'))); @@ -141,7 +154,7 @@ class OStatusSubAction extends Action if ($this->profile_uri) { $this->validateAndPreview(); } else { - $this->showPage(); + $this->showForm(); } } } diff --git a/plugins/OStatus/theme/base/css/ostatus.css b/plugins/OStatus/theme/base/css/ostatus.css index 9bc90a731..feeeb47d3 100644 --- a/plugins/OStatus/theme/base/css/ostatus.css +++ b/plugins/OStatus/theme/base/css/ostatus.css @@ -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; +} -- cgit v1.2.3-54-g00ecf From 2b16532ffb77d683d32ca6a399b80949d7e6b1e4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 22 Feb 2010 10:03:34 -0800 Subject: OStatus: use 'profile' consistently as param on ostatussub and ostatusinit to help us stay sane. --- plugins/OStatus/actions/ostatusinit.php | 28 +++++++++++++++++----------- plugins/OStatus/js/ostatus.js | 1 - 2 files changed, 17 insertions(+), 12 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatusinit.php b/plugins/OStatus/actions/ostatusinit.php index abd8cb541..3f2f6368f 100644 --- a/plugins/OStatus/actions/ostatusinit.php +++ b/plugins/OStatus/actions/ostatusinit.php @@ -29,7 +29,7 @@ class OStatusInitAction extends Action { var $nickname; - var $acct; + var $profile; var $err; function prepare($args) @@ -41,8 +41,11 @@ class OStatusInitAction extends Action 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; } @@ -100,7 +103,7 @@ class OStatusInitAction extends Action _m('Nickname of the user you want to follow')); $this->elementEnd('li'); $this->elementStart('li', array('id' => 'ostatus_profile')); - $this->input('acct', _m('Profile Account'), $this->acct, + $this->input('profile', _m('Profile Account'), $this->profile, _m('Your account id (i.e. user@identi.ca)')); $this->elementEnd('li'); $this->elementEnd('ul'); @@ -112,15 +115,17 @@ class OStatusInitAction extends Action function ostatusConnect() { $opts = array('allowed_schemes' => array('http', 'https', 'acct')); - if (Validate::uri($this->acct, $opts)) { - $bits = parse_url($this->acct); + if (Validate::uri($this->profile, $opts)) { + $bits = parse_url($this->profile); if ($bits['scheme'] == 'acct') { $this->connectWebfinger($bits['path']); } else { - $this->connectProfile($this->acct); + $this->connectProfile($this->profile); } - } elseif (strpos($this->acct, '@') !== false) { - $this->connectWebfinger($this->acct); + } elseif (strpos($this->profile, '@') !== false) { + $this->connectWebfinger($this->profile); + } else { + $this->clientError(_m("Must provide a remote profile.")); } } @@ -140,12 +145,12 @@ class OStatusInitAction extends Action $target_profile = common_local_url('userbyid', array('id' => $user->id)); $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) @@ -157,6 +162,7 @@ class OStatusInitAction extends Action $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); } diff --git a/plugins/OStatus/js/ostatus.js b/plugins/OStatus/js/ostatus.js index 4b4c32910..0daeb1a8b 100644 --- a/plugins/OStatus/js/ostatus.js +++ b/plugins/OStatus/js/ostatus.js @@ -40,7 +40,6 @@ SN.U.DialogBox = { return false; }); - form.find('#acct').focus(); form.find('#profile').focus(); } -- cgit v1.2.3-54-g00ecf From 85cb850cd5fe4b2edd61a86c6020f246f71e8306 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 22 Feb 2010 19:13:30 +0100 Subject: Set and reuse a cookie with own profile value at a StatusNet instance --- plugins/OStatus/js/ostatus.js | 45 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 44 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/js/ostatus.js b/plugins/OStatus/js/ostatus.js index 0daeb1a8b..dc1925cb9 100644 --- a/plugins/OStatus/js/ostatus.js +++ b/plugins/OStatus/js/ostatus.js @@ -1,3 +1,36 @@ +SN.C.S.StatusNetInstance = 'StatusNetInstance'; + +SN.U.StatusNetInstance = { + Set: function(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); + } +}; + +SN.Init.OStatusCookie = function() { + if (SN.U.StatusNetInstance.Get() === null) { + SN.C.I.OStatusProfile = SN.C.I.OStatusProfile || null; + SN.U.StatusNetInstance.Set({profile: SN.C.I.OStatusProfile}); + } +}; + SN.U.DialogBox = { Subscribe: function(a) { var f = a.parent().find('.form_settings'); @@ -41,13 +74,23 @@ SN.U.DialogBox = { }); form.find('#profile').focus(); + + if (form.attr('id') == 'form_ostatus_connect') { + SN.Init.OStatusCookie(); + form.find('#profile').val(SN.U.StatusNetInstance.Get().profile) + + form.find("[type=submit]").bind('click', function() { + SN.U.StatusNetInstance.Set({profile: form.find('#profile').val()}); + return true; + }); + } } a.removeClass('processing'); } }); } - } + }, }; SN.Init.Subscribe = function() { -- cgit v1.2.3-54-g00ecf From 3ed379613598645f75a402baa2c4abcf78984639 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 22 Feb 2010 19:18:32 +0100 Subject: Added licensing info and a note about migrating --- plugins/OStatus/js/ostatus.js | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/js/ostatus.js b/plugins/OStatus/js/ostatus.js index dc1925cb9..5521583de 100644 --- a/plugins/OStatus/js/ostatus.js +++ b/plugins/OStatus/js/ostatus.js @@ -1,3 +1,29 @@ +/* + * 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 . + * + * @category OStatus UI interaction + * @package StatusNet + * @author Sarven Capadisli + * @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.C.S.StatusNetInstance = 'StatusNetInstance'; SN.U.StatusNetInstance = { -- cgit v1.2.3-54-g00ecf From a1549ebf87b7c1629c23704b1ec733c1e7c2a57d Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 22 Feb 2010 19:36:03 +0100 Subject: Minor JSLinting --- plugins/OStatus/js/ostatus.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/js/ostatus.js b/plugins/OStatus/js/ostatus.js index 5521583de..473f1540a 100644 --- a/plugins/OStatus/js/ostatus.js +++ b/plugins/OStatus/js/ostatus.js @@ -64,7 +64,7 @@ SN.U.DialogBox = { f.show(); } else { - a[0].href = (a[0].href.match(/[\\?]/) == null) ? a[0].href+'?' : a[0].href+'&'; + a[0].href = (a[0].href.match(/[\\?]/) === null) ? a[0].href+'?' : a[0].href+'&'; $.ajax({ type: 'GET', dataType: 'xml', @@ -103,7 +103,7 @@ SN.U.DialogBox = { if (form.attr('id') == 'form_ostatus_connect') { SN.Init.OStatusCookie(); - form.find('#profile').val(SN.U.StatusNetInstance.Get().profile) + form.find('#profile').val(SN.U.StatusNetInstance.Get().profile); form.find("[type=submit]").bind('click', function() { SN.U.StatusNetInstance.Set({profile: form.find('#profile').val()}); -- cgit v1.2.3-54-g00ecf From 7e8c3ea418796152151a5780e52dd095ca4e114b Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 22 Feb 2010 19:37:42 +0100 Subject: Removed extra comma --- plugins/OStatus/js/ostatus.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/js/ostatus.js b/plugins/OStatus/js/ostatus.js index 473f1540a..8ba424a53 100644 --- a/plugins/OStatus/js/ostatus.js +++ b/plugins/OStatus/js/ostatus.js @@ -116,7 +116,7 @@ SN.U.DialogBox = { } }); } - }, + } }; SN.Init.Subscribe = function() { -- cgit v1.2.3-54-g00ecf From 06f155c02df91ae81eb4401c738815ee46b802a6 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 22 Feb 2010 09:43:27 -0800 Subject: OStatus: initial hookup of remote group membership (notice delivery not yet working quite right) - added a temp config var to disable salmon magic signatures until they're working consistently --- plugins/OStatus/OStatusPlugin.php | 93 ++++++++++++++- plugins/OStatus/actions/groupsalmon.php | 77 ++++++++++++- plugins/OStatus/actions/ostatussub.php | 2 +- plugins/OStatus/classes/Ostatus_profile.php | 169 +++++++++++++++++++++------- plugins/OStatus/lib/activity.php | 6 + plugins/OStatus/lib/salmon.php | 21 +++- plugins/OStatus/lib/salmonaction.php | 23 +++- 7 files changed, 336 insertions(+), 55 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 7c6c0c69f..061ed4bd1 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -211,7 +211,7 @@ class OStatusPlugin extends Plugin // FIXME: this needs to go out in a queue handler - $xml = ''; + $xml = ''; $xml .= $notice->asAtomEntry(true, true); $salmon = new Salmon(); @@ -402,6 +402,97 @@ class OStatusPlugin extends Plugin 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) { + $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 { + throw new ServerException(_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. + + $members = $group->getMembers(0, 1); + if ($members->N == 0) { + common_log(LOG_INFO, "Unsubscribing from now-unused group feed $oprofile->feeduri"); + $oprofile->unsubscribe(); + } + + + $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. * diff --git a/plugins/OStatus/actions/groupsalmon.php b/plugins/OStatus/actions/groupsalmon.php index 64ae9f3cc..2e4fe9443 100644 --- a/plugins/OStatus/actions/groupsalmon.php +++ b/plugins/OStatus/actions/groupsalmon.php @@ -88,21 +88,96 @@ class GroupsalmonAction extends SalmonAction * Save a subscription relationship for them. */ + /** + * Postel's law: consider a "follow" notification as a "join". + */ function handleFollow() { - $this->handleJoin(); // ??? + $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; + } } } diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 95dec19af..592ae387e 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -248,7 +248,7 @@ class OStatusSubAction extends Action $group = $this->oprofile->localGroup(); if ($user->isMember($group)) { $this->showForm(_m('Already a member!')); - } elseif (Group_member::join($this->profile->group_id, $user->id)) { + } elseif (Group_member::join($this->oprofile->group_id, $user->id)) { $this->showForm(_m('Joined remote group!')); } else { $this->showForm(_m('Remote group join failed!')); diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 0e12f8fc6..c0e39add8 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -137,12 +137,49 @@ class Ostatus_profile extends Memcached_DataObject return null; } + /** + * Returns an ActivityObject describing this remote user or group profile. + * Can then be used to generate Atom chunks. + * + * @return ActivityObject + */ + function asActivityObject() + { + if ($this->isGroup()) { + $object = new ActivityObject(); + $object->type = 'http://activitystrea.ms/schema/1.0/group'; + $object->id = $this->uri; + $self = $this->localGroup(); + + // @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]; + } + } + + $object->link = $this->uri; // @fixme accurate? + return $object; + } else { + return ActivityObject::fromProfile($this->localProfile()); + } + } + /** * 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. * + * @fixme replace with wrappers on asActivityObject when it's got everything. + * * @param string $element one of 'actor', 'subject', 'object', 'target' * @return string */ @@ -202,11 +239,19 @@ 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"); + } } /** @@ -353,22 +398,24 @@ class Ostatus_profile extends Memcached_DataObject 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; } public function notifyActivity($activity) { if ($this->salmonuri) { - $xml = $activity->asString(true); + $xml = '' . + $activity->asString(true); $salmon = new Salmon(); // ? - $salmon->post($this->salmonuri, $xml); + return $salmon->post($this->salmonuri, $xml); } - return; + return false; } function getBestName() @@ -597,10 +644,23 @@ class Ostatus_profile extends Memcached_DataObject */ protected function updateAvatar($url) { + 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'); - copy($url, $temp_filename); + if (!copy($url, $temp_filename)) { + throw new ServerException(sprintf(_m("Unable to fetch avatar from %s"), $url)); + } if ($this->isGroup()) { $id = $this->group_id; @@ -614,13 +674,7 @@ class Ostatus_profile extends Memcached_DataObject null, common_timestamp()); rename($temp_filename, Avatar::path($filename)); - if ($this->isGroup()) { - $group = $this->localGroup(); - $group->setOriginal($filename); - } else { - $profile = $this->localProfile(); - $profile->setOriginal($filename); - } + $self->setOriginal($filename); } protected static function getActivityObjectAvatar($object) @@ -747,6 +801,18 @@ class Ostatus_profile extends Memcached_DataObject 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; @@ -784,46 +850,65 @@ class Ostatus_profile extends Memcached_DataObject } } - $profile = new Profile(); - $profile->nickname = $nickname; - $profile->fullname = $object->title; - if (!empty($object->link)) { - $profile->profileurl = $object->link; - } else if (array_key_exists('profileurl', $hints)) { - $profile->profileurl = $hints['profileurl']; - } - $profile->created = common_sql_now(); - - // @fixme bio - // @fixme tags/categories - // @fixme location? - // @todo tags from categories - // @todo lat/lon/location? - - $profile_id = $profile->insert(); - - if (!$profile_id) { - throw new ServerException("Can't save local profile"); - } - - // @fixme either need to do feed discovery here - // or need to split out some of the feed stuff - // so we can leave it empty until later. - $oprofile = new Ostatus_profile(); $oprofile->uri = $homeuri; $oprofile->feeduri = $feeduri; $oprofile->salmonuri = $salmonuri; - $oprofile->profile_id = $profile_id; $oprofile->created = common_sql_now(); $oprofile->modified = common_sql_now(); + if ($object->type == ActivityObject::PERSON) { + $profile = new Profile(); + $profile->nickname = $nickname; + $profile->fullname = $object->title; + if (!empty($object->link)) { + $profile->profileurl = $object->link; + } else if (array_key_exists('profileurl', $hints)) { + $profile->profileurl = $hints['profileurl']; + } + $profile->created = common_sql_now(); + + // @fixme bio + // @fixme tags/categories + // @fixme location? + // @todo tags from categories + // @todo lat/lon/location? + + $oprofile->profile_id = $profile->insert(); + + if (!$oprofile->profile_id) { + throw new ServerException("Can't save local profile"); + } + } else { + $group = new User_group(); + $group->nickname = $nickname; + $group->fullname = $object->title; + // @fixme no canonical profileurl; using homepage instead for now + $group->homepage = $homeuri; + $group->created = common_sql_now(); + + // @fixme homepage + // @fixme bio + // @fixme tags/categories + // @fixme location? + // @todo tags from categories + // @todo lat/lon/location? + + $oprofile->group_id = $group->insert(); + + if (!$oprofile->group_id) { + throw new ServerException("Can't save local profile"); + } + } + $ok = $oprofile->insert(); if ($ok) { - $oprofile->updateAvatar($avatar); + if ($avatar) { + $oprofile->updateAvatar($avatar); + } return $oprofile; } else { throw new ServerException("Can't save OStatus profile"); diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index a26248f19..6cb9881bf 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -367,6 +367,9 @@ class ActivityObject return $object; } + /** + * @fixme missing avatar, bio info, etc + */ static function fromProfile($profile) { $object = new ActivityObject(); @@ -379,6 +382,9 @@ class ActivityObject return $object; } + /** + * @fixme missing avatar, bio info, etc + */ function asString($tag='activity:object') { $xs = new XMLStringer(true); diff --git a/plugins/OStatus/lib/salmon.php b/plugins/OStatus/lib/salmon.php index 53925dc3f..b5f178cc6 100644 --- a/plugins/OStatus/lib/salmon.php +++ b/plugins/OStatus/lib/salmon.php @@ -28,15 +28,26 @@ */ 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; } - $xml = $this->createMagicEnv($xml); - - $headers = array('Content-type: application/atom+xml'); + if (!common_config('ostatus', 'skip_signatures')) { + $xml = $this->createMagicEnv($xml); + } + + $headers = array('Content-Type: application/atom+xml'); try { $client = new HTTPClient(); @@ -51,7 +62,7 @@ class Salmon $response->getStatus() . ': ' . $response->getBody()); return false; } - + return true; } public function createMagicEnv($text) diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 09a042975..83cf0b8f8 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -41,7 +41,7 @@ class SalmonAction extends Action $this->clientError(_('This method requires a POST.')); } - if ($_SERVER['CONTENT_TYPE'] != 'application/atom+xml') { + if (empty($_SERVER['CONTENT_TYPE']) || $_SERVER['CONTENT_TYPE'] != 'application/atom+xml') { $this->clientError(_('Salmon requires application/atom+xml')); } @@ -57,11 +57,13 @@ class SalmonAction extends Action // Check the signature $salmon = new Salmon; - if (!$salmon->verifyMagicEnv($dom)) { - common_log(LOG_DEBUG, "Salmon signature verification failed."); - $this->clientError(_m('Salmon signature verification failed.')); + 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; } @@ -101,6 +103,9 @@ class SalmonAction extends Action case ActivityVerb::JOIN: $this->handleJoin(); break; + case ActivityVerb::LEAVE: + $this->handleLeave(); + break; default: throw new ClientException(_("Unimplemented.")); } @@ -154,6 +159,14 @@ class SalmonAction extends Action throw new ClientException(_("Unimplemented!")); } + /** + * Hmmmm + */ + function handleLeave() + { + throw new ClientException(_("Unimplemented!")); + } + /** * @return Ostatus_profile */ -- cgit v1.2.3-54-g00ecf From 3c004729999f3f1a25ecb723a07af07c4b4c2bc8 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 22 Feb 2010 22:23:37 +0100 Subject: Removed unnecessary assignment to SN.C.I.OStatusProfile. It can be brought back in the future if the value is to be set directly from the HTML script output. --- plugins/OStatus/js/ostatus.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/js/ostatus.js b/plugins/OStatus/js/ostatus.js index 8ba424a53..148a05f6f 100644 --- a/plugins/OStatus/js/ostatus.js +++ b/plugins/OStatus/js/ostatus.js @@ -52,8 +52,7 @@ SN.U.StatusNetInstance = { SN.Init.OStatusCookie = function() { if (SN.U.StatusNetInstance.Get() === null) { - SN.C.I.OStatusProfile = SN.C.I.OStatusProfile || null; - SN.U.StatusNetInstance.Set({profile: SN.C.I.OStatusProfile}); + SN.U.StatusNetInstance.Set({profile: null}); } }; -- cgit v1.2.3-54-g00ecf From 3b823f8fbde531b00f9770fb214543b965851036 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 23 Feb 2010 00:27:41 +0100 Subject: Leaves the original URL alone and adds ? or & when it does the XHR. --- plugins/OStatus/js/ostatus.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/js/ostatus.js b/plugins/OStatus/js/ostatus.js index 148a05f6f..1fc44b21b 100644 --- a/plugins/OStatus/js/ostatus.js +++ b/plugins/OStatus/js/ostatus.js @@ -63,11 +63,10 @@ SN.U.DialogBox = { f.show(); } else { - a[0].href = (a[0].href.match(/[\\?]/) === null) ? a[0].href+'?' : a[0].href+'&'; $.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'); }, -- cgit v1.2.3-54-g00ecf From caad5859b51e8d9be87f234ebc91fdf2802816f1 Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 19:00:27 -0500 Subject: swapping pear error handling so Crypt_RSA can properly detect available math libraries --- plugins/OStatus/lib/magicsig.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/magicsig.php b/plugins/OStatus/lib/magicsig.php index af65bad04..50eb301ab 100644 --- a/plugins/OStatus/lib/magicsig.php +++ b/plugins/OStatus/lib/magicsig.php @@ -57,8 +57,10 @@ class MagicsigRsaSha256 $keypair = new Crypt_RSA_KeyPair($key_length); $params['public_key'] = $keypair->getPublicKey(); $params['private_key'] = $keypair->getPrivateKey(); - + + PEAR::pushErrorHandling(PEAR_ERROR_RETURN); $this->keypair = new Crypt_RSA($params); + PEAR::popErrorHandling(); } @@ -79,6 +81,8 @@ class MagicsigRsaSha256 public function fromString($text) { + PEAR::pushErrorHandling(PEAR_ERROR_RETURN); + // remove whitespace $text = preg_replace('/\s+/', '', $text); @@ -86,7 +90,6 @@ class MagicsigRsaSha256 if (!preg_match('/RSA\.([^\.]+)\.([^\.]+)(.([^\.]+))?/', $text, $matches)) { return false; } - $mod = base64_url_decode($matches[1]); $exp = base64_url_decode($matches[2]); @@ -110,6 +113,7 @@ class MagicsigRsaSha256 } $this->keypair = new Crypt_RSA($params); + PEAR::popErrorHandling(); } public function getName() -- cgit v1.2.3-54-g00ecf From d410df040684f443d14bd921c450ca464d52c9d4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Feb 2010 00:44:45 +0000 Subject: OStatus group delivery initial implementation. - added rel="ostatus:attention" links for group delivery - added events for plugins to override group profile/permalink pages - pulled Notice::saveGroups up to save-time so we can override; it's relatively cheap and gives us a clean list of target groups for distrib time even with customized delivery. - fixed notice::getGroups to return group objects as expected - added some doc on new parameters to Notice::saveNew - 'groups' list of group IDs to push to in place of parsing - messages that come in via PuSH and contain local group targets are delivered to local group members - messages that come in via PuSH and contain remote group targets are delivered to local members of the remote group Todo: - handle group posts that only come through Salmon - handle conflicts in case something comes in both through Salmon and PuSH - better source verification - need a cleaner interface to look up groups by URI - need a way to handle remote groups with conflicting names --- actions/apitimelinegroup.php | 3 +- classes/Notice.php | 111 +++++++++++++++++++++++-- classes/User_group.php | 18 +++- lib/distribqueuehandler.php | 14 +--- plugins/OStatus/OStatusPlugin.php | 16 ++++ plugins/OStatus/classes/Ostatus_profile.php | 75 +++++++++++++++-- plugins/OStatus/lib/hubdistribqueuehandler.php | 2 +- 7 files changed, 207 insertions(+), 32 deletions(-) (limited to 'plugins/OStatus') diff --git a/actions/apitimelinegroup.php b/actions/apitimelinegroup.php index 1d0c4afdd..0bb4860ea 100644 --- a/actions/apitimelinegroup.php +++ b/actions/apitimelinegroup.php @@ -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( diff --git a/classes/Notice.php b/classes/Notice.php index a12839d72..754c126ed 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -187,7 +187,14 @@ 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 @@ -342,6 +349,12 @@ class Notice extends Memcached_DataObject $notice->saveReplies(); } + if (isset($groups)) { + $notice->saveKnownGroups($groups); + } else { + $notice->saveGroups(); + } + $notice->distribute(); return $notice; @@ -692,7 +705,22 @@ 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); @@ -742,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() @@ -824,6 +888,19 @@ class Notice extends Memcached_DataObject return true; } + /** + * 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) { @@ -845,6 +922,13 @@ class Notice extends Memcached_DataObject } /** + * 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 */ @@ -934,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() { @@ -959,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; + } } } @@ -1063,6 +1151,17 @@ class Notice extends Memcached_DataObject } } + $groups = $this->getGroups(); + + foreach ($groups as $group) { + $xs->element( + 'link', array( + 'rel' => 'ostatus:attention', + 'href' => $group->permalink() + ) + ); + } + if (!empty($this->repeat_of)) { $repeat = Notice::staticGet('id', $this->repeat_of); if (!empty($repeat)) { diff --git a/classes/User_group.php b/classes/User_group.php index 379e6b721..1382aa407 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -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) diff --git a/lib/distribqueuehandler.php b/lib/distribqueuehandler.php index c31b675c1..dc183fb36 100644 --- a/lib/distribqueuehandler.php +++ b/lib/distribqueuehandler.php @@ -69,19 +69,7 @@ class DistribQueueHandler } try { - $groups = $notice->saveGroups(); - } catch (Exception $e) { - $this->logit($notice, $e); - } - - try { - $recipients = $notice->getReplies(); - } catch (Exception $e) { - $this->logit($notice, $e); - } - - try { - $notice->addToInboxes($groups, $recipients); + $notice->addToInboxes(); } catch (Exception $e) { $this->logit($notice, $e); } diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 061ed4bd1..472008419 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -591,6 +591,22 @@ class OStatusPlugin extends Plugin 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(); diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index c0e39add8..e8cc13c6c 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -501,6 +501,7 @@ class Ostatus_profile extends Memcached_DataObject /** * Process an incoming post activity from this remote feed. * @param Activity $activity + * @fixme break up this function, it's getting nasty long */ protected function processPost($activity) { @@ -518,7 +519,6 @@ class Ostatus_profile extends Memcached_DataObject } $oprofile = $this; } - $sourceUri = $activity->object->id; $dupe = Notice::staticGet('uri', $sourceUri); @@ -555,15 +555,76 @@ class Ostatus_profile extends Memcached_DataObject } } - // @fixme ensure that groups get handled correctly + $profile = $oprofile->localProfile(); + $params['groups'] = array(); + $params['replies'] = array(); + if ($activity->context) { + foreach ($activity->context->attention as $recipient) { + $roprofile = Ostatus_profile::staticGet('uri', $recipient); + if ($roprofile) { + if ($roprofile->isGroup()) { + // Deliver to local recipients of this remote group. + // @fixme sender verification? + $params['groups'][] = $roprofile->group_id; + continue; + } else { + // Delivery to remote users is the source service's job. + continue; + } + } + + $user = User::staticGet('uri', $recipient); + if ($user) { + // An @-reply directed to a local user. + // @fixme sender verification, spam etc? + $params['replies'][] = $recipient; + continue; + } + + // @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); + common_log(LOG_DEBUG, $template); + if (preg_match("/$template/", $recipient, $matches)) { + $id = $matches[1]; + $group = User_group::staticGet('id', $id); + if ($group) { + // Deliver to all members of this local group. + // @fixme sender verification? + if ($profile->isMember($group)) { + common_log(LOG_DEBUG, "delivering to group $id $group->nickname"); + $params['groups'][] = $group->id; + } else { + common_log(LOG_DEBUG, "not delivering to group $id $group->nickname because sender $profile->nickname is not a member"); + } + continue; + } else { + common_log(LOG_DEBUG, "not delivering to missing group $id"); + } + } else { + common_log(LOG_DEBUG, "not delivering to groups for $recipient"); + } + } + } - $saved = Notice::saveNew($oprofile->localProfile()->id, - $content, - 'ostatus', - $params); + try { + $saved = Notice::saveNew($profile->id, + $content, + 'ostatus', + $params); + } catch (Exception $e) { + common_log(LOG_ERR, "Failed saving notice entry for $sourceUri: " . $e->getMessage()); + return; + } // Record which feed this came through... - Ostatus_source::saveNew($saved, $this, 'push'); + try { + Ostatus_source::saveNew($saved, $this, 'push'); + } catch (Exception $e) { + common_log(LOG_ERR, "Failed saving ostatus_source entry for $saved->notice_id: " . $e->getMessage()); + } } /** diff --git a/plugins/OStatus/lib/hubdistribqueuehandler.php b/plugins/OStatus/lib/hubdistribqueuehandler.php index 30a427e3f..c2bd630f9 100644 --- a/plugins/OStatus/lib/hubdistribqueuehandler.php +++ b/plugins/OStatus/lib/hubdistribqueuehandler.php @@ -36,7 +36,7 @@ class HubDistribQueueHandler extends QueueHandler $this->pushUser($notice); foreach ($notice->getGroups() as $group) { - $this->pushGroup($notice, $group->group_id); + $this->pushGroup($notice, $group->id); } return true; } -- cgit v1.2.3-54-g00ecf From a3e800e67c8ced785a1ca6c2628cc5116ef44730 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 22 Feb 2010 16:46:54 -0800 Subject: Add PoCo bits, avatar link, geo point, etc. to person activity obj output --- plugins/OStatus/lib/activity.php | 152 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 146 insertions(+), 6 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php index a26248f19..585028318 100644 --- a/plugins/OStatus/lib/activity.php +++ b/plugins/OStatus/lib/activity.php @@ -31,10 +31,117 @@ if (!defined('STATUSNET')) { exit(1); } +class PoCoURL +{ + 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 ($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; + + function __construct($formatted) + { + if (empty($formatted)) { + return null; + } + $this->formatted = $formatted; + } + + function asString() + { + $xs = new XMLStringer(true); + $xs->elementStart('poco:address'); + $xs->element('poco:formatted', null, $this->formatted); + $xs->elementEnd('poco:address'); + return $xs->getString(); + } +} + class PoCo { const NS = 'http://portablecontacts.net/spec/1.0'; - const USERNAME = 'preferredUsername'; + + const USERNAME = 'preferredUsername'; + const NOTE = 'note'; + const URLS = 'urls'; + + public $preferredUsername; + public $note; + public $address; + public $urls = array(); + + function __construct($profile) + { + $this->preferredUsername = $profile->nickname; + + $this->note = $profile->bio; + $this->address = new PoCoAddress($profile->location); + + if (!empty($profile->homepage)) { + array_push( + $this->urls, + new PoCoURL( + 'homepage', + $profile->homepage, + true + ) + ); + } + } + + function asString() + { + $xs = new XMLStringer(true); + $xs->element( + 'poco:preferredUsername', + null, + $this->preferredUsername + ); + + 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(); + } } /** @@ -265,6 +372,7 @@ class ActivityObject public $link; public $source; public $avatar; + public $geopoint; /** * Constructor @@ -371,10 +479,17 @@ class ActivityObject { $object = new ActivityObject(); - $object->type = ActivityObject::PERSON; - $object->id = $profile->getUri(); - $object->title = $profile->getBestName(); - $object->link = $profile->profileurl; + $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 = new PoCo($profile); return $object; } @@ -404,7 +519,32 @@ class ActivityObject if (!empty($this->link)) { $xs->element('link', array('rel' => 'alternate', 'type' => 'text/html'), - $this->content); + $this->link); + } + + if ($this->type == ActivityObject::PERSON) { + $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() + ), + '' + ); + } + + if (!empty($this->geopoint)) { + $xs->element( + 'georss:point', + null, + $this->geopoint + ); + } + + if (!empty($this->poco)) { + $xs->raw($this->poco->asString()); } $xs->elementEnd($tag); -- cgit v1.2.3-54-g00ecf From 6a711c6cdc5d1e1b1a64e5858b12e6964a0abe9c Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 22 Feb 2010 17:10:50 -0800 Subject: Move ActivityObject and related stuff to core --- classes/Notice.php | 21 +- classes/Profile.php | 78 +--- lib/activity.php | 864 +++++++++++++++++++++++++++++++++++++++ plugins/OStatus/lib/activity.php | 863 -------------------------------------- 4 files changed, 868 insertions(+), 958 deletions(-) create mode 100644 lib/activity.php delete mode 100644 plugins/OStatus/lib/activity.php (limited to 'plugins/OStatus') diff --git a/classes/Notice.php b/classes/Notice.php index a12839d72..ba8646f68 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1119,25 +1119,8 @@ class Notice extends Memcached_DataObject */ function asActivityNoun($element) { - $xs = new XMLStringer(true); - - $xs->elementStart('activity:' . $element); - $xs->element('activity:object-type', - null, - 'http://activitystrea.ms/schema/1.0/note'); - $xs->element('id', - null, - $this->uri); - $xs->element('content', - array('type' => 'text/html'), - $this->rendered); - $xs->element('link', - array('type' => 'text/html', - 'rel' => 'alternate', - 'href' => $this->bestUrl())); - $xs->elementEnd('activity:' . $element); - - return $xs->getString(); + $noun = ActivityObject::fromNotice($this); + return $noun->asString('activity:' . $element); } function bestUrl() diff --git a/classes/Profile.php b/classes/Profile.php index 7fb2b87bc..78223b34a 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -801,82 +801,8 @@ class Profile extends Memcached_DataObject */ function asActivityNoun($element) { - $xs = new XMLStringer(true); - - $xs->elementStart('activity:' . $element); - $xs->element( - 'activity:object-type', - null, - 'http://activitystrea.ms/schema/1.0/person' - ); - $xs->element( - 'id', - null, - $this->getUri() - ); - - // title should contain fullname - $xs->element('title', null, $this->getBestName()); - - $xs->element('link', array('rel' => 'alternate', - 'type' => 'text/html'), - $this->profileurl); - - $xs->element('poco:preferredUsername', null, $this->nickname); - - // Portable Contacts stuff - - if (isset($this->bio)) { - - // XXX: Possible to use OpenSocial's aboutMe? - - $xs->element('poco:note', null, $this->bio); - } - - if (isset($this->homepage)) { - - $xs->elementStart('poco:urls'); - $xs->element('poco:value', null, $this->homepage); - $xs->element('poco:type', null, 'homepage'); - $xs->element('poco:primary', null, 'true'); - $xs->elementEnd('poco:urls'); - } - - if (isset($this->location)) { - $xs->elementStart('poco:address'); - $xs->element('poco:formatted', null, $this->location); - $xs->elementEnd('poco:address'); - } - - if (isset($this->lat) && isset($this->lon)) { - $this->element( - 'georss:point', - null, - (float)$this->lat . ' ' . (float)$this->lon - ); - } - - // XXX: Should we send all avatar sizes we have? I think - // cliqset does -Z - - $avatar = $this->getAvatar(AVATAR_PROFILE_SIZE); - - $xs->element( - 'link', array( - 'type' => empty($avatar) ? 'image/png' : $avatar->mediatype, - 'rel' => 'avatar', - 'href' => empty($avatar) - ? Avatar::defaultImage(AVATAR_PROFILE_SIZE) - : $avatar->displayUrl() - ), - '' - ); - - $xs->elementEnd('activity:' . $element); - - // XXX: Add people tags with plural? - - return $xs->getString(); + $noun = ActivityObject::fromProfile($this); + return $noun->asString('activity:' . $element); } /** diff --git a/lib/activity.php b/lib/activity.php new file mode 100644 index 000000000..3689dac38 --- /dev/null +++ b/lib/activity.php @@ -0,0 +1,864 @@ +. + * + * @category Feed + * @package StatusNet + * @author Evan Prodromou + * @author Zach Copley + * @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 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 ($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; + + function __construct($formatted) + { + if (empty($formatted)) { + return null; + } + $this->formatted = $formatted; + } + + function asString() + { + $xs = new XMLStringer(true); + $xs->elementStart('poco:address'); + $xs->element('poco:formatted', null, $this->formatted); + $xs->elementEnd('poco:address'); + return $xs->getString(); + } +} + +class PoCo +{ + const NS = 'http://portablecontacts.net/spec/1.0'; + + const USERNAME = 'preferredUsername'; + const NOTE = 'note'; + const URLS = 'urls'; + + public $preferredUsername; + public $note; + public $address; + public $urls = array(); + + function __construct($profile) + { + $this->preferredUsername = $profile->nickname; + + $this->note = $profile->bio; + $this->address = new PoCoAddress($profile->location); + + if (!empty($profile->homepage)) { + array_push( + $this->urls, + new PoCoURL( + 'homepage', + $profile->homepage, + true + ) + ); + } + } + + function asString() + { + $xs = new XMLStringer(true); + $xs->element( + 'poco:preferredUsername', + null, + $this->preferredUsername + ); + + 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 + * @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($element, $rel, $type=null) + { + $links = $element->getElementsByTagnameNS(self::ATOM, self::LINK); + + foreach ($links as $link) { + + $linkRel = $link->getAttribute(self::REL); + $linkType = $link->getAttribute(self::TYPE); + + if ($linkRel == $rel && + (is_null($type) || $linkType == $type)) { + return $link->getAttribute(self::HREF); + } + } + + return null; + } + + /** + * Gets the first child element with the given tag + * + * @param DOMElement $element element to pick at + * @param string $tag tag to look for + * @param string $namespace Namespace to look under + * + * @return DOMElement found element or null + */ + + static function child($element, $tag, $namespace=self::ATOM) + { + $els = $element->childNodes; + if (empty($els) || $els->length == 0) { + return null; + } else { + for ($i = 0; $i < $els->length; $i++) { + $el = $els->item($i); + if ($el->localName == $tag && $el->namespaceURI == $namespace) { + return $el; + } + } + } + } + + /** + * Grab the text content of a DOM element child of the current element + * + * @param DOMElement $element Element whose children we examine + * @param string $tag Tag to look up + * @param string $namespace Namespace to use, defaults to Atom + * + * @return string content of the child + */ + + static function childContent($element, $tag, $namespace=self::ATOM) + { + $el = self::child($element, $tag, $namespace); + + if (empty($el)) { + return null; + } else { + return $el->textContent; + } + } + + /** + * 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 -< is HTML." + * + * @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 + * @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; + + /** + * 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); + + // XXX: grab PoCo stuff + } + + // Some per-type attributes... + if ($this->type == self::PERSON || $this->type == self::GROUP) { + $this->displayName = $this->title; + + // @fixme we may have multiple avatars with different resolutions specified + $this->avatar = ActivityUtils::getLink($element, 'avatar'); + $this->nickname = ActivityUtils::childContent($element, PoCo::USERNAME, PoCo::NS); + } + } + + 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 = new PoCo($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'), + $this->link); + } + + if ($this->type == ActivityObject::PERSON) { + $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() + ), + '' + ); + } + + 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 + * @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'; +} + +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 + * @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 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 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:ostatus' => 'http://ostatus.org/schema/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 + // XXX: add target + + $xs->raw($this->actor->asString('activity:actor')); + $xs->element('activity:verb', null, $this->verb); + $xs->raw($this->object->asString()); + + $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 diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php deleted file mode 100644 index 585028318..000000000 --- a/plugins/OStatus/lib/activity.php +++ /dev/null @@ -1,863 +0,0 @@ -. - * - * @category OStatus - * @package StatusNet - * @author Evan Prodromou - * @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 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 ($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; - - function __construct($formatted) - { - if (empty($formatted)) { - return null; - } - $this->formatted = $formatted; - } - - function asString() - { - $xs = new XMLStringer(true); - $xs->elementStart('poco:address'); - $xs->element('poco:formatted', null, $this->formatted); - $xs->elementEnd('poco:address'); - return $xs->getString(); - } -} - -class PoCo -{ - const NS = 'http://portablecontacts.net/spec/1.0'; - - const USERNAME = 'preferredUsername'; - const NOTE = 'note'; - const URLS = 'urls'; - - public $preferredUsername; - public $note; - public $address; - public $urls = array(); - - function __construct($profile) - { - $this->preferredUsername = $profile->nickname; - - $this->note = $profile->bio; - $this->address = new PoCoAddress($profile->location); - - if (!empty($profile->homepage)) { - array_push( - $this->urls, - new PoCoURL( - 'homepage', - $profile->homepage, - true - ) - ); - } - } - - function asString() - { - $xs = new XMLStringer(true); - $xs->element( - 'poco:preferredUsername', - null, - $this->preferredUsername - ); - - 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 - * @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($element, $rel, $type=null) - { - $links = $element->getElementsByTagnameNS(self::ATOM, self::LINK); - - foreach ($links as $link) { - - $linkRel = $link->getAttribute(self::REL); - $linkType = $link->getAttribute(self::TYPE); - - if ($linkRel == $rel && - (is_null($type) || $linkType == $type)) { - return $link->getAttribute(self::HREF); - } - } - - return null; - } - - /** - * Gets the first child element with the given tag - * - * @param DOMElement $element element to pick at - * @param string $tag tag to look for - * @param string $namespace Namespace to look under - * - * @return DOMElement found element or null - */ - - static function child($element, $tag, $namespace=self::ATOM) - { - $els = $element->childNodes; - if (empty($els) || $els->length == 0) { - return null; - } else { - for ($i = 0; $i < $els->length; $i++) { - $el = $els->item($i); - if ($el->localName == $tag && $el->namespaceURI == $namespace) { - return $el; - } - } - } - } - - /** - * Grab the text content of a DOM element child of the current element - * - * @param DOMElement $element Element whose children we examine - * @param string $tag Tag to look up - * @param string $namespace Namespace to use, defaults to Atom - * - * @return string content of the child - */ - - static function childContent($element, $tag, $namespace=self::ATOM) - { - $el = self::child($element, $tag, $namespace); - - if (empty($el)) { - return null; - } else { - return $el->textContent; - } - } - - /** - * 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 -< is HTML." - * - * @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 - * @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; - - /** - * 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); - - // XXX: grab PoCo stuff - } - - // Some per-type attributes... - if ($this->type == self::PERSON || $this->type == self::GROUP) { - $this->displayName = $this->title; - - // @fixme we may have multiple avatars with different resolutions specified - $this->avatar = ActivityUtils::getLink($element, 'avatar'); - $this->nickname = ActivityUtils::childContent($element, PoCo::USERNAME, PoCo::NS); - } - } - - 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 = new PoCo($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'), - $this->link); - } - - if ($this->type == ActivityObject::PERSON) { - $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() - ), - '' - ); - } - - 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 - * @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'; -} - -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 - * @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 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 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:ostatus' => 'http://ostatus.org/schema/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 - // XXX: add target - - $xs->raw($this->actor->asString('activity:actor')); - $xs->element('activity:verb', null, $this->verb); - $xs->raw($this->object->asString()); - - $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 -- cgit v1.2.3-54-g00ecf From 193448d1be53e27232477bed4d3fa7c2c6f39fbf Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Feb 2010 01:58:05 +0000 Subject: OStatus: cleanup on ostatussub preparing for final UI work on the remote sub/join forms. --- plugins/OStatus/actions/ostatussub.php | 387 ++++++++++++++++++++------------- 1 file changed, 237 insertions(+), 150 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 592ae387e..ffa88cb08 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -24,70 +24,29 @@ 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; - protected $preview; - protected $munger; + protected $profile_uri; // provided acct: or URI of remote entity + protected $oprofile; // Ostatus_profile of remote entity, if valid /** - * Title of the page - * - * @return string Title of the page + * Show the initial form, when we haven't yet been given a valid + * remote profile. */ - - 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 showForm($error=null) - { - $this->error = $error; - 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(); - } - } - - function showPageNotice() - { - if ($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() + function showInputForm() { $user = common_current_user(); @@ -112,18 +71,167 @@ class OStatusSubAction extends Action $this->elementEnd('li'); $this->elementEnd('ul'); - if ($this->preview) { - $this->submit('subscribe', _m('Subscribe')); + $this->submit('validate', _m('Continue')); + + $this->elementEnd('fieldset'); + + $this->elementEnd('form'); + } + + /** + * Show the preview-and-confirm form. We've got a valid remote + * profile and are ready to poke it! + * + * This controls the wrapper form; actual profile display will + * be in previewUser() or previewGroup() depending on the type. + */ + function showPreviewForm() + { + $this->elementStart('form', array('method' => 'post', + 'id' => 'form_ostatus_sub', + 'class' => 'form_settings', + 'action' => + common_local_url('ostatussub'))); + + $this->hidden('token', common_session_token()); + $this->hidden('profile', $this->profile_uri); + + $this->elementStart('fieldset', array('id' => 'settings_feeds')); + + if ($this->oprofile->isGroup()) { + $this->previewGroup(); + $this->submit('subscribe', _m('Join')); } else { - $this->submit('validate', _m('Continue')); + $this->previewUser(); + $this->submit('subscribe', _m('Subscribe')); } + $this->elementEnd('fieldset'); $this->elementEnd('form'); + } + + /** + * Show a preview for a remote user's profile + */ + function previewUser() + { + $oprofile = $this->oprofile; + $profile = $oprofile->localProfile(); + + $this->text(sprintf(_m("Remote user %s"), $profile->nickname)); + // ... + } + + /** + * Show a preview for a remote group's profile + */ + function previewGroup() + { + $oprofile = $this->oprofile; + $group = $oprofile->localGroup(); + + $this->text(sprintf(_m("Remote group %s"), $group->nickname)); + // .. + } + + /** + * 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 + */ + function validateFeed() + { + $profile_uri = trim($this->arg('profile')); - if ($this->preview) { - $this->previewFeed(); + if ($profile_uri == '') { + $this->showForm(_m('Empty remote profile URL!')); + return; + } + $this->profile_uri = $profile_uri; + + // @fixme validate, normalize bla bla + try { + $oprofile = Ostatus_profile::ensureProfile($this->profile_uri); + $this->oprofile = $oprofile; + return true; + } catch (FeedSubBadURLException $e) { + $this->error = _m('Invalid URL or could not reach server.'); + } catch (FeedSubBadResponseException $e) { + $this->error = _m('Cannot read feed; server returned error.'); + } catch (FeedSubEmptyException $e) { + $this->error = _m('Cannot read feed; server returned an empty page.'); + } catch (FeedSubBadHTMLException $e) { + $this->error = _m('Bad HTML, could not find feed link.'); + } catch (FeedSubNoFeedException $e) { + $this->error = _m('Could not find a feed linked from this URL.'); + } catch (FeedSubUnrecognizedTypeException $e) { + $this->error = _m('Not a recognized feed type.'); + } catch (FeedSubException $e) { + // Any new ones we forgot about + $this->error = sprintf(_m('Bad feed URL: %s %s'), get_class($e), $e->getMessage()); + } + + return false; + } + + /** + * Attempt to finalize subscription. + * validateFeed must have been run first. + * + * Calls showForm on failure or successUser/successGroup on success. + */ + function saveFeed() + { + // And subscribe the current user to the local profile + $user = common_current_user(); + + if (!$this->oprofile->subscribe()) { + $this->showForm(_m("Failed to set up server-to-server subscription.")); + return; + } + + 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 { + $this->showForm(_m('Remote group join failed!')); + } + } else { + $local = $this->oprofile->localProfile(); + if ($user->isSubscribed($local)) { + $this->showForm(_m('Already subscribed!')); + } elseif ($this->oprofile->subscribeLocalToRemote($user)) { + $this->successUser(); + } else { + $this->showForm(_m('Remote subscription failed!')); + } } } @@ -145,28 +253,26 @@ class OStatusSubAction extends Action return true; } + /** + * Handle the submission. + */ function handle($args) { parent::handle($args); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $this->handlePost(); } else { - if ($this->profile_uri) { - $this->validateAndPreview(); - } else { - $this->showForm(); + if ($this->arg('profile')) { + $this->validateFeed(); } + $this->showForm(); } } + /** * 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 */ @@ -180,103 +286,84 @@ class OStatusSubAction extends Action return; } - if ($this->arg('validate')) { - $this->validateAndPreview(); - } else if ($this->arg('subscribe')) { - $this->saveFeed(); - } else { - $this->showForm(_('Unexpected form submission.')); + if ($this->validateFeed()) { + if ($this->arg('subscribe')) { + $this->saveFeed(); + return; + } } + $this->showForm(); } /** - * Set up and add a feed - * - * @return boolean true if feed successfully read - * Sends you back to input form if not. + * Show the appropriate form based on our input state. */ - function validateFeed() + function showForm($err=null) { - $profile_uri = trim($this->arg('profile')); - - if ($profile_uri == '') { - $this->showForm(_m('Empty remote profile URL!')); - return; + if ($err) { + $this->error = $err; } - $this->profile_uri = $profile_uri; - - // @fixme validate, normalize bla bla - try { - $oprofile = Ostatus_profile::ensureProfile($this->profile_uri); - $this->oprofile = $oprofile; - return true; - } catch (FeedSubBadURLException $e) { - $err = _m('Invalid URL or could not reach server.'); - } catch (FeedSubBadResponseException $e) { - $err = _m('Cannot read feed; server returned error.'); - } catch (FeedSubEmptyException $e) { - $err = _m('Cannot read feed; server returned an empty page.'); - } catch (FeedSubBadHTMLException $e) { - $err = _m('Bad HTML, could not find feed link.'); - } catch (FeedSubNoFeedException $e) { - $err = _m('Could not find a feed linked from this URL.'); - } catch (FeedSubUnrecognizedTypeException $e) { - $err = _m('Not a recognized feed type.'); - } catch (FeedSubException $e) { - // Any new ones we forgot about - $err = sprintf(_m('Bad feed URL: %s %s'), get_class($e), $e->getMessage()); + 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(); } - - $this->showForm($err); - return false; } - function saveFeed() - { - if ($this->validateFeed()) { - $this->preview = true; + /** + * Title of the page + * + * @return string Title of the page + */ - // And subscribe the current user to the local profile - $user = common_current_user(); + function title() + { + return _m('Authorize subscription'); + } - if (!$this->oprofile->subscribe()) { - $this->showForm(_m("Failed to set up server-to-server subscription.")); - return; - } + /** + * Instructions for use + * + * @return instructions for use + */ - 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->showForm(_m('Joined remote group!')); - } else { - $this->showForm(_m('Remote group join failed!')); - } - } else { - $local = $this->oprofile->localProfile(); - if ($user->isSubscribed($local)) { - $this->showForm(_m('Already subscribed!')); - } elseif ($this->oprofile->subscribeLocalToRemote($user)) { - $this->showForm(_m('Remote user subscribed!')); - } else { - $this->showForm(_m('Remote subscription failed!')); - } - } - } + function getInstructions() + { + return _m('You can subscribe to users from other supported sites. Paste their address or profile URI below:'); } - function validateAndPreview() + function showPageNotice() { - if ($this->validateFeed()) { - $this->preview = true; - $this->showForm(); + if ($this->error) { + $this->element('p', 'error', $this->error); } } - function previewFeed() + /** + * Content area of the page + * + * Shows a form for associating a remote OStatus account with this + * StatusNet account. + * + * @return void + */ + + function showContent() { - $this->text('Profile preview should go here'); + if ($this->oprofile) { + $this->showPreviewForm(); + } else { + $this->showInputForm(); + } } function showScripts() -- cgit v1.2.3-54-g00ecf From b67bb182b008b5f7b66d39df7bb8dab449b7002a Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 23 Feb 2010 04:59:34 +0100 Subject: Refactored preview info and form for authorizing a remote subscription --- plugins/OStatus/actions/ostatussub.php | 113 ++++++++++++++++++++++++++++----- 1 file changed, 97 insertions(+), 16 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index ffa88cb08..206fb309d 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -87,29 +87,35 @@ class OStatusSubAction extends Action */ function showPreviewForm() { + if ($this->oprofile->isGroup()) { + $this->previewGroup(); + } else { + $this->previewUser(); + } + + $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_settings', + 'class' => 'form_remote_authorize', 'action' => common_local_url('ostatussub'))); - + $this->elementStart('fieldset'); $this->hidden('token', common_session_token()); $this->hidden('profile', $this->profile_uri); - - $this->elementStart('fieldset', array('id' => 'settings_feeds')); - if ($this->oprofile->isGroup()) { - $this->previewGroup(); - $this->submit('subscribe', _m('Join')); + $this->submit('submit', _m('Join'), 'submit', null, + _m('Join this group')); } else { - $this->previewUser(); - $this->submit('subscribe', _m('Subscribe')); + $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'); } /** @@ -120,8 +126,7 @@ class OStatusSubAction extends Action $oprofile = $this->oprofile; $profile = $oprofile->localProfile(); - $this->text(sprintf(_m("Remote user %s"), $profile->nickname)); - // ... + $this->showEntity($profile); } /** @@ -132,8 +137,84 @@ class OStatusSubAction extends Action $oprofile = $this->oprofile; $group = $oprofile->localGroup(); - $this->text(sprintf(_m("Remote group %s"), $group->nickname)); - // .. + $this->showEntity($group); + } + + + function showEntity($entity) + { + $nickname = $entity->nickname; + $profile = $entity->profileurl; + $fullname = $entity->fullname; + $homepage = $entity->homepage; + $bio = $entity->bio; + $location = $entity->location; + $avatar = $entity->avatarurl; + + $this->elementStart('div', 'entity_profile vcard'); + $this->elementStart('dl', 'entity_depiction'); + $this->element('dt', null, _('Photo')); + $this->elementStart('dd'); + if ($avatar) { + $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($bio)) { + $this->elementStart('dl', 'entity_note'); + $this->element('dt', null, _('Note')); + $this->elementStart('dd', 'note'); + $this->raw($bio); + $this->elementEnd('dd'); + $this->elementEnd('dl'); + } + $this->elementEnd('div'); } /** -- cgit v1.2.3-54-g00ecf From cb32b676fa4d7e95ec32c3e8968d0ccddbfa42fa Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 20:56:11 -0500 Subject: moving magicsig.php to classes - to add storage --- plugins/OStatus/classes/Magicsig.php | 155 +++++++++++++++++++++++++++++++++ plugins/OStatus/lib/magicsig.php | 163 ----------------------------------- 2 files changed, 155 insertions(+), 163 deletions(-) create mode 100644 plugins/OStatus/classes/Magicsig.php delete mode 100644 plugins/OStatus/lib/magicsig.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php new file mode 100644 index 000000000..9d9d32744 --- /dev/null +++ b/plugins/OStatus/classes/Magicsig.php @@ -0,0 +1,155 @@ +. + * + * @package StatusNet + * @author James Walker + * @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 +{ + + public $keypair; + + public function __construct($init = null) + { + if (is_null($init)) { + $this->generate(); + } else { + $this->fromString($init); + } + } + + + public function generate($key_length = 512) + { + $keypair = new Crypt_RSA_KeyPair($key_length); + $params['public_key'] = $keypair->getPublicKey(); + $params['private_key'] = $keypair->getPrivateKey(); + + PEAR::pushErrorHandling(PEAR_ERROR_RETURN); + $this->keypair = new Crypt_RSA($params); + PEAR::popErrorHandling(); + } + + + public function toString($full_pair = true) + { + $public_key = $this->keypair->_public_key; + $private_key = $this->keypair->_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 function fromString($text) + { + PEAR::pushErrorHandling(PEAR_ERROR_RETURN); + + // 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(); + print $error->getMessage(); + exit; + } + if ($private_exp) { + $params['private_key'] = new Crypt_RSA_KEY($mod, $private_exp, 'private'); + if ($params['private_key']->isError()) { + $error = $params['private_key']->getLastError(); + print $error->getMessage(); + exit; + } + } + + $this->keypair = new Crypt_RSA($params); + PEAR::popErrorHandling(); + } + + public function getName() + { + return 'RSA-SHA256'; + } + + public function sign($bytes) + { + $sig = $this->keypair->createSign($bytes, null, 'sha256'); + if ($this->keypair->isError()) { + $error = $this->keypair->getLastError(); + common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); + } + + return $sig; + } + + public function verify($signed_bytes, $signature) + { + $result = $this->keypair->validateSign($signed_bytes, $signature, null, 'sha256'); + if ($this->keypair->isError()) { + $error = $this->keypair->getLastError(); + //common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); + print $error->getMessage(); + } + 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 diff --git a/plugins/OStatus/lib/magicsig.php b/plugins/OStatus/lib/magicsig.php deleted file mode 100644 index 50eb301ab..000000000 --- a/plugins/OStatus/lib/magicsig.php +++ /dev/null @@ -1,163 +0,0 @@ -. - * - * @package StatusNet - * @author James Walker - * @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'; - -interface Magicsig -{ - - public function sign($bytes); - - public function verify($signed, $signature_b64); -} - -class MagicsigRsaSha256 -{ - - public $keypair; - - public function __construct($init = null) - { - if (is_null($init)) { - $this->generate(); - } else { - $this->fromString($init); - } - } - - - public function generate($key_length = 512) - { - $keypair = new Crypt_RSA_KeyPair($key_length); - $params['public_key'] = $keypair->getPublicKey(); - $params['private_key'] = $keypair->getPrivateKey(); - - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $this->keypair = new Crypt_RSA($params); - PEAR::popErrorHandling(); - } - - - public function toString($full_pair = true) - { - $public_key = $this->keypair->_public_key; - $private_key = $this->keypair->_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 function fromString($text) - { - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - - // 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(); - print $error->getMessage(); - exit; - } - if ($private_exp) { - $params['private_key'] = new Crypt_RSA_KEY($mod, $private_exp, 'private'); - if ($params['private_key']->isError()) { - $error = $params['private_key']->getLastError(); - print $error->getMessage(); - exit; - } - } - - $this->keypair = new Crypt_RSA($params); - PEAR::popErrorHandling(); - } - - public function getName() - { - return 'RSA-SHA256'; - } - - public function sign($bytes) - { - $sig = $this->keypair->createSign($bytes, null, 'sha256'); - if ($this->keypair->isError()) { - $error = $this->keypair->getLastError(); - common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); - } - - return $sig; - } - - public function verify($signed_bytes, $signature) - { - $result = $this->keypair->validateSign($signed_bytes, $signature, null, 'sha256'); - if ($this->keypair->isError()) { - $error = $this->keypair->getLastError(); - //common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); - print $error->getMessage(); - } - 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 -- cgit v1.2.3-54-g00ecf From 74f5c1e16968110caefeeb8431869897f2f8ddfb Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 22:55:26 -0500 Subject: db_objectified magic sig - for persistence of local keypairs --- plugins/OStatus/classes/Magicsig.php | 46 ++++++++++++++++++++++++++++++------ 1 file changed, 39 insertions(+), 7 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index 9d9d32744..6d09c54ec 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -29,21 +29,53 @@ require_once 'Crypt/RSA.php'; -class Magicsig +class Magicsig extends Memcached_DataObject { + public $__table = 'magicsig'; + + public $user_id; public $keypair; + public $alg; - public function __construct($init = null) + private $_rsa; + + public /*static*/ function staticGet($k, $v=null) { - if (is_null($init)) { - $this->generate(); - } else { - $this->fromString($init); - } + 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'); + } + public function generate($key_length = 512) { $keypair = new Crypt_RSA_KeyPair($key_length); -- cgit v1.2.3-54-g00ecf From f4b34d67c54022b70185e83fe628c17e3656d91f Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 23:11:40 -0500 Subject: generate keypairs for users, and put them in the XRD for discovery --- plugins/OStatus/OStatusPlugin.php | 1 + plugins/OStatus/actions/webfinger.php | 11 +++++++ plugins/OStatus/classes/Magicsig.php | 55 +++++++++++++++++++++++++++-------- 3 files changed, 55 insertions(+), 12 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 472008419..db4a0af35 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -312,6 +312,7 @@ class OStatusPlugin extends Plugin $schema->ensureTable('ostatus_source', Ostatus_source::schemaDef()); $schema->ensureTable('feedsub', FeedSub::schemaDef()); $schema->ensureTable('hubsub', HubSub::schemaDef()); + $schema->ensureTable('magicsig', Magicsig::schemaDef()); return true; } diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php index cf60b8069..fbbd8d039 100644 --- a/plugins/OStatus/actions/webfinger.php +++ b/plugins/OStatus/actions/webfinger.php @@ -71,6 +71,17 @@ class WebfingerAction extends Action $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') . '?profile={uri}'; $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe', diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index 6d09c54ec..85664bbf9 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -32,6 +32,8 @@ require_once 'Crypt/RSA.php'; class Magicsig extends Memcached_DataObject { + const PUBLICKEYREL = 'magic-public-key'; + public $__table = 'magicsig'; public $user_id; @@ -40,6 +42,11 @@ class Magicsig extends Memcached_DataObject private $_rsa; + public function __construct($alg = 'RSA-SHA256') + { + $this->alg = $alg; + } + public /*static*/ function staticGet($k, $v=null) { return parent::staticGet(__CLASS__, $k, $v); @@ -75,23 +82,33 @@ class Magicsig extends Memcached_DataObject { 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(); - PEAR::pushErrorHandling(PEAR_ERROR_RETURN); - $this->keypair = new Crypt_RSA($params); + $this->_rsa = new Crypt_RSA($params); PEAR::popErrorHandling(); + + $this->insert(); } public function toString($full_pair = true) { - $public_key = $this->keypair->_public_key; - $private_key = $this->keypair->_private_key; + $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()); @@ -103,10 +120,12 @@ class Magicsig extends Memcached_DataObject return 'RSA.' . $mod . '.' . $exp . $private_exp; } - public function fromString($text) + public static function fromString($text) { PEAR::pushErrorHandling(PEAR_ERROR_RETURN); + $magic_sig = new Magicsig(); + // remove whitespace $text = preg_replace('/\s+/', '', $text); @@ -136,20 +155,32 @@ class Magicsig extends Memcached_DataObject } } - $this->keypair = new Crypt_RSA($params); + $magic_sig->_rsa = new Crypt_RSA($params); PEAR::popErrorHandling(); + + return $magic_sig; } public function getName() { - return 'RSA-SHA256'; + $this->alg; } + public function getHash() + { + switch ($this->alg) { + + case 'RSA-SHA256': + return 'sha256'; + } + + } + public function sign($bytes) { - $sig = $this->keypair->createSign($bytes, null, 'sha256'); - if ($this->keypair->isError()) { - $error = $this->keypair->getLastError(); + $sig = $this->_rsa->createSign($bytes, null, 'sha256'); + if ($this->_rsa->isError()) { + $error = $this->_rsa->getLastError(); common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); } @@ -158,8 +189,8 @@ class Magicsig extends Memcached_DataObject public function verify($signed_bytes, $signature) { - $result = $this->keypair->validateSign($signed_bytes, $signature, null, 'sha256'); - if ($this->keypair->isError()) { + $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()); print $error->getMessage(); -- cgit v1.2.3-54-g00ecf From cd561657c2bea873f6916cec0e957a9973fa990e Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 23:28:15 -0500 Subject: missing return value check --- plugins/OStatus/lib/webfinger.php | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/webfinger.php b/plugins/OStatus/lib/webfinger.php index 0386881d1..8a5037629 100644 --- a/plugins/OStatus/lib/webfinger.php +++ b/plugins/OStatus/lib/webfinger.php @@ -108,6 +108,10 @@ class Webfinger $content = $this->fetchURL($url); + if (!$content) { + return false; + } + return XRD::parse($content); } -- cgit v1.2.3-54-g00ecf From 17b8020d2585ce248d12ad1a2b8f57a4ab250f82 Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 23:30:05 -0500 Subject: clean up error logging --- plugins/OStatus/classes/Magicsig.php | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index 85664bbf9..c9f6182b5 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -89,7 +89,7 @@ class Magicsig extends Memcached_DataObject return parent::insert(); } - + public function generate($key_length = 512) { PEAR::pushErrorHandling(PEAR_ERROR_RETURN); @@ -143,15 +143,15 @@ class Magicsig extends Memcached_DataObject $params['public_key'] = new Crypt_RSA_KEY($mod, $exp, 'public'); if ($params['public_key']->isError()) { $error = $params['public_key']->getLastError(); - print $error->getMessage(); - exit; + 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(); - print $error->getMessage(); - exit; + common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); + return false; } } @@ -182,6 +182,7 @@ class Magicsig extends Memcached_DataObject if ($this->_rsa->isError()) { $error = $this->_rsa->getLastError(); common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); + return false; } return $sig; @@ -192,8 +193,8 @@ class Magicsig extends Memcached_DataObject $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()); - print $error->getMessage(); + common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); + return false; } return $result; } -- cgit v1.2.3-54-g00ecf From 9494b0e5d79601b339bf28967a65ffdfe9458532 Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 23:30:21 -0500 Subject: magicsig shuffling --- plugins/OStatus/lib/magicenvelope.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index 1ae80d70c..81f4609c5 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -27,8 +27,6 @@ * @link http://status.net/ */ -require_once 'magicsig.php'; - class MagicEnvelope { const ENCODING = 'base64url'; @@ -64,7 +62,7 @@ class MagicEnvelope return false; } - $signature_alg = new MagicsigRsaSha256($this->getKeyPair($signer_uri)); + $signature_alg = Magicsig::fromString($this->getKeyPair($signer_uri)); $armored_text = base64_encode($text); return array( @@ -139,7 +137,7 @@ class MagicEnvelope $text = base64_decode($env['data']); $signer_uri = $this->getAuthor($text); - $verifier = new MagicsigRsaSha256($this->getKeyPair($signer_uri)); + $verifier = Magicsig::fromString($this->getKeyPair($signer_uri)); return $verifier->verify($env['data'], $env['sig']); } -- cgit v1.2.3-54-g00ecf From 1fe031844c136d503074e23e0d0a50056dc224dc Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 22 Feb 2010 23:44:33 -0500 Subject: er typo --- plugins/OStatus/classes/Magicsig.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index c9f6182b5..681aec184 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -163,7 +163,7 @@ class Magicsig extends Memcached_DataObject public function getName() { - $this->alg; + return $this->alg; } public function getHash() -- cgit v1.2.3-54-g00ecf From e070fcaaae3e6ac1fef1f9b066c5335fddb9376b Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Feb 2010 11:37:49 -0800 Subject: OStatus: fix for avatars, submit button in updated remote profile preview --- plugins/OStatus/actions/ostatussub.php | 42 ++++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 17 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 206fb309d..0d786fac9 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -126,7 +126,13 @@ class OStatusSubAction extends Action $oprofile = $this->oprofile; $profile = $oprofile->localProfile(); - $this->showEntity($profile); + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + $avatarUrl = $avatar ? $avatar->displayUrl() : false; + + $this->showEntity($profile, + $profile->profileurl, + $avatarUrl, + $profile->bio); } /** @@ -137,31 +143,33 @@ class OStatusSubAction extends Action $oprofile = $this->oprofile; $group = $oprofile->localGroup(); - $this->showEntity($group); + $this->showEntity($group, + $group->getProfileUrl(), + $group->homepage_logo, + $group->description); } - function showEntity($entity) + function showEntity($entity, $profile, $avatar, $note) { $nickname = $entity->nickname; - $profile = $entity->profileurl; $fullname = $entity->fullname; $homepage = $entity->homepage; - $bio = $entity->bio; $location = $entity->location; - $avatar = $entity->avatarurl; + + 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'); - if ($avatar) { - $this->element('img', array('src' => $avatar, - 'class' => 'photo avatar', - 'width' => AVATAR_PROFILE_SIZE, - 'height' => AVATAR_PROFILE_SIZE, - 'alt' => $nickname)); - } + $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'); @@ -206,11 +214,11 @@ class OStatusSubAction extends Action $this->elementEnd('dl'); } - if (!is_null($bio)) { + if (!is_null($note)) { $this->elementStart('dl', 'entity_note'); $this->element('dt', null, _('Note')); $this->elementStart('dd', 'note'); - $this->raw($bio); + $this->raw($note); $this->elementEnd('dd'); $this->elementEnd('dl'); } @@ -368,7 +376,7 @@ class OStatusSubAction extends Action } if ($this->validateFeed()) { - if ($this->arg('subscribe')) { + if ($this->arg('submit')) { $this->saveFeed(); return; } @@ -424,7 +432,7 @@ class OStatusSubAction extends Action function showPageNotice() { - if ($this->error) { + if (!empty($this->error)) { $this->element('p', 'error', $this->error); } } -- cgit v1.2.3-54-g00ecf From c79c70ea2c2dadafa72c65dc4593a66fecb070e3 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Feb 2010 11:56:17 -0800 Subject: OStatus subscription UI tweak: if we're already subscribed/joined, say so and don't offer a 'subscribe'/'join' button on the profile preview page. --- plugins/OStatus/actions/ostatussub.php | 30 ++++++++++++++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 0d786fac9..df9aa80b0 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -88,9 +88,13 @@ class OStatusSubAction extends Action function showPreviewForm() { if ($this->oprofile->isGroup()) { - $this->previewGroup(); + $ok = $this->previewGroup(); } else { - $this->previewUser(); + $ok = $this->previewUser(); + } + if (!$ok) { + // @fixme maybe provide a cancel button or link back? + return; } $this->elementStart('div', 'entity_actions'); @@ -120,12 +124,22 @@ class OStatusSubAction extends Action /** * 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; @@ -133,20 +147,32 @@ class OStatusSubAction extends Action $profile->profileurl, $avatarUrl, $profile->bio); + return $ok; } /** * Show a preview for a remote group's profile + * @return boolean true if we're ok to try joining */ function previewGroup() { $oprofile = $this->oprofile; $group = $oprofile->localGroup(); + $cur = common_current_user(); + if ($cur->isMember($group)) { + $this->element('div', array('class' => 'error'), + _m("You are already a member of this group.")); + $ok = false; + } else { + $ok = true; + } + $this->showEntity($group, $group->getProfileUrl(), $group->homepage_logo, $group->description); + return $ok; } -- cgit v1.2.3-54-g00ecf From 90d34b26c66ceb5d37a9c2782356b46361a523cc Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Feb 2010 20:44:27 +0000 Subject: OStatus: do PuSH subscription setup from subscribe/join event hooks, so resubscribing directly from a profile/group list works correctly if there aren't active subscriptions at the moment. --- lib/activity.php | 4 +- plugins/OStatus/OStatusPlugin.php | 158 +++++++++++++++++----------- plugins/OStatus/actions/ostatussub.php | 5 - plugins/OStatus/classes/Ostatus_profile.php | 26 ++++- 4 files changed, 127 insertions(+), 66 deletions(-) (limited to 'plugins/OStatus') diff --git a/lib/activity.php b/lib/activity.php index 3689dac38..04c57c561 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -823,7 +823,9 @@ class Activity if ($namespace) { $attrs = array('xmlns' => 'http://www.w3.org/2005/Atom', 'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/', - 'xmlns:ostatus' => 'http://ostatus.org/schema/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(); } diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index db4a0af35..629645767 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -251,58 +251,6 @@ class OStatusPlugin extends Plugin 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. - - if ($other->subscriberCount() == 0) { - common_log(LOG_INFO, "Unsubscribing from now-unused feed $oprofile->feeduri"); - $oprofile->unsubscribe(); - } - - $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; - } - /** * Make sure necessary tables are filled out. */ @@ -366,6 +314,50 @@ class OStatusPlugin extends Plugin } } + /** + * 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); @@ -403,6 +395,54 @@ class OStatusPlugin extends Plugin 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, @@ -418,6 +458,10 @@ class OStatusPlugin extends Plugin { $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(); @@ -439,7 +483,8 @@ class OStatusPlugin extends Plugin if ($oprofile->notifyActivity($act)) { return true; } else { - throw new ServerException(_m("Failed joining remote group.")); + $oprofile->garbageCollect(); + throw new Exception(_m("Failed joining remote group.")); } } } @@ -464,12 +509,7 @@ class OStatusPlugin extends Plugin $oprofile = Ostatus_profile::staticGet('group_id', $group->id); if ($oprofile) { // Drop the PuSH subscription if there are no other subscribers. - - $members = $group->getMembers(0, 1); - if ($members->N == 0) { - common_log(LOG_INFO, "Unsubscribing from now-unused group feed $oprofile->feeduri"); - $oprofile->unsubscribe(); - } + $oprofile->garbageCollect(); $member = Profile::staticGet($user->id); diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index df9aa80b0..b3569e695 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -324,11 +324,6 @@ class OStatusSubAction extends Action // And subscribe the current user to the local profile $user = common_current_user(); - if (!$this->oprofile->subscribe()) { - $this->showForm(_m("Failed to set up server-to-server subscription.")); - return; - } - if ($this->oprofile->isGroup()) { $group = $this->oprofile->localGroup(); if ($user->isMember($group)) { diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index e8cc13c6c..91b957fa2 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -346,6 +346,29 @@ class Ostatus_profile extends Memcached_DataObject } } + /** + * 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. @@ -379,7 +402,8 @@ class Ostatus_profile extends Memcached_DataObject '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:ostatus' => 'http://ostatus.org/schema/1.0', + 'xmlns:poco' => 'http://portablecontacts.net/spec/1.0'); $entry = new XMLStringer(); $entry->elementStart('entry', $attributes); -- cgit v1.2.3-54-g00ecf From a0c255e231a84cf77554cc3c0a095eae7b0ffd9c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 23 Feb 2010 15:59:10 -0500 Subject: move mention detection before default in OStatusPlugin --- plugins/OStatus/OStatusPlugin.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index db4a0af35..679857f89 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -224,7 +224,7 @@ class OStatusPlugin extends Plugin * */ - function onEndFindMentions($sender, $text, &$mentions) + function onStartFindMentions($sender, $text, &$mentions) { preg_match_all('/(?:^|\s+)@((?:\w+\.)*\w+@(?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+)/', $text, @@ -464,14 +464,13 @@ class OStatusPlugin extends Plugin $oprofile = Ostatus_profile::staticGet('group_id', $group->id); if ($oprofile) { // Drop the PuSH subscription if there are no other subscribers. - + $members = $group->getMembers(0, 1); if ($members->N == 0) { common_log(LOG_INFO, "Unsubscribing from now-unused group feed $oprofile->feeduri"); $oprofile->unsubscribe(); } - $member = Profile::staticGet($user->id); $act = new Activity(); -- cgit v1.2.3-54-g00ecf From 5f9a8ca64bee5247358238c26b4f54003337d11b Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Feb 2010 21:11:44 +0000 Subject: OStatus: accept webfinger addresses as well as profile URLs in the explicit remote subscribe form. --- plugins/OStatus/actions/ostatussub.php | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index b3569e695..12832cdcf 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -288,10 +288,15 @@ class OStatusSubAction extends Action } $this->profile_uri = $profile_uri; - // @fixme validate, normalize bla bla try { - $oprofile = Ostatus_profile::ensureProfile($this->profile_uri); - $this->oprofile = $oprofile; + 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->error = _m('Invalid URL or could not reach server.'); -- cgit v1.2.3-54-g00ecf From f5ec7c27070dac4ac28ba860f4cc9a808b5f7c30 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 23 Feb 2010 16:13:24 -0500 Subject: some logging for OStatusPlugin::onStartFindMentions() --- plugins/OStatus/OStatusPlugin.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 3a9e77c2a..934c858ac 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -235,9 +235,17 @@ class OStatusPlugin extends Plugin $webfinger = $wmatch[0]; + $this->log(LOG_INFO, "Checking Webfinger for address '$webfinger'"); + $oprofile = Ostatus_profile::ensureWebfinger($webfinger); - if (!empty($oprofile)) { + if (empty($oprofile)) { + + $this->log(LOG_INFO, "No Ostatus_profile found for address '$webfinger'"); + + } else { + + $this->log(LOG_INFO, "Ostatus_profile found for address '$webfinger'"); $profile = $oprofile->localProfile(); -- cgit v1.2.3-54-g00ecf From d6ad7332475f1cc4ab45d55fc04ef491d5f3999d Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 23 Feb 2010 21:47:14 +0000 Subject: OStatus: fixes for link/id and text extraction gets import of Buzz feeds working. --- plugins/OStatus/OStatusPlugin.php | 26 ++++++++++++++------------ plugins/OStatus/classes/Ostatus_profile.php | 17 ++++++++++++++--- 2 files changed, 28 insertions(+), 15 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 3a9e77c2a..724634924 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -287,13 +287,19 @@ class OStatusPlugin extends Plugin function onStartNoticeSourceLink($notice, &$name, &$url, &$title) { if ($notice->source == 'ostatus') { - $bits = parse_url($notice->uri); - $domain = $bits['host']; - - $name = $domain; - $url = $notice->uri; - $title = sprintf(_m("Sent from %s via OStatus"), $domain); - return false; + 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; + } } } @@ -509,12 +515,8 @@ class OStatusPlugin extends Plugin $oprofile = Ostatus_profile::staticGet('group_id', $group->id); if ($oprofile) { // Drop the PuSH subscription if there are no other subscribers. + $oprofile->garbageCollect(); - $members = $group->getMembers(0, 1); - if ($members->N == 0) { - common_log(LOG_INFO, "Unsubscribing from now-unused group feed $oprofile->feeduri"); - $oprofile->unsubscribe(); - } $member = Profile::staticGet($user->id); diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 91b957fa2..4998809bc 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -556,17 +556,28 @@ class Ostatus_profile extends Memcached_DataObject 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; } - // @fixme sanitize and save HTML content if available + // Get (safe!) HTML and text versions of the content - $content = $activity->object->title; + require_once(INSTALLDIR.'/extlib/HTMLPurifier/HTMLPurifier.auto.php'); + + $html = $activity->object->content; + + $purifier = new HTMLPurifier(); + + $rendered = $purifier->purify($html); + + $content = html_entity_decode(strip_tags($rendered)); $params = array('is_local' => Notice::REMOTE_OMB, 'url' => $sourceUrl, - 'uri' => $sourceUri); + 'uri' => $sourceUri, + 'rendered' => $rendered); $location = $activity->context->location; -- cgit v1.2.3-54-g00ecf From 391b45949f6fabef0427aa99d4123fe6ef5ef49d Mon Sep 17 00:00:00 2001 From: James Walker Date: Tue, 23 Feb 2010 18:25:31 -0500 Subject: adding xfn, foaf and hcard rel's to our webfinger output --- plugins/OStatus/actions/webfinger.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php index fbbd8d039..34336a903 100644 --- a/plugins/OStatus/actions/webfinger.php +++ b/plugins/OStatus/actions/webfinger.php @@ -65,6 +65,21 @@ class WebfingerAction extends Action '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)); -- cgit v1.2.3-54-g00ecf From 584b87cfe57bd2d683101194040e3563f0706536 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 24 Feb 2010 01:09:52 +0000 Subject: OStatus: consolidate the low-level notice save code between Salmon and PuSH input paths. Validation etc remains at higher levels. --- plugins/OStatus/OStatusPlugin.php | 2 +- plugins/OStatus/classes/Ostatus_profile.php | 214 ++++++++++++++++------------ plugins/OStatus/lib/salmonaction.php | 50 +------ 3 files changed, 125 insertions(+), 141 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 724634924..35f952935 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -314,7 +314,7 @@ class OStatusPlugin extends Plugin { $oprofile = Ostatus_profile::staticGet('feeduri', $feedsub->uri); if ($oprofile) { - $oprofile->processFeed($feed); + $oprofile->processFeed($feed, 'push'); } else { common_log(LOG_DEBUG, "No ostatus profile for incoming feed $feedsub->uri"); } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 4998809bc..6beaf0f5d 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -488,7 +488,7 @@ class Ostatus_profile extends Memcached_DataObject * * @param DOMDocument $feed */ - public function processFeed($feed) + public function processFeed($feed, $source) { $entries = $feed->getElementsByTagNameNS(Activity::ATOM, 'entry'); if ($entries->length == 0) { @@ -498,7 +498,7 @@ class Ostatus_profile extends Memcached_DataObject for ($i = 0; $i < $entries->length; $i++) { $entry = $entries->item($i); - $this->processEntry($entry, $feed); + $this->processEntry($entry, $feed, $source); } } @@ -508,15 +508,12 @@ class Ostatus_profile extends Memcached_DataObject * @param DOMElement $entry * @param DOMElement $feed for context */ - protected function processEntry($entry, $feed) + public function processEntry($entry, $feed, $source) { $activity = new Activity($entry, $feed); - $debug = var_export($activity, true); - common_log(LOG_DEBUG, $debug); - if ($activity->verb == ActivityVerb::POST) { - $this->processPost($activity); + $this->processPost($activity, $source); } else { common_log(LOG_INFO, "Ignoring activity with unrecognized verb $activity->verb"); } @@ -525,35 +522,47 @@ class Ostatus_profile extends Memcached_DataObject /** * Process an incoming post activity from this remote feed. * @param Activity $activity + * @param string $method 'push' or 'salmon' + * @return mixed saved Notice or false * @fixme break up this function, it's getting nasty long */ - protected function processPost($activity) + public function processPost($activity, $method) { if ($this->isGroup()) { + // A group feed will contain posts from multiple authors. // @fixme validate these profiles in some way! $oprofile = 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) { // @fixme check if profile info has changed and update it } else { - // @fixme drop or reject the messages once we've got the canonical profile URI recorded sanely - common_log(LOG_INFO, "OStatus: Warning: non-group post with unexpected author: $actorUri expected $this->uri"); - //return; + common_log(LOG_WARNING, "OStatus: skipping post with bad author: got $actorUri expected $this->uri"); + return false; } $oprofile = $this; } - $sourceUri = $activity->object->id; + // 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; + return false; } + // 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) { @@ -563,103 +572,126 @@ class Ostatus_profile extends Memcached_DataObject } // Get (safe!) HTML and text versions of the content - - require_once(INSTALLDIR.'/extlib/HTMLPurifier/HTMLPurifier.auto.php'); - - $html = $activity->object->content; - - $purifier = new HTMLPurifier(); - - $rendered = $purifier->purify($html); - + $rendered = $this->purify($activity->object->content); $content = html_entity_decode(strip_tags($rendered)); - $params = array('is_local' => Notice::REMOTE_OMB, + $options = array('is_local' => Notice::REMOTE_OMB, 'url' => $sourceUrl, 'uri' => $sourceUri, - 'rendered' => $rendered); + 'rendered' => $rendered, + 'replies' => array(), + 'groups' => array()); - $location = $activity->context->location; + // Check for optional attributes... - if ($location) { - $params['lat'] = $location->lat; - $params['lon'] = $location->lon; - if ($location->location_id) { - $params['location_ns'] = $location->location_ns; - $params['location_id'] = $location->location_id; - } + if (!empty($activity->time)) { + $options['created'] = common_sql_date($activity->time); } - $profile = $oprofile->localProfile(); - $params['groups'] = array(); - $params['replies'] = array(); if ($activity->context) { - foreach ($activity->context->attention as $recipient) { - $roprofile = Ostatus_profile::staticGet('uri', $recipient); - if ($roprofile) { - if ($roprofile->isGroup()) { - // Deliver to local recipients of this remote group. - // @fixme sender verification? - $params['groups'][] = $roprofile->group_id; - continue; - } else { - // Delivery to remote users is the source service's job. - continue; - } - } - - $user = User::staticGet('uri', $recipient); - if ($user) { - // An @-reply directed to a local user. - // @fixme sender verification, spam etc? - $params['replies'][] = $recipient; - continue; + // 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 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); - common_log(LOG_DEBUG, $template); - if (preg_match("/$template/", $recipient, $matches)) { - $id = $matches[1]; - $group = User_group::staticGet('id', $id); - if ($group) { - // Deliver to all members of this local group. - // @fixme sender verification? - if ($profile->isMember($group)) { - common_log(LOG_DEBUG, "delivering to group $id $group->nickname"); - $params['groups'][] = $group->id; - } else { - common_log(LOG_DEBUG, "not delivering to group $id $group->nickname because sender $profile->nickname is not a member"); - } - continue; - } else { - common_log(LOG_DEBUG, "not delivering to missing group $id"); - } - } else { - common_log(LOG_DEBUG, "not delivering to groups for $recipient"); + } + + $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($profile->id, + $saved = Notice::saveNew($oprofile->profile_id, $content, 'ostatus', - $params); + $options); + if ($saved) { + Ostatus_source::saveNew($saved, $this, $method); + } } catch (Exception $e) { - common_log(LOG_ERR, "Failed saving notice entry for $sourceUri: " . $e->getMessage()); - return; + 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; + } - // Record which feed this came through... - try { - Ostatus_source::saveNew($saved, $this, 'push'); - } catch (Exception $e) { - common_log(LOG_ERR, "Failed saving ostatus_source entry for $saved->notice_id: " . $e->getMessage()); + /** + * Clean up HTML + */ + protected function purify($html) + { + // @fixme disable caching or set a sane temp dir + require_once(INSTALLDIR.'/extlib/HTMLPurifier/HTMLPurifier.auto.php'); + $purifier = new HTMLPurifier(); + return $purifier->purify($html); + } + + /** + * 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) + { + $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; + } + 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) { + // Deliver to all members of this local group if allowed. + if ($sender->localProfile()->isMember($group)) { + $groups[] = $group->id; + } + continue; + } + } } + $attention_uris = $replies; + return $groups; } /** diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 83cf0b8f8..9aac2ed52 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -185,54 +185,6 @@ class SalmonAction extends Action function saveNotice() { $oprofile = $this->ensureProfile(); - - // Get (safe!) HTML and text versions of the content - - require_once(INSTALLDIR.'/extlib/HTMLPurifier/HTMLPurifier.auto.php'); - - $html = $this->act->object->content; - - $purifier = new HTMLPurifier(); - - $rendered = $purifier->purify($html); - - $content = html_entity_decode(strip_tags($rendered)); - - $options = array('is_local' => Notice::REMOTE_OMB, - 'uri' => $this->act->object->id, - 'url' => $this->act->object->link, - 'rendered' => $rendered, - 'replies' => $this->act->context->attention); - - if (!empty($this->act->context->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; - } - } - - if (!empty($this->act->context->replyToID)) { - $orig = Notice::staticGet('uri', - $this->act->context->replyToID); - if (!empty($orig)) { - $options['reply_to'] = $orig->id; - } - } - - if (!empty($this->act->time)) { - $options['created'] = common_sql_date($this->act->time); - } - - $saved = Notice::saveNew($oprofile->profile_id, - $content, - 'ostatus+salmon', - $options); - - // Record that this was saved through a validated Salmon source - // @fixme actually do the signature validation! - Ostatus_source::saveNew($saved, $oprofile, 'salmon'); - return $saved; + return $oprofile->processPost($this->act, 'salmon'); } } -- cgit v1.2.3-54-g00ecf From 2e58802cc9959763f28e2f43c8e0cd0dbe7bcd8e Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 24 Feb 2010 02:19:13 +0000 Subject: OStatus: fix group delivery, send reply/group Salmon pings from background. --- plugins/OStatus/OStatusPlugin.php | 28 +--- plugins/OStatus/actions/groupsalmon.php | 9 +- plugins/OStatus/classes/Ostatus_profile.php | 15 +- plugins/OStatus/lib/hubdistribqueuehandler.php | 182 -------------------- plugins/OStatus/lib/ostatusqueuehandler.php | 223 +++++++++++++++++++++++++ plugins/OStatus/lib/salmonoutqueuehandler.php | 44 +++++ 6 files changed, 295 insertions(+), 206 deletions(-) delete mode 100644 plugins/OStatus/lib/hubdistribqueuehandler.php create mode 100644 plugins/OStatus/lib/ostatusqueuehandler.php create mode 100644 plugins/OStatus/lib/salmonoutqueuehandler.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 35f952935..9376c048d 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -78,11 +78,16 @@ class OStatusPlugin extends Plugin */ function onEndInitializeQueueManager(QueueManager $qm) { + // Prepare outgoing distributions after notice save. + $qm->connect('ostatus', 'OStatusQueueHandler'); + // Outgoing from our internal PuSH hub $qm->connect('hubverify', 'HubVerifyQueueHandler'); - $qm->connect('hubdistrib', 'HubDistribQueueHandler'); $qm->connect('hubout', 'HubOutQueueHandler'); + // Outgoing Salmon replies (when we don't need a return value) + $qm->connect('salmonout', 'SalmonOutQueueHandler'); + // Incoming from a foreign PuSH hub $qm->connect('pushinput', 'PushInputQueueHandler'); return true; @@ -93,7 +98,7 @@ class OStatusPlugin extends Plugin */ function onStartEnqueueNotice($notice, &$transports) { - $transports[] = 'hubdistrib'; + $transports[] = 'ostatus'; return true; } @@ -199,25 +204,6 @@ class OStatusPlugin extends Plugin function onEndNoticeSave($notice) { - $mentioned = $notice->getReplies(); - - foreach ($mentioned as $profile_id) { - - $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id); - - if (!empty($oprofile) && !empty($oprofile->salmonuri)) { - - common_log(LOG_INFO, "Sending notice '{$notice->uri}' to remote profile '{$oprofile->uri}'."); - - // FIXME: this needs to go out in a queue handler - - $xml = ''; - $xml .= $notice->asAtomEntry(true, true); - - $salmon = new Salmon(); - $salmon->post($oprofile->salmonuri, $xml); - } - } } /** diff --git a/plugins/OStatus/actions/groupsalmon.php b/plugins/OStatus/actions/groupsalmon.php index 2e4fe9443..29377b5fa 100644 --- a/plugins/OStatus/actions/groupsalmon.php +++ b/plugins/OStatus/actions/groupsalmon.php @@ -46,6 +46,11 @@ class GroupsalmonAction extends SalmonAction $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; } @@ -74,13 +79,13 @@ class GroupsalmonAction extends SalmonAction throw new ClientException("Not to the attention of anyone."); } else { $uri = common_local_url('groupbyid', array('id' => $this->group->id)); - if (!in_array($context->attention, $uri)) { + if (!in_array($uri, $context->attention)) { throw new ClientException("Not to the attention of this group."); } } $profile = $this->ensureProfile(); - // @fixme save the post + $this->saveNotice(); } /** diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 6beaf0f5d..82dbf773d 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -650,6 +650,7 @@ class Ostatus_profile extends Memcached_DataObject */ 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) { @@ -668,6 +669,8 @@ class Ostatus_profile extends Memcached_DataObject // 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; } @@ -683,14 +686,24 @@ class Ostatus_profile extends Memcached_DataObject $group = User_group::staticGet('id', $id); if ($group) { // Deliver to all members of this local group if allowed. - if ($sender->localProfile()->isMember($group)) { + $profile = $sender->localProfile(); + if ($profile->isMember($group)) { $groups[] = $group->id; + } else { + common_log(LOG_DEBUG, "Skipping reply to local group $group->nickname as sender $profile->id is not a member"); } continue; + } else { + common_log(LOG_DEBUG, "Skipping reply to bogus group $recipient"); } } + + common_log(LOG_DEBUG, "Skipping reply to unrecognized profile $recipient"); + } $attention_uris = $replies; + common_log(LOG_DEBUG, "Local reply recipients: " . implode(', ', $replies)); + common_log(LOG_DEBUG, "Local group recipients: " . implode(', ', $groups)); return $groups; } diff --git a/plugins/OStatus/lib/hubdistribqueuehandler.php b/plugins/OStatus/lib/hubdistribqueuehandler.php deleted file mode 100644 index c2bd630f9..000000000 --- a/plugins/OStatus/lib/hubdistribqueuehandler.php +++ /dev/null @@ -1,182 +0,0 @@ -. - */ - -/** - * Send a PuSH subscription verification from our internal hub. - * Queue up final distribution for - * @package Hub - * @author Brion Vibber - */ -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->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()) { - $sub->distribute($atom); - } - } - - /** - * 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; - } - -} - diff --git a/plugins/OStatus/lib/ostatusqueuehandler.php b/plugins/OStatus/lib/ostatusqueuehandler.php new file mode 100644 index 000000000..c1e50bffa --- /dev/null +++ b/plugins/OStatus/lib/ostatusqueuehandler.php @@ -0,0 +1,223 @@ +. + */ + +/** + * Prepare PuSH and Salmon distributions for an outgoing message. + * + * @package OStatusPlugin + * @author Brion Vibber + */ +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) { + if (!empty($oprofile->salmonuri)) { + // 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. + + common_log(LOG_INFO, "Prepping to send notice '{$this->notice->uri}' to remote profile '{$oprofile->uri}'."); + + $xml = ''; + $xml .= $this->notice->asAtomEntry(true, true); + + $data = array('salmonuri' => $oprofile->salmonuri, + 'entry' => $xml); + + $qm = QueueManager::get(); + $qm->enqueue($data, 'salmonout'); + } + } + } + + /** + * @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/salmonoutqueuehandler.php b/plugins/OStatus/lib/salmonoutqueuehandler.php new file mode 100644 index 000000000..536ff94af --- /dev/null +++ b/plugins/OStatus/lib/salmonoutqueuehandler.php @@ -0,0 +1,44 @@ +. + */ + +/** + * Send a Salmon notification in the background. + * @package OStatusPlugin + * @author Brion Vibber + */ +class SalmonOutQueueHandler extends QueueHandler +{ + function transport() + { + return 'salmonout'; + } + + 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; + } +} -- cgit v1.2.3-54-g00ecf From 618ce6a855330f424d54c3dedf10acb60f7e3001 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 23 Feb 2010 23:58:21 -0800 Subject: - Move ActivityParseTests to core - Add test for Portable Contacts stuff --- plugins/OStatus/tests/ActivityParseTests.php | 209 ----------------- tests/ActivityParseTests.php | 326 +++++++++++++++++++++++++++ 2 files changed, 326 insertions(+), 209 deletions(-) delete mode 100644 plugins/OStatus/tests/ActivityParseTests.php create mode 100644 tests/ActivityParseTests.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/tests/ActivityParseTests.php b/plugins/OStatus/tests/ActivityParseTests.php deleted file mode 100644 index d7305dede..000000000 --- a/plugins/OStatus/tests/ActivityParseTests.php +++ /dev/null @@ -1,209 +0,0 @@ -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, - '@evan now is the time for all good men to come to the aid of their country. #'); - - $this->assertFalse(empty($act->actor)); - } -} - -$_example1 = << - - tag:versioncentral.example.org,2009:/commit/1643245 - 2009-06-01T12:54:00Z - Geraldine committed a change to yate - Geraldine just committed a change to yate on VersionCentral - - http://activitystrea.ms/schema/1.0/post - http://versioncentral.example.org/activity/commit - - http://versioncentral.example.org/activity/changeset - tag:versioncentral.example.org,2009:/change/1643245 - Punctuation Changeset - Fixing punctuation because it makes it more readable. - - - -EXAMPLE1; - -$_example2 = << - - tag:photopanic.example.com,2008:activity01 - Geraldine posted a Photo on PhotoPanic - 2008-11-02T15:29:00Z - - - http://activitystrea.ms/schema/1.0/post - - - tag:photopanic.example.com,2008:photo01 - My Cat - 2008-11-02T15:29:00Z - - - tag:atomactivity.example.com,2008:photo - - - Geraldine's Photos - - - - - - <p>Geraldine posted a Photo on PhotoPanic</p> - <img src="/geraldine/photo1.jpg"> - - -EXAMPLE2; - -$_example3 = << - - - - Example Feed - A subtitle. - - - urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6 - 2003-12-13T18:30:02Z - - John Doe - johndoe@example.com - - - - Atom-Powered Robots Run Amok - - - - urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a - 2003-12-13T18:30:02Z - Some text. - - - -EXAMPLE3; - -$_example4 = << - - @evan now is the time for all good men to come to the aid of their country. #thetime - @evan now is the time for all good men to come to the aid of their country. #thetime - - spock - http://example.net/user/2 - - - http://activitystrea.ms/schema/1.0/person - http://example.net/user/2 - spock - - - - http://example.net/notice/14 - 2010-02-19T02:52:38+00:00 - 2010-02-19T02:52:38+00:00 - - - - - @<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> - - -EXAMPLE4; diff --git a/tests/ActivityParseTests.php b/tests/ActivityParseTests.php new file mode 100644 index 000000000..5de97d2e2 --- /dev/null +++ b/tests/ActivityParseTests.php @@ -0,0 +1,326 @@ +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, + '@evan now is the time for all good men to come to the aid of their country. #'); + + $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 = << + + tag:versioncentral.example.org,2009:/commit/1643245 + 2009-06-01T12:54:00Z + Geraldine committed a change to yate + Geraldine just committed a change to yate on VersionCentral + + http://activitystrea.ms/schema/1.0/post + http://versioncentral.example.org/activity/commit + + http://versioncentral.example.org/activity/changeset + tag:versioncentral.example.org,2009:/change/1643245 + Punctuation Changeset + Fixing punctuation because it makes it more readable. + + + +EXAMPLE1; + +$_example2 = << + + tag:photopanic.example.com,2008:activity01 + Geraldine posted a Photo on PhotoPanic + 2008-11-02T15:29:00Z + + + http://activitystrea.ms/schema/1.0/post + + + tag:photopanic.example.com,2008:photo01 + My Cat + 2008-11-02T15:29:00Z + + + tag:atomactivity.example.com,2008:photo + + + Geraldine's Photos + + + + + + <p>Geraldine posted a Photo on PhotoPanic</p> + <img src="/geraldine/photo1.jpg"> + + +EXAMPLE2; + +$_example3 = << + + + + Example Feed + A subtitle. + + + urn:uuid:60a76c80-d399-11d9-b91C-0003939e0af6 + 2003-12-13T18:30:02Z + + John Doe + johndoe@example.com + + + + Atom-Powered Robots Run Amok + + + + urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a + 2003-12-13T18:30:02Z + Some text. + + + +EXAMPLE3; + +$_example4 = << + + @evan now is the time for all good men to come to the aid of their country. #thetime + @evan now is the time for all good men to come to the aid of their country. #thetime + + spock + http://example.net/user/2 + + + http://activitystrea.ms/schema/1.0/person + http://example.net/user/2 + spock + + + + http://example.net/notice/14 + 2010-02-19T02:52:38+00:00 + 2010-02-19T02:52:38+00:00 + + + + + @<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> + + +EXAMPLE4; + +$_example5 = << + + 3 + testuser timeline + Updates from testuser on Zach Dev! + http://example.net/mysite/avatar/3-96-20100224004207.jpeg + 2010-02-24T06:38:49+00:00 + + testuser + http://example.net/mysite/user/3 + + + + + + + + + http://activitystrea.ms/schema/1.0/person + http://example.net/mysite/user/3 + Test User + + + 37.7749295 -122.4194155 + +testuser +Test User +Just another test user. + + San Francisco, CA + + + homepage + http://example.com/blog.html + true + + + + + Hey man, is that Freedom Code?! #freedom #hippy + Hey man, is that Freedom Code?! #freedom #hippy + + testuser + http://example.net/mysite/user/3 + + + http://activitystrea.ms/schema/1.0/person + http://example.net/mysite/user/3 + Test User + + + 37.7749295 -122.4194155 + +testuser +Test User +Just another test user. + + San Francisco, CA + + + homepage + http://example.com/blog.html + true + + + + + http://example.net/mysite/notice/7 + 2010-02-24T00:53:06+00:00 + 2010-02-24T00:53:06+00:00 + + Hey man, is that Freedom Code?! #<span class="tag"><a href="http://example.net/mysite/tag/freedom" rel="tag">freedom</a></span> #<span class="tag"><a href="http://example.net/mysite/tag/hippy" rel="tag">hippy</a></span> + 37.8313160 -122.2852473 + + + +EXAMPLE5; -- cgit v1.2.3-54-g00ecf From 8e7606cc8d9003cb5d58410678c2be0f812d0ed1 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 24 Feb 2010 15:20:44 +0100 Subject: Added processing indicator for .form_remote_authorize on ostatussub page --- plugins/OStatus/js/ostatus.js | 2 ++ 1 file changed, 2 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/js/ostatus.js b/plugins/OStatus/js/ostatus.js index 1fc44b21b..3637b8725 100644 --- a/plugins/OStatus/js/ostatus.js +++ b/plugins/OStatus/js/ostatus.js @@ -123,4 +123,6 @@ SN.Init.Subscribe = function() { $(document).ready(function() { SN.Init.Subscribe(); + + $('.form_remote_authorize').bind('submit', function() { $(this).addClass(SN.C.S.Processing); return true; }); }); -- cgit v1.2.3-54-g00ecf From 1f45273d5303e98430a02d4480278c24733a5be9 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 24 Feb 2010 16:35:20 +0100 Subject: Moved StatusNetInstance into SN in util.js --- js/util.js | 32 +++++++++++++++++++++++++++++++- plugins/OStatus/js/ostatus.js | 32 +++----------------------------- 2 files changed, 34 insertions(+), 30 deletions(-) (limited to 'plugins/OStatus') diff --git a/js/util.js b/js/util.js index 3623337b9..78533ab73 100644 --- a/js/util.js +++ b/js/util.js @@ -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); + } } }, diff --git a/plugins/OStatus/js/ostatus.js b/plugins/OStatus/js/ostatus.js index 3637b8725..bd29b5c0c 100644 --- a/plugins/OStatus/js/ostatus.js +++ b/plugins/OStatus/js/ostatus.js @@ -24,35 +24,9 @@ * @note Everything in here should eventually migrate over to /js/util.js's SN. */ -SN.C.S.StatusNetInstance = 'StatusNetInstance'; - -SN.U.StatusNetInstance = { - Set: function(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); - } -}; - SN.Init.OStatusCookie = function() { if (SN.U.StatusNetInstance.Get() === null) { - SN.U.StatusNetInstance.Set({profile: null}); + SN.U.StatusNetInstance.Set({RemoteProfile: null}); } }; @@ -101,10 +75,10 @@ SN.U.DialogBox = { if (form.attr('id') == 'form_ostatus_connect') { SN.Init.OStatusCookie(); - form.find('#profile').val(SN.U.StatusNetInstance.Get().profile); + form.find('#profile').val(SN.U.StatusNetInstance.Get().RemoteProfile); form.find("[type=submit]").bind('click', function() { - SN.U.StatusNetInstance.Set({profile: form.find('#profile').val()}); + SN.U.StatusNetInstance.Set({RemoteProfile: form.find('#profile').val()}); return true; }); } -- cgit v1.2.3-54-g00ecf From 07214f1370547fcc64db34ce8c8a84ec70e0d5bd Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 24 Feb 2010 19:06:10 +0000 Subject: OStatus: save updated profile bits when they come in over the wire; fix up nicknames --- plugins/OStatus/classes/Ostatus_profile.php | 147 +++++++++++++++++++++------- 1 file changed, 112 insertions(+), 35 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 82dbf773d..9f9efb96e 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -33,6 +33,7 @@ class Ostatus_profile extends Memcached_DataObject public $feeduri; public $salmonuri; + public $avatar; // remote URL of the last avatar we saved public $created; public $modified; @@ -58,6 +59,7 @@ class Ostatus_profile extends Memcached_DataObject 'group_id' => DB_DATAOBJECT_INT, '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, 'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL); } @@ -74,6 +76,8 @@ class Ostatus_profile extends Memcached_DataObject 255, true, 'UNI'), new ColumnDef('salmonuri', 'text', null, true), + new ColumnDef('avatar', 'text', + null, true), new ColumnDef('created', 'datetime', null, false), new ColumnDef('modified', 'datetime', @@ -543,7 +547,8 @@ class Ostatus_profile extends Memcached_DataObject // through PuSH setup or Salmon signature checks. $actorUri = self::getActorProfileURI($activity); if ($actorUri == $this->uri) { - // @fixme check if profile info has changed and update it + // Check if profile info has changed and update it + $this->updateFromActivityObject($activity->actor); } else { common_log(LOG_WARNING, "OStatus: skipping post with bad author: got $actorUri expected $this->uri"); return false; @@ -785,6 +790,11 @@ class Ostatus_profile extends Memcached_DataObject */ protected function updateAvatar($url) { + if ($url == $this->avatar) { + // We've already got this one. + return; + } + if ($this->isGroup()) { $self = $this->localGroup(); } else { @@ -816,12 +826,28 @@ class Ostatus_profile extends Memcached_DataObject common_timestamp()); rename($temp_filename, Avatar::path($filename)); $self->setOriginal($filename); + + $orig = clone($this); + $this->avatar = $url; + $this->update($orig); } - protected static function getActivityObjectAvatar($object) + /** + * 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()) { - // XXX: go poke around in the feed - return $object->avatar; + if ($object->avatar) { + return $object->avatar; + } else if (array_key_exists('avatar', $hints)) { + return $hints['avatar']; + } + return false; } /** @@ -888,7 +914,9 @@ class Ostatus_profile extends Memcached_DataObject public static function ensureActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array()) { $profile = self::getActivityObjectProfile($object); - if (!$profile) { + if ($profile) { + $profile->updateFromActivityObject($object, $hints); + } else { $profile = self::createActivityObjectProfile($object, $feeduri, $salmonuri, $hints); } return $profile; @@ -957,8 +985,6 @@ class Ostatus_profile extends Memcached_DataObject protected static function createActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array()) { $homeuri = $object->id; - $nickname = self::getActivityObjectNickname($object, $hints); - $avatar = self::getActivityObjectAvatar($object); if (!$homeuri) { common_log(LOG_DEBUG, __METHOD__ . " empty actor profile URI: " . var_export($activity, true)); @@ -1002,43 +1028,19 @@ class Ostatus_profile extends Memcached_DataObject if ($object->type == ActivityObject::PERSON) { $profile = new Profile(); - $profile->nickname = $nickname; - $profile->fullname = $object->title; - if (!empty($object->link)) { - $profile->profileurl = $object->link; - } else if (array_key_exists('profileurl', $hints)) { - $profile->profileurl = $hints['profileurl']; - } - $profile->created = common_sql_now(); - - // @fixme bio - // @fixme tags/categories - // @fixme location? - // @todo tags from categories - // @todo lat/lon/location? - + 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->nickname = $nickname; - $group->fullname = $object->title; - // @fixme no canonical profileurl; using homepage instead for now - $group->homepage = $homeuri; $group->created = common_sql_now(); - - // @fixme homepage - // @fixme bio - // @fixme tags/categories - // @fixme location? - // @todo tags from categories - // @todo lat/lon/location? + self::updateGroup($group, $object, $hints); $oprofile->group_id = $group->insert(); - if (!$oprofile->group_id) { throw new ServerException("Can't save local profile"); } @@ -1047,6 +1049,7 @@ class Ostatus_profile extends Memcached_DataObject $ok = $oprofile->insert(); if ($ok) { + $avatar = self::getActivityObjectAvatar($object, $hints); if ($avatar) { $oprofile->updateAvatar($avatar); } @@ -1056,8 +1059,82 @@ class Ostatus_profile extends Memcached_DataObject } } + /** + * Save any updated profile information to our local copy. + * @param ActivityObject $object + * @param array $hints + */ + protected 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); } -- cgit v1.2.3-54-g00ecf From 269d567d9440e3c943f67aad428efce9d112385c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 24 Feb 2010 15:20:06 -0500 Subject: use Subscription::start() for remote subscribes --- plugins/OStatus/classes/Ostatus_profile.php | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 9f9efb96e..e8ab06522 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -299,18 +299,9 @@ class Ostatus_profile extends Memcached_DataObject throw new ServerException("Remote groups can't subscribe to local users"); } - // @fixme use regular channels for subbing, once they accept remote profiles - $sub = new Subscription(); - $sub->subscriber = $this->profile_id; - $sub->subscribed = $user->id; - $sub->created = common_sql_now(); // current time - - if ($sub->insert()) { - // @fixme use subs_notify() if refactored to take profiles? - mail_subscribe_notify_profile($user, $this->localProfile()); - return true; - } - return false; + Subscription::start($this->localProfile(), $user->getProfile()); + + return true; } /** @@ -1127,7 +1118,6 @@ class Ostatus_profile extends Memcached_DataObject } } - protected static function getActivityObjectNickname($object, $hints=array()) { if ($object->poco) { -- cgit v1.2.3-54-g00ecf From c36bdc1ba535dc3e2dc9098dbe40735b1955d96d Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 24 Feb 2010 20:36:36 +0000 Subject: - break OMB profile update pings to a background queue - add event hooks to profile update pings - send Salmon pings with custom update-profile event to OStatus subscribees and groups (subscribers will see it on your next post) - fix OStatus queues with overlong transport names, should work on DB queues now - Ostatus_profile::notifyActivity() and ::notifyDeferred() now can take XML, Notice, or Activity for convenience --- lib/activity.php | 3 ++ lib/profilequeuehandler.php | 48 ++++++++++++++++++++++++ lib/queuemanager.php | 3 ++ lib/util.php | 14 ++++--- plugins/OStatus/OStatusPlugin.php | 53 ++++++++++++++++++++++++-- plugins/OStatus/actions/pushcallback.php | 2 +- plugins/OStatus/classes/HubSub.php | 2 +- plugins/OStatus/classes/Ostatus_profile.php | 46 ++++++++++++++++++++--- plugins/OStatus/lib/hubconfqueuehandler.php | 54 +++++++++++++++++++++++++++ plugins/OStatus/lib/hubverifyqueuehandler.php | 54 --------------------------- plugins/OStatus/lib/ostatusqueuehandler.php | 22 +++-------- plugins/OStatus/lib/pushinputqueuehandler.php | 49 ------------------------ plugins/OStatus/lib/pushinqueuehandler.php | 49 ++++++++++++++++++++++++ plugins/OStatus/lib/salmonoutqueuehandler.php | 44 ---------------------- plugins/OStatus/lib/salmonqueuehandler.php | 44 ++++++++++++++++++++++ 15 files changed, 308 insertions(+), 179 deletions(-) create mode 100644 lib/profilequeuehandler.php create mode 100644 plugins/OStatus/lib/hubconfqueuehandler.php delete mode 100644 plugins/OStatus/lib/hubverifyqueuehandler.php delete mode 100644 plugins/OStatus/lib/pushinputqueuehandler.php create mode 100644 plugins/OStatus/lib/pushinqueuehandler.php delete mode 100644 plugins/OStatus/lib/salmonoutqueuehandler.php create mode 100644 plugins/OStatus/lib/salmonqueuehandler.php (limited to 'plugins/OStatus') diff --git a/lib/activity.php b/lib/activity.php index fa4ae0274..33932ad0e 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -691,6 +691,9 @@ class ActivityVerb 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 diff --git a/lib/profilequeuehandler.php b/lib/profilequeuehandler.php new file mode 100644 index 000000000..e8a00aef3 --- /dev/null +++ b/lib/profilequeuehandler.php @@ -0,0 +1,48 @@ +. + */ + +/** + * @package QueueHandler + * @maintainer Brion Vibber + */ + +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; + } + +} diff --git a/lib/queuemanager.php b/lib/queuemanager.php index 8f8c8f133..9fdc80110 100644 --- a/lib/queuemanager.php +++ b/lib/queuemanager.php @@ -262,6 +262,9 @@ abstract class QueueManager extends IoManager $this->connect('sms', 'SmsQueueHandler'); } + // Broadcasting profile updates to OMB remote subscribers + $this->connect('profile', 'ProfileQueueHandler'); + // XMPP output handlers... if (common_config('xmpp', 'enabled')) { // Delivery prep, read by queuedaemon.php: diff --git a/lib/util.php b/lib/util.php index 7fb2c6c4b..9354431f2 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1119,12 +1119,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; } diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 9376c048d..90abe034d 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -82,14 +82,14 @@ class OStatusPlugin extends Plugin $qm->connect('ostatus', 'OStatusQueueHandler'); // Outgoing from our internal PuSH hub - $qm->connect('hubverify', 'HubVerifyQueueHandler'); + $qm->connect('hubconf', 'HubConfQueueHandler'); $qm->connect('hubout', 'HubOutQueueHandler'); // Outgoing Salmon replies (when we don't need a return value) - $qm->connect('salmonout', 'SalmonOutQueueHandler'); + $qm->connect('salmon', 'SalmonQueueHandler'); // Incoming from a foreign PuSH hub - $qm->connect('pushinput', 'PushInputQueueHandler'); + $qm->connect('pushin', 'PushInQueueHandler'); return true; } @@ -656,4 +656,51 @@ class OStatusPlugin extends Plugin 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; + } } diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index 4184f0e0c..9a2067b8c 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -68,7 +68,7 @@ class PushCallbackAction extends Action 'post' => $post, 'hmac' => $hmac); $qm = QueueManager::get(); - $qm->enqueue($data, 'pushinput'); + $qm->enqueue($data, 'pushin'); } /** diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index eae2928c3..1ac181fee 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -164,7 +164,7 @@ class HubSub extends Memcached_DataObject 'token' => $token, 'retries' => $retries); $qm = QueueManager::get(); - $qm->enqueue($data, 'hubverify'); + $qm->enqueue($data, 'hubconf'); } /** diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 9f9efb96e..61505206e 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -431,21 +431,57 @@ class Ostatus_profile extends Memcached_DataObject return false; } - public function notifyActivity($activity) + /** + * 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)); + } - $xml = '' . - $activity->asString(true); + return false; + } - $salmon = new Salmon(); // ? + /** + * 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)); - return $salmon->post($this->salmonuri, $xml); + $qm = QueueManager::get(); + return $qm->enqueue($data, 'salmon'); } return false; } + protected function notifyPrepXml($entry) + { + $preamble = ''; + 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"); + } + } + function getBestName() { if ($this->isGroup()) { diff --git a/plugins/OStatus/lib/hubconfqueuehandler.php b/plugins/OStatus/lib/hubconfqueuehandler.php new file mode 100644 index 000000000..c8e0b72fe --- /dev/null +++ b/plugins/OStatus/lib/hubconfqueuehandler.php @@ -0,0 +1,54 @@ +. + */ + +/** + * Send a PuSH subscription verification from our internal hub. + * @package Hub + * @author Brion Vibber + */ +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/hubverifyqueuehandler.php b/plugins/OStatus/lib/hubverifyqueuehandler.php deleted file mode 100644 index 7ce9e1431..000000000 --- a/plugins/OStatus/lib/hubverifyqueuehandler.php +++ /dev/null @@ -1,54 +0,0 @@ -. - */ - -/** - * Send a PuSH subscription verification from our internal hub. - * @package Hub - * @author Brion Vibber - */ -class HubVerifyQueueHandler extends QueueHandler -{ - function transport() - { - return 'hubverify'; - } - - 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/ostatusqueuehandler.php b/plugins/OStatus/lib/ostatusqueuehandler.php index c1e50bffa..0da85600f 100644 --- a/plugins/OStatus/lib/ostatusqueuehandler.php +++ b/plugins/OStatus/lib/ostatusqueuehandler.php @@ -83,23 +83,11 @@ class OStatusQueueHandler extends QueueHandler function pingReply($oprofile) { if ($this->user) { - if (!empty($oprofile->salmonuri)) { - // 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. - - common_log(LOG_INFO, "Prepping to send notice '{$this->notice->uri}' to remote profile '{$oprofile->uri}'."); - - $xml = ''; - $xml .= $this->notice->asAtomEntry(true, true); - - $data = array('salmonuri' => $oprofile->salmonuri, - 'entry' => $xml); - - $qm = QueueManager::get(); - $qm->enqueue($data, 'salmonout'); - } + // 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); } } diff --git a/plugins/OStatus/lib/pushinputqueuehandler.php b/plugins/OStatus/lib/pushinputqueuehandler.php deleted file mode 100644 index cbd9139b5..000000000 --- a/plugins/OStatus/lib/pushinputqueuehandler.php +++ /dev/null @@ -1,49 +0,0 @@ -. - */ - -/** - * Process a feed distribution POST from a PuSH hub. - * @package FeedSub - * @author Brion Vibber - */ - -class PushInputQueueHandler extends QueueHandler -{ - function transport() - { - return 'pushinput'; - } - - 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; - } -} diff --git a/plugins/OStatus/lib/pushinqueuehandler.php b/plugins/OStatus/lib/pushinqueuehandler.php new file mode 100644 index 000000000..a90f52df2 --- /dev/null +++ b/plugins/OStatus/lib/pushinqueuehandler.php @@ -0,0 +1,49 @@ +. + */ + +/** + * Process a feed distribution POST from a PuSH hub. + * @package FeedSub + * @author Brion Vibber + */ + +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; + } +} diff --git a/plugins/OStatus/lib/salmonoutqueuehandler.php b/plugins/OStatus/lib/salmonoutqueuehandler.php deleted file mode 100644 index 536ff94af..000000000 --- a/plugins/OStatus/lib/salmonoutqueuehandler.php +++ /dev/null @@ -1,44 +0,0 @@ -. - */ - -/** - * Send a Salmon notification in the background. - * @package OStatusPlugin - * @author Brion Vibber - */ -class SalmonOutQueueHandler extends QueueHandler -{ - function transport() - { - return 'salmonout'; - } - - 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; - } -} diff --git a/plugins/OStatus/lib/salmonqueuehandler.php b/plugins/OStatus/lib/salmonqueuehandler.php new file mode 100644 index 000000000..aa97018dc --- /dev/null +++ b/plugins/OStatus/lib/salmonqueuehandler.php @@ -0,0 +1,44 @@ +. + */ + +/** + * Send a Salmon notification in the background. + * @package OStatusPlugin + * @author Brion Vibber + */ +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; + } +} -- cgit v1.2.3-54-g00ecf From ec4899e6179f2d9b368e6fc04041dd72c2ac2596 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 24 Feb 2010 22:16:17 +0000 Subject: OStatus: disable HTMLPurify cache unless we've configured a writable path for it. Updated plugin README with available config options. Cleanup for a bad element fallback lookup in Activity --- lib/activity.php | 26 ++++++++------- plugins/OStatus/README | 50 ++++++++++++++++++----------- plugins/OStatus/classes/Ostatus_profile.php | 22 +++++++++++-- 3 files changed, 66 insertions(+), 32 deletions(-) (limited to 'plugins/OStatus') diff --git a/lib/activity.php b/lib/activity.php index 33932ad0e..25727bf2b 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -167,16 +167,18 @@ class PoCo PoCo::NS ); - $formatted = ActivityUtils::childContent( - $addressEl, - PoCoAddress::FORMATTED, - self::NS - ); + if (!empty($addressEl)) { + $formatted = ActivityUtils::childContent( + $addressEl, + PoCoAddress::FORMATTED, + self::NS + ); - if (!empty($formatted)) { - $address = new PoCoAddress(); - $address->formatted = $formatted; - return $address; + if (!empty($formatted)) { + $address = new PoCoAddress(); + $address->formatted = $formatted; + return $address; + } } return null; @@ -292,7 +294,7 @@ class ActivityUtils * @return string related link, if any */ - static function getLink($element, $rel, $type=null) + static function getLink(DOMNode $element, $rel, $type=null) { $links = $element->getElementsByTagnameNS(self::ATOM, self::LINK); @@ -320,7 +322,7 @@ class ActivityUtils * @return DOMElement found element or null */ - static function child($element, $tag, $namespace=self::ATOM) + static function child(DOMNode $element, $tag, $namespace=self::ATOM) { $els = $element->childNodes; if (empty($els) || $els->length == 0) { @@ -345,7 +347,7 @@ class ActivityUtils * @return string content of the child */ - static function childContent($element, $tag, $namespace=self::ATOM) + static function childContent(DOMNode $element, $tag, $namespace=self::ATOM) { $el = self::child($element, $tag, $namespace); diff --git a/plugins/OStatus/README b/plugins/OStatus/README index cbf3adbb9..09a59e349 100644 --- a/plugins/OStatus/README +++ b/plugins/OStatus/README @@ -2,23 +2,37 @@ 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 + +$config['ostatus']['purify_cache'] + (default cache disabled) + Set to a writable cache directory for HTMLPurifier's configuration settings, can speed up processing of remote messages (have not tested by how much) + + +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 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/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 5e38a523e..c755a094e 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -668,9 +668,27 @@ class Ostatus_profile extends Memcached_DataObject */ protected function purify($html) { - // @fixme disable caching or set a sane temp dir require_once(INSTALLDIR.'/extlib/HTMLPurifier/HTMLPurifier.auto.php'); - $purifier = new HTMLPurifier(); + + // By default Purifier wants to cache data to its own code directories, + // and spews error messages if they're not writable. + $config = HTMLPurifier_Config::createDefault(); + if (common_config('ostatus', 'purify_cache')) { + $config->set('Cache.SerializerPath', common_config('ostatus', 'purify_cache')); + } else { + // Although recommended in the documentation, this produces a notice: + // "Core.DefinitionCache is an alias, preferred directive name is Cache.DefinitionImpl" + // If I then follow *those* directions, I get a warning and it doesn't work: + // "Cannot set undefined directive Core.DefinitionImpl" + // So... lesser of two evils. Suppressing the notice from output, + // though it'll still be seen and logged by StatusNet's error handler. + $old = error_reporting(); + error_reporting($old & ~E_NOTICE); + $config->set('Core.DefinitionCache', null); + error_reporting($old); + } + + $purifier = new HTMLPurifier($config); return $purifier->purify($html); } -- cgit v1.2.3-54-g00ecf From 93507a192755494417eb0433edd315880752c857 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 24 Feb 2010 23:28:01 +0000 Subject: OStatus: handle update-profile Salmon pings --- plugins/OStatus/classes/Ostatus_profile.php | 4 +-- plugins/OStatus/lib/salmonaction.php | 55 +++++++++++++++-------------- 2 files changed, 31 insertions(+), 28 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index c755a094e..33b0ceb9e 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -971,7 +971,7 @@ class Ostatus_profile extends Memcached_DataObject * @param Activity $activity * @return mixed matching Ostatus_profile or false if none known */ - protected static function getActorProfile($activity) + public static function getActorProfile($activity) { return self::getActivityObjectProfile($activity->actor); } @@ -1109,7 +1109,7 @@ class Ostatus_profile extends Memcached_DataObject * @param ActivityObject $object * @param array $hints */ - protected function updateFromActivityObject($object, $hints=array()) + public function updateFromActivityObject($object, $hints=array()) { if ($this->isGroup()) { $group = $this->localGroup(); diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 9aac2ed52..a03169101 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -38,11 +38,11 @@ class SalmonAction extends Action parent::prepare($args); if ($_SERVER['REQUEST_METHOD'] != 'POST') { - $this->clientError(_('This method requires a POST.')); + $this->clientError(_m('This method requires a POST.')); } if (empty($_SERVER['CONTENT_TYPE']) || $_SERVER['CONTENT_TYPE'] != 'application/atom+xml') { - $this->clientError(_('Salmon requires application/atom+xml')); + $this->clientError(_m('Salmon requires application/atom+xml')); } $xml = file_get_contents('php://input'); @@ -76,8 +76,7 @@ class SalmonAction extends Action { StatusNet::setApi(true); // Send smaller error pages - // TODO : Insert new $xml -> notice code - + common_log(LOG_DEBUG, "Got a " . $this->act->verb); if (Event::handle('StartHandleSalmon', array($this->activity))) { switch ($this->act->verb) { @@ -106,8 +105,11 @@ class SalmonAction extends Action case ActivityVerb::LEAVE: $this->handleLeave(); break; + case ActivityVerb::UPDATE_PROFILE: + $this->handleUpdateProfile(); + break; default: - throw new ClientException(_("Unimplemented.")); + throw new ClientException(_m("Unrecognized activity type.")); } Event::handle('EndHandleSalmon', array($this->activity)); } @@ -115,56 +117,57 @@ class SalmonAction extends Action function handlePost() { - throw new ClientException(_("Unimplemented!")); + throw new ClientException(_m("This target doesn't understand posts.")); } function handleFollow() { - throw new ClientException(_("Unimplemented!")); + throw new ClientException(_m("This target doesn't understand follows.")); } function handleUnfollow() { - throw new ClientException(_("Unimplemented!")); + throw new ClientException(_m("This target doesn't understand unfollows.")); } function handleFavorite() { - throw new ClientException(_("Unimplemented!")); + throw new ClientException(_m("This target doesn't understand favorites.")); } - /** - * Remote user doesn't like one of our posts after all! - * Confirm the post is ours, and delete a local favorite event. - */ - function handleUnfavorite() { - throw new ClientException(_("Unimplemented!")); + throw new ClientException(_m("This target doesn't understand unfavorites.")); } - /** - * Hmmmm - */ function handleShare() { - throw new ClientException(_("Unimplemented!")); + throw new ClientException(_m("This target doesn't understand share events.")); } - /** - * Hmmmm - */ function handleJoin() { - throw new ClientException(_("Unimplemented!")); + throw new ClientException(_m("This target doesn't understand joins.")); + } + + function handleLeave() + { + throw new ClientException(_m("This target doesn't understand leave events.")); } /** - * Hmmmm + * Remote user sent us an update to their profile. + * If we already know them, accept the updates. */ - function handleLeave() + function handleUpdateProfile() { - throw new ClientException(_("Unimplemented!")); + $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); + } } /** -- cgit v1.2.3-54-g00ecf From e18e659ca3b40ade283f51c91a263507d7c6694e Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 24 Feb 2010 23:39:40 +0000 Subject: Drop HTMLPurifier; we don't need its extra capabilities and we're already using htmLawed which is lighter-weight. --- extlib/HTMLPurifier/HTMLPurifier.auto.php | 11 - extlib/HTMLPurifier/HTMLPurifier.autoload.php | 21 - extlib/HTMLPurifier/HTMLPurifier.func.php | 23 - extlib/HTMLPurifier/HTMLPurifier.includes.php | 208 -- extlib/HTMLPurifier/HTMLPurifier.kses.php | 30 - extlib/HTMLPurifier/HTMLPurifier.path.php | 11 - extlib/HTMLPurifier/HTMLPurifier.php | 237 -- extlib/HTMLPurifier/HTMLPurifier.safe-includes.php | 202 - .../HTMLPurifier/HTMLPurifier/AttrCollections.php | 128 - extlib/HTMLPurifier/HTMLPurifier/AttrDef.php | 87 - extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php | 87 - .../HTMLPurifier/AttrDef/CSS/AlphaValue.php | 21 - .../HTMLPurifier/AttrDef/CSS/Background.php | 87 - .../AttrDef/CSS/BackgroundPosition.php | 126 - .../HTMLPurifier/AttrDef/CSS/Border.php | 43 - .../HTMLPurifier/AttrDef/CSS/Color.php | 78 - .../HTMLPurifier/AttrDef/CSS/Composite.php | 38 - .../AttrDef/CSS/DenyElementDecorator.php | 28 - .../HTMLPurifier/AttrDef/CSS/Filter.php | 54 - .../HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php | 149 - .../HTMLPurifier/AttrDef/CSS/FontFamily.php | 90 - .../AttrDef/CSS/ImportantDecorator.php | 40 - .../HTMLPurifier/AttrDef/CSS/Length.php | 47 - .../HTMLPurifier/AttrDef/CSS/ListStyle.php | 78 - .../HTMLPurifier/AttrDef/CSS/Multiple.php | 58 - .../HTMLPurifier/AttrDef/CSS/Number.php | 69 - .../HTMLPurifier/AttrDef/CSS/Percentage.php | 40 - .../HTMLPurifier/AttrDef/CSS/TextDecoration.php | 38 - .../HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php | 56 - extlib/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php | 65 - .../HTMLPurifier/AttrDef/HTML/Bool.php | 28 - .../HTMLPurifier/AttrDef/HTML/Class.php | 34 - .../HTMLPurifier/AttrDef/HTML/Color.php | 32 - .../HTMLPurifier/AttrDef/HTML/FrameTarget.php | 21 - .../HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php | 70 - .../HTMLPurifier/AttrDef/HTML/Length.php | 41 - .../HTMLPurifier/AttrDef/HTML/LinkTypes.php | 53 - .../HTMLPurifier/AttrDef/HTML/MultiLength.php | 41 - .../HTMLPurifier/AttrDef/HTML/Nmtokens.php | 52 - .../HTMLPurifier/AttrDef/HTML/Pixels.php | 48 - .../HTMLPurifier/HTMLPurifier/AttrDef/Integer.php | 73 - extlib/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php | 73 - .../HTMLPurifier/HTMLPurifier/AttrDef/Switch.php | 34 - extlib/HTMLPurifier/HTMLPurifier/AttrDef/Text.php | 15 - extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI.php | 77 - .../HTMLPurifier/AttrDef/URI/Email.php | 17 - .../HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php | 21 - .../HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php | 62 - .../HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php | 39 - .../HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php | 99 - extlib/HTMLPurifier/HTMLPurifier/AttrTransform.php | 56 - .../HTMLPurifier/AttrTransform/Background.php | 23 - .../HTMLPurifier/AttrTransform/BdoDir.php | 19 - .../HTMLPurifier/AttrTransform/BgColor.php | 23 - .../HTMLPurifier/AttrTransform/BoolToCSS.php | 36 - .../HTMLPurifier/AttrTransform/Border.php | 18 - .../HTMLPurifier/AttrTransform/EnumToCSS.php | 58 - .../HTMLPurifier/AttrTransform/ImgRequired.php | 42 - .../HTMLPurifier/AttrTransform/ImgSpace.php | 44 - .../HTMLPurifier/AttrTransform/Input.php | 40 - .../HTMLPurifier/AttrTransform/Lang.php | 28 - .../HTMLPurifier/AttrTransform/Length.php | 27 - .../HTMLPurifier/AttrTransform/Name.php | 21 - .../HTMLPurifier/AttrTransform/NameSync.php | 27 - .../HTMLPurifier/AttrTransform/SafeEmbed.php | 15 - .../HTMLPurifier/AttrTransform/SafeObject.php | 16 - .../HTMLPurifier/AttrTransform/SafeParam.php | 50 - .../HTMLPurifier/AttrTransform/ScriptRequired.php | 16 - .../HTMLPurifier/AttrTransform/Textarea.php | 18 - extlib/HTMLPurifier/HTMLPurifier/AttrTypes.php | 77 - extlib/HTMLPurifier/HTMLPurifier/AttrValidator.php | 162 - extlib/HTMLPurifier/HTMLPurifier/Bootstrap.php | 98 - extlib/HTMLPurifier/HTMLPurifier/CSSDefinition.php | 292 -- extlib/HTMLPurifier/HTMLPurifier/ChildDef.php | 48 - .../HTMLPurifier/ChildDef/Chameleon.php | 48 - .../HTMLPurifier/HTMLPurifier/ChildDef/Custom.php | 90 - .../HTMLPurifier/HTMLPurifier/ChildDef/Empty.php | 20 - .../HTMLPurifier/ChildDef/Optional.php | 26 - .../HTMLPurifier/ChildDef/Required.php | 117 - .../HTMLPurifier/ChildDef/StrictBlockquote.php | 88 - .../HTMLPurifier/HTMLPurifier/ChildDef/Table.php | 142 - extlib/HTMLPurifier/HTMLPurifier/Config.php | 580 --- extlib/HTMLPurifier/HTMLPurifier/ConfigSchema.php | 158 - .../ConfigSchema/Builder/ConfigSchema.php | 44 - .../HTMLPurifier/ConfigSchema/Builder/Xml.php | 106 - .../HTMLPurifier/ConfigSchema/Exception.php | 11 - .../HTMLPurifier/ConfigSchema/Interchange.php | 42 - .../ConfigSchema/Interchange/Directive.php | 77 - .../HTMLPurifier/ConfigSchema/Interchange/Id.php | 37 - .../ConfigSchema/InterchangeBuilder.php | 180 - .../HTMLPurifier/ConfigSchema/Validator.php | 206 -- .../HTMLPurifier/ConfigSchema/ValidatorAtom.php | 66 - .../HTMLPurifier/ConfigSchema/schema.ser | Bin 12999 -> 0 bytes .../ConfigSchema/schema/Attr.AllowedClasses.txt | 8 - .../schema/Attr.AllowedFrameTargets.txt | 12 - .../ConfigSchema/schema/Attr.AllowedRel.txt | 9 - .../ConfigSchema/schema/Attr.AllowedRev.txt | 9 - .../ConfigSchema/schema/Attr.ClassUseCDATA.txt | 19 - .../ConfigSchema/schema/Attr.DefaultImageAlt.txt | 11 - .../schema/Attr.DefaultInvalidImage.txt | 9 - .../schema/Attr.DefaultInvalidImageAlt.txt | 8 - .../ConfigSchema/schema/Attr.DefaultTextDir.txt | 10 - .../ConfigSchema/schema/Attr.EnableID.txt | 16 - .../ConfigSchema/schema/Attr.ForbiddenClasses.txt | 8 - .../ConfigSchema/schema/Attr.IDBlacklist.txt | 5 - .../ConfigSchema/schema/Attr.IDBlacklistRegexp.txt | 9 - .../ConfigSchema/schema/Attr.IDPrefix.txt | 12 - .../ConfigSchema/schema/Attr.IDPrefixLocal.txt | 14 - .../schema/AutoFormat.AutoParagraph.txt | 31 - .../ConfigSchema/schema/AutoFormat.Custom.txt | 12 - .../schema/AutoFormat.DisplayLinkURI.txt | 11 - .../ConfigSchema/schema/AutoFormat.Linkify.txt | 12 - .../schema/AutoFormat.PurifierLinkify.DocURL.txt | 12 - .../schema/AutoFormat.PurifierLinkify.txt | 12 - ...utoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt | 11 - .../schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt | 15 - .../ConfigSchema/schema/AutoFormat.RemoveEmpty.txt | 46 - .../ConfigSchema/schema/CSS.AllowImportant.txt | 8 - .../ConfigSchema/schema/CSS.AllowTricky.txt | 11 - .../ConfigSchema/schema/CSS.AllowedProperties.txt | 18 - .../ConfigSchema/schema/CSS.DefinitionRev.txt | 11 - .../ConfigSchema/schema/CSS.MaxImgLength.txt | 16 - .../ConfigSchema/schema/CSS.Proprietary.txt | 10 - .../ConfigSchema/schema/Cache.DefinitionImpl.txt | 14 - .../ConfigSchema/schema/Cache.SerializerPath.txt | 13 - .../ConfigSchema/schema/Core.AggressivelyFixLt.txt | 18 - .../ConfigSchema/schema/Core.CollectErrors.txt | 12 - .../ConfigSchema/schema/Core.ColorKeywords.txt | 28 - .../schema/Core.ConvertDocumentToFragment.txt | 14 - .../Core.DirectLexLineNumberSyncInterval.txt | 17 - .../ConfigSchema/schema/Core.Encoding.txt | 15 - .../schema/Core.EscapeInvalidChildren.txt | 10 - .../ConfigSchema/schema/Core.EscapeInvalidTags.txt | 7 - .../schema/Core.EscapeNonASCIICharacters.txt | 13 - .../ConfigSchema/schema/Core.HiddenElements.txt | 19 - .../ConfigSchema/schema/Core.Language.txt | 10 - .../ConfigSchema/schema/Core.LexerImpl.txt | 34 - .../schema/Core.MaintainLineNumbers.txt | 16 - .../ConfigSchema/schema/Core.RemoveInvalidImg.txt | 12 - .../schema/Core.RemoveScriptContents.txt | 12 - .../ConfigSchema/schema/Filter.Custom.txt | 11 - .../schema/Filter.ExtractStyleBlocks.Escaping.txt | 14 - .../schema/Filter.ExtractStyleBlocks.Scope.txt | 29 - .../schema/Filter.ExtractStyleBlocks.TidyImpl.txt | 16 - .../schema/Filter.ExtractStyleBlocks.txt | 74 - .../ConfigSchema/schema/Filter.YouTube.txt | 11 - .../ConfigSchema/schema/HTML.Allowed.txt | 22 - .../ConfigSchema/schema/HTML.AllowedAttributes.txt | 19 - .../ConfigSchema/schema/HTML.AllowedElements.txt | 18 - .../ConfigSchema/schema/HTML.AllowedModules.txt | 20 - .../schema/HTML.Attr.Name.UseCDATA.txt | 11 - .../ConfigSchema/schema/HTML.BlockWrapper.txt | 18 - .../ConfigSchema/schema/HTML.CoreModules.txt | 23 - .../ConfigSchema/schema/HTML.CustomDoctype.txt | 9 - .../ConfigSchema/schema/HTML.DefinitionID.txt | 33 - .../ConfigSchema/schema/HTML.DefinitionRev.txt | 16 - .../ConfigSchema/schema/HTML.Doctype.txt | 11 - .../schema/HTML.ForbiddenAttributes.txt | 21 - .../ConfigSchema/schema/HTML.ForbiddenElements.txt | 20 - .../ConfigSchema/schema/HTML.MaxImgLength.txt | 14 - .../ConfigSchema/schema/HTML.Parent.txt | 12 - .../ConfigSchema/schema/HTML.Proprietary.txt | 12 - .../ConfigSchema/schema/HTML.SafeEmbed.txt | 14 - .../ConfigSchema/schema/HTML.SafeObject.txt | 14 - .../ConfigSchema/schema/HTML.Strict.txt | 9 - .../ConfigSchema/schema/HTML.TidyAdd.txt | 8 - .../ConfigSchema/schema/HTML.TidyLevel.txt | 24 - .../ConfigSchema/schema/HTML.TidyRemove.txt | 8 - .../ConfigSchema/schema/HTML.Trusted.txt | 8 - .../ConfigSchema/schema/HTML.XHTML.txt | 11 - .../schema/Output.CommentScriptContents.txt | 10 - .../ConfigSchema/schema/Output.Newline.txt | 13 - .../ConfigSchema/schema/Output.SortAttr.txt | 14 - .../ConfigSchema/schema/Output.TidyFormat.txt | 25 - .../ConfigSchema/schema/Test.ForceNoIconv.txt | 7 - .../ConfigSchema/schema/URI.AllowedSchemes.txt | 15 - .../HTMLPurifier/ConfigSchema/schema/URI.Base.txt | 17 - .../ConfigSchema/schema/URI.DefaultScheme.txt | 10 - .../ConfigSchema/schema/URI.DefinitionID.txt | 11 - .../ConfigSchema/schema/URI.DefinitionRev.txt | 11 - .../ConfigSchema/schema/URI.Disable.txt | 14 - .../ConfigSchema/schema/URI.DisableExternal.txt | 11 - .../schema/URI.DisableExternalResources.txt | 13 - .../ConfigSchema/schema/URI.DisableResources.txt | 12 - .../HTMLPurifier/ConfigSchema/schema/URI.Host.txt | 19 - .../ConfigSchema/schema/URI.HostBlacklist.txt | 9 - .../ConfigSchema/schema/URI.MakeAbsolute.txt | 13 - .../HTMLPurifier/ConfigSchema/schema/URI.Munge.txt | 83 - .../ConfigSchema/schema/URI.MungeResources.txt | 17 - .../ConfigSchema/schema/URI.MungeSecretKey.txt | 30 - .../schema/URI.OverrideAllowedSchemes.txt | 9 - .../HTMLPurifier/ConfigSchema/schema/info.ini | 3 - extlib/HTMLPurifier/HTMLPurifier/ContentSets.php | 155 - extlib/HTMLPurifier/HTMLPurifier/Context.php | 82 - extlib/HTMLPurifier/HTMLPurifier/Definition.php | 39 - .../HTMLPurifier/HTMLPurifier/DefinitionCache.php | 108 - .../HTMLPurifier/DefinitionCache/Decorator.php | 62 - .../DefinitionCache/Decorator/Cleanup.php | 43 - .../DefinitionCache/Decorator/Memory.php | 46 - .../DefinitionCache/Decorator/Template.php.in | 47 - .../HTMLPurifier/DefinitionCache/Null.php | 39 - .../HTMLPurifier/DefinitionCache/Serializer.php | 172 - .../HTMLPurifier/DefinitionCache/Serializer/README | 3 - .../HTMLPurifier/DefinitionCacheFactory.php | 91 - extlib/HTMLPurifier/HTMLPurifier/Doctype.php | 60 - .../HTMLPurifier/HTMLPurifier/DoctypeRegistry.php | 103 - extlib/HTMLPurifier/HTMLPurifier/ElementDef.php | 176 - extlib/HTMLPurifier/HTMLPurifier/Encoder.php | 426 --- extlib/HTMLPurifier/HTMLPurifier/EntityLookup.php | 44 - .../HTMLPurifier/EntityLookup/entities.ser | 1 - extlib/HTMLPurifier/HTMLPurifier/EntityParser.php | 144 - .../HTMLPurifier/HTMLPurifier/ErrorCollector.php | 209 -- extlib/HTMLPurifier/HTMLPurifier/ErrorStruct.php | 60 - extlib/HTMLPurifier/HTMLPurifier/Exception.php | 12 - extlib/HTMLPurifier/HTMLPurifier/Filter.php | 46 - .../HTMLPurifier/Filter/ExtractStyleBlocks.php | 135 - .../HTMLPurifier/HTMLPurifier/Filter/YouTube.php | 39 - extlib/HTMLPurifier/HTMLPurifier/Generator.php | 183 - .../HTMLPurifier/HTMLPurifier/HTMLDefinition.php | 420 --- extlib/HTMLPurifier/HTMLPurifier/HTMLModule.php | 244 -- .../HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php | 31 - .../HTMLPurifier/HTMLModule/CommonAttributes.php | 26 - .../HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php | 38 - .../HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php | 118 - .../HTMLPurifier/HTMLModule/Hypertext.php | 31 - .../HTMLPurifier/HTMLPurifier/HTMLModule/Image.php | 40 - .../HTMLPurifier/HTMLModule/Legacy.php | 143 - .../HTMLPurifier/HTMLPurifier/HTMLModule/List.php | 35 - .../HTMLPurifier/HTMLPurifier/HTMLModule/Name.php | 21 - .../HTMLModule/NonXMLCommonAttributes.php | 14 - .../HTMLPurifier/HTMLModule/Object.php | 47 - .../HTMLPurifier/HTMLModule/Presentation.php | 36 - .../HTMLPurifier/HTMLModule/Proprietary.php | 33 - .../HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php | 27 - .../HTMLPurifier/HTMLModule/SafeEmbed.php | 33 - .../HTMLPurifier/HTMLModule/SafeObject.php | 50 - .../HTMLPurifier/HTMLModule/Scripting.php | 54 - .../HTMLPurifier/HTMLModule/StyleAttribute.php | 24 - .../HTMLPurifier/HTMLModule/Tables.php | 66 - .../HTMLPurifier/HTMLModule/Target.php | 23 - .../HTMLPurifier/HTMLPurifier/HTMLModule/Text.php | 71 - .../HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php | 207 -- .../HTMLPurifier/HTMLModule/Tidy/Name.php | 24 - .../HTMLPurifier/HTMLModule/Tidy/Proprietary.php | 23 - .../HTMLPurifier/HTMLModule/Tidy/Strict.php | 21 - .../HTMLPurifier/HTMLModule/Tidy/Transitional.php | 9 - .../HTMLPurifier/HTMLModule/Tidy/XHTML.php | 17 - .../HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php | 161 - .../HTMLModule/XMLCommonAttributes.php | 14 - .../HTMLPurifier/HTMLModuleManager.php | 403 -- extlib/HTMLPurifier/HTMLPurifier/IDAccumulator.php | 53 - extlib/HTMLPurifier/HTMLPurifier/Injector.php | 239 -- .../HTMLPurifier/Injector/AutoParagraph.php | 340 -- .../HTMLPurifier/Injector/DisplayLinkURI.php | 26 - .../HTMLPurifier/HTMLPurifier/Injector/Linkify.php | 46 - .../HTMLPurifier/Injector/PurifierLinkify.php | 45 - .../HTMLPurifier/Injector/RemoveEmpty.php | 51 - .../HTMLPurifier/Injector/SafeObject.php | 87 - extlib/HTMLPurifier/HTMLPurifier/Language.php | 163 - .../HTMLPurifier/Language/classes/en-x-test.php | 12 - .../HTMLPurifier/Language/messages/en-x-test.php | 11 - .../Language/messages/en-x-testmini.php | 12 - .../HTMLPurifier/Language/messages/en.php | 62 - .../HTMLPurifier/HTMLPurifier/LanguageFactory.php | 198 - extlib/HTMLPurifier/HTMLPurifier/Length.php | 115 - extlib/HTMLPurifier/HTMLPurifier/Lexer.php | 298 -- extlib/HTMLPurifier/HTMLPurifier/Lexer/DOMLex.php | 213 -- .../HTMLPurifier/HTMLPurifier/Lexer/DirectLex.php | 490 --- .../HTMLPurifier/HTMLPurifier/Lexer/PEARSax3.php | 106 - extlib/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php | 3906 -------------------- .../HTMLPurifier/HTMLPurifier/PercentEncoder.php | 98 - extlib/HTMLPurifier/HTMLPurifier/Printer.php | 176 - .../HTMLPurifier/Printer/CSSDefinition.php | 38 - .../HTMLPurifier/Printer/ConfigForm.css | 10 - .../HTMLPurifier/Printer/ConfigForm.js | 5 - .../HTMLPurifier/Printer/ConfigForm.php | 368 -- .../HTMLPurifier/Printer/HTMLDefinition.php | 272 -- extlib/HTMLPurifier/HTMLPurifier/PropertyList.php | 86 - .../HTMLPurifier/PropertyListIterator.php | 32 - extlib/HTMLPurifier/HTMLPurifier/Strategy.php | 26 - .../HTMLPurifier/Strategy/Composite.php | 25 - extlib/HTMLPurifier/HTMLPurifier/Strategy/Core.php | 18 - .../HTMLPurifier/Strategy/FixNesting.php | 328 -- .../HTMLPurifier/Strategy/MakeWellFormed.php | 457 --- .../Strategy/RemoveForeignElements.php | 171 - .../HTMLPurifier/Strategy/ValidateAttributes.php | 39 - extlib/HTMLPurifier/HTMLPurifier/StringHash.php | 39 - .../HTMLPurifier/HTMLPurifier/StringHashParser.php | 110 - extlib/HTMLPurifier/HTMLPurifier/TagTransform.php | 36 - .../HTMLPurifier/TagTransform/Font.php | 96 - .../HTMLPurifier/TagTransform/Simple.php | 35 - extlib/HTMLPurifier/HTMLPurifier/Token.php | 57 - extlib/HTMLPurifier/HTMLPurifier/Token/Comment.php | 22 - extlib/HTMLPurifier/HTMLPurifier/Token/Empty.php | 11 - extlib/HTMLPurifier/HTMLPurifier/Token/End.php | 19 - extlib/HTMLPurifier/HTMLPurifier/Token/Start.php | 11 - extlib/HTMLPurifier/HTMLPurifier/Token/Tag.php | 56 - extlib/HTMLPurifier/HTMLPurifier/Token/Text.php | 33 - extlib/HTMLPurifier/HTMLPurifier/TokenFactory.php | 94 - extlib/HTMLPurifier/HTMLPurifier/URI.php | 173 - extlib/HTMLPurifier/HTMLPurifier/URIDefinition.php | 93 - extlib/HTMLPurifier/HTMLPurifier/URIFilter.php | 45 - .../HTMLPurifier/URIFilter/DisableExternal.php | 23 - .../URIFilter/DisableExternalResources.php | 12 - .../HTMLPurifier/URIFilter/HostBlacklist.php | 21 - .../HTMLPurifier/URIFilter/MakeAbsolute.php | 114 - .../HTMLPurifier/HTMLPurifier/URIFilter/Munge.php | 58 - extlib/HTMLPurifier/HTMLPurifier/URIParser.php | 70 - extlib/HTMLPurifier/HTMLPurifier/URIScheme.php | 42 - extlib/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php | 43 - .../HTMLPurifier/HTMLPurifier/URIScheme/http.php | 20 - .../HTMLPurifier/HTMLPurifier/URIScheme/https.php | 12 - .../HTMLPurifier/HTMLPurifier/URIScheme/mailto.php | 27 - .../HTMLPurifier/HTMLPurifier/URIScheme/news.php | 22 - .../HTMLPurifier/HTMLPurifier/URIScheme/nntp.php | 20 - .../HTMLPurifier/URISchemeRegistry.php | 68 - extlib/HTMLPurifier/HTMLPurifier/UnitConverter.php | 254 -- extlib/HTMLPurifier/HTMLPurifier/VarParser.php | 154 - .../HTMLPurifier/VarParser/Flexible.php | 96 - .../HTMLPurifier/HTMLPurifier/VarParser/Native.php | 26 - .../HTMLPurifier/VarParserException.php | 11 - extlib/HTMLPurifier/LICENSE | 504 --- plugins/OStatus/README | 4 - plugins/OStatus/classes/Ostatus_profile.php | 25 +- 324 files changed, 3 insertions(+), 24231 deletions(-) delete mode 100644 extlib/HTMLPurifier/HTMLPurifier.auto.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier.autoload.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier.func.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier.includes.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier.kses.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier.path.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier.safe-includes.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrCollections.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Nmtokens.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/Text.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email/SimpleCheck.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Background.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Length.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/SafeObject.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/SafeParam.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrTypes.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/AttrValidator.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Bootstrap.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/CSSDefinition.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ChildDef.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ChildDef/Optional.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ChildDef/Required.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ChildDef/Table.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Config.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema.ser delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ContentSets.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Context.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Definition.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/DefinitionCache.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Memory.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Null.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer.php delete mode 100755 extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Doctype.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ElementDef.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Encoder.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/EntityLookup.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/EntityLookup/entities.ser delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/EntityParser.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ErrorCollector.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/ErrorStruct.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Exception.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Filter.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Filter/YouTube.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Generator.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLDefinition.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/List.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Proprietary.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Strict.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/XHTML.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/XHTMLAndHTML4.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/IDAccumulator.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Injector.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Injector/Linkify.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Language.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Language/messages/en-x-test.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Language/messages/en.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/LanguageFactory.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Length.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Lexer.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Lexer/DOMLex.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Lexer/DirectLex.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Lexer/PEARSax3.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/PercentEncoder.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Printer.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/PropertyList.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/PropertyListIterator.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Strategy.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Strategy/Composite.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Strategy/Core.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/StringHash.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/StringHashParser.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/TagTransform.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/TagTransform/Font.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Token.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Token/Comment.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Token/Empty.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Token/End.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Token/Start.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Token/Tag.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/Token/Text.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/TokenFactory.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URI.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIDefinition.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIFilter.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternal.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIParser.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIScheme.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIScheme/http.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIScheme/https.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIScheme/mailto.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIScheme/news.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/UnitConverter.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/VarParser.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/VarParser/Native.php delete mode 100644 extlib/HTMLPurifier/HTMLPurifier/VarParserException.php delete mode 100644 extlib/HTMLPurifier/LICENSE (limited to 'plugins/OStatus') diff --git a/extlib/HTMLPurifier/HTMLPurifier.auto.php b/extlib/HTMLPurifier/HTMLPurifier.auto.php deleted file mode 100644 index 1960c399f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier.auto.php +++ /dev/null @@ -1,11 +0,0 @@ -purify($html, $config); -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier.includes.php b/extlib/HTMLPurifier/HTMLPurifier.includes.php deleted file mode 100644 index 7cfb97060..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier.includes.php +++ /dev/null @@ -1,208 +0,0 @@ - $attributes) { - $allowed_elements[$element] = true; - foreach ($attributes as $attribute => $x) { - $allowed_attributes["$element.$attribute"] = true; - } - } - $config->set('HTML.AllowedElements', $allowed_elements); - $config->set('HTML.AllowedAttributes', $allowed_attributes); - $allowed_schemes = array(); - if ($allowed_protocols !== null) { - $config->set('URI.AllowedSchemes', $allowed_protocols); - } - $purifier = new HTMLPurifier($config); - return $purifier->purify($string); -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier.path.php b/extlib/HTMLPurifier/HTMLPurifier.path.php deleted file mode 100644 index 39b1b6531..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier.path.php +++ /dev/null @@ -1,11 +0,0 @@ -config = HTMLPurifier_Config::create($config); - - $this->strategy = new HTMLPurifier_Strategy_Core(); - - } - - /** - * Adds a filter to process the output. First come first serve - * @param $filter HTMLPurifier_Filter object - */ - public function addFilter($filter) { - trigger_error('HTMLPurifier->addFilter() is deprecated, use configuration directives in the Filter namespace or Filter.Custom', E_USER_WARNING); - $this->filters[] = $filter; - } - - /** - * Filters an HTML snippet/document to be XSS-free and standards-compliant. - * - * @param $html String of HTML to purify - * @param $config HTMLPurifier_Config object for this operation, if omitted, - * defaults to the config object specified during this - * object's construction. The parameter can also be any type - * that HTMLPurifier_Config::create() supports. - * @return Purified HTML - */ - public function purify($html, $config = null) { - - // :TODO: make the config merge in, instead of replace - $config = $config ? HTMLPurifier_Config::create($config) : $this->config; - - // implementation is partially environment dependant, partially - // configuration dependant - $lexer = HTMLPurifier_Lexer::create($config); - - $context = new HTMLPurifier_Context(); - - // setup HTML generator - $this->generator = new HTMLPurifier_Generator($config, $context); - $context->register('Generator', $this->generator); - - // set up global context variables - if ($config->get('Core.CollectErrors')) { - // may get moved out if other facilities use it - $language_factory = HTMLPurifier_LanguageFactory::instance(); - $language = $language_factory->create($config, $context); - $context->register('Locale', $language); - - $error_collector = new HTMLPurifier_ErrorCollector($context); - $context->register('ErrorCollector', $error_collector); - } - - // setup id_accumulator context, necessary due to the fact that - // AttrValidator can be called from many places - $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); - $context->register('IDAccumulator', $id_accumulator); - - $html = HTMLPurifier_Encoder::convertToUTF8($html, $config, $context); - - // setup filters - $filter_flags = $config->getBatch('Filter'); - $custom_filters = $filter_flags['Custom']; - unset($filter_flags['Custom']); - $filters = array(); - foreach ($filter_flags as $filter => $flag) { - if (!$flag) continue; - if (strpos($filter, '.') !== false) continue; - $class = "HTMLPurifier_Filter_$filter"; - $filters[] = new $class; - } - foreach ($custom_filters as $filter) { - // maybe "HTMLPurifier_Filter_$filter", but be consistent with AutoFormat - $filters[] = $filter; - } - $filters = array_merge($filters, $this->filters); - // maybe prepare(), but later - - for ($i = 0, $filter_size = count($filters); $i < $filter_size; $i++) { - $html = $filters[$i]->preFilter($html, $config, $context); - } - - // purified HTML - $html = - $this->generator->generateFromTokens( - // list of tokens - $this->strategy->execute( - // list of un-purified tokens - $lexer->tokenizeHTML( - // un-purified HTML - $html, $config, $context - ), - $config, $context - ) - ); - - for ($i = $filter_size - 1; $i >= 0; $i--) { - $html = $filters[$i]->postFilter($html, $config, $context); - } - - $html = HTMLPurifier_Encoder::convertFromUTF8($html, $config, $context); - $this->context =& $context; - return $html; - } - - /** - * Filters an array of HTML snippets - * @param $config Optional HTMLPurifier_Config object for this operation. - * See HTMLPurifier::purify() for more details. - * @return Array of purified HTML - */ - public function purifyArray($array_of_html, $config = null) { - $context_array = array(); - foreach ($array_of_html as $key => $html) { - $array_of_html[$key] = $this->purify($html, $config); - $context_array[$key] = $this->context; - } - $this->context = $context_array; - return $array_of_html; - } - - /** - * Singleton for enforcing just one HTML Purifier in your system - * @param $prototype Optional prototype HTMLPurifier instance to - * overload singleton with, or HTMLPurifier_Config - * instance to configure the generated version with. - */ - public static function instance($prototype = null) { - if (!self::$instance || $prototype) { - if ($prototype instanceof HTMLPurifier) { - self::$instance = $prototype; - } elseif ($prototype) { - self::$instance = new HTMLPurifier($prototype); - } else { - self::$instance = new HTMLPurifier(); - } - } - return self::$instance; - } - - /** - * @note Backwards compatibility, see instance() - */ - public static function getInstance($prototype = null) { - return HTMLPurifier::instance($prototype); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier.safe-includes.php b/extlib/HTMLPurifier/HTMLPurifier.safe-includes.php deleted file mode 100644 index cf2c1d617..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier.safe-includes.php +++ /dev/null @@ -1,202 +0,0 @@ -attr_collections as $coll_i => $coll) { - if (!isset($this->info[$coll_i])) { - $this->info[$coll_i] = array(); - } - foreach ($coll as $attr_i => $attr) { - if ($attr_i === 0 && isset($this->info[$coll_i][$attr_i])) { - // merge in includes - $this->info[$coll_i][$attr_i] = array_merge( - $this->info[$coll_i][$attr_i], $attr); - continue; - } - $this->info[$coll_i][$attr_i] = $attr; - } - } - } - // perform internal expansions and inclusions - foreach ($this->info as $name => $attr) { - // merge attribute collections that include others - $this->performInclusions($this->info[$name]); - // replace string identifiers with actual attribute objects - $this->expandIdentifiers($this->info[$name], $attr_types); - } - } - - /** - * Takes a reference to an attribute associative array and performs - * all inclusions specified by the zero index. - * @param &$attr Reference to attribute array - */ - public function performInclusions(&$attr) { - if (!isset($attr[0])) return; - $merge = $attr[0]; - $seen = array(); // recursion guard - // loop through all the inclusions - for ($i = 0; isset($merge[$i]); $i++) { - if (isset($seen[$merge[$i]])) continue; - $seen[$merge[$i]] = true; - // foreach attribute of the inclusion, copy it over - if (!isset($this->info[$merge[$i]])) continue; - foreach ($this->info[$merge[$i]] as $key => $value) { - if (isset($attr[$key])) continue; // also catches more inclusions - $attr[$key] = $value; - } - if (isset($this->info[$merge[$i]][0])) { - // recursion - $merge = array_merge($merge, $this->info[$merge[$i]][0]); - } - } - unset($attr[0]); - } - - /** - * Expands all string identifiers in an attribute array by replacing - * them with the appropriate values inside HTMLPurifier_AttrTypes - * @param &$attr Reference to attribute array - * @param $attr_types HTMLPurifier_AttrTypes instance - */ - public function expandIdentifiers(&$attr, $attr_types) { - - // because foreach will process new elements we add, make sure we - // skip duplicates - $processed = array(); - - foreach ($attr as $def_i => $def) { - // skip inclusions - if ($def_i === 0) continue; - - if (isset($processed[$def_i])) continue; - - // determine whether or not attribute is required - if ($required = (strpos($def_i, '*') !== false)) { - // rename the definition - unset($attr[$def_i]); - $def_i = trim($def_i, '*'); - $attr[$def_i] = $def; - } - - $processed[$def_i] = true; - - // if we've already got a literal object, move on - if (is_object($def)) { - // preserve previous required - $attr[$def_i]->required = ($required || $attr[$def_i]->required); - continue; - } - - if ($def === false) { - unset($attr[$def_i]); - continue; - } - - if ($t = $attr_types->get($def)) { - $attr[$def_i] = $t; - $attr[$def_i]->required = $required; - } else { - unset($attr[$def_i]); - } - } - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef.php deleted file mode 100644 index d32fa62d6..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef.php +++ /dev/null @@ -1,87 +0,0 @@ - by removing - * leading and trailing whitespace, ignoring line feeds, and replacing - * carriage returns and tabs with spaces. While most useful for HTML - * attributes specified as CDATA, it can also be applied to most CSS - * values. - * - * @note This method is not entirely standards compliant, as trim() removes - * more types of whitespace than specified in the spec. In practice, - * this is rarely a problem, as those extra characters usually have - * already been removed by HTMLPurifier_Encoder. - * - * @warning This processing is inconsistent with XML's whitespace handling - * as specified by section 3.3.3 and referenced XHTML 1.0 section - * 4.7. However, note that we are NOT necessarily - * parsing XML, thus, this behavior may still be correct. We - * assume that newlines have been normalized. - */ - public function parseCDATA($string) { - $string = trim($string); - $string = str_replace(array("\n", "\t", "\r"), ' ', $string); - return $string; - } - - /** - * Factory method for creating this class from a string. - * @param $string String construction info - * @return Created AttrDef object corresponding to $string - */ - public function make($string) { - // default implementation, return a flyweight of this object. - // If $string has an effect on the returned object (i.e. you - // need to overload this method), it is best - // to clone or instantiate new copies. (Instantiation is safer.) - return $this; - } - - /** - * Removes spaces from rgb(0, 0, 0) so that shorthand CSS properties work - * properly. THIS IS A HACK! - */ - protected function mungeRgb($string) { - return preg_replace('/rgb\((\d+)\s*,\s*(\d+)\s*,\s*(\d+)\)/', 'rgb(\1,\2,\3)', $string); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php deleted file mode 100644 index 953e70675..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS.php +++ /dev/null @@ -1,87 +0,0 @@ -parseCDATA($css); - - $definition = $config->getCSSDefinition(); - - // we're going to break the spec and explode by semicolons. - // This is because semicolon rarely appears in escaped form - // Doing this is generally flaky but fast - // IT MIGHT APPEAR IN URIs, see HTMLPurifier_AttrDef_CSSURI - // for details - - $declarations = explode(';', $css); - $propvalues = array(); - - /** - * Name of the current CSS property being validated. - */ - $property = false; - $context->register('CurrentCSSProperty', $property); - - foreach ($declarations as $declaration) { - if (!$declaration) continue; - if (!strpos($declaration, ':')) continue; - list($property, $value) = explode(':', $declaration, 2); - $property = trim($property); - $value = trim($value); - $ok = false; - do { - if (isset($definition->info[$property])) { - $ok = true; - break; - } - if (ctype_lower($property)) break; - $property = strtolower($property); - if (isset($definition->info[$property])) { - $ok = true; - break; - } - } while(0); - if (!$ok) continue; - // inefficient call, since the validator will do this again - if (strtolower(trim($value)) !== 'inherit') { - // inherit works for everything (but only on the base property) - $result = $definition->info[$property]->validate( - $value, $config, $context ); - } else { - $result = 'inherit'; - } - if ($result === false) continue; - $propvalues[$property] = $result; - } - - $context->destroy('CurrentCSSProperty'); - - // procedure does not write the new CSS simultaneously, so it's - // slightly inefficient, but it's the only way of getting rid of - // duplicates. Perhaps config to optimize it, but not now. - - $new_declarations = ''; - foreach ($propvalues as $prop => $value) { - $new_declarations .= "$prop:$value;"; - } - - return $new_declarations ? $new_declarations : false; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php deleted file mode 100644 index 292c040d4..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/AlphaValue.php +++ /dev/null @@ -1,21 +0,0 @@ - 1.0) $result = '1'; - return $result; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php deleted file mode 100644 index 3a3d20cd6..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Background.php +++ /dev/null @@ -1,87 +0,0 @@ -getCSSDefinition(); - $this->info['background-color'] = $def->info['background-color']; - $this->info['background-image'] = $def->info['background-image']; - $this->info['background-repeat'] = $def->info['background-repeat']; - $this->info['background-attachment'] = $def->info['background-attachment']; - $this->info['background-position'] = $def->info['background-position']; - } - - public function validate($string, $config, $context) { - - // regular pre-processing - $string = $this->parseCDATA($string); - if ($string === '') return false; - - // munge rgb() decl if necessary - $string = $this->mungeRgb($string); - - // assumes URI doesn't have spaces in it - $bits = explode(' ', strtolower($string)); // bits to process - - $caught = array(); - $caught['color'] = false; - $caught['image'] = false; - $caught['repeat'] = false; - $caught['attachment'] = false; - $caught['position'] = false; - - $i = 0; // number of catches - $none = false; - - foreach ($bits as $bit) { - if ($bit === '') continue; - foreach ($caught as $key => $status) { - if ($key != 'position') { - if ($status !== false) continue; - $r = $this->info['background-' . $key]->validate($bit, $config, $context); - } else { - $r = $bit; - } - if ($r === false) continue; - if ($key == 'position') { - if ($caught[$key] === false) $caught[$key] = ''; - $caught[$key] .= $r . ' '; - } else { - $caught[$key] = $r; - } - $i++; - break; - } - } - - if (!$i) return false; - if ($caught['position'] !== false) { - $caught['position'] = $this->info['background-position']-> - validate($caught['position'], $config, $context); - } - - $ret = array(); - foreach ($caught as $value) { - if ($value === false) continue; - $ret[] = $value; - } - - if (empty($ret)) return false; - return implode(' ', $ret); - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php deleted file mode 100644 index 35df3985e..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/BackgroundPosition.php +++ /dev/null @@ -1,126 +0,0 @@ - | | left | center | right - ] - [ - | | top | center | bottom - ]? - ] | - [ // this signifies that the vertical and horizontal adjectives - // can be arbitrarily ordered, however, there can only be two, - // one of each, or none at all - [ - left | center | right - ] || - [ - top | center | bottom - ] - ] - top, left = 0% - center, (none) = 50% - bottom, right = 100% -*/ - -/* QuirksMode says: - keyword + length/percentage must be ordered correctly, as per W3C - - Internet Explorer and Opera, however, support arbitrary ordering. We - should fix it up. - - Minor issue though, not strictly necessary. -*/ - -// control freaks may appreciate the ability to convert these to -// percentages or something, but it's not necessary - -/** - * Validates the value of background-position. - */ -class HTMLPurifier_AttrDef_CSS_BackgroundPosition extends HTMLPurifier_AttrDef -{ - - protected $length; - protected $percentage; - - public function __construct() { - $this->length = new HTMLPurifier_AttrDef_CSS_Length(); - $this->percentage = new HTMLPurifier_AttrDef_CSS_Percentage(); - } - - public function validate($string, $config, $context) { - $string = $this->parseCDATA($string); - $bits = explode(' ', $string); - - $keywords = array(); - $keywords['h'] = false; // left, right - $keywords['v'] = false; // top, bottom - $keywords['c'] = false; // center - $measures = array(); - - $i = 0; - - $lookup = array( - 'top' => 'v', - 'bottom' => 'v', - 'left' => 'h', - 'right' => 'h', - 'center' => 'c' - ); - - foreach ($bits as $bit) { - if ($bit === '') continue; - - // test for keyword - $lbit = ctype_lower($bit) ? $bit : strtolower($bit); - if (isset($lookup[$lbit])) { - $status = $lookup[$lbit]; - $keywords[$status] = $lbit; - $i++; - } - - // test for length - $r = $this->length->validate($bit, $config, $context); - if ($r !== false) { - $measures[] = $r; - $i++; - } - - // test for percentage - $r = $this->percentage->validate($bit, $config, $context); - if ($r !== false) { - $measures[] = $r; - $i++; - } - - } - - if (!$i) return false; // no valid values were caught - - - $ret = array(); - - // first keyword - if ($keywords['h']) $ret[] = $keywords['h']; - elseif (count($measures)) $ret[] = array_shift($measures); - elseif ($keywords['c']) { - $ret[] = $keywords['c']; - $keywords['c'] = false; // prevent re-use: center = center center - } - - if ($keywords['v']) $ret[] = $keywords['v']; - elseif (count($measures)) $ret[] = array_shift($measures); - elseif ($keywords['c']) $ret[] = $keywords['c']; - - if (empty($ret)) return false; - return implode(' ', $ret); - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php deleted file mode 100644 index 42a1d1b4a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Border.php +++ /dev/null @@ -1,43 +0,0 @@ -getCSSDefinition(); - $this->info['border-width'] = $def->info['border-width']; - $this->info['border-style'] = $def->info['border-style']; - $this->info['border-top-color'] = $def->info['border-top-color']; - } - - public function validate($string, $config, $context) { - $string = $this->parseCDATA($string); - $string = $this->mungeRgb($string); - $bits = explode(' ', $string); - $done = array(); // segments we've finished - $ret = ''; // return value - foreach ($bits as $bit) { - foreach ($this->info as $propname => $validator) { - if (isset($done[$propname])) continue; - $r = $validator->validate($bit, $config, $context); - if ($r !== false) { - $ret .= $r . ' '; - $done[$propname] = true; - break; - } - } - } - return rtrim($ret); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php deleted file mode 100644 index 07f95a671..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Color.php +++ /dev/null @@ -1,78 +0,0 @@ -get('Core.ColorKeywords'); - - $color = trim($color); - if ($color === '') return false; - - $lower = strtolower($color); - if (isset($colors[$lower])) return $colors[$lower]; - - if (strpos($color, 'rgb(') !== false) { - // rgb literal handling - $length = strlen($color); - if (strpos($color, ')') !== $length - 1) return false; - $triad = substr($color, 4, $length - 4 - 1); - $parts = explode(',', $triad); - if (count($parts) !== 3) return false; - $type = false; // to ensure that they're all the same type - $new_parts = array(); - foreach ($parts as $part) { - $part = trim($part); - if ($part === '') return false; - $length = strlen($part); - if ($part[$length - 1] === '%') { - // handle percents - if (!$type) { - $type = 'percentage'; - } elseif ($type !== 'percentage') { - return false; - } - $num = (float) substr($part, 0, $length - 1); - if ($num < 0) $num = 0; - if ($num > 100) $num = 100; - $new_parts[] = "$num%"; - } else { - // handle integers - if (!$type) { - $type = 'integer'; - } elseif ($type !== 'integer') { - return false; - } - $num = (int) $part; - if ($num < 0) $num = 0; - if ($num > 255) $num = 255; - $new_parts[] = (string) $num; - } - } - $new_triad = implode(',', $new_parts); - $color = "rgb($new_triad)"; - } else { - // hexadecimal handling - if ($color[0] === '#') { - $hex = substr($color, 1); - } else { - $hex = $color; - $color = '#' . $color; - } - $length = strlen($hex); - if ($length !== 3 && $length !== 6) return false; - if (!ctype_xdigit($hex)) return false; - } - - return $color; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php deleted file mode 100644 index de1289cba..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Composite.php +++ /dev/null @@ -1,38 +0,0 @@ -defs = $defs; - } - - public function validate($string, $config, $context) { - foreach ($this->defs as $i => $def) { - $result = $this->defs[$i]->validate($string, $config, $context); - if ($result !== false) return $result; - } - return false; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php deleted file mode 100644 index 6599c5b2d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/DenyElementDecorator.php +++ /dev/null @@ -1,28 +0,0 @@ -def = $def; - $this->element = $element; - } - /** - * Checks if CurrentToken is set and equal to $this->element - */ - public function validate($string, $config, $context) { - $token = $context->get('CurrentToken', true); - if ($token && $token->name == $this->element) return false; - return $this->def->validate($string, $config, $context); - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php deleted file mode 100644 index 147894b86..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Filter.php +++ /dev/null @@ -1,54 +0,0 @@ -intValidator = new HTMLPurifier_AttrDef_Integer(); - } - - public function validate($value, $config, $context) { - $value = $this->parseCDATA($value); - if ($value === 'none') return $value; - // if we looped this we could support multiple filters - $function_length = strcspn($value, '('); - $function = trim(substr($value, 0, $function_length)); - if ($function !== 'alpha' && - $function !== 'Alpha' && - $function !== 'progid:DXImageTransform.Microsoft.Alpha' - ) return false; - $cursor = $function_length + 1; - $parameters_length = strcspn($value, ')', $cursor); - $parameters = substr($value, $cursor, $parameters_length); - $params = explode(',', $parameters); - $ret_params = array(); - $lookup = array(); - foreach ($params as $param) { - list($key, $value) = explode('=', $param); - $key = trim($key); - $value = trim($value); - if (isset($lookup[$key])) continue; - if ($key !== 'opacity') continue; - $value = $this->intValidator->validate($value, $config, $context); - if ($value === false) continue; - $int = (int) $value; - if ($int > 100) $value = '100'; - if ($int < 0) $value = '0'; - $ret_params[] = "$key=$value"; - $lookup[$key] = true; - } - $ret_parameters = implode(',', $ret_params); - $ret_function = "$function($ret_parameters)"; - return $ret_function; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php deleted file mode 100644 index 699ee0b70..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Font.php +++ /dev/null @@ -1,149 +0,0 @@ -getCSSDefinition(); - $this->info['font-style'] = $def->info['font-style']; - $this->info['font-variant'] = $def->info['font-variant']; - $this->info['font-weight'] = $def->info['font-weight']; - $this->info['font-size'] = $def->info['font-size']; - $this->info['line-height'] = $def->info['line-height']; - $this->info['font-family'] = $def->info['font-family']; - } - - public function validate($string, $config, $context) { - - static $system_fonts = array( - 'caption' => true, - 'icon' => true, - 'menu' => true, - 'message-box' => true, - 'small-caption' => true, - 'status-bar' => true - ); - - // regular pre-processing - $string = $this->parseCDATA($string); - if ($string === '') return false; - - // check if it's one of the keywords - $lowercase_string = strtolower($string); - if (isset($system_fonts[$lowercase_string])) { - return $lowercase_string; - } - - $bits = explode(' ', $string); // bits to process - $stage = 0; // this indicates what we're looking for - $caught = array(); // which stage 0 properties have we caught? - $stage_1 = array('font-style', 'font-variant', 'font-weight'); - $final = ''; // output - - for ($i = 0, $size = count($bits); $i < $size; $i++) { - if ($bits[$i] === '') continue; - switch ($stage) { - - // attempting to catch font-style, font-variant or font-weight - case 0: - foreach ($stage_1 as $validator_name) { - if (isset($caught[$validator_name])) continue; - $r = $this->info[$validator_name]->validate( - $bits[$i], $config, $context); - if ($r !== false) { - $final .= $r . ' '; - $caught[$validator_name] = true; - break; - } - } - // all three caught, continue on - if (count($caught) >= 3) $stage = 1; - if ($r !== false) break; - - // attempting to catch font-size and perhaps line-height - case 1: - $found_slash = false; - if (strpos($bits[$i], '/') !== false) { - list($font_size, $line_height) = - explode('/', $bits[$i]); - if ($line_height === '') { - // ooh, there's a space after the slash! - $line_height = false; - $found_slash = true; - } - } else { - $font_size = $bits[$i]; - $line_height = false; - } - $r = $this->info['font-size']->validate( - $font_size, $config, $context); - if ($r !== false) { - $final .= $r; - // attempt to catch line-height - if ($line_height === false) { - // we need to scroll forward - for ($j = $i + 1; $j < $size; $j++) { - if ($bits[$j] === '') continue; - if ($bits[$j] === '/') { - if ($found_slash) { - return false; - } else { - $found_slash = true; - continue; - } - } - $line_height = $bits[$j]; - break; - } - } else { - // slash already found - $found_slash = true; - $j = $i; - } - if ($found_slash) { - $i = $j; - $r = $this->info['line-height']->validate( - $line_height, $config, $context); - if ($r !== false) { - $final .= '/' . $r; - } - } - $final .= ' '; - $stage = 2; - break; - } - return false; - - // attempting to catch font-family - case 2: - $font_family = - implode(' ', array_slice($bits, $i, $size - $i)); - $r = $this->info['font-family']->validate( - $font_family, $config, $context); - if ($r !== false) { - $final .= $r . ' '; - // processing completed successfully - return rtrim($final); - } - return false; - } - } - return false; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php deleted file mode 100644 index 705ac893d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/FontFamily.php +++ /dev/null @@ -1,90 +0,0 @@ - true, - 'sans-serif' => true, - 'monospace' => true, - 'fantasy' => true, - 'cursive' => true - ); - - // assume that no font names contain commas in them - $fonts = explode(',', $string); - $final = ''; - foreach($fonts as $font) { - $font = trim($font); - if ($font === '') continue; - // match a generic name - if (isset($generic_names[$font])) { - $final .= $font . ', '; - continue; - } - // match a quoted name - if ($font[0] === '"' || $font[0] === "'") { - $length = strlen($font); - if ($length <= 2) continue; - $quote = $font[0]; - if ($font[$length - 1] !== $quote) continue; - $font = substr($font, 1, $length - 2); - - $new_font = ''; - for ($i = 0, $c = strlen($font); $i < $c; $i++) { - if ($font[$i] === '\\') { - $i++; - if ($i >= $c) { - $new_font .= '\\'; - break; - } - if (ctype_xdigit($font[$i])) { - $code = $font[$i]; - for ($a = 1, $i++; $i < $c && $a < 6; $i++, $a++) { - if (!ctype_xdigit($font[$i])) break; - $code .= $font[$i]; - } - // We have to be extremely careful when adding - // new characters, to make sure we're not breaking - // the encoding. - $char = HTMLPurifier_Encoder::unichr(hexdec($code)); - if (HTMLPurifier_Encoder::cleanUTF8($char) === '') continue; - $new_font .= $char; - if ($i < $c && trim($font[$i]) !== '') $i--; - continue; - } - if ($font[$i] === "\n") continue; - } - $new_font .= $font[$i]; - } - - $font = $new_font; - } - // $font is a pure representation of the font name - - if (ctype_alnum($font) && $font !== '') { - // very simple font, allow it in unharmed - $final .= $font . ', '; - continue; - } - - // complicated font, requires quoting - - // armor single quotes and new lines - $font = str_replace("\\", "\\\\", $font); - $font = str_replace("'", "\\'", $font); - $final .= "'$font', "; - } - $final = rtrim($final, ', '); - if ($final === '') return false; - return $final; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php deleted file mode 100644 index 4e6b35e5a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ImportantDecorator.php +++ /dev/null @@ -1,40 +0,0 @@ -def = $def; - $this->allow = $allow; - } - /** - * Intercepts and removes !important if necessary - */ - public function validate($string, $config, $context) { - // test for ! and important tokens - $string = trim($string); - $is_important = false; - // :TODO: optimization: test directly for !important and ! important - if (strlen($string) >= 9 && substr($string, -9) === 'important') { - $temp = rtrim(substr($string, 0, -9)); - // use a temp, because we might want to restore important - if (strlen($temp) >= 1 && substr($temp, -1) === '!') { - $string = rtrim(substr($temp, 0, -1)); - $is_important = true; - } - } - $string = $this->def->validate($string, $config, $context); - if ($this->allow && $is_important) $string .= ' !important'; - return $string; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php deleted file mode 100644 index a07ec5813..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Length.php +++ /dev/null @@ -1,47 +0,0 @@ -min = $min !== null ? HTMLPurifier_Length::make($min) : null; - $this->max = $max !== null ? HTMLPurifier_Length::make($max) : null; - } - - public function validate($string, $config, $context) { - $string = $this->parseCDATA($string); - - // Optimizations - if ($string === '') return false; - if ($string === '0') return '0'; - if (strlen($string) === 1) return false; - - $length = HTMLPurifier_Length::make($string); - if (!$length->isValid()) return false; - - if ($this->min) { - $c = $length->compareTo($this->min); - if ($c === false) return false; - if ($c < 0) return false; - } - if ($this->max) { - $c = $length->compareTo($this->max); - if ($c === false) return false; - if ($c > 0) return false; - } - - return $length->toString(); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php deleted file mode 100644 index 4406868c0..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/ListStyle.php +++ /dev/null @@ -1,78 +0,0 @@ -getCSSDefinition(); - $this->info['list-style-type'] = $def->info['list-style-type']; - $this->info['list-style-position'] = $def->info['list-style-position']; - $this->info['list-style-image'] = $def->info['list-style-image']; - } - - public function validate($string, $config, $context) { - - // regular pre-processing - $string = $this->parseCDATA($string); - if ($string === '') return false; - - // assumes URI doesn't have spaces in it - $bits = explode(' ', strtolower($string)); // bits to process - - $caught = array(); - $caught['type'] = false; - $caught['position'] = false; - $caught['image'] = false; - - $i = 0; // number of catches - $none = false; - - foreach ($bits as $bit) { - if ($i >= 3) return; // optimization bit - if ($bit === '') continue; - foreach ($caught as $key => $status) { - if ($status !== false) continue; - $r = $this->info['list-style-' . $key]->validate($bit, $config, $context); - if ($r === false) continue; - if ($r === 'none') { - if ($none) continue; - else $none = true; - if ($key == 'image') continue; - } - $caught[$key] = $r; - $i++; - break; - } - } - - if (!$i) return false; - - $ret = array(); - - // construct type - if ($caught['type']) $ret[] = $caught['type']; - - // construct image - if ($caught['image']) $ret[] = $caught['image']; - - // construct position - if ($caught['position']) $ret[] = $caught['position']; - - if (empty($ret)) return false; - return implode(' ', $ret); - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php deleted file mode 100644 index 4d62a40d7..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Multiple.php +++ /dev/null @@ -1,58 +0,0 @@ -single = $single; - $this->max = $max; - } - - public function validate($string, $config, $context) { - $string = $this->parseCDATA($string); - if ($string === '') return false; - $parts = explode(' ', $string); // parseCDATA replaced \r, \t and \n - $length = count($parts); - $final = ''; - for ($i = 0, $num = 0; $i < $length && $num < $this->max; $i++) { - if (ctype_space($parts[$i])) continue; - $result = $this->single->validate($parts[$i], $config, $context); - if ($result !== false) { - $final .= $result . ' '; - $num++; - } - } - if ($final === '') return false; - return rtrim($final); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php deleted file mode 100644 index 3f99e12ec..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Number.php +++ /dev/null @@ -1,69 +0,0 @@ -non_negative = $non_negative; - } - - /** - * @warning Some contexts do not pass $config, $context. These - * variables should not be used without checking HTMLPurifier_Length - */ - public function validate($number, $config, $context) { - - $number = $this->parseCDATA($number); - - if ($number === '') return false; - if ($number === '0') return '0'; - - $sign = ''; - switch ($number[0]) { - case '-': - if ($this->non_negative) return false; - $sign = '-'; - case '+': - $number = substr($number, 1); - } - - if (ctype_digit($number)) { - $number = ltrim($number, '0'); - return $number ? $sign . $number : '0'; - } - - // Period is the only non-numeric character allowed - if (strpos($number, '.') === false) return false; - - list($left, $right) = explode('.', $number, 2); - - if ($left === '' && $right === '') return false; - if ($left !== '' && !ctype_digit($left)) return false; - - $left = ltrim($left, '0'); - $right = rtrim($right, '0'); - - if ($right === '') { - return $left ? $sign . $left : '0'; - } elseif (!ctype_digit($right)) { - return false; - } - - return $sign . $left . '.' . $right; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php deleted file mode 100644 index c34b8fc3c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/Percentage.php +++ /dev/null @@ -1,40 +0,0 @@ -number_def = new HTMLPurifier_AttrDef_CSS_Number($non_negative); - } - - public function validate($string, $config, $context) { - - $string = $this->parseCDATA($string); - - if ($string === '') return false; - $length = strlen($string); - if ($length === 1) return false; - if ($string[$length - 1] !== '%') return false; - - $number = substr($string, 0, $length - 1); - $number = $this->number_def->validate($number, $config, $context); - - if ($number === false) return false; - return "$number%"; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php deleted file mode 100644 index 772c922d8..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/TextDecoration.php +++ /dev/null @@ -1,38 +0,0 @@ - true, - 'overline' => true, - 'underline' => true, - ); - - $string = strtolower($this->parseCDATA($string)); - - if ($string === 'none') return $string; - - $parts = explode(' ', $string); - $final = ''; - foreach ($parts as $part) { - if (isset($allowed_values[$part])) { - $final .= $part . ' '; - } - } - $final = rtrim($final); - if ($final === '') return false; - return $final; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php deleted file mode 100644 index 435d7930b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/CSS/URI.php +++ /dev/null @@ -1,56 +0,0 @@ -parseCDATA($uri_string); - if (strpos($uri_string, 'url(') !== 0) return false; - $uri_string = substr($uri_string, 4); - $new_length = strlen($uri_string) - 1; - if ($uri_string[$new_length] != ')') return false; - $uri = trim(substr($uri_string, 0, $new_length)); - - if (!empty($uri) && ($uri[0] == "'" || $uri[0] == '"')) { - $quote = $uri[0]; - $new_length = strlen($uri) - 1; - if ($uri[$new_length] !== $quote) return false; - $uri = substr($uri, 1, $new_length - 1); - } - - $keys = array( '(', ')', ',', ' ', '"', "'"); - $values = array('\\(', '\\)', '\\,', '\\ ', '\\"', "\\'"); - $uri = str_replace($values, $keys, $uri); - - $result = parent::validate($uri, $config, $context); - - if ($result === false) return false; - - // escape necessary characters according to CSS spec - // except for the comma, none of these should appear in the - // URI at all - $result = str_replace($keys, $values, $result); - - return "url($result)"; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php deleted file mode 100644 index 5d603ebcc..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Enum.php +++ /dev/null @@ -1,65 +0,0 @@ -valid_values = array_flip($valid_values); - $this->case_sensitive = $case_sensitive; - } - - public function validate($string, $config, $context) { - $string = trim($string); - if (!$this->case_sensitive) { - // we may want to do full case-insensitive libraries - $string = ctype_lower($string) ? $string : strtolower($string); - } - $result = isset($this->valid_values[$string]); - - return $result ? $string : false; - } - - /** - * @param $string In form of comma-delimited list of case-insensitive - * valid values. Example: "foo,bar,baz". Prepend "s:" to make - * case sensitive - */ - public function make($string) { - if (strlen($string) > 2 && $string[0] == 's' && $string[1] == ':') { - $string = substr($string, 2); - $sensitive = true; - } else { - $sensitive = false; - } - $values = explode(',', $string); - return new HTMLPurifier_AttrDef_Enum($values, $sensitive); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php deleted file mode 100644 index e06987eb8..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Bool.php +++ /dev/null @@ -1,28 +0,0 @@ -name = $name;} - - public function validate($string, $config, $context) { - if (empty($string)) return false; - return $this->name; - } - - /** - * @param $string Name of attribute - */ - public function make($string) { - return new HTMLPurifier_AttrDef_HTML_Bool($string); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php deleted file mode 100644 index 370068d97..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Class.php +++ /dev/null @@ -1,34 +0,0 @@ -getDefinition('HTML')->doctype->name; - if ($name == "XHTML 1.1" || $name == "XHTML 2.0") { - return parent::split($string, $config, $context); - } else { - return preg_split('/\s+/', $string); - } - } - protected function filter($tokens, $config, $context) { - $allowed = $config->get('Attr.AllowedClasses'); - $forbidden = $config->get('Attr.ForbiddenClasses'); - $ret = array(); - foreach ($tokens as $token) { - if ( - ($allowed === null || isset($allowed[$token])) && - !isset($forbidden[$token]) && - // We need this O(n) check because of PHP's array - // implementation that casts -0 to 0. - !in_array($token, $ret, true) - ) { - $ret[] = $token; - } - } - return $ret; - } -} diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php deleted file mode 100644 index d01e20454..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Color.php +++ /dev/null @@ -1,32 +0,0 @@ -get('Core.ColorKeywords'); - - $string = trim($string); - - if (empty($string)) return false; - if (isset($colors[$string])) return $colors[$string]; - if ($string[0] === '#') $hex = substr($string, 1); - else $hex = $string; - - $length = strlen($hex); - if ($length !== 3 && $length !== 6) return false; - if (!ctype_xdigit($hex)) return false; - if ($length === 3) $hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2]; - - return "#$hex"; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php deleted file mode 100644 index ae6ea7c01..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/FrameTarget.php +++ /dev/null @@ -1,21 +0,0 @@ -valid_values === false) $this->valid_values = $config->get('Attr.AllowedFrameTargets'); - return parent::validate($string, $config, $context); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php deleted file mode 100644 index 81d03762d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/ID.php +++ /dev/null @@ -1,70 +0,0 @@ -get('Attr.EnableID')) return false; - - $id = trim($id); // trim it first - - if ($id === '') return false; - - $prefix = $config->get('Attr.IDPrefix'); - if ($prefix !== '') { - $prefix .= $config->get('Attr.IDPrefixLocal'); - // prevent re-appending the prefix - if (strpos($id, $prefix) !== 0) $id = $prefix . $id; - } elseif ($config->get('Attr.IDPrefixLocal') !== '') { - trigger_error('%Attr.IDPrefixLocal cannot be used unless '. - '%Attr.IDPrefix is set', E_USER_WARNING); - } - - //if (!$this->ref) { - $id_accumulator =& $context->get('IDAccumulator'); - if (isset($id_accumulator->ids[$id])) return false; - //} - - // we purposely avoid using regex, hopefully this is faster - - if (ctype_alpha($id)) { - $result = true; - } else { - if (!ctype_alpha(@$id[0])) return false; - $trim = trim( // primitive style of regexps, I suppose - $id, - 'A..Za..z0..9:-._' - ); - $result = ($trim === ''); - } - - $regexp = $config->get('Attr.IDBlacklistRegexp'); - if ($regexp && preg_match($regexp, $id)) { - return false; - } - - if (/*!$this->ref && */$result) $id_accumulator->add($id); - - // if no change was made to the ID, return the result - // else, return the new id if stripping whitespace made it - // valid, or return false. - return $result ? $id : false; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php deleted file mode 100644 index a242f9c23..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Length.php +++ /dev/null @@ -1,41 +0,0 @@ - 100) return '100%'; - - return ((string) $points) . '%'; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php deleted file mode 100644 index 76d25ed08..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/LinkTypes.php +++ /dev/null @@ -1,53 +0,0 @@ - 'AllowedRel', - 'rev' => 'AllowedRev' - ); - if (!isset($configLookup[$name])) { - trigger_error('Unrecognized attribute name for link '. - 'relationship.', E_USER_ERROR); - return; - } - $this->name = $configLookup[$name]; - } - - public function validate($string, $config, $context) { - - $allowed = $config->get('Attr.' . $this->name); - if (empty($allowed)) return false; - - $string = $this->parseCDATA($string); - $parts = explode(' ', $string); - - // lookup to prevent duplicates - $ret_lookup = array(); - foreach ($parts as $part) { - $part = strtolower(trim($part)); - if (!isset($allowed[$part])) continue; - $ret_lookup[$part] = true; - } - - if (empty($ret_lookup)) return false; - $string = implode(' ', array_keys($ret_lookup)); - - return $string; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php deleted file mode 100644 index c72fc76e4..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/MultiLength.php +++ /dev/null @@ -1,41 +0,0 @@ -split($string, $config, $context); - $tokens = $this->filter($tokens, $config, $context); - if (empty($tokens)) return false; - return implode(' ', $tokens); - - } - - /** - * Splits a space separated list of tokens into its constituent parts. - */ - protected function split($string, $config, $context) { - // OPTIMIZABLE! - // do the preg_match, capture all subpatterns for reformulation - - // we don't support U+00A1 and up codepoints or - // escaping because I don't know how to do that with regexps - // and plus it would complicate optimization efforts (you never - // see that anyway). - $pattern = '/(?:(?<=\s)|\A)'. // look behind for space or string start - '((?:--|-?[A-Za-z_])[A-Za-z_\-0-9]*)'. - '(?:(?=\s)|\z)/'; // look ahead for space or string end - preg_match_all($pattern, $string, $matches); - return $matches[1]; - } - - /** - * Template method for removing certain tokens based on arbitrary criteria. - * @note If we wanted to be really functional, we'd do an array_filter - * with a callback. But... we're not. - */ - protected function filter($tokens, $config, $context) { - return $tokens; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php deleted file mode 100644 index 4cb2c1b85..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/HTML/Pixels.php +++ /dev/null @@ -1,48 +0,0 @@ -max = $max; - } - - public function validate($string, $config, $context) { - - $string = trim($string); - if ($string === '0') return $string; - if ($string === '') return false; - $length = strlen($string); - if (substr($string, $length - 2) == 'px') { - $string = substr($string, 0, $length - 2); - } - if (!is_numeric($string)) return false; - $int = (int) $string; - - if ($int < 0) return '0'; - - // upper-bound value, extremely high values can - // crash operating systems, see - // WARNING, above link WILL crash you if you're using Windows - - if ($this->max !== null && $int > $this->max) return (string) $this->max; - - return (string) $int; - - } - - public function make($string) { - if ($string === '') $max = null; - else $max = (int) $string; - $class = get_class($this); - return new $class($max); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php deleted file mode 100644 index d59738d2a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Integer.php +++ /dev/null @@ -1,73 +0,0 @@ -negative = $negative; - $this->zero = $zero; - $this->positive = $positive; - } - - public function validate($integer, $config, $context) { - - $integer = $this->parseCDATA($integer); - if ($integer === '') return false; - - // we could possibly simply typecast it to integer, but there are - // certain fringe cases that must not return an integer. - - // clip leading sign - if ( $this->negative && $integer[0] === '-' ) { - $digits = substr($integer, 1); - if ($digits === '0') $integer = '0'; // rm minus sign for zero - } elseif( $this->positive && $integer[0] === '+' ) { - $digits = $integer = substr($integer, 1); // rm unnecessary plus - } else { - $digits = $integer; - } - - // test if it's numeric - if (!ctype_digit($digits)) return false; - - // perform scope tests - if (!$this->zero && $integer == 0) return false; - if (!$this->positive && $integer > 0) return false; - if (!$this->negative && $integer < 0) return false; - - return $integer; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php deleted file mode 100644 index 10e6da56d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Lang.php +++ /dev/null @@ -1,73 +0,0 @@ - 8 || !ctype_alnum($subtags[1])) { - return $new_string; - } - if (!ctype_lower($subtags[1])) $subtags[1] = strtolower($subtags[1]); - - $new_string .= '-' . $subtags[1]; - if ($num_subtags == 2) return $new_string; - - // process all other subtags, index 2 and up - for ($i = 2; $i < $num_subtags; $i++) { - $length = strlen($subtags[$i]); - if ($length == 0 || $length > 8 || !ctype_alnum($subtags[$i])) { - return $new_string; - } - if (!ctype_lower($subtags[$i])) { - $subtags[$i] = strtolower($subtags[$i]); - } - $new_string .= '-' . $subtags[$i]; - } - - return $new_string; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php deleted file mode 100644 index c9e3ed193..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Switch.php +++ /dev/null @@ -1,34 +0,0 @@ -tag = $tag; - $this->withTag = $with_tag; - $this->withoutTag = $without_tag; - } - - public function validate($string, $config, $context) { - $token = $context->get('CurrentToken', true); - if (!$token || $token->name !== $this->tag) { - return $this->withoutTag->validate($string, $config, $context); - } else { - return $this->withTag->validate($string, $config, $context); - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Text.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Text.php deleted file mode 100644 index c6216cc53..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/Text.php +++ /dev/null @@ -1,15 +0,0 @@ -parseCDATA($string); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI.php deleted file mode 100644 index 01a6d83e9..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI.php +++ /dev/null @@ -1,77 +0,0 @@ -parser = new HTMLPurifier_URIParser(); - $this->embedsResource = (bool) $embeds_resource; - } - - public function make($string) { - $embeds = (bool) $string; - return new HTMLPurifier_AttrDef_URI($embeds); - } - - public function validate($uri, $config, $context) { - - if ($config->get('URI.Disable')) return false; - - $uri = $this->parseCDATA($uri); - - // parse the URI - $uri = $this->parser->parse($uri); - if ($uri === false) return false; - - // add embedded flag to context for validators - $context->register('EmbeddedURI', $this->embedsResource); - - $ok = false; - do { - - // generic validation - $result = $uri->validate($config, $context); - if (!$result) break; - - // chained filtering - $uri_def = $config->getDefinition('URI'); - $result = $uri_def->filter($uri, $config, $context); - if (!$result) break; - - // scheme-specific validation - $scheme_obj = $uri->getSchemeObj($config, $context); - if (!$scheme_obj) break; - if ($this->embedsResource && !$scheme_obj->browsable) break; - $result = $scheme_obj->validate($uri, $config, $context); - if (!$result) break; - - // Post chained filtering - $result = $uri_def->postFilter($uri, $config, $context); - if (!$result) break; - - // survived gauntlet - $ok = true; - - } while (false); - - $context->destroy('EmbeddedURI'); - if (!$ok) return false; - - // back to string - return $uri->toString(); - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php deleted file mode 100644 index bfee9d166..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/Email.php +++ /dev/null @@ -1,17 +0,0 @@ -" - // that needs more percent encoding to be done - if ($string == '') return false; - $string = trim($string); - $result = preg_match('/^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$/i', $string); - return $result ? $string : false; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php deleted file mode 100644 index 2156c10c6..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/Host.php +++ /dev/null @@ -1,62 +0,0 @@ -ipv4 = new HTMLPurifier_AttrDef_URI_IPv4(); - $this->ipv6 = new HTMLPurifier_AttrDef_URI_IPv6(); - } - - public function validate($string, $config, $context) { - $length = strlen($string); - if ($string === '') return ''; - if ($length > 1 && $string[0] === '[' && $string[$length-1] === ']') { - //IPv6 - $ip = substr($string, 1, $length - 2); - $valid = $this->ipv6->validate($ip, $config, $context); - if ($valid === false) return false; - return '['. $valid . ']'; - } - - // need to do checks on unusual encodings too - $ipv4 = $this->ipv4->validate($string, $config, $context); - if ($ipv4 !== false) return $ipv4; - - // A regular domain name. - - // This breaks I18N domain names, but we don't have proper IRI support, - // so force users to insert Punycode. If there's complaining we'll - // try to fix things into an international friendly form. - - // The productions describing this are: - $a = '[a-z]'; // alpha - $an = '[a-z0-9]'; // alphanum - $and = '[a-z0-9-]'; // alphanum | "-" - // domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum - $domainlabel = "$an($and*$an)?"; - // toplabel = alpha | alpha *( alphanum | "-" ) alphanum - $toplabel = "$a($and*$an)?"; - // hostname = *( domainlabel "." ) toplabel [ "." ] - $match = preg_match("/^($domainlabel\.)*$toplabel\.?$/i", $string); - if (!$match) return false; - - return $string; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php deleted file mode 100644 index ec4cf591b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv4.php +++ /dev/null @@ -1,39 +0,0 @@ -ip4) $this->_loadRegex(); - - if (preg_match('#^' . $this->ip4 . '$#s', $aIP)) - { - return $aIP; - } - - return false; - - } - - /** - * Lazy load function to prevent regex from being stuffed in - * cache. - */ - protected function _loadRegex() { - $oct = '(?:25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])'; // 0-255 - $this->ip4 = "(?:{$oct}\\.{$oct}\\.{$oct}\\.{$oct})"; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php b/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php deleted file mode 100644 index 9454e9be5..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrDef/URI/IPv6.php +++ /dev/null @@ -1,99 +0,0 @@ -ip4) $this->_loadRegex(); - - $original = $aIP; - - $hex = '[0-9a-fA-F]'; - $blk = '(?:' . $hex . '{1,4})'; - $pre = '(?:/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))'; // /0 - /128 - - // prefix check - if (strpos($aIP, '/') !== false) - { - if (preg_match('#' . $pre . '$#s', $aIP, $find)) - { - $aIP = substr($aIP, 0, 0-strlen($find[0])); - unset($find); - } - else - { - return false; - } - } - - // IPv4-compatiblity check - if (preg_match('#(?<=:'.')' . $this->ip4 . '$#s', $aIP, $find)) - { - $aIP = substr($aIP, 0, 0-strlen($find[0])); - $ip = explode('.', $find[0]); - $ip = array_map('dechex', $ip); - $aIP .= $ip[0] . $ip[1] . ':' . $ip[2] . $ip[3]; - unset($find, $ip); - } - - // compression check - $aIP = explode('::', $aIP); - $c = count($aIP); - if ($c > 2) - { - return false; - } - elseif ($c == 2) - { - list($first, $second) = $aIP; - $first = explode(':', $first); - $second = explode(':', $second); - - if (count($first) + count($second) > 8) - { - return false; - } - - while(count($first) < 8) - { - array_push($first, '0'); - } - - array_splice($first, 8 - count($second), 8, $second); - $aIP = $first; - unset($first,$second); - } - else - { - $aIP = explode(':', $aIP[0]); - } - $c = count($aIP); - - if ($c != 8) - { - return false; - } - - // All the pieces should be 16-bit hex strings. Are they? - foreach ($aIP as $piece) - { - if (!preg_match('#^[0-9a-fA-F]{4}$#s', sprintf('%04s', $piece))) - { - return false; - } - } - - return $original; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform.php deleted file mode 100644 index e61d3e01b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform.php +++ /dev/null @@ -1,56 +0,0 @@ -confiscateAttr($attr, 'background'); - // some validation should happen here - - $this->prependCSS($attr, "background-image:url($background);"); - - return $attr; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php deleted file mode 100644 index 4d1a05665..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BdoDir.php +++ /dev/null @@ -1,19 +0,0 @@ -get('Attr.DefaultTextDir'); - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php deleted file mode 100644 index ad3916bb9..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BgColor.php +++ /dev/null @@ -1,23 +0,0 @@ -confiscateAttr($attr, 'bgcolor'); - // some validation should happen here - - $this->prependCSS($attr, "background-color:$bgcolor;"); - - return $attr; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php deleted file mode 100644 index 51159b671..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/BoolToCSS.php +++ /dev/null @@ -1,36 +0,0 @@ -attr = $attr; - $this->css = $css; - } - - public function transform($attr, $config, $context) { - if (!isset($attr[$this->attr])) return $attr; - unset($attr[$this->attr]); - $this->prependCSS($attr, $this->css); - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php deleted file mode 100644 index 476b0b079..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Border.php +++ /dev/null @@ -1,18 +0,0 @@ -confiscateAttr($attr, 'border'); - // some validation should happen here - $this->prependCSS($attr, "border:{$border_width}px solid;"); - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php deleted file mode 100644 index 2a5b4514a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/EnumToCSS.php +++ /dev/null @@ -1,58 +0,0 @@ -attr = $attr; - $this->enumToCSS = $enum_to_css; - $this->caseSensitive = (bool) $case_sensitive; - } - - public function transform($attr, $config, $context) { - - if (!isset($attr[$this->attr])) return $attr; - - $value = trim($attr[$this->attr]); - unset($attr[$this->attr]); - - if (!$this->caseSensitive) $value = strtolower($value); - - if (!isset($this->enumToCSS[$value])) { - return $attr; - } - - $this->prependCSS($attr, $this->enumToCSS[$value]); - - return $attr; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php deleted file mode 100644 index a219479a0..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ImgRequired.php +++ /dev/null @@ -1,42 +0,0 @@ -get('Core.RemoveInvalidImg')) return $attr; - $attr['src'] = $config->get('Attr.DefaultInvalidImage'); - $src = false; - } - - if (!isset($attr['alt'])) { - if ($src) { - $alt = $config->get('Attr.DefaultImageAlt'); - if ($alt === null) { - $attr['alt'] = basename($attr['src']); - } else { - $attr['alt'] = $alt; - } - } else { - $attr['alt'] = $config->get('Attr.DefaultInvalidImageAlt'); - } - } - - return $attr; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php deleted file mode 100644 index fd84c10c3..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ImgSpace.php +++ /dev/null @@ -1,44 +0,0 @@ - array('left', 'right'), - 'vspace' => array('top', 'bottom') - ); - - public function __construct($attr) { - $this->attr = $attr; - if (!isset($this->css[$attr])) { - trigger_error(htmlspecialchars($attr) . ' is not valid space attribute'); - } - } - - public function transform($attr, $config, $context) { - - if (!isset($attr[$this->attr])) return $attr; - - $width = $this->confiscateAttr($attr, $this->attr); - // some validation could happen here - - if (!isset($this->css[$this->attr])) return $attr; - - $style = ''; - foreach ($this->css[$this->attr] as $suffix) { - $property = "margin-$suffix"; - $style .= "$property:{$width}px;"; - } - - $this->prependCSS($attr, $style); - - return $attr; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php deleted file mode 100644 index 16829552d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Input.php +++ /dev/null @@ -1,40 +0,0 @@ -pixels = new HTMLPurifier_AttrDef_HTML_Pixels(); - } - - public function transform($attr, $config, $context) { - if (!isset($attr['type'])) $t = 'text'; - else $t = strtolower($attr['type']); - if (isset($attr['checked']) && $t !== 'radio' && $t !== 'checkbox') { - unset($attr['checked']); - } - if (isset($attr['maxlength']) && $t !== 'text' && $t !== 'password') { - unset($attr['maxlength']); - } - if (isset($attr['size']) && $t !== 'text' && $t !== 'password') { - $result = $this->pixels->validate($attr['size'], $config, $context); - if ($result === false) unset($attr['size']); - else $attr['size'] = $result; - } - if (isset($attr['src']) && $t !== 'image') { - unset($attr['src']); - } - if (!isset($attr['value']) && ($t === 'radio' || $t === 'checkbox')) { - $attr['value'] = ''; - } - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php deleted file mode 100644 index 5869e7f82..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Lang.php +++ /dev/null @@ -1,28 +0,0 @@ -name = $name; - $this->cssName = $css_name ? $css_name : $name; - } - - public function transform($attr, $config, $context) { - if (!isset($attr[$this->name])) return $attr; - $length = $this->confiscateAttr($attr, $this->name); - if(ctype_digit($length)) $length .= 'px'; - $this->prependCSS($attr, $this->cssName . ":$length;"); - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php deleted file mode 100644 index 15315bc73..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Name.php +++ /dev/null @@ -1,21 +0,0 @@ -get('HTML.Attr.Name.UseCDATA')) return $attr; - if (!isset($attr['name'])) return $attr; - $id = $this->confiscateAttr($attr, 'name'); - if ( isset($attr['id'])) return $attr; - $attr['id'] = $id; - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php deleted file mode 100644 index a95638c14..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/NameSync.php +++ /dev/null @@ -1,27 +0,0 @@ -idDef = new HTMLPurifier_AttrDef_HTML_ID(); - } - - public function transform($attr, $config, $context) { - if (!isset($attr['name'])) return $attr; - $name = $attr['name']; - if (isset($attr['id']) && $attr['id'] === $name) return $attr; - $result = $this->idDef->validate($name, $config, $context); - if ($result === false) unset($attr['name']); - else $attr['name'] = $result; - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php deleted file mode 100644 index 4da449981..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/SafeEmbed.php +++ /dev/null @@ -1,15 +0,0 @@ -uri = new HTMLPurifier_AttrDef_URI(true); // embedded - } - - public function transform($attr, $config, $context) { - // If we add support for other objects, we'll need to alter the - // transforms. - switch ($attr['name']) { - // application/x-shockwave-flash - // Keep this synchronized with Injector/SafeObject.php - case 'allowScriptAccess': - $attr['value'] = 'never'; - break; - case 'allowNetworking': - $attr['value'] = 'internal'; - break; - case 'wmode': - $attr['value'] = 'window'; - break; - case 'movie': - $attr['value'] = $this->uri->validate($attr['value'], $config, $context); - break; - // add other cases to support other param name/value pairs - default: - $attr['name'] = $attr['value'] = null; - } - return $attr; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php deleted file mode 100644 index 4499050a2..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/ScriptRequired.php +++ /dev/null @@ -1,16 +0,0 @@ - - */ -class HTMLPurifier_AttrTransform_ScriptRequired extends HTMLPurifier_AttrTransform -{ - public function transform($attr, $config, $context) { - if (!isset($attr['type'])) { - $attr['type'] = 'text/javascript'; - } - return $attr; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php deleted file mode 100644 index 81ac3488b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTransform/Textarea.php +++ /dev/null @@ -1,18 +0,0 @@ - - */ -class HTMLPurifier_AttrTransform_Textarea extends HTMLPurifier_AttrTransform -{ - - public function transform($attr, $config, $context) { - // Calculated from Firefox - if (!isset($attr['cols'])) $attr['cols'] = '22'; - if (!isset($attr['rows'])) $attr['rows'] = '3'; - return $attr; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrTypes.php b/extlib/HTMLPurifier/HTMLPurifier/AttrTypes.php deleted file mode 100644 index fc2ea4e58..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrTypes.php +++ /dev/null @@ -1,77 +0,0 @@ -info['Enum'] = new HTMLPurifier_AttrDef_Enum(); - $this->info['Bool'] = new HTMLPurifier_AttrDef_HTML_Bool(); - - $this->info['CDATA'] = new HTMLPurifier_AttrDef_Text(); - $this->info['ID'] = new HTMLPurifier_AttrDef_HTML_ID(); - $this->info['Length'] = new HTMLPurifier_AttrDef_HTML_Length(); - $this->info['MultiLength'] = new HTMLPurifier_AttrDef_HTML_MultiLength(); - $this->info['NMTOKENS'] = new HTMLPurifier_AttrDef_HTML_Nmtokens(); - $this->info['Pixels'] = new HTMLPurifier_AttrDef_HTML_Pixels(); - $this->info['Text'] = new HTMLPurifier_AttrDef_Text(); - $this->info['URI'] = new HTMLPurifier_AttrDef_URI(); - $this->info['LanguageCode'] = new HTMLPurifier_AttrDef_Lang(); - $this->info['Color'] = new HTMLPurifier_AttrDef_HTML_Color(); - - // unimplemented aliases - $this->info['ContentType'] = new HTMLPurifier_AttrDef_Text(); - $this->info['ContentTypes'] = new HTMLPurifier_AttrDef_Text(); - $this->info['Charsets'] = new HTMLPurifier_AttrDef_Text(); - $this->info['Character'] = new HTMLPurifier_AttrDef_Text(); - - // "proprietary" types - $this->info['Class'] = new HTMLPurifier_AttrDef_HTML_Class(); - - // number is really a positive integer (one or more digits) - // FIXME: ^^ not always, see start and value of list items - $this->info['Number'] = new HTMLPurifier_AttrDef_Integer(false, false, true); - } - - /** - * Retrieves a type - * @param $type String type name - * @return Object AttrDef for type - */ - public function get($type) { - - // determine if there is any extra info tacked on - if (strpos($type, '#') !== false) list($type, $string) = explode('#', $type, 2); - else $string = ''; - - if (!isset($this->info[$type])) { - trigger_error('Cannot retrieve undefined attribute type ' . $type, E_USER_ERROR); - return; - } - - return $this->info[$type]->make($string); - - } - - /** - * Sets a new implementation for a type - * @param $type String type name - * @param $impl Object AttrDef for type - */ - public function set($type, $impl) { - $this->info[$type] = $impl; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/AttrValidator.php b/extlib/HTMLPurifier/HTMLPurifier/AttrValidator.php deleted file mode 100644 index 829a0f8f2..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/AttrValidator.php +++ /dev/null @@ -1,162 +0,0 @@ -getHTMLDefinition(); - $e =& $context->get('ErrorCollector', true); - - // initialize IDAccumulator if necessary - $ok =& $context->get('IDAccumulator', true); - if (!$ok) { - $id_accumulator = HTMLPurifier_IDAccumulator::build($config, $context); - $context->register('IDAccumulator', $id_accumulator); - } - - // initialize CurrentToken if necessary - $current_token =& $context->get('CurrentToken', true); - if (!$current_token) $context->register('CurrentToken', $token); - - if ( - !$token instanceof HTMLPurifier_Token_Start && - !$token instanceof HTMLPurifier_Token_Empty - ) return $token; - - // create alias to global definition array, see also $defs - // DEFINITION CALL - $d_defs = $definition->info_global_attr; - - // don't update token until the very end, to ensure an atomic update - $attr = $token->attr; - - // do global transformations (pre) - // nothing currently utilizes this - foreach ($definition->info_attr_transform_pre as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e) { - if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - } - - // do local transformations only applicable to this element (pre) - // ex.

to

- foreach ($definition->info[$token->name]->attr_transform_pre as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e) { - if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - } - - // create alias to this element's attribute definition array, see - // also $d_defs (global attribute definition array) - // DEFINITION CALL - $defs = $definition->info[$token->name]->attr; - - $attr_key = false; - $context->register('CurrentAttr', $attr_key); - - // iterate through all the attribute keypairs - // Watch out for name collisions: $key has previously been used - foreach ($attr as $attr_key => $value) { - - // call the definition - if ( isset($defs[$attr_key]) ) { - // there is a local definition defined - if ($defs[$attr_key] === false) { - // We've explicitly been told not to allow this element. - // This is usually when there's a global definition - // that must be overridden. - // Theoretically speaking, we could have a - // AttrDef_DenyAll, but this is faster! - $result = false; - } else { - // validate according to the element's definition - $result = $defs[$attr_key]->validate( - $value, $config, $context - ); - } - } elseif ( isset($d_defs[$attr_key]) ) { - // there is a global definition defined, validate according - // to the global definition - $result = $d_defs[$attr_key]->validate( - $value, $config, $context - ); - } else { - // system never heard of the attribute? DELETE! - $result = false; - } - - // put the results into effect - if ($result === false || $result === null) { - // this is a generic error message that should replaced - // with more specific ones when possible - if ($e) $e->send(E_ERROR, 'AttrValidator: Attribute removed'); - - // remove the attribute - unset($attr[$attr_key]); - } elseif (is_string($result)) { - // generally, if a substitution is happening, there - // was some sort of implicit correction going on. We'll - // delegate it to the attribute classes to say exactly what. - - // simple substitution - $attr[$attr_key] = $result; - } else { - // nothing happens - } - - // we'd also want slightly more complicated substitution - // involving an array as the return value, - // although we're not sure how colliding attributes would - // resolve (certain ones would be completely overriden, - // others would prepend themselves). - } - - $context->destroy('CurrentAttr'); - - // post transforms - - // global (error reporting untested) - foreach ($definition->info_attr_transform_post as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e) { - if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - } - - // local (error reporting untested) - foreach ($definition->info[$token->name]->attr_transform_post as $transform) { - $attr = $transform->transform($o = $attr, $config, $context); - if ($e) { - if ($attr != $o) $e->send(E_NOTICE, 'AttrValidator: Attributes transformed', $o, $attr); - } - } - - $token->attr = $attr; - - // destroy CurrentToken if we made it ourselves - if (!$current_token) $context->destroy('CurrentToken'); - - } - - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Bootstrap.php b/extlib/HTMLPurifier/HTMLPurifier/Bootstrap.php deleted file mode 100644 index 559f61a23..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Bootstrap.php +++ /dev/null @@ -1,98 +0,0 @@ - -if (!defined('PHP_EOL')) { - switch (strtoupper(substr(PHP_OS, 0, 3))) { - case 'WIN': - define('PHP_EOL', "\r\n"); - break; - case 'DAR': - define('PHP_EOL', "\r"); - break; - default: - define('PHP_EOL', "\n"); - } -} - -/** - * Bootstrap class that contains meta-functionality for HTML Purifier such as - * the autoload function. - * - * @note - * This class may be used without any other files from HTML Purifier. - */ -class HTMLPurifier_Bootstrap -{ - - /** - * Autoload function for HTML Purifier - * @param $class Class to load - */ - public static function autoload($class) { - $file = HTMLPurifier_Bootstrap::getPath($class); - if (!$file) return false; - require HTMLPURIFIER_PREFIX . '/' . $file; - return true; - } - - /** - * Returns the path for a specific class. - */ - public static function getPath($class) { - if (strncmp('HTMLPurifier', $class, 12) !== 0) return false; - // Custom implementations - if (strncmp('HTMLPurifier_Language_', $class, 22) === 0) { - $code = str_replace('_', '-', substr($class, 22)); - $file = 'HTMLPurifier/Language/classes/' . $code . '.php'; - } else { - $file = str_replace('_', '/', $class) . '.php'; - } - if (!file_exists(HTMLPURIFIER_PREFIX . '/' . $file)) return false; - return $file; - } - - /** - * "Pre-registers" our autoloader on the SPL stack. - */ - public static function registerAutoload() { - $autoload = array('HTMLPurifier_Bootstrap', 'autoload'); - if ( ($funcs = spl_autoload_functions()) === false ) { - spl_autoload_register($autoload); - } elseif (function_exists('spl_autoload_unregister')) { - $compat = version_compare(PHP_VERSION, '5.1.2', '<=') && - version_compare(PHP_VERSION, '5.1.0', '>='); - foreach ($funcs as $func) { - if (is_array($func)) { - // :TRICKY: There are some compatibility issues and some - // places where we need to error out - $reflector = new ReflectionMethod($func[0], $func[1]); - if (!$reflector->isStatic()) { - throw new Exception(' - HTML Purifier autoloader registrar is not compatible - with non-static object methods due to PHP Bug #44144; - Please do not use HTMLPurifier.autoload.php (or any - file that includes this file); instead, place the code: - spl_autoload_register(array(\'HTMLPurifier_Bootstrap\', \'autoload\')) - after your own autoloaders. - '); - } - // Suprisingly, spl_autoload_register supports the - // Class::staticMethod callback format, although call_user_func doesn't - if ($compat) $func = implode('::', $func); - } - spl_autoload_unregister($func); - } - spl_autoload_register($autoload); - foreach ($funcs as $func) spl_autoload_register($func); - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/CSSDefinition.php b/extlib/HTMLPurifier/HTMLPurifier/CSSDefinition.php deleted file mode 100644 index 6a2e6f56d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/CSSDefinition.php +++ /dev/null @@ -1,292 +0,0 @@ -info['text-align'] = new HTMLPurifier_AttrDef_Enum( - array('left', 'right', 'center', 'justify'), false); - - $border_style = - $this->info['border-bottom-style'] = - $this->info['border-right-style'] = - $this->info['border-left-style'] = - $this->info['border-top-style'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'hidden', 'dotted', 'dashed', 'solid', 'double', - 'groove', 'ridge', 'inset', 'outset'), false); - - $this->info['border-style'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_style); - - $this->info['clear'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'left', 'right', 'both'), false); - $this->info['float'] = new HTMLPurifier_AttrDef_Enum( - array('none', 'left', 'right'), false); - $this->info['font-style'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'italic', 'oblique'), false); - $this->info['font-variant'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'small-caps'), false); - - $uri_or_none = new HTMLPurifier_AttrDef_CSS_Composite( - array( - new HTMLPurifier_AttrDef_Enum(array('none')), - new HTMLPurifier_AttrDef_CSS_URI() - ) - ); - - $this->info['list-style-position'] = new HTMLPurifier_AttrDef_Enum( - array('inside', 'outside'), false); - $this->info['list-style-type'] = new HTMLPurifier_AttrDef_Enum( - array('disc', 'circle', 'square', 'decimal', 'lower-roman', - 'upper-roman', 'lower-alpha', 'upper-alpha', 'none'), false); - $this->info['list-style-image'] = $uri_or_none; - - $this->info['list-style'] = new HTMLPurifier_AttrDef_CSS_ListStyle($config); - - $this->info['text-transform'] = new HTMLPurifier_AttrDef_Enum( - array('capitalize', 'uppercase', 'lowercase', 'none'), false); - $this->info['color'] = new HTMLPurifier_AttrDef_CSS_Color(); - - $this->info['background-image'] = $uri_or_none; - $this->info['background-repeat'] = new HTMLPurifier_AttrDef_Enum( - array('repeat', 'repeat-x', 'repeat-y', 'no-repeat') - ); - $this->info['background-attachment'] = new HTMLPurifier_AttrDef_Enum( - array('scroll', 'fixed') - ); - $this->info['background-position'] = new HTMLPurifier_AttrDef_CSS_BackgroundPosition(); - - $border_color = - $this->info['border-top-color'] = - $this->info['border-bottom-color'] = - $this->info['border-left-color'] = - $this->info['border-right-color'] = - $this->info['background-color'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('transparent')), - new HTMLPurifier_AttrDef_CSS_Color() - )); - - $this->info['background'] = new HTMLPurifier_AttrDef_CSS_Background($config); - - $this->info['border-color'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_color); - - $border_width = - $this->info['border-top-width'] = - $this->info['border-bottom-width'] = - $this->info['border-left-width'] = - $this->info['border-right-width'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('thin', 'medium', 'thick')), - new HTMLPurifier_AttrDef_CSS_Length('0') //disallow negative - )); - - $this->info['border-width'] = new HTMLPurifier_AttrDef_CSS_Multiple($border_width); - - $this->info['letter-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Length() - )); - - $this->info['word-spacing'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Length() - )); - - $this->info['font-size'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('xx-small', 'x-small', - 'small', 'medium', 'large', 'x-large', 'xx-large', - 'larger', 'smaller')), - new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_CSS_Length() - )); - - $this->info['line-height'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('normal')), - new HTMLPurifier_AttrDef_CSS_Number(true), // no negatives - new HTMLPurifier_AttrDef_CSS_Length('0'), - new HTMLPurifier_AttrDef_CSS_Percentage(true) - )); - - $margin = - $this->info['margin-top'] = - $this->info['margin-bottom'] = - $this->info['margin-left'] = - $this->info['margin-right'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage(), - new HTMLPurifier_AttrDef_Enum(array('auto')) - )); - - $this->info['margin'] = new HTMLPurifier_AttrDef_CSS_Multiple($margin); - - // non-negative - $padding = - $this->info['padding-top'] = - $this->info['padding-bottom'] = - $this->info['padding-left'] = - $this->info['padding-right'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length('0'), - new HTMLPurifier_AttrDef_CSS_Percentage(true) - )); - - $this->info['padding'] = new HTMLPurifier_AttrDef_CSS_Multiple($padding); - - $this->info['text-indent'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage() - )); - - $trusted_wh = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length('0'), - new HTMLPurifier_AttrDef_CSS_Percentage(true), - new HTMLPurifier_AttrDef_Enum(array('auto')) - )); - $max = $config->get('CSS.MaxImgLength'); - - $this->info['width'] = - $this->info['height'] = - $max === null ? - $trusted_wh : - new HTMLPurifier_AttrDef_Switch('img', - // For img tags: - new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_CSS_Length('0', $max), - new HTMLPurifier_AttrDef_Enum(array('auto')) - )), - // For everyone else: - $trusted_wh - ); - - $this->info['text-decoration'] = new HTMLPurifier_AttrDef_CSS_TextDecoration(); - - $this->info['font-family'] = new HTMLPurifier_AttrDef_CSS_FontFamily(); - - // this could use specialized code - $this->info['font-weight'] = new HTMLPurifier_AttrDef_Enum( - array('normal', 'bold', 'bolder', 'lighter', '100', '200', '300', - '400', '500', '600', '700', '800', '900'), false); - - // MUST be called after other font properties, as it references - // a CSSDefinition object - $this->info['font'] = new HTMLPurifier_AttrDef_CSS_Font($config); - - // same here - $this->info['border'] = - $this->info['border-bottom'] = - $this->info['border-top'] = - $this->info['border-left'] = - $this->info['border-right'] = new HTMLPurifier_AttrDef_CSS_Border($config); - - $this->info['border-collapse'] = new HTMLPurifier_AttrDef_Enum(array( - 'collapse', 'separate')); - - $this->info['caption-side'] = new HTMLPurifier_AttrDef_Enum(array( - 'top', 'bottom')); - - $this->info['table-layout'] = new HTMLPurifier_AttrDef_Enum(array( - 'auto', 'fixed')); - - $this->info['vertical-align'] = new HTMLPurifier_AttrDef_CSS_Composite(array( - new HTMLPurifier_AttrDef_Enum(array('baseline', 'sub', 'super', - 'top', 'text-top', 'middle', 'bottom', 'text-bottom')), - new HTMLPurifier_AttrDef_CSS_Length(), - new HTMLPurifier_AttrDef_CSS_Percentage() - )); - - $this->info['border-spacing'] = new HTMLPurifier_AttrDef_CSS_Multiple(new HTMLPurifier_AttrDef_CSS_Length(), 2); - - // partial support - $this->info['white-space'] = new HTMLPurifier_AttrDef_Enum(array('nowrap')); - - if ($config->get('CSS.Proprietary')) { - $this->doSetupProprietary($config); - } - - if ($config->get('CSS.AllowTricky')) { - $this->doSetupTricky($config); - } - - $allow_important = $config->get('CSS.AllowImportant'); - // wrap all attr-defs with decorator that handles !important - foreach ($this->info as $k => $v) { - $this->info[$k] = new HTMLPurifier_AttrDef_CSS_ImportantDecorator($v, $allow_important); - } - - $this->setupConfigStuff($config); - } - - protected function doSetupProprietary($config) { - // Internet Explorer only scrollbar colors - $this->info['scrollbar-arrow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-base-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-darkshadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-face-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-highlight-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - $this->info['scrollbar-shadow-color'] = new HTMLPurifier_AttrDef_CSS_Color(); - - // technically not proprietary, but CSS3, and no one supports it - $this->info['opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - $this->info['-moz-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - $this->info['-khtml-opacity'] = new HTMLPurifier_AttrDef_CSS_AlphaValue(); - - // only opacity, for now - $this->info['filter'] = new HTMLPurifier_AttrDef_CSS_Filter(); - - } - - protected function doSetupTricky($config) { - $this->info['display'] = new HTMLPurifier_AttrDef_Enum(array( - 'inline', 'block', 'list-item', 'run-in', 'compact', - 'marker', 'table', 'inline-table', 'table-row-group', - 'table-header-group', 'table-footer-group', 'table-row', - 'table-column-group', 'table-column', 'table-cell', 'table-caption', 'none' - )); - $this->info['visibility'] = new HTMLPurifier_AttrDef_Enum(array( - 'visible', 'hidden', 'collapse' - )); - $this->info['overflow'] = new HTMLPurifier_AttrDef_Enum(array('visible', 'hidden', 'auto', 'scroll')); - } - - - /** - * Performs extra config-based processing. Based off of - * HTMLPurifier_HTMLDefinition. - * @todo Refactor duplicate elements into common class (probably using - * composition, not inheritance). - */ - protected function setupConfigStuff($config) { - - // setup allowed elements - $support = "(for information on implementing this, see the ". - "support forums) "; - $allowed_attributes = $config->get('CSS.AllowedProperties'); - if ($allowed_attributes !== null) { - foreach ($this->info as $name => $d) { - if(!isset($allowed_attributes[$name])) unset($this->info[$name]); - unset($allowed_attributes[$name]); - } - // emit errors - foreach ($allowed_attributes as $name => $d) { - // :TODO: Is this htmlspecialchars() call really necessary? - $name = htmlspecialchars($name); - trigger_error("Style attribute '$name' is not supported $support", E_USER_WARNING); - } - } - - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ChildDef.php b/extlib/HTMLPurifier/HTMLPurifier/ChildDef.php deleted file mode 100644 index c5d5216da..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ChildDef.php +++ /dev/null @@ -1,48 +0,0 @@ -elements; - } - - /** - * Validates nodes according to definition and returns modification. - * - * @param $tokens_of_children Array of HTMLPurifier_Token - * @param $config HTMLPurifier_Config object - * @param $context HTMLPurifier_Context object - * @return bool true to leave nodes as is - * @return bool false to remove parent node - * @return array of replacement child tokens - */ - abstract public function validateChildren($tokens_of_children, $config, $context); -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php b/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php deleted file mode 100644 index 15c364ee3..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Chameleon.php +++ /dev/null @@ -1,48 +0,0 @@ -inline = new HTMLPurifier_ChildDef_Optional($inline); - $this->block = new HTMLPurifier_ChildDef_Optional($block); - $this->elements = $this->block->elements; - } - - public function validateChildren($tokens_of_children, $config, $context) { - if ($context->get('IsInline') === false) { - return $this->block->validateChildren( - $tokens_of_children, $config, $context); - } else { - return $this->inline->validateChildren( - $tokens_of_children, $config, $context); - } - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php b/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php deleted file mode 100644 index b68047b4b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Custom.php +++ /dev/null @@ -1,90 +0,0 @@ -dtd_regex = $dtd_regex; - $this->_compileRegex(); - } - /** - * Compiles the PCRE regex from a DTD regex ($dtd_regex to $_pcre_regex) - */ - protected function _compileRegex() { - $raw = str_replace(' ', '', $this->dtd_regex); - if ($raw{0} != '(') { - $raw = "($raw)"; - } - $el = '[#a-zA-Z0-9_.-]+'; - $reg = $raw; - - // COMPLICATED! AND MIGHT BE BUGGY! I HAVE NO CLUE WHAT I'M - // DOING! Seriously: if there's problems, please report them. - - // collect all elements into the $elements array - preg_match_all("/$el/", $reg, $matches); - foreach ($matches[0] as $match) { - $this->elements[$match] = true; - } - - // setup all elements as parentheticals with leading commas - $reg = preg_replace("/$el/", '(,\\0)', $reg); - - // remove commas when they were not solicited - $reg = preg_replace("/([^,(|]\(+),/", '\\1', $reg); - - // remove all non-paranthetical commas: they are handled by first regex - $reg = preg_replace("/,\(/", '(', $reg); - - $this->_pcre_regex = $reg; - } - public function validateChildren($tokens_of_children, $config, $context) { - $list_of_children = ''; - $nesting = 0; // depth into the nest - foreach ($tokens_of_children as $token) { - if (!empty($token->is_whitespace)) continue; - - $is_child = ($nesting == 0); // direct - - if ($token instanceof HTMLPurifier_Token_Start) { - $nesting++; - } elseif ($token instanceof HTMLPurifier_Token_End) { - $nesting--; - } - - if ($is_child) { - $list_of_children .= $token->name . ','; - } - } - // add leading comma to deal with stray comma declarations - $list_of_children = ',' . rtrim($list_of_children, ','); - $okay = - preg_match( - '/^,?'.$this->_pcre_regex.'$/', - $list_of_children - ); - - return (bool) $okay; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php b/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php deleted file mode 100644 index 13171f665..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Empty.php +++ /dev/null @@ -1,20 +0,0 @@ -whitespace) return $tokens_of_children; - else return array(); - } - return $result; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Required.php b/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Required.php deleted file mode 100644 index 4889f249b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Required.php +++ /dev/null @@ -1,117 +0,0 @@ - $x) { - $elements[$i] = true; - if (empty($i)) unset($elements[$i]); // remove blank - } - } - $this->elements = $elements; - } - public $allow_empty = false; - public $type = 'required'; - public function validateChildren($tokens_of_children, $config, $context) { - // Flag for subclasses - $this->whitespace = false; - - // if there are no tokens, delete parent node - if (empty($tokens_of_children)) return false; - - // the new set of children - $result = array(); - - // current depth into the nest - $nesting = 0; - - // whether or not we're deleting a node - $is_deleting = false; - - // whether or not parsed character data is allowed - // this controls whether or not we silently drop a tag - // or generate escaped HTML from it - $pcdata_allowed = isset($this->elements['#PCDATA']); - - // a little sanity check to make sure it's not ALL whitespace - $all_whitespace = true; - - // some configuration - $escape_invalid_children = $config->get('Core.EscapeInvalidChildren'); - - // generator - $gen = new HTMLPurifier_Generator($config, $context); - - foreach ($tokens_of_children as $token) { - if (!empty($token->is_whitespace)) { - $result[] = $token; - continue; - } - $all_whitespace = false; // phew, we're not talking about whitespace - - $is_child = ($nesting == 0); - - if ($token instanceof HTMLPurifier_Token_Start) { - $nesting++; - } elseif ($token instanceof HTMLPurifier_Token_End) { - $nesting--; - } - - if ($is_child) { - $is_deleting = false; - if (!isset($this->elements[$token->name])) { - $is_deleting = true; - if ($pcdata_allowed && $token instanceof HTMLPurifier_Token_Text) { - $result[] = $token; - } elseif ($pcdata_allowed && $escape_invalid_children) { - $result[] = new HTMLPurifier_Token_Text( - $gen->generateFromToken($token) - ); - } - continue; - } - } - if (!$is_deleting || ($pcdata_allowed && $token instanceof HTMLPurifier_Token_Text)) { - $result[] = $token; - } elseif ($pcdata_allowed && $escape_invalid_children) { - $result[] = - new HTMLPurifier_Token_Text( - $gen->generateFromToken($token) - ); - } else { - // drop silently - } - } - if (empty($result)) return false; - if ($all_whitespace) { - $this->whitespace = true; - return false; - } - if ($tokens_of_children == $result) return true; - return $result; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php b/extlib/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php deleted file mode 100644 index dfae8a6e5..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/StrictBlockquote.php +++ /dev/null @@ -1,88 +0,0 @@ -init($config); - return $this->fake_elements; - } - - public function validateChildren($tokens_of_children, $config, $context) { - - $this->init($config); - - // trick the parent class into thinking it allows more - $this->elements = $this->fake_elements; - $result = parent::validateChildren($tokens_of_children, $config, $context); - $this->elements = $this->real_elements; - - if ($result === false) return array(); - if ($result === true) $result = $tokens_of_children; - - $def = $config->getHTMLDefinition(); - $block_wrap_start = new HTMLPurifier_Token_Start($def->info_block_wrapper); - $block_wrap_end = new HTMLPurifier_Token_End( $def->info_block_wrapper); - $is_inline = false; - $depth = 0; - $ret = array(); - - // assuming that there are no comment tokens - foreach ($result as $i => $token) { - $token = $result[$i]; - // ifs are nested for readability - if (!$is_inline) { - if (!$depth) { - if ( - ($token instanceof HTMLPurifier_Token_Text && !$token->is_whitespace) || - (!$token instanceof HTMLPurifier_Token_Text && !isset($this->elements[$token->name])) - ) { - $is_inline = true; - $ret[] = $block_wrap_start; - } - } - } else { - if (!$depth) { - // starting tokens have been inline text / empty - if ($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) { - if (isset($this->elements[$token->name])) { - // ended - $ret[] = $block_wrap_end; - $is_inline = false; - } - } - } - } - $ret[] = $token; - if ($token instanceof HTMLPurifier_Token_Start) $depth++; - if ($token instanceof HTMLPurifier_Token_End) $depth--; - } - if ($is_inline) $ret[] = $block_wrap_end; - return $ret; - } - - private function init($config) { - if (!$this->init) { - $def = $config->getHTMLDefinition(); - // allow all inline elements - $this->real_elements = $this->elements; - $this->fake_elements = $def->info_content_sets['Flow']; - $this->fake_elements['#PCDATA'] = true; - $this->init = true; - } - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Table.php b/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Table.php deleted file mode 100644 index 34f0227dd..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ChildDef/Table.php +++ /dev/null @@ -1,142 +0,0 @@ - true, 'tbody' => true, 'thead' => true, - 'tfoot' => true, 'caption' => true, 'colgroup' => true, 'col' => true); - public function __construct() {} - public function validateChildren($tokens_of_children, $config, $context) { - if (empty($tokens_of_children)) return false; - - // this ensures that the loop gets run one last time before closing - // up. It's a little bit of a hack, but it works! Just make sure you - // get rid of the token later. - $tokens_of_children[] = false; - - // only one of these elements is allowed in a table - $caption = false; - $thead = false; - $tfoot = false; - - // as many of these as you want - $cols = array(); - $content = array(); - - $nesting = 0; // current depth so we can determine nodes - $is_collecting = false; // are we globbing together tokens to package - // into one of the collectors? - $collection = array(); // collected nodes - $tag_index = 0; // the first node might be whitespace, - // so this tells us where the start tag is - - foreach ($tokens_of_children as $token) { - $is_child = ($nesting == 0); - - if ($token === false) { - // terminating sequence started - } elseif ($token instanceof HTMLPurifier_Token_Start) { - $nesting++; - } elseif ($token instanceof HTMLPurifier_Token_End) { - $nesting--; - } - - // handle node collection - if ($is_collecting) { - if ($is_child) { - // okay, let's stash the tokens away - // first token tells us the type of the collection - switch ($collection[$tag_index]->name) { - case 'tr': - case 'tbody': - $content[] = $collection; - break; - case 'caption': - if ($caption !== false) break; - $caption = $collection; - break; - case 'thead': - case 'tfoot': - // access the appropriate variable, $thead or $tfoot - $var = $collection[$tag_index]->name; - if ($$var === false) { - $$var = $collection; - } else { - // transmutate the first and less entries into - // tbody tags, and then put into content - $collection[$tag_index]->name = 'tbody'; - $collection[count($collection)-1]->name = 'tbody'; - $content[] = $collection; - } - break; - case 'colgroup': - $cols[] = $collection; - break; - } - $collection = array(); - $is_collecting = false; - $tag_index = 0; - } else { - // add the node to the collection - $collection[] = $token; - } - } - - // terminate - if ($token === false) break; - - if ($is_child) { - // determine what we're dealing with - if ($token->name == 'col') { - // the only empty tag in the possie, we can handle it - // immediately - $cols[] = array_merge($collection, array($token)); - $collection = array(); - $tag_index = 0; - continue; - } - switch($token->name) { - case 'caption': - case 'colgroup': - case 'thead': - case 'tfoot': - case 'tbody': - case 'tr': - $is_collecting = true; - $collection[] = $token; - continue; - default: - if (!empty($token->is_whitespace)) { - $collection[] = $token; - $tag_index++; - } - continue; - } - } - } - - if (empty($content)) return false; - - $ret = array(); - if ($caption !== false) $ret = array_merge($ret, $caption); - if ($cols !== false) foreach ($cols as $token_array) $ret = array_merge($ret, $token_array); - if ($thead !== false) $ret = array_merge($ret, $thead); - if ($tfoot !== false) $ret = array_merge($ret, $tfoot); - foreach ($content as $token_array) $ret = array_merge($ret, $token_array); - if (!empty($collection) && $is_collecting == false){ - // grab the trailing space - $ret = array_merge($ret, $collection); - } - - array_pop($tokens_of_children); // remove phantom token - - return ($ret === $tokens_of_children) ? true : $ret; - - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Config.php b/extlib/HTMLPurifier/HTMLPurifier/Config.php deleted file mode 100644 index a01706043..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Config.php +++ /dev/null @@ -1,580 +0,0 @@ -defaultPlist; - $this->plist = new HTMLPurifier_PropertyList($parent); - $this->def = $definition; // keep a copy around for checking - $this->parser = new HTMLPurifier_VarParser_Flexible(); - } - - /** - * Convenience constructor that creates a config object based on a mixed var - * @param mixed $config Variable that defines the state of the config - * object. Can be: a HTMLPurifier_Config() object, - * an array of directives based on loadArray(), - * or a string filename of an ini file. - * @param HTMLPurifier_ConfigSchema Schema object - * @return Configured HTMLPurifier_Config object - */ - public static function create($config, $schema = null) { - if ($config instanceof HTMLPurifier_Config) { - // pass-through - return $config; - } - if (!$schema) { - $ret = HTMLPurifier_Config::createDefault(); - } else { - $ret = new HTMLPurifier_Config($schema); - } - if (is_string($config)) $ret->loadIni($config); - elseif (is_array($config)) $ret->loadArray($config); - return $ret; - } - - /** - * Creates a new config object that inherits from a previous one. - * @param HTMLPurifier_Config $config Configuration object to inherit - * from. - * @return HTMLPurifier_Config object with $config as its parent. - */ - public static function inherit(HTMLPurifier_Config $config) { - return new HTMLPurifier_Config($config->def, $config->plist); - } - - /** - * Convenience constructor that creates a default configuration object. - * @return Default HTMLPurifier_Config object. - */ - public static function createDefault() { - $definition = HTMLPurifier_ConfigSchema::instance(); - $config = new HTMLPurifier_Config($definition); - return $config; - } - - /** - * Retreives a value from the configuration. - * @param $key String key - */ - public function get($key, $a = null) { - if ($a !== null) { - $this->triggerError("Using deprecated API: use \$config->get('$key.$a') instead", E_USER_WARNING); - $key = "$key.$a"; - } - if (!$this->finalized) $this->autoFinalize(); - if (!isset($this->def->info[$key])) { - // can't add % due to SimpleTest bug - $this->triggerError('Cannot retrieve value of undefined directive ' . htmlspecialchars($key), - E_USER_WARNING); - return; - } - if (isset($this->def->info[$key]->isAlias)) { - $d = $this->def->info[$key]; - $this->triggerError('Cannot get value from aliased directive, use real name ' . $d->key, - E_USER_ERROR); - return; - } - if ($this->lock) { - list($ns) = explode('.', $key); - if ($ns !== $this->lock) { - $this->triggerError('Cannot get value of namespace ' . $ns . ' when lock for ' . $this->lock . ' is active, this probably indicates a Definition setup method is accessing directives that are not within its namespace', E_USER_ERROR); - return; - } - } - return $this->plist->get($key); - } - - /** - * Retreives an array of directives to values from a given namespace - * @param $namespace String namespace - */ - public function getBatch($namespace) { - if (!$this->finalized) $this->autoFinalize(); - $full = $this->getAll(); - if (!isset($full[$namespace])) { - $this->triggerError('Cannot retrieve undefined namespace ' . htmlspecialchars($namespace), - E_USER_WARNING); - return; - } - return $full[$namespace]; - } - - /** - * Returns a md5 signature of a segment of the configuration object - * that uniquely identifies that particular configuration - * @note Revision is handled specially and is removed from the batch - * before processing! - * @param $namespace Namespace to get serial for - */ - public function getBatchSerial($namespace) { - if (empty($this->serials[$namespace])) { - $batch = $this->getBatch($namespace); - unset($batch['DefinitionRev']); - $this->serials[$namespace] = md5(serialize($batch)); - } - return $this->serials[$namespace]; - } - - /** - * Returns a md5 signature for the entire configuration object - * that uniquely identifies that particular configuration - */ - public function getSerial() { - if (empty($this->serial)) { - $this->serial = md5(serialize($this->getAll())); - } - return $this->serial; - } - - /** - * Retrieves all directives, organized by namespace - * @warning This is a pretty inefficient function, avoid if you can - */ - public function getAll() { - if (!$this->finalized) $this->autoFinalize(); - $ret = array(); - foreach ($this->plist->squash() as $name => $value) { - list($ns, $key) = explode('.', $name, 2); - $ret[$ns][$key] = $value; - } - return $ret; - } - - /** - * Sets a value to configuration. - * @param $key String key - * @param $value Mixed value - */ - public function set($key, $value, $a = null) { - if (strpos($key, '.') === false) { - $namespace = $key; - $directive = $value; - $value = $a; - $key = "$key.$directive"; - $this->triggerError("Using deprecated API: use \$config->set('$key', ...) instead", E_USER_NOTICE); - } else { - list($namespace) = explode('.', $key); - } - if ($this->isFinalized('Cannot set directive after finalization')) return; - if (!isset($this->def->info[$key])) { - $this->triggerError('Cannot set undefined directive ' . htmlspecialchars($key) . ' to value', - E_USER_WARNING); - return; - } - $def = $this->def->info[$key]; - - if (isset($def->isAlias)) { - if ($this->aliasMode) { - $this->triggerError('Double-aliases not allowed, please fix '. - 'ConfigSchema bug with' . $key, E_USER_ERROR); - return; - } - $this->aliasMode = true; - $this->set($def->key, $value); - $this->aliasMode = false; - $this->triggerError("$key is an alias, preferred directive name is {$def->key}", E_USER_NOTICE); - return; - } - - // Raw type might be negative when using the fully optimized form - // of stdclass, which indicates allow_null == true - $rtype = is_int($def) ? $def : $def->type; - if ($rtype < 0) { - $type = -$rtype; - $allow_null = true; - } else { - $type = $rtype; - $allow_null = isset($def->allow_null); - } - - try { - $value = $this->parser->parse($value, $type, $allow_null); - } catch (HTMLPurifier_VarParserException $e) { - $this->triggerError('Value for ' . $key . ' is of invalid type, should be ' . HTMLPurifier_VarParser::getTypeName($type), E_USER_WARNING); - return; - } - if (is_string($value) && is_object($def)) { - // resolve value alias if defined - if (isset($def->aliases[$value])) { - $value = $def->aliases[$value]; - } - // check to see if the value is allowed - if (isset($def->allowed) && !isset($def->allowed[$value])) { - $this->triggerError('Value not supported, valid values are: ' . - $this->_listify($def->allowed), E_USER_WARNING); - return; - } - } - $this->plist->set($key, $value); - - // reset definitions if the directives they depend on changed - // this is a very costly process, so it's discouraged - // with finalization - if ($namespace == 'HTML' || $namespace == 'CSS' || $namespace == 'URI') { - $this->definitions[$namespace] = null; - } - - $this->serials[$namespace] = false; - } - - /** - * Convenience function for error reporting - */ - private function _listify($lookup) { - $list = array(); - foreach ($lookup as $name => $b) $list[] = $name; - return implode(', ', $list); - } - - /** - * Retrieves object reference to the HTML definition. - * @param $raw Return a copy that has not been setup yet. Must be - * called before it's been setup, otherwise won't work. - */ - public function getHTMLDefinition($raw = false) { - return $this->getDefinition('HTML', $raw); - } - - /** - * Retrieves object reference to the CSS definition - * @param $raw Return a copy that has not been setup yet. Must be - * called before it's been setup, otherwise won't work. - */ - public function getCSSDefinition($raw = false) { - return $this->getDefinition('CSS', $raw); - } - - /** - * Retrieves a definition - * @param $type Type of definition: HTML, CSS, etc - * @param $raw Whether or not definition should be returned raw - */ - public function getDefinition($type, $raw = false) { - if (!$this->finalized) $this->autoFinalize(); - // temporarily suspend locks, so we can handle recursive definition calls - $lock = $this->lock; - $this->lock = null; - $factory = HTMLPurifier_DefinitionCacheFactory::instance(); - $cache = $factory->create($type, $this); - $this->lock = $lock; - if (!$raw) { - // see if we can quickly supply a definition - if (!empty($this->definitions[$type])) { - if (!$this->definitions[$type]->setup) { - $this->definitions[$type]->setup($this); - $cache->set($this->definitions[$type], $this); - } - return $this->definitions[$type]; - } - // memory check missed, try cache - $this->definitions[$type] = $cache->get($this); - if ($this->definitions[$type]) { - // definition in cache, return it - return $this->definitions[$type]; - } - } elseif ( - !empty($this->definitions[$type]) && - !$this->definitions[$type]->setup - ) { - // raw requested, raw in memory, quick return - return $this->definitions[$type]; - } - // quick checks failed, let's create the object - if ($type == 'HTML') { - $this->definitions[$type] = new HTMLPurifier_HTMLDefinition(); - } elseif ($type == 'CSS') { - $this->definitions[$type] = new HTMLPurifier_CSSDefinition(); - } elseif ($type == 'URI') { - $this->definitions[$type] = new HTMLPurifier_URIDefinition(); - } else { - throw new HTMLPurifier_Exception("Definition of $type type not supported"); - } - // quick abort if raw - if ($raw) { - if (is_null($this->get($type . '.DefinitionID'))) { - // fatally error out if definition ID not set - throw new HTMLPurifier_Exception("Cannot retrieve raw version without specifying %$type.DefinitionID"); - } - return $this->definitions[$type]; - } - // set it up - $this->lock = $type; - $this->definitions[$type]->setup($this); - $this->lock = null; - // save in cache - $cache->set($this->definitions[$type], $this); - return $this->definitions[$type]; - } - - /** - * Loads configuration values from an array with the following structure: - * Namespace.Directive => Value - * @param $config_array Configuration associative array - */ - public function loadArray($config_array) { - if ($this->isFinalized('Cannot load directives after finalization')) return; - foreach ($config_array as $key => $value) { - $key = str_replace('_', '.', $key); - if (strpos($key, '.') !== false) { - $this->set($key, $value); - } else { - $namespace = $key; - $namespace_values = $value; - foreach ($namespace_values as $directive => $value) { - $this->set($namespace .'.'. $directive, $value); - } - } - } - } - - /** - * Returns a list of array(namespace, directive) for all directives - * that are allowed in a web-form context as per an allowed - * namespaces/directives list. - * @param $allowed List of allowed namespaces/directives - */ - public static function getAllowedDirectivesForForm($allowed, $schema = null) { - if (!$schema) { - $schema = HTMLPurifier_ConfigSchema::instance(); - } - if ($allowed !== true) { - if (is_string($allowed)) $allowed = array($allowed); - $allowed_ns = array(); - $allowed_directives = array(); - $blacklisted_directives = array(); - foreach ($allowed as $ns_or_directive) { - if (strpos($ns_or_directive, '.') !== false) { - // directive - if ($ns_or_directive[0] == '-') { - $blacklisted_directives[substr($ns_or_directive, 1)] = true; - } else { - $allowed_directives[$ns_or_directive] = true; - } - } else { - // namespace - $allowed_ns[$ns_or_directive] = true; - } - } - } - $ret = array(); - foreach ($schema->info as $key => $def) { - list($ns, $directive) = explode('.', $key, 2); - if ($allowed !== true) { - if (isset($blacklisted_directives["$ns.$directive"])) continue; - if (!isset($allowed_directives["$ns.$directive"]) && !isset($allowed_ns[$ns])) continue; - } - if (isset($def->isAlias)) continue; - if ($directive == 'DefinitionID' || $directive == 'DefinitionRev') continue; - $ret[] = array($ns, $directive); - } - return $ret; - } - - /** - * Loads configuration values from $_GET/$_POST that were posted - * via ConfigForm - * @param $array $_GET or $_POST array to import - * @param $index Index/name that the config variables are in - * @param $allowed List of allowed namespaces/directives - * @param $mq_fix Boolean whether or not to enable magic quotes fix - * @param $schema Instance of HTMLPurifier_ConfigSchema to use, if not global copy - */ - public static function loadArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) { - $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $schema); - $config = HTMLPurifier_Config::create($ret, $schema); - return $config; - } - - /** - * Merges in configuration values from $_GET/$_POST to object. NOT STATIC. - * @note Same parameters as loadArrayFromForm - */ - public function mergeArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true) { - $ret = HTMLPurifier_Config::prepareArrayFromForm($array, $index, $allowed, $mq_fix, $this->def); - $this->loadArray($ret); - } - - /** - * Prepares an array from a form into something usable for the more - * strict parts of HTMLPurifier_Config - */ - public static function prepareArrayFromForm($array, $index = false, $allowed = true, $mq_fix = true, $schema = null) { - if ($index !== false) $array = (isset($array[$index]) && is_array($array[$index])) ? $array[$index] : array(); - $mq = $mq_fix && function_exists('get_magic_quotes_gpc') && get_magic_quotes_gpc(); - - $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $schema); - $ret = array(); - foreach ($allowed as $key) { - list($ns, $directive) = $key; - $skey = "$ns.$directive"; - if (!empty($array["Null_$skey"])) { - $ret[$ns][$directive] = null; - continue; - } - if (!isset($array[$skey])) continue; - $value = $mq ? stripslashes($array[$skey]) : $array[$skey]; - $ret[$ns][$directive] = $value; - } - return $ret; - } - - /** - * Loads configuration values from an ini file - * @param $filename Name of ini file - */ - public function loadIni($filename) { - if ($this->isFinalized('Cannot load directives after finalization')) return; - $array = parse_ini_file($filename, true); - $this->loadArray($array); - } - - /** - * Checks whether or not the configuration object is finalized. - * @param $error String error message, or false for no error - */ - public function isFinalized($error = false) { - if ($this->finalized && $error) { - $this->triggerError($error, E_USER_ERROR); - } - return $this->finalized; - } - - /** - * Finalizes configuration only if auto finalize is on and not - * already finalized - */ - public function autoFinalize() { - if ($this->autoFinalize) { - $this->finalize(); - } else { - $this->plist->squash(true); - } - } - - /** - * Finalizes a configuration object, prohibiting further change - */ - public function finalize() { - $this->finalized = true; - unset($this->parser); - } - - /** - * Produces a nicely formatted error message by supplying the - * stack frame information from two levels up and OUTSIDE of - * HTMLPurifier_Config. - */ - protected function triggerError($msg, $no) { - // determine previous stack frame - $backtrace = debug_backtrace(); - if ($this->chatty && isset($backtrace[1])) { - $frame = $backtrace[1]; - $extra = " on line {$frame['line']} in file {$frame['file']}"; - } else { - $extra = ''; - } - trigger_error($msg . $extra, $no); - } - - /** - * Returns a serialized form of the configuration object that can - * be reconstituted. - */ - public function serialize() { - $this->getDefinition('HTML'); - $this->getDefinition('CSS'); - $this->getDefinition('URI'); - return serialize($this); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema.php b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema.php deleted file mode 100644 index 67be5c71f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema.php +++ /dev/null @@ -1,158 +0,0 @@ - array( - * 'Directive' => new stdclass(), - * ) - * ) - * - * The stdclass may have the following properties: - * - * - If isAlias isn't set: - * - type: Integer type of directive, see HTMLPurifier_VarParser for definitions - * - allow_null: If set, this directive allows null values - * - aliases: If set, an associative array of value aliases to real values - * - allowed: If set, a lookup array of allowed (string) values - * - If isAlias is set: - * - namespace: Namespace this directive aliases to - * - name: Directive name this directive aliases to - * - * In certain degenerate cases, stdclass will actually be an integer. In - * that case, the value is equivalent to an stdclass with the type - * property set to the integer. If the integer is negative, type is - * equal to the absolute value of integer, and allow_null is true. - * - * This class is friendly with HTMLPurifier_Config. If you need introspection - * about the schema, you're better of using the ConfigSchema_Interchange, - * which uses more memory but has much richer information. - */ - public $info = array(); - - /** - * Application-wide singleton - */ - static protected $singleton; - - public function __construct() { - $this->defaultPlist = new HTMLPurifier_PropertyList(); - } - - /** - * Unserializes the default ConfigSchema. - */ - public static function makeFromSerial() { - return unserialize(file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema.ser')); - } - - /** - * Retrieves an instance of the application-wide configuration definition. - */ - public static function instance($prototype = null) { - if ($prototype !== null) { - HTMLPurifier_ConfigSchema::$singleton = $prototype; - } elseif (HTMLPurifier_ConfigSchema::$singleton === null || $prototype === true) { - HTMLPurifier_ConfigSchema::$singleton = HTMLPurifier_ConfigSchema::makeFromSerial(); - } - return HTMLPurifier_ConfigSchema::$singleton; - } - - /** - * Defines a directive for configuration - * @warning Will fail of directive's namespace is defined. - * @warning This method's signature is slightly different from the legacy - * define() static method! Beware! - * @param $namespace Namespace the directive is in - * @param $name Key of directive - * @param $default Default value of directive - * @param $type Allowed type of the directive. See - * HTMLPurifier_DirectiveDef::$type for allowed values - * @param $allow_null Whether or not to allow null values - */ - public function add($key, $default, $type, $allow_null) { - $obj = new stdclass(); - $obj->type = is_int($type) ? $type : HTMLPurifier_VarParser::$types[$type]; - if ($allow_null) $obj->allow_null = true; - $this->info[$key] = $obj; - $this->defaults[$key] = $default; - $this->defaultPlist->set($key, $default); - } - - /** - * Defines a directive value alias. - * - * Directive value aliases are convenient for developers because it lets - * them set a directive to several values and get the same result. - * @param $namespace Directive's namespace - * @param $name Name of Directive - * @param $aliases Hash of aliased values to the real alias - */ - public function addValueAliases($key, $aliases) { - if (!isset($this->info[$key]->aliases)) { - $this->info[$key]->aliases = array(); - } - foreach ($aliases as $alias => $real) { - $this->info[$key]->aliases[$alias] = $real; - } - } - - /** - * Defines a set of allowed values for a directive. - * @warning This is slightly different from the corresponding static - * method definition. - * @param $namespace Namespace of directive - * @param $name Name of directive - * @param $allowed Lookup array of allowed values - */ - public function addAllowedValues($key, $allowed) { - $this->info[$key]->allowed = $allowed; - } - - /** - * Defines a directive alias for backwards compatibility - * @param $namespace - * @param $name Directive that will be aliased - * @param $new_namespace - * @param $new_name Directive that the alias will be to - */ - public function addAlias($key, $new_key) { - $obj = new stdclass; - $obj->key = $new_key; - $obj->isAlias = true; - $this->info[$key] = $obj; - } - - /** - * Replaces any stdclass that only has the type property with type integer. - */ - public function postProcess() { - foreach ($this->info as $key => $v) { - if (count((array) $v) == 1) { - $this->info[$key] = $v->type; - } elseif (count((array) $v) == 2 && isset($v->allow_null)) { - $this->info[$key] = -$v->type; - } - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php deleted file mode 100644 index c05668a70..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/ConfigSchema.php +++ /dev/null @@ -1,44 +0,0 @@ -directives as $d) { - $schema->add( - $d->id->key, - $d->default, - $d->type, - $d->typeAllowsNull - ); - if ($d->allowed !== null) { - $schema->addAllowedValues( - $d->id->key, - $d->allowed - ); - } - foreach ($d->aliases as $alias) { - $schema->addAlias( - $alias->key, - $d->id->key - ); - } - if ($d->valueAliases !== null) { - $schema->addValueAliases( - $d->id->key, - $d->valueAliases - ); - } - } - $schema->postProcess(); - return $schema; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php deleted file mode 100644 index 244561a37..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Builder/Xml.php +++ /dev/null @@ -1,106 +0,0 @@ -startElement('div'); - - $purifier = HTMLPurifier::getInstance(); - $html = $purifier->purify($html); - $this->writeAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); - $this->writeRaw($html); - - $this->endElement(); // div - } - - protected function export($var) { - if ($var === array()) return 'array()'; - return var_export($var, true); - } - - public function build($interchange) { - // global access, only use as last resort - $this->interchange = $interchange; - - $this->setIndent(true); - $this->startDocument('1.0', 'UTF-8'); - $this->startElement('configdoc'); - $this->writeElement('title', $interchange->name); - - foreach ($interchange->directives as $directive) { - $this->buildDirective($directive); - } - - if ($this->namespace) $this->endElement(); // namespace - - $this->endElement(); // configdoc - $this->flush(); - } - - public function buildDirective($directive) { - - // Kludge, although I suppose having a notion of a "root namespace" - // certainly makes things look nicer when documentation is built. - // Depends on things being sorted. - if (!$this->namespace || $this->namespace !== $directive->id->getRootNamespace()) { - if ($this->namespace) $this->endElement(); // namespace - $this->namespace = $directive->id->getRootNamespace(); - $this->startElement('namespace'); - $this->writeAttribute('id', $this->namespace); - $this->writeElement('name', $this->namespace); - } - - $this->startElement('directive'); - $this->writeAttribute('id', $directive->id->toString()); - - $this->writeElement('name', $directive->id->getDirective()); - - $this->startElement('aliases'); - foreach ($directive->aliases as $alias) $this->writeElement('alias', $alias->toString()); - $this->endElement(); // aliases - - $this->startElement('constraints'); - if ($directive->version) $this->writeElement('version', $directive->version); - $this->startElement('type'); - if ($directive->typeAllowsNull) $this->writeAttribute('allow-null', 'yes'); - $this->text($directive->type); - $this->endElement(); // type - if ($directive->allowed) { - $this->startElement('allowed'); - foreach ($directive->allowed as $value => $x) $this->writeElement('value', $value); - $this->endElement(); // allowed - } - $this->writeElement('default', $this->export($directive->default)); - $this->writeAttribute('xml:space', 'preserve'); - if ($directive->external) { - $this->startElement('external'); - foreach ($directive->external as $project) $this->writeElement('project', $project); - $this->endElement(); - } - $this->endElement(); // constraints - - if ($directive->deprecatedVersion) { - $this->startElement('deprecated'); - $this->writeElement('version', $directive->deprecatedVersion); - $this->writeElement('use', $directive->deprecatedUse->toString()); - $this->endElement(); // deprecated - } - - $this->startElement('description'); - $this->writeHTMLDiv($directive->description); - $this->endElement(); // description - - $this->endElement(); // directive - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php deleted file mode 100644 index 2671516c5..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Exception.php +++ /dev/null @@ -1,11 +0,0 @@ - array(directive info) - */ - public $directives = array(); - - /** - * Adds a directive array to $directives - */ - public function addDirective($directive) { - if (isset($this->directives[$i = $directive->id->toString()])) { - throw new HTMLPurifier_ConfigSchema_Exception("Cannot redefine directive '$i'"); - } - $this->directives[$i] = $directive; - } - - /** - * Convenience function to perform standard validation. Throws exception - * on failed validation. - */ - public function validate() { - $validator = new HTMLPurifier_ConfigSchema_Validator(); - return $validator->validate($this); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php deleted file mode 100644 index ac8be0d97..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Directive.php +++ /dev/null @@ -1,77 +0,0 @@ - true). - * Null if all values are allowed. - */ - public $allowed; - - /** - * List of aliases for the directive, - * e.g. array(new HTMLPurifier_ConfigSchema_Interchange_Id('Ns', 'Dir'))). - */ - public $aliases = array(); - - /** - * Hash of value aliases, e.g. array('alt' => 'real'). Null if value - * aliasing is disabled (necessary for non-scalar types). - */ - public $valueAliases; - - /** - * Version of HTML Purifier the directive was introduced, e.g. '1.3.1'. - * Null if the directive has always existed. - */ - public $version; - - /** - * ID of directive that supercedes this old directive, is an instance - * of HTMLPurifier_ConfigSchema_Interchange_Id. Null if not deprecated. - */ - public $deprecatedUse; - - /** - * Version of HTML Purifier this directive was deprecated. Null if not - * deprecated. - */ - public $deprecatedVersion; - - /** - * List of external projects this directive depends on, e.g. array('CSSTidy'). - */ - public $external = array(); - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php deleted file mode 100644 index b9b3c6f5c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Interchange/Id.php +++ /dev/null @@ -1,37 +0,0 @@ -key = $key; - } - - /** - * @warning This is NOT magic, to ensure that people don't abuse SPL and - * cause problems for PHP 5.0 support. - */ - public function toString() { - return $this->key; - } - - public function getRootNamespace() { - return substr($this->key, 0, strpos($this->key, ".")); - } - - public function getDirective() { - return substr($this->key, strpos($this->key, ".") + 1); - } - - public static function make($id) { - return new HTMLPurifier_ConfigSchema_Interchange_Id($id); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php deleted file mode 100644 index 785b72ce8..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/InterchangeBuilder.php +++ /dev/null @@ -1,180 +0,0 @@ -varParser = $varParser ? $varParser : new HTMLPurifier_VarParser_Native(); - } - - public static function buildFromDirectory($dir = null) { - $builder = new HTMLPurifier_ConfigSchema_InterchangeBuilder(); - $interchange = new HTMLPurifier_ConfigSchema_Interchange(); - return $builder->buildDir($interchange, $dir); - } - - public function buildDir($interchange, $dir = null) { - if (!$dir) $dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier/ConfigSchema/schema'; - if (file_exists($dir . '/info.ini')) { - $info = parse_ini_file($dir . '/info.ini'); - $interchange->name = $info['name']; - } - - $files = array(); - $dh = opendir($dir); - while (false !== ($file = readdir($dh))) { - if (!$file || $file[0] == '.' || strrchr($file, '.') !== '.txt') { - continue; - } - $files[] = $file; - } - closedir($dh); - - sort($files); - foreach ($files as $file) { - $this->buildFile($interchange, $dir . '/' . $file); - } - - return $interchange; - } - - public function buildFile($interchange, $file) { - $parser = new HTMLPurifier_StringHashParser(); - $this->build( - $interchange, - new HTMLPurifier_StringHash( $parser->parseFile($file) ) - ); - } - - /** - * Builds an interchange object based on a hash. - * @param $interchange HTMLPurifier_ConfigSchema_Interchange object to build - * @param $hash HTMLPurifier_ConfigSchema_StringHash source data - */ - public function build($interchange, $hash) { - if (!$hash instanceof HTMLPurifier_StringHash) { - $hash = new HTMLPurifier_StringHash($hash); - } - if (!isset($hash['ID'])) { - throw new HTMLPurifier_ConfigSchema_Exception('Hash does not have any ID'); - } - if (strpos($hash['ID'], '.') === false) { - if (count($hash) == 2 && isset($hash['DESCRIPTION'])) { - $hash->offsetGet('DESCRIPTION'); // prevent complaining - } else { - throw new HTMLPurifier_ConfigSchema_Exception('All directives must have a namespace'); - } - } else { - $this->buildDirective($interchange, $hash); - } - $this->_findUnused($hash); - } - - public function buildDirective($interchange, $hash) { - $directive = new HTMLPurifier_ConfigSchema_Interchange_Directive(); - - // These are required elements: - $directive->id = $this->id($hash->offsetGet('ID')); - $id = $directive->id->toString(); // convenience - - if (isset($hash['TYPE'])) { - $type = explode('/', $hash->offsetGet('TYPE')); - if (isset($type[1])) $directive->typeAllowsNull = true; - $directive->type = $type[0]; - } else { - throw new HTMLPurifier_ConfigSchema_Exception("TYPE in directive hash '$id' not defined"); - } - - if (isset($hash['DEFAULT'])) { - try { - $directive->default = $this->varParser->parse($hash->offsetGet('DEFAULT'), $directive->type, $directive->typeAllowsNull); - } catch (HTMLPurifier_VarParserException $e) { - throw new HTMLPurifier_ConfigSchema_Exception($e->getMessage() . " in DEFAULT in directive hash '$id'"); - } - } - - if (isset($hash['DESCRIPTION'])) { - $directive->description = $hash->offsetGet('DESCRIPTION'); - } - - if (isset($hash['ALLOWED'])) { - $directive->allowed = $this->lookup($this->evalArray($hash->offsetGet('ALLOWED'))); - } - - if (isset($hash['VALUE-ALIASES'])) { - $directive->valueAliases = $this->evalArray($hash->offsetGet('VALUE-ALIASES')); - } - - if (isset($hash['ALIASES'])) { - $raw_aliases = trim($hash->offsetGet('ALIASES')); - $aliases = preg_split('/\s*,\s*/', $raw_aliases); - foreach ($aliases as $alias) { - $directive->aliases[] = $this->id($alias); - } - } - - if (isset($hash['VERSION'])) { - $directive->version = $hash->offsetGet('VERSION'); - } - - if (isset($hash['DEPRECATED-USE'])) { - $directive->deprecatedUse = $this->id($hash->offsetGet('DEPRECATED-USE')); - } - - if (isset($hash['DEPRECATED-VERSION'])) { - $directive->deprecatedVersion = $hash->offsetGet('DEPRECATED-VERSION'); - } - - if (isset($hash['EXTERNAL'])) { - $directive->external = preg_split('/\s*,\s*/', trim($hash->offsetGet('EXTERNAL'))); - } - - $interchange->addDirective($directive); - } - - /** - * Evaluates an array PHP code string without array() wrapper - */ - protected function evalArray($contents) { - return eval('return array('. $contents .');'); - } - - /** - * Converts an array list into a lookup array. - */ - protected function lookup($array) { - $ret = array(); - foreach ($array as $val) $ret[$val] = true; - return $ret; - } - - /** - * Convenience function that creates an HTMLPurifier_ConfigSchema_Interchange_Id - * object based on a string Id. - */ - protected function id($id) { - return HTMLPurifier_ConfigSchema_Interchange_Id::make($id); - } - - /** - * Triggers errors for any unused keys passed in the hash; such keys - * may indicate typos, missing values, etc. - * @param $hash Instance of ConfigSchema_StringHash to check. - */ - protected function _findUnused($hash) { - $accessed = $hash->getAccessed(); - foreach ($hash as $k => $v) { - if (!isset($accessed[$k])) { - trigger_error("String hash key '$k' not used by builder", E_USER_NOTICE); - } - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php deleted file mode 100644 index f374f6a02..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/Validator.php +++ /dev/null @@ -1,206 +0,0 @@ -parser = new HTMLPurifier_VarParser(); - } - - /** - * Validates a fully-formed interchange object. Throws an - * HTMLPurifier_ConfigSchema_Exception if there's a problem. - */ - public function validate($interchange) { - $this->interchange = $interchange; - $this->aliases = array(); - // PHP is a bit lax with integer <=> string conversions in - // arrays, so we don't use the identical !== comparison - foreach ($interchange->directives as $i => $directive) { - $id = $directive->id->toString(); - if ($i != $id) $this->error(false, "Integrity violation: key '$i' does not match internal id '$id'"); - $this->validateDirective($directive); - } - return true; - } - - /** - * Validates a HTMLPurifier_ConfigSchema_Interchange_Id object. - */ - public function validateId($id) { - $id_string = $id->toString(); - $this->context[] = "id '$id_string'"; - if (!$id instanceof HTMLPurifier_ConfigSchema_Interchange_Id) { - // handled by InterchangeBuilder - $this->error(false, 'is not an instance of HTMLPurifier_ConfigSchema_Interchange_Id'); - } - // keys are now unconstrained (we might want to narrow down to A-Za-z0-9.) - // we probably should check that it has at least one namespace - $this->with($id, 'key') - ->assertNotEmpty() - ->assertIsString(); // implicit assertIsString handled by InterchangeBuilder - array_pop($this->context); - } - - /** - * Validates a HTMLPurifier_ConfigSchema_Interchange_Directive object. - */ - public function validateDirective($d) { - $id = $d->id->toString(); - $this->context[] = "directive '$id'"; - $this->validateId($d->id); - - $this->with($d, 'description') - ->assertNotEmpty(); - - // BEGIN - handled by InterchangeBuilder - $this->with($d, 'type') - ->assertNotEmpty(); - $this->with($d, 'typeAllowsNull') - ->assertIsBool(); - try { - // This also tests validity of $d->type - $this->parser->parse($d->default, $d->type, $d->typeAllowsNull); - } catch (HTMLPurifier_VarParserException $e) { - $this->error('default', 'had error: ' . $e->getMessage()); - } - // END - handled by InterchangeBuilder - - if (!is_null($d->allowed) || !empty($d->valueAliases)) { - // allowed and valueAliases require that we be dealing with - // strings, so check for that early. - $d_int = HTMLPurifier_VarParser::$types[$d->type]; - if (!isset(HTMLPurifier_VarParser::$stringTypes[$d_int])) { - $this->error('type', 'must be a string type when used with allowed or value aliases'); - } - } - - $this->validateDirectiveAllowed($d); - $this->validateDirectiveValueAliases($d); - $this->validateDirectiveAliases($d); - - array_pop($this->context); - } - - /** - * Extra validation if $allowed member variable of - * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. - */ - public function validateDirectiveAllowed($d) { - if (is_null($d->allowed)) return; - $this->with($d, 'allowed') - ->assertNotEmpty() - ->assertIsLookup(); // handled by InterchangeBuilder - if (is_string($d->default) && !isset($d->allowed[$d->default])) { - $this->error('default', 'must be an allowed value'); - } - $this->context[] = 'allowed'; - foreach ($d->allowed as $val => $x) { - if (!is_string($val)) $this->error("value $val", 'must be a string'); - } - array_pop($this->context); - } - - /** - * Extra validation if $valueAliases member variable of - * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. - */ - public function validateDirectiveValueAliases($d) { - if (is_null($d->valueAliases)) return; - $this->with($d, 'valueAliases') - ->assertIsArray(); // handled by InterchangeBuilder - $this->context[] = 'valueAliases'; - foreach ($d->valueAliases as $alias => $real) { - if (!is_string($alias)) $this->error("alias $alias", 'must be a string'); - if (!is_string($real)) $this->error("alias target $real from alias '$alias'", 'must be a string'); - if ($alias === $real) { - $this->error("alias '$alias'", "must not be an alias to itself"); - } - } - if (!is_null($d->allowed)) { - foreach ($d->valueAliases as $alias => $real) { - if (isset($d->allowed[$alias])) { - $this->error("alias '$alias'", 'must not be an allowed value'); - } elseif (!isset($d->allowed[$real])) { - $this->error("alias '$alias'", 'must be an alias to an allowed value'); - } - } - } - array_pop($this->context); - } - - /** - * Extra validation if $aliases member variable of - * HTMLPurifier_ConfigSchema_Interchange_Directive is defined. - */ - public function validateDirectiveAliases($d) { - $this->with($d, 'aliases') - ->assertIsArray(); // handled by InterchangeBuilder - $this->context[] = 'aliases'; - foreach ($d->aliases as $alias) { - $this->validateId($alias); - $s = $alias->toString(); - if (isset($this->interchange->directives[$s])) { - $this->error("alias '$s'", 'collides with another directive'); - } - if (isset($this->aliases[$s])) { - $other_directive = $this->aliases[$s]; - $this->error("alias '$s'", "collides with alias for directive '$other_directive'"); - } - $this->aliases[$s] = $d->id->toString(); - } - array_pop($this->context); - } - - // protected helper functions - - /** - * Convenience function for generating HTMLPurifier_ConfigSchema_ValidatorAtom - * for validating simple member variables of objects. - */ - protected function with($obj, $member) { - return new HTMLPurifier_ConfigSchema_ValidatorAtom($this->getFormattedContext(), $obj, $member); - } - - /** - * Emits an error, providing helpful context. - */ - protected function error($target, $msg) { - if ($target !== false) $prefix = ucfirst($target) . ' in ' . $this->getFormattedContext(); - else $prefix = ucfirst($this->getFormattedContext()); - throw new HTMLPurifier_ConfigSchema_Exception(trim($prefix . ' ' . $msg)); - } - - /** - * Returns a formatted context string. - */ - protected function getFormattedContext() { - return implode(' in ', array_reverse($this->context)); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php deleted file mode 100644 index b95aea18c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/ValidatorAtom.php +++ /dev/null @@ -1,66 +0,0 @@ -context = $context; - $this->obj = $obj; - $this->member = $member; - $this->contents =& $obj->$member; - } - - public function assertIsString() { - if (!is_string($this->contents)) $this->error('must be a string'); - return $this; - } - - public function assertIsBool() { - if (!is_bool($this->contents)) $this->error('must be a boolean'); - return $this; - } - - public function assertIsArray() { - if (!is_array($this->contents)) $this->error('must be an array'); - return $this; - } - - public function assertNotNull() { - if ($this->contents === null) $this->error('must not be null'); - return $this; - } - - public function assertAlnum() { - $this->assertIsString(); - if (!ctype_alnum($this->contents)) $this->error('must be alphanumeric'); - return $this; - } - - public function assertNotEmpty() { - if (empty($this->contents)) $this->error('must not be empty'); - return $this; - } - - public function assertIsLookup() { - $this->assertIsArray(); - foreach ($this->contents as $v) { - if ($v !== true) $this->error('must be a lookup array'); - } - return $this; - } - - protected function error($msg) { - throw new HTMLPurifier_ConfigSchema_Exception(ucfirst($this->member) . ' in ' . $this->context . ' ' . $msg); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema.ser b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema.ser deleted file mode 100644 index bbf12f9c3..000000000 Binary files a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema.ser and /dev/null differ diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt deleted file mode 100644 index 0517fed0a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedClasses.txt +++ /dev/null @@ -1,8 +0,0 @@ -Attr.AllowedClasses -TYPE: lookup/null -VERSION: 4.0.0 -DEFAULT: null ---DESCRIPTION-- -List of allowed class values in the class attribute. By default, this is null, -which means all classes are allowed. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt deleted file mode 100644 index 249edd647..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedFrameTargets.txt +++ /dev/null @@ -1,12 +0,0 @@ -Attr.AllowedFrameTargets -TYPE: lookup -DEFAULT: array() ---DESCRIPTION-- -Lookup table of all allowed link frame targets. Some commonly used link -targets include _blank, _self, _parent and _top. Values should be -lowercase, as validation will be done in a case-sensitive manner despite -W3C's recommendation. XHTML 1.0 Strict does not permit the target attribute -so this directive will have no effect in that doctype. XHTML 1.1 does not -enable the Target module by default, you will have to manually enable it -(see the module documentation for more details.) ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt deleted file mode 100644 index 9a8fa6a2e..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRel.txt +++ /dev/null @@ -1,9 +0,0 @@ -Attr.AllowedRel -TYPE: lookup -VERSION: 1.6.0 -DEFAULT: array() ---DESCRIPTION-- -List of allowed forward document relationships in the rel attribute. Common -values may be nofollow or print. By default, this is empty, meaning that no -document relationships are allowed. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt deleted file mode 100644 index b01788348..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.AllowedRev.txt +++ /dev/null @@ -1,9 +0,0 @@ -Attr.AllowedRev -TYPE: lookup -VERSION: 1.6.0 -DEFAULT: array() ---DESCRIPTION-- -List of allowed reverse document relationships in the rev attribute. This -attribute is a bit of an edge-case; if you don't know what it is for, stay -away. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt deleted file mode 100644 index e774b823b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ClassUseCDATA.txt +++ /dev/null @@ -1,19 +0,0 @@ -Attr.ClassUseCDATA -TYPE: bool/null -DEFAULT: null -VERSION: 4.0.0 ---DESCRIPTION-- -If null, class will auto-detect the doctype and, if matching XHTML 1.1 or -XHTML 2.0, will use the restrictive NMTOKENS specification of class. Otherwise, -it will use a relaxed CDATA definition. If true, the relaxed CDATA definition -is forced; if false, the NMTOKENS definition is forced. To get behavior -of HTML Purifier prior to 4.0.0, set this directive to false. - -Some rational behind the auto-detection: -in previous versions of HTML Purifier, it was assumed that the form of -class was NMTOKENS, as specified by the XHTML Modularization (representing -XHTML 1.1 and XHTML 2.0). The DTDs for HTML 4.01 and XHTML 1.0, however -specify class as CDATA. HTML 5 effectively defines it as CDATA, but -with the additional constraint that each name should be unique (this is not -explicitly outlined in previous specifications). ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt deleted file mode 100644 index 533165e17..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultImageAlt.txt +++ /dev/null @@ -1,11 +0,0 @@ -Attr.DefaultImageAlt -TYPE: string/null -DEFAULT: null -VERSION: 3.2.0 ---DESCRIPTION-- -This is the content of the alt tag of an image if the user had not -previously specified an alt attribute. This applies to all images without -a valid alt attribute, as opposed to %Attr.DefaultInvalidImageAlt, which -only applies to invalid images, and overrides in the case of an invalid image. -Default behavior with null is to use the basename of the src tag for the alt. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt deleted file mode 100644 index 9eb7e3846..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImage.txt +++ /dev/null @@ -1,9 +0,0 @@ -Attr.DefaultInvalidImage -TYPE: string -DEFAULT: '' ---DESCRIPTION-- -This is the default image an img tag will be pointed to if it does not have -a valid src attribute. In future versions, we may allow the image tag to -be removed completely, but due to design issues, this is not possible right -now. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt deleted file mode 100644 index 2f17bf477..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultInvalidImageAlt.txt +++ /dev/null @@ -1,8 +0,0 @@ -Attr.DefaultInvalidImageAlt -TYPE: string -DEFAULT: 'Invalid image' ---DESCRIPTION-- -This is the content of the alt tag of an invalid image if the user had not -previously specified an alt attribute. It has no effect when the image is -valid but there was no alt attribute present. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt deleted file mode 100644 index 52654b53a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.DefaultTextDir.txt +++ /dev/null @@ -1,10 +0,0 @@ -Attr.DefaultTextDir -TYPE: string -DEFAULT: 'ltr' ---DESCRIPTION-- -Defines the default text direction (ltr or rtl) of the document being -parsed. This generally is the same as the value of the dir attribute in -HTML, or ltr if that is not specified. ---ALLOWED-- -'ltr', 'rtl' ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt deleted file mode 100644 index 6440d2103..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.EnableID.txt +++ /dev/null @@ -1,16 +0,0 @@ -Attr.EnableID -TYPE: bool -DEFAULT: false -VERSION: 1.2.0 ---DESCRIPTION-- -Allows the ID attribute in HTML. This is disabled by default due to the -fact that without proper configuration user input can easily break the -validation of a webpage by specifying an ID that is already on the -surrounding HTML. If you don't mind throwing caution to the wind, enable -this directive, but I strongly recommend you also consider blacklisting IDs -you use (%Attr.IDBlacklist) or prefixing all user supplied IDs -(%Attr.IDPrefix). When set to true HTML Purifier reverts to the behavior of -pre-1.2.0 versions. ---ALIASES-- -HTML.EnableAttrID ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt deleted file mode 100644 index f31d226f5..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.ForbiddenClasses.txt +++ /dev/null @@ -1,8 +0,0 @@ -Attr.ForbiddenClasses -TYPE: lookup -VERSION: 4.0.0 -DEFAULT: array() ---DESCRIPTION-- -List of forbidden class values in the class attribute. By default, this is -empty, which means that no classes are forbidden. See also %Attr.AllowedClasses. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt deleted file mode 100644 index 5f2b5e3d2..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklist.txt +++ /dev/null @@ -1,5 +0,0 @@ -Attr.IDBlacklist -TYPE: list -DEFAULT: array() -DESCRIPTION: Array of IDs not allowed in the document. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt deleted file mode 100644 index 6f5824586..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDBlacklistRegexp.txt +++ /dev/null @@ -1,9 +0,0 @@ -Attr.IDBlacklistRegexp -TYPE: string/null -VERSION: 1.6.0 -DEFAULT: NULL ---DESCRIPTION-- -PCRE regular expression to be matched against all IDs. If the expression is -matches, the ID is rejected. Use this with care: may cause significant -degradation. ID matching is done after all other validation. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt deleted file mode 100644 index cc49d43fd..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefix.txt +++ /dev/null @@ -1,12 +0,0 @@ -Attr.IDPrefix -TYPE: string -VERSION: 1.2.0 -DEFAULT: '' ---DESCRIPTION-- -String to prefix to IDs. If you have no idea what IDs your pages may use, -you may opt to simply add a prefix to all user-submitted ID attributes so -that they are still usable, but will not conflict with core page IDs. -Example: setting the directive to 'user_' will result in a user submitted -'foo' to become 'user_foo' Be sure to set %HTML.EnableAttrID to true -before using this. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt deleted file mode 100644 index 2c5924a7a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Attr.IDPrefixLocal.txt +++ /dev/null @@ -1,14 +0,0 @@ -Attr.IDPrefixLocal -TYPE: string -VERSION: 1.2.0 -DEFAULT: '' ---DESCRIPTION-- -Temporary prefix for IDs used in conjunction with %Attr.IDPrefix. If you -need to allow multiple sets of user content on web page, you may need to -have a seperate prefix that changes with each iteration. This way, -seperately submitted user content displayed on the same page doesn't -clobber each other. Ideal values are unique identifiers for the content it -represents (i.e. the id of the row in the database). Be sure to add a -seperator (like an underscore) at the end. Warning: this directive will -not work unless %Attr.IDPrefix is set to a non-empty value! ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt deleted file mode 100644 index d5caa1bb9..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.AutoParagraph.txt +++ /dev/null @@ -1,31 +0,0 @@ -AutoFormat.AutoParagraph -TYPE: bool -VERSION: 2.0.1 -DEFAULT: false ---DESCRIPTION-- - -

- This directive turns on auto-paragraphing, where double newlines are - converted in to paragraphs whenever possible. Auto-paragraphing: -

-
    -
  • Always applies to inline elements or text in the root node,
  • -
  • Applies to inline elements or text with double newlines in nodes - that allow paragraph tags,
  • -
  • Applies to double newlines in paragraph tags
  • -
-

- p tags must be allowed for this directive to take effect. - We do not use br tags for paragraphing, as that is - semantically incorrect. -

-

- To prevent auto-paragraphing as a content-producer, refrain from using - double-newlines except to specify a new paragraph or in contexts where - it has special meaning (whitespace usually has no meaning except in - tags like pre, so this should not be difficult.) To prevent - the paragraphing of inline text adjacent to block elements, wrap them - in div tags (the behavior is slightly different outside of - the root node.) -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt deleted file mode 100644 index 2a476481a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Custom.txt +++ /dev/null @@ -1,12 +0,0 @@ -AutoFormat.Custom -TYPE: list -VERSION: 2.0.1 -DEFAULT: array() ---DESCRIPTION-- - -

- This directive can be used to add custom auto-format injectors. - Specify an array of injector names (class name minus the prefix) - or concrete implementations. Injector class must exist. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt deleted file mode 100644 index 663064a34..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.DisplayLinkURI.txt +++ /dev/null @@ -1,11 +0,0 @@ -AutoFormat.DisplayLinkURI -TYPE: bool -VERSION: 3.2.0 -DEFAULT: false ---DESCRIPTION-- -

- This directive turns on the in-text display of URIs in <a> tags, and disables - those links. For example, example becomes - example (http://example.com). -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt deleted file mode 100644 index 3a48ba960..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.Linkify.txt +++ /dev/null @@ -1,12 +0,0 @@ -AutoFormat.Linkify -TYPE: bool -VERSION: 2.0.1 -DEFAULT: false ---DESCRIPTION-- - -

- This directive turns on linkification, auto-linking http, ftp and - https URLs. a tags with the href attribute - must be allowed. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt deleted file mode 100644 index db58b1346..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.DocURL.txt +++ /dev/null @@ -1,12 +0,0 @@ -AutoFormat.PurifierLinkify.DocURL -TYPE: string -VERSION: 2.0.1 -DEFAULT: '#%s' -ALIASES: AutoFormatParam.PurifierLinkifyDocURL ---DESCRIPTION-- -

- Location of configuration documentation to link to, let %s substitute - into the configuration's namespace and directive names sans the percent - sign. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt deleted file mode 100644 index 7996488be..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.PurifierLinkify.txt +++ /dev/null @@ -1,12 +0,0 @@ -AutoFormat.PurifierLinkify -TYPE: bool -VERSION: 2.0.1 -DEFAULT: false ---DESCRIPTION-- - -

- Internal auto-formatter that converts configuration directives in - syntax %Namespace.Directive to links. a tags - with the href attribute must be allowed. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt deleted file mode 100644 index 35c393b4e..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions.txt +++ /dev/null @@ -1,11 +0,0 @@ -AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions -TYPE: lookup -VERSION: 4.0.0 -DEFAULT: array('td' => true, 'th' => true) ---DESCRIPTION-- -

- When %AutoFormat.RemoveEmpty and %AutoFormat.RemoveEmpty.RemoveNbsp - are enabled, this directive defines what HTML elements should not be - removede if they have only a non-breaking space in them. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt deleted file mode 100644 index ca17eb1dc..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.RemoveNbsp.txt +++ /dev/null @@ -1,15 +0,0 @@ -AutoFormat.RemoveEmpty.RemoveNbsp -TYPE: bool -VERSION: 4.0.0 -DEFAULT: false ---DESCRIPTION-- -

- When enabled, HTML Purifier will treat any elements that contain only - non-breaking spaces as well as regular whitespace as empty, and remove - them when %AutoForamt.RemoveEmpty is enabled. -

-

- See %AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions for a list of elements - that don't have this behavior applied to them. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt deleted file mode 100644 index 34657ba47..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/AutoFormat.RemoveEmpty.txt +++ /dev/null @@ -1,46 +0,0 @@ -AutoFormat.RemoveEmpty -TYPE: bool -VERSION: 3.2.0 -DEFAULT: false ---DESCRIPTION-- -

- When enabled, HTML Purifier will attempt to remove empty elements that - contribute no semantic information to the document. The following types - of nodes will be removed: -

-
  • - Tags with no attributes and no content, and that are not empty - elements (remove <a></a> but not - <br />), and -
  • -
  • - Tags with no content, except for:
      -
    • The colgroup element, or
    • -
    • - Elements with the id or name attribute, - when those attributes are permitted on those elements. -
    • -
  • -
-

- Please be very careful when using this functionality; while it may not - seem that empty elements contain useful information, they can alter the - layout of a document given appropriate styling. This directive is most - useful when you are processing machine-generated HTML, please avoid using - it on regular user HTML. -

-

- Elements that contain only whitespace will be treated as empty. Non-breaking - spaces, however, do not count as whitespace. See - %AutoFormat.RemoveEmpty.RemoveNbsp for alternate behavior. -

-

- This algorithm is not perfect; you may still notice some empty tags, - particularly if a node had elements, but those elements were later removed - because they were not permitted in that context, or tags that, after - being auto-closed by another tag, where empty. This is for safety reasons - to prevent clever code from breaking validation. The general rule of thumb: - if a tag looked empty on the way in, it will get removed; if HTML Purifier - made it empty, it will stay. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt deleted file mode 100644 index b324608f7..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowImportant.txt +++ /dev/null @@ -1,8 +0,0 @@ -CSS.AllowImportant -TYPE: bool -DEFAULT: false -VERSION: 3.1.0 ---DESCRIPTION-- -This parameter determines whether or not !important cascade modifiers should -be allowed in user CSS. If false, !important will stripped. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt deleted file mode 100644 index 748be0eec..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowTricky.txt +++ /dev/null @@ -1,11 +0,0 @@ -CSS.AllowTricky -TYPE: bool -DEFAULT: false -VERSION: 3.1.0 ---DESCRIPTION-- -This parameter determines whether or not to allow "tricky" CSS properties and -values. Tricky CSS properties/values can drastically modify page layout or -be used for deceptive practices but do not directly constitute a security risk. -For example, display:none; is considered a tricky property that -will only be allowed if this directive is set to true. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt deleted file mode 100644 index 460112ebe..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.AllowedProperties.txt +++ /dev/null @@ -1,18 +0,0 @@ -CSS.AllowedProperties -TYPE: lookup/null -VERSION: 3.1.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- If HTML Purifier's style attributes set is unsatisfactory for your needs, - you can overload it with your own list of tags to allow. Note that this - method is subtractive: it does its job by taking away from HTML Purifier - usual feature set, so you cannot add an attribute that HTML Purifier never - supported in the first place. -

-

- Warning: If another directive conflicts with the - elements here, that directive will win and override. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt deleted file mode 100644 index 5cb7dda3b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.DefinitionRev.txt +++ /dev/null @@ -1,11 +0,0 @@ -CSS.DefinitionRev -TYPE: int -VERSION: 2.0.0 -DEFAULT: 1 ---DESCRIPTION-- - -

- Revision identifier for your custom definition. See - %HTML.DefinitionRev for details. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt deleted file mode 100644 index 7a3291470..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.MaxImgLength.txt +++ /dev/null @@ -1,16 +0,0 @@ -CSS.MaxImgLength -TYPE: string/null -DEFAULT: '1200px' -VERSION: 3.1.1 ---DESCRIPTION-- -

- This parameter sets the maximum allowed length on img tags, - effectively the width and height properties. - Only absolute units of measurement (in, pt, pc, mm, cm) and pixels (px) are allowed. This is - in place to prevent imagecrash attacks, disable with null at your own risk. - This directive is similar to %HTML.MaxImgLength, and both should be - concurrently edited, although there are - subtle differences in the input format (the CSS max is a number with - a unit). -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt deleted file mode 100644 index 148eedb8b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/CSS.Proprietary.txt +++ /dev/null @@ -1,10 +0,0 @@ -CSS.Proprietary -TYPE: bool -VERSION: 3.0.0 -DEFAULT: false ---DESCRIPTION-- - -

- Whether or not to allow safe, proprietary CSS values. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt deleted file mode 100644 index c486724c8..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.DefinitionImpl.txt +++ /dev/null @@ -1,14 +0,0 @@ -Cache.DefinitionImpl -TYPE: string/null -VERSION: 2.0.0 -DEFAULT: 'Serializer' ---DESCRIPTION-- - -This directive defines which method to use when caching definitions, -the complex data-type that makes HTML Purifier tick. Set to null -to disable caching (not recommended, as you will see a definite -performance degradation). - ---ALIASES-- -Core.DefinitionCache ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt deleted file mode 100644 index 54036507d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Cache.SerializerPath.txt +++ /dev/null @@ -1,13 +0,0 @@ -Cache.SerializerPath -TYPE: string/null -VERSION: 2.0.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- Absolute path with no trailing slash to store serialized definitions in. - Default is within the - HTML Purifier library inside DefinitionCache/Serializer. This - path must be writable by the webserver. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt deleted file mode 100644 index 568cbf3b3..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.AggressivelyFixLt.txt +++ /dev/null @@ -1,18 +0,0 @@ -Core.AggressivelyFixLt -TYPE: bool -VERSION: 2.1.0 -DEFAULT: true ---DESCRIPTION-- -

- This directive enables aggressive pre-filter fixes HTML Purifier can - perform in order to ensure that open angled-brackets do not get killed - during parsing stage. Enabling this will result in two preg_replace_callback - calls and at least two preg_replace calls for every HTML document parsed; - if your users make very well-formed HTML, you can set this directive false. - This has no effect when DirectLex is used. -

-

- Notice: This directive's default turned from false to true - in HTML Purifier 3.2.0. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt deleted file mode 100644 index d7317911f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.CollectErrors.txt +++ /dev/null @@ -1,12 +0,0 @@ -Core.CollectErrors -TYPE: bool -VERSION: 2.0.0 -DEFAULT: false ---DESCRIPTION-- - -Whether or not to collect errors found while filtering the document. This -is a useful way to give feedback to your users. Warning: -Currently this feature is very patchy and experimental, with lots of -possible error messages not yet implemented. It will not cause any -problems, but it may not help your users either. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt deleted file mode 100644 index 08b381d34..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ColorKeywords.txt +++ /dev/null @@ -1,28 +0,0 @@ -Core.ColorKeywords -TYPE: hash -VERSION: 2.0.0 ---DEFAULT-- -array ( - 'maroon' => '#800000', - 'red' => '#FF0000', - 'orange' => '#FFA500', - 'yellow' => '#FFFF00', - 'olive' => '#808000', - 'purple' => '#800080', - 'fuchsia' => '#FF00FF', - 'white' => '#FFFFFF', - 'lime' => '#00FF00', - 'green' => '#008000', - 'navy' => '#000080', - 'blue' => '#0000FF', - 'aqua' => '#00FFFF', - 'teal' => '#008080', - 'black' => '#000000', - 'silver' => '#C0C0C0', - 'gray' => '#808080', -) ---DESCRIPTION-- - -Lookup array of color names to six digit hexadecimal number corresponding -to color, with preceding hash mark. Used when parsing colors. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt deleted file mode 100644 index 64b114fce..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.ConvertDocumentToFragment.txt +++ /dev/null @@ -1,14 +0,0 @@ -Core.ConvertDocumentToFragment -TYPE: bool -DEFAULT: true ---DESCRIPTION-- - -This parameter determines whether or not the filter should convert -input that is a full document with html and body tags to a fragment -of just the contents of a body tag. This parameter is simply something -HTML Purifier can do during an edge-case: for most inputs, this -processing is not necessary. - ---ALIASES-- -Core.AcceptFullDocuments ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt deleted file mode 100644 index 36f16e07e..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.DirectLexLineNumberSyncInterval.txt +++ /dev/null @@ -1,17 +0,0 @@ -Core.DirectLexLineNumberSyncInterval -TYPE: int -VERSION: 2.0.0 -DEFAULT: 0 ---DESCRIPTION-- - -

- Specifies the number of tokens the DirectLex line number tracking - implementations should process before attempting to resyncronize the - current line count by manually counting all previous new-lines. When - at 0, this functionality is disabled. Lower values will decrease - performance, and this is only strictly necessary if the counting - algorithm is buggy (in which case you should report it as a bug). - This has no effect when %Core.MaintainLineNumbers is disabled or DirectLex is - not being used. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt deleted file mode 100644 index 8bfb47c3a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Encoding.txt +++ /dev/null @@ -1,15 +0,0 @@ -Core.Encoding -TYPE: istring -DEFAULT: 'utf-8' ---DESCRIPTION-- -If for some reason you are unable to convert all webpages to UTF-8, you can -use this directive as a stop-gap compatibility change to let HTML Purifier -deal with non UTF-8 input. This technique has notable deficiencies: -absolutely no characters outside of the selected character encoding will be -preserved, not even the ones that have been ampersand escaped (this is due -to a UTF-8 specific feature that automatically resolves all -entities), making it pretty useless for anything except the most I18N-blind -applications, although %Core.EscapeNonASCIICharacters offers fixes this -trouble with another tradeoff. This directive only accepts ISO-8859-1 if -iconv is not enabled. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt deleted file mode 100644 index 4d5b5055c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidChildren.txt +++ /dev/null @@ -1,10 +0,0 @@ -Core.EscapeInvalidChildren -TYPE: bool -DEFAULT: false ---DESCRIPTION-- -When true, a child is found that is not allowed in the context of the -parent element will be transformed into text as if it were ASCII. When -false, that element and all internal tags will be dropped, though text will -be preserved. There is no option for dropping the element but preserving -child nodes. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt deleted file mode 100644 index a7a5b249b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeInvalidTags.txt +++ /dev/null @@ -1,7 +0,0 @@ -Core.EscapeInvalidTags -TYPE: bool -DEFAULT: false ---DESCRIPTION-- -When true, invalid tags will be written back to the document as plain text. -Otherwise, they are silently dropped. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt deleted file mode 100644 index abb499948..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.EscapeNonASCIICharacters.txt +++ /dev/null @@ -1,13 +0,0 @@ -Core.EscapeNonASCIICharacters -TYPE: bool -VERSION: 1.4.0 -DEFAULT: false ---DESCRIPTION-- -This directive overcomes a deficiency in %Core.Encoding by blindly -converting all non-ASCII characters into decimal numeric entities before -converting it to its native encoding. This means that even characters that -can be expressed in the non-UTF-8 encoding will be entity-ized, which can -be a real downer for encodings like Big5. It also assumes that the ASCII -repetoire is available, although this is the case for almost all encodings. -Anyway, use UTF-8! ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt deleted file mode 100644 index 915391edb..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.HiddenElements.txt +++ /dev/null @@ -1,19 +0,0 @@ -Core.HiddenElements -TYPE: lookup ---DEFAULT-- -array ( - 'script' => true, - 'style' => true, -) ---DESCRIPTION-- - -

- This directive is a lookup array of elements which should have their - contents removed when they are not allowed by the HTML definition. - For example, the contents of a script tag are not - normally shown in a document, so if script tags are to be removed, - their contents should be removed to. This is opposed to a b - tag, which defines some presentational changes but does not hide its - contents. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt deleted file mode 100644 index 233fca14f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.Language.txt +++ /dev/null @@ -1,10 +0,0 @@ -Core.Language -TYPE: string -VERSION: 2.0.0 -DEFAULT: 'en' ---DESCRIPTION-- - -ISO 639 language code for localizable things in HTML Purifier to use, -which is mainly error reporting. There is currently only an English (en) -translation, so this directive is currently useless. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt deleted file mode 100644 index 8983e2cca..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.LexerImpl.txt +++ /dev/null @@ -1,34 +0,0 @@ -Core.LexerImpl -TYPE: mixed/null -VERSION: 2.0.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- This parameter determines what lexer implementation can be used. The - valid values are: -

-
-
null
-
- Recommended, the lexer implementation will be auto-detected based on - your PHP-version and configuration. -
-
string lexer identifier
-
- This is a slim way of manually overridding the implementation. - Currently recognized values are: DOMLex (the default PHP5 -implementation) - and DirectLex (the default PHP4 implementation). Only use this if - you know what you are doing: usually, the auto-detection will - manage things for cases you aren't even aware of. -
-
object lexer instance
-
- Super-advanced: you can specify your own, custom, implementation that - implements the interface defined by HTMLPurifier_Lexer. - I may remove this option simply because I don't expect anyone - to use it. -
-
---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt deleted file mode 100644 index eb841a759..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.MaintainLineNumbers.txt +++ /dev/null @@ -1,16 +0,0 @@ -Core.MaintainLineNumbers -TYPE: bool/null -VERSION: 2.0.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- If true, HTML Purifier will add line number information to all tokens. - This is useful when error reporting is turned on, but can result in - significant performance degradation and should not be used when - unnecessary. This directive must be used with the DirectLex lexer, - as the DOMLex lexer does not (yet) support this functionality. - If the value is null, an appropriate value will be selected based - on other configuration. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt deleted file mode 100644 index 4070c2a0d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveInvalidImg.txt +++ /dev/null @@ -1,12 +0,0 @@ -Core.RemoveInvalidImg -TYPE: bool -DEFAULT: true -VERSION: 1.3.0 ---DESCRIPTION-- - -

- This directive enables pre-emptive URI checking in img - tags, as the attribute validation strategy is not authorized to - remove elements from the document. Revert to pre-1.3.0 behavior by setting to false. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt deleted file mode 100644 index a4cd966df..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Core.RemoveScriptContents.txt +++ /dev/null @@ -1,12 +0,0 @@ -Core.RemoveScriptContents -TYPE: bool/null -DEFAULT: NULL -VERSION: 2.0.0 -DEPRECATED-VERSION: 2.1.0 -DEPRECATED-USE: Core.HiddenElements ---DESCRIPTION-- -

- This directive enables HTML Purifier to remove not only script tags - but all of their contents. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt deleted file mode 100644 index 3db50ef20..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.Custom.txt +++ /dev/null @@ -1,11 +0,0 @@ -Filter.Custom -TYPE: list -VERSION: 3.1.0 -DEFAULT: array() ---DESCRIPTION-- -

- This directive can be used to add custom filters; it is nearly the - equivalent of the now deprecated HTMLPurifier->addFilter() - method. Specify an array of concrete implementations. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt deleted file mode 100644 index 16829bcda..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Escaping.txt +++ /dev/null @@ -1,14 +0,0 @@ -Filter.ExtractStyleBlocks.Escaping -TYPE: bool -VERSION: 3.0.0 -DEFAULT: true -ALIASES: Filter.ExtractStyleBlocksEscaping, FilterParam.ExtractStyleBlocksEscaping ---DESCRIPTION-- - -

- Whether or not to escape the dangerous characters <, > and & - as \3C, \3E and \26, respectively. This is can be safely set to false - if the contents of StyleBlocks will be placed in an external stylesheet, - where there is no risk of it being interpreted as HTML. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt deleted file mode 100644 index 7f95f54d1..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.Scope.txt +++ /dev/null @@ -1,29 +0,0 @@ -Filter.ExtractStyleBlocks.Scope -TYPE: string/null -VERSION: 3.0.0 -DEFAULT: NULL -ALIASES: Filter.ExtractStyleBlocksScope, FilterParam.ExtractStyleBlocksScope ---DESCRIPTION-- - -

- If you would like users to be able to define external stylesheets, but - only allow them to specify CSS declarations for a specific node and - prevent them from fiddling with other elements, use this directive. - It accepts any valid CSS selector, and will prepend this to any - CSS declaration extracted from the document. For example, if this - directive is set to #user-content and a user uses the - selector a:hover, the final selector will be - #user-content a:hover. -

-

- The comma shorthand may be used; consider the above example, with - #user-content, #user-content2, the final selector will - be #user-content a:hover, #user-content2 a:hover. -

-

- Warning: It is possible for users to bypass this measure - using a naughty + selector. This is a bug in CSS Tidy 1.3, not HTML - Purifier, and I am working to get it fixed. Until then, HTML Purifier - performs a basic check to prevent this. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt deleted file mode 100644 index 6c231b2d7..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.TidyImpl.txt +++ /dev/null @@ -1,16 +0,0 @@ -Filter.ExtractStyleBlocks.TidyImpl -TYPE: mixed/null -VERSION: 3.1.0 -DEFAULT: NULL -ALIASES: FilterParam.ExtractStyleBlocksTidyImpl ---DESCRIPTION-- -

- If left NULL, HTML Purifier will attempt to instantiate a csstidy - class to use for internal cleaning. This will usually be good enough. -

-

- However, for trusted user input, you can set this to false to - disable cleaning. In addition, you can supply your own concrete implementation - of Tidy's interface to use, although I don't know why you'd want to do that. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt deleted file mode 100644 index 078d08741..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.ExtractStyleBlocks.txt +++ /dev/null @@ -1,74 +0,0 @@ -Filter.ExtractStyleBlocks -TYPE: bool -VERSION: 3.1.0 -DEFAULT: false -EXTERNAL: CSSTidy ---DESCRIPTION-- -

- This directive turns on the style block extraction filter, which removes - style blocks from input HTML, cleans them up with CSSTidy, - and places them in the StyleBlocks context variable, for further - use by you, usually to be placed in an external stylesheet, or a - style block in the head of your document. -

-

- Sample usage: -

-
';
-?>
-
-
-
-  Filter.ExtractStyleBlocks
-body {color:#F00;} Some text';
-
-    $config = HTMLPurifier_Config::createDefault();
-    $config->set('Filter', 'ExtractStyleBlocks', true);
-    $purifier = new HTMLPurifier($config);
-
-    $html = $purifier->purify($dirty);
-
-    // This implementation writes the stylesheets to the styles/ directory.
-    // You can also echo the styles inside the document, but it's a bit
-    // more difficult to make sure they get interpreted properly by
-    // browsers; try the usual CSS armoring techniques.
-    $styles = $purifier->context->get('StyleBlocks');
-    $dir = 'styles/';
-    if (!is_dir($dir)) mkdir($dir);
-    $hash = sha1($_GET['html']);
-    foreach ($styles as $i => $style) {
-        file_put_contents($name = $dir . $hash . "_$i");
-        echo '';
-    }
-?>
-
-
-  
- -
- - -]]>
-

- Warning: It is possible for a user to mount an - imagecrash attack using this CSS. Counter-measures are difficult; - it is not simply enough to limit the range of CSS lengths (using - relative lengths with many nesting levels allows for large values - to be attained without actually specifying them in the stylesheet), - and the flexible nature of selectors makes it difficult to selectively - disable lengths on image tags (HTML Purifier, however, does disable - CSS width and height in inline styling). There are probably two effective - counter measures: an explicit width and height set to auto in all - images in your document (unlikely) or the disabling of width and - height (somewhat reasonable). Whether or not these measures should be - used is left to the reader. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt deleted file mode 100644 index 7fa6536b2..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Filter.YouTube.txt +++ /dev/null @@ -1,11 +0,0 @@ -Filter.YouTube -TYPE: bool -VERSION: 3.1.0 -DEFAULT: false ---DESCRIPTION-- -

- This directive enables YouTube video embedding in HTML Purifier. Check - this document - on embedding videos for more information on what this filter does. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt deleted file mode 100644 index 3e231d2d1..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Allowed.txt +++ /dev/null @@ -1,22 +0,0 @@ -HTML.Allowed -TYPE: itext/null -VERSION: 2.0.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- This is a convenience directive that rolls the functionality of - %HTML.AllowedElements and %HTML.AllowedAttributes into one directive. - Specify elements and attributes that are allowed using: - element1[attr1|attr2],element2.... You can also use - newlines instead of commas to separate elements. -

-

- Warning: - All of the constraints on the component directives are still enforced. - The syntax is a subset of TinyMCE's valid_elements - whitelist: directly copy-pasting it here will probably result in - broken whitelists. If %HTML.AllowedElements or %HTML.AllowedAttributes - are set, this directive has no effect. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt deleted file mode 100644 index fcf093f17..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedAttributes.txt +++ /dev/null @@ -1,19 +0,0 @@ -HTML.AllowedAttributes -TYPE: lookup/null -VERSION: 1.3.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- If HTML Purifier's attribute set is unsatisfactory, overload it! - The syntax is "tag.attr" or "*.attr" for the global attributes - (style, id, class, dir, lang, xml:lang). -

-

- Warning: If another directive conflicts with the - elements here, that directive will win and override. For - example, %HTML.EnableAttrID will take precedence over *.id in this - directive. You must set that directive to true before you can use - IDs at all. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt deleted file mode 100644 index 888d55819..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedElements.txt +++ /dev/null @@ -1,18 +0,0 @@ -HTML.AllowedElements -TYPE: lookup/null -VERSION: 1.3.0 -DEFAULT: NULL ---DESCRIPTION-- -

- If HTML Purifier's tag set is unsatisfactory for your needs, you - can overload it with your own list of tags to allow. Note that this - method is subtractive: it does its job by taking away from HTML Purifier - usual feature set, so you cannot add a tag that HTML Purifier never - supported in the first place (like embed, form or head). If you - change this, you probably also want to change %HTML.AllowedAttributes. -

-

- Warning: If another directive conflicts with the - elements here, that directive will win and override. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt deleted file mode 100644 index 5a59a55c0..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.AllowedModules.txt +++ /dev/null @@ -1,20 +0,0 @@ -HTML.AllowedModules -TYPE: lookup/null -VERSION: 2.0.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- A doctype comes with a set of usual modules to use. Without having - to mucking about with the doctypes, you can quickly activate or - disable these modules by specifying which modules you wish to allow - with this directive. This is most useful for unit testing specific - modules, although end users may find it useful for their own ends. -

-

- If you specify a module that does not exist, the manager will silently - fail to use it, so be careful! User-defined modules are not affected - by this directive. Modules defined in %HTML.CoreModules are not - affected by this directive. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt deleted file mode 100644 index 151fb7b82..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Attr.Name.UseCDATA.txt +++ /dev/null @@ -1,11 +0,0 @@ -HTML.Attr.Name.UseCDATA -TYPE: bool -DEFAULT: false -VERSION: 4.0.0 ---DESCRIPTION-- -The W3C specification DTD defines the name attribute to be CDATA, not ID, due -to limitations of DTD. In certain documents, this relaxed behavior is desired, -whether it is to specify duplicate names, or to specify names that would be -illegal IDs (for example, names that begin with a digit.) Set this configuration -directive to true to use the relaxed parsing rules. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt deleted file mode 100644 index 45ae469ec..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.BlockWrapper.txt +++ /dev/null @@ -1,18 +0,0 @@ -HTML.BlockWrapper -TYPE: string -VERSION: 1.3.0 -DEFAULT: 'p' ---DESCRIPTION-- - -

- String name of element to wrap inline elements that are inside a block - context. This only occurs in the children of blockquote in strict mode. -

-

- Example: by default value, - <blockquote>Foo</blockquote> would become - <blockquote><p>Foo</p></blockquote>. - The <p> tags can be replaced with whatever you desire, - as long as it is a block level element. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt deleted file mode 100644 index 524618879..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CoreModules.txt +++ /dev/null @@ -1,23 +0,0 @@ -HTML.CoreModules -TYPE: lookup -VERSION: 2.0.0 ---DEFAULT-- -array ( - 'Structure' => true, - 'Text' => true, - 'Hypertext' => true, - 'List' => true, - 'NonXMLCommonAttributes' => true, - 'XMLCommonAttributes' => true, - 'CommonAttributes' => true, -) ---DESCRIPTION-- - -

- Certain modularized doctypes (XHTML, namely), have certain modules - that must be included for the doctype to be an conforming document - type: put those modules here. By default, XHTML's core modules - are used. You can set this to a blank array to disable core module - protection, but this is not recommended. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt deleted file mode 100644 index a64e3d7c3..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.CustomDoctype.txt +++ /dev/null @@ -1,9 +0,0 @@ -HTML.CustomDoctype -TYPE: string/null -VERSION: 2.0.1 -DEFAULT: NULL ---DESCRIPTION-- - -A custom doctype for power-users who defined there own document -type. This directive only applies when %HTML.Doctype is blank. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt deleted file mode 100644 index 103db754a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionID.txt +++ /dev/null @@ -1,33 +0,0 @@ -HTML.DefinitionID -TYPE: string/null -DEFAULT: NULL -VERSION: 2.0.0 ---DESCRIPTION-- - -

- Unique identifier for a custom-built HTML definition. If you edit - the raw version of the HTMLDefinition, introducing changes that the - configuration object does not reflect, you must specify this variable. - If you change your custom edits, you should change this directive, or - clear your cache. Example: -

-
-$config = HTMLPurifier_Config::createDefault();
-$config->set('HTML', 'DefinitionID', '1');
-$def = $config->getHTMLDefinition();
-$def->addAttribute('a', 'tabindex', 'Number');
-
-

- In the above example, the configuration is still at the defaults, but - using the advanced API, an extra attribute has been added. The - configuration object normally has no way of knowing that this change - has taken place, so it needs an extra directive: %HTML.DefinitionID. - If someone else attempts to use the default configuration, these two - pieces of code will not clobber each other in the cache, since one has - an extra directive attached to it. -

-

- You must specify a value to this directive to use the - advanced API features. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt deleted file mode 100644 index 229ae0267..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.DefinitionRev.txt +++ /dev/null @@ -1,16 +0,0 @@ -HTML.DefinitionRev -TYPE: int -VERSION: 2.0.0 -DEFAULT: 1 ---DESCRIPTION-- - -

- Revision identifier for your custom definition specified in - %HTML.DefinitionID. This serves the same purpose: uniquely identifying - your custom definition, but this one does so in a chronological - context: revision 3 is more up-to-date then revision 2. Thus, when - this gets incremented, the cache handling is smart enough to clean - up any older revisions of your definition as well as flush the - cache. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt deleted file mode 100644 index 9dab497f2..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Doctype.txt +++ /dev/null @@ -1,11 +0,0 @@ -HTML.Doctype -TYPE: string/null -DEFAULT: NULL ---DESCRIPTION-- -Doctype to use during filtering. Technically speaking this is not actually -a doctype (as it does not identify a corresponding DTD), but we are using -this name for sake of simplicity. When non-blank, this will override any -older directives like %HTML.XHTML or %HTML.Strict. ---ALLOWED-- -'HTML 4.01 Transitional', 'HTML 4.01 Strict', 'XHTML 1.0 Transitional', 'XHTML 1.0 Strict', 'XHTML 1.1' ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt deleted file mode 100644 index 57358f9ba..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenAttributes.txt +++ /dev/null @@ -1,21 +0,0 @@ -HTML.ForbiddenAttributes -TYPE: lookup -VERSION: 3.1.0 -DEFAULT: array() ---DESCRIPTION-- -

- While this directive is similar to %HTML.AllowedAttributes, for - forwards-compatibility with XML, this attribute has a different syntax. Instead of - tag.attr, use tag@attr. To disallow href - attributes in a tags, set this directive to - a@href. You can also disallow an attribute globally with - attr or *@attr (either syntax is fine; the latter - is provided for consistency with %HTML.AllowedAttributes). -

-

- Warning: This directive complements %HTML.ForbiddenElements, - accordingly, check - out that directive for a discussion of why you - should think twice before using this directive. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt deleted file mode 100644 index 93a53e14f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.ForbiddenElements.txt +++ /dev/null @@ -1,20 +0,0 @@ -HTML.ForbiddenElements -TYPE: lookup -VERSION: 3.1.0 -DEFAULT: array() ---DESCRIPTION-- -

- This was, perhaps, the most requested feature ever in HTML - Purifier. Please don't abuse it! This is the logical inverse of - %HTML.AllowedElements, and it will override that directive, or any - other directive. -

-

- If possible, %HTML.Allowed is recommended over this directive, because it - can sometimes be difficult to tell whether or not you've forbidden all of - the behavior you would like to disallow. If you forbid img - with the expectation of preventing images on your site, you'll be in for - a nasty surprise when people start using the background-image - CSS property. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt deleted file mode 100644 index e424c386e..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.MaxImgLength.txt +++ /dev/null @@ -1,14 +0,0 @@ -HTML.MaxImgLength -TYPE: int/null -DEFAULT: 1200 -VERSION: 3.1.1 ---DESCRIPTION-- -

- This directive controls the maximum number of pixels in the width and - height attributes in img tags. This is - in place to prevent imagecrash attacks, disable with null at your own risk. - This directive is similar to %CSS.MaxImgLength, and both should be - concurrently edited, although there are - subtle differences in the input format (the HTML max is an integer). -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt deleted file mode 100644 index 62e8e160c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Parent.txt +++ /dev/null @@ -1,12 +0,0 @@ -HTML.Parent -TYPE: string -VERSION: 1.3.0 -DEFAULT: 'div' ---DESCRIPTION-- - -

- String name of element that HTML fragment passed to library will be - inserted in. An interesting variation would be using span as the - parent element, meaning that only inline tags would be allowed. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt deleted file mode 100644 index dfb720496..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Proprietary.txt +++ /dev/null @@ -1,12 +0,0 @@ -HTML.Proprietary -TYPE: bool -VERSION: 3.1.0 -DEFAULT: false ---DESCRIPTION-- -

- Whether or not to allow proprietary elements and attributes in your - documents, as per HTMLPurifier_HTMLModule_Proprietary. - Warning: This can cause your documents to stop - validating! -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt deleted file mode 100644 index f635a6854..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeEmbed.txt +++ /dev/null @@ -1,14 +0,0 @@ -HTML.SafeEmbed -TYPE: bool -VERSION: 3.1.1 -DEFAULT: false ---DESCRIPTION-- -

- Whether or not to permit embed tags in documents, with a number of extra - security features added to prevent script execution. This is similar to - what websites like MySpace do to embed tags. Embed is a proprietary - element and will cause your website to stop validating. You probably want - to enable this with %HTML.SafeObject. - Highly experimental. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt deleted file mode 100644 index 32967b88f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.SafeObject.txt +++ /dev/null @@ -1,14 +0,0 @@ -HTML.SafeObject -TYPE: bool -VERSION: 3.1.1 -DEFAULT: false ---DESCRIPTION-- -

- Whether or not to permit object tags in documents, with a number of extra - security features added to prevent script execution. This is similar to - what websites like MySpace do to object tags. You may also want to - enable %HTML.SafeEmbed for maximum interoperability with Internet Explorer, - although embed tags will cause your website to stop validating. - Highly experimental. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt deleted file mode 100644 index a8b1de56b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Strict.txt +++ /dev/null @@ -1,9 +0,0 @@ -HTML.Strict -TYPE: bool -VERSION: 1.3.0 -DEFAULT: false -DEPRECATED-VERSION: 1.7.0 -DEPRECATED-USE: HTML.Doctype ---DESCRIPTION-- -Determines whether or not to use Transitional (loose) or Strict rulesets. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt deleted file mode 100644 index b4c271b7f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyAdd.txt +++ /dev/null @@ -1,8 +0,0 @@ -HTML.TidyAdd -TYPE: lookup -VERSION: 2.0.0 -DEFAULT: array() ---DESCRIPTION-- - -Fixes to add to the default set of Tidy fixes as per your level. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt deleted file mode 100644 index 4186ccd0d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyLevel.txt +++ /dev/null @@ -1,24 +0,0 @@ -HTML.TidyLevel -TYPE: string -VERSION: 2.0.0 -DEFAULT: 'medium' ---DESCRIPTION-- - -

General level of cleanliness the Tidy module should enforce. -There are four allowed values:

-
-
none
-
No extra tidying should be done
-
light
-
Only fix elements that would be discarded otherwise due to - lack of support in doctype
-
medium
-
Enforce best practices
-
heavy
-
Transform all deprecated elements and attributes to standards - compliant equivalents
-
- ---ALLOWED-- -'none', 'light', 'medium', 'heavy' ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt deleted file mode 100644 index 996762bd1..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.TidyRemove.txt +++ /dev/null @@ -1,8 +0,0 @@ -HTML.TidyRemove -TYPE: lookup -VERSION: 2.0.0 -DEFAULT: array() ---DESCRIPTION-- - -Fixes to remove from the default set of Tidy fixes as per your level. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt deleted file mode 100644 index 89133b1a3..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.Trusted.txt +++ /dev/null @@ -1,8 +0,0 @@ -HTML.Trusted -TYPE: bool -VERSION: 2.0.0 -DEFAULT: false ---DESCRIPTION-- -Indicates whether or not the user input is trusted or not. If the input is -trusted, a more expansive set of allowed tags and attributes will be used. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt deleted file mode 100644 index 2a47e384f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/HTML.XHTML.txt +++ /dev/null @@ -1,11 +0,0 @@ -HTML.XHTML -TYPE: bool -DEFAULT: true -VERSION: 1.1.0 -DEPRECATED-VERSION: 1.7.0 -DEPRECATED-USE: HTML.Doctype ---DESCRIPTION-- -Determines whether or not output is XHTML 1.0 or HTML 4.01 flavor. ---ALIASES-- -Core.XHTML ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt deleted file mode 100644 index 08921fde7..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.CommentScriptContents.txt +++ /dev/null @@ -1,10 +0,0 @@ -Output.CommentScriptContents -TYPE: bool -VERSION: 2.0.0 -DEFAULT: true ---DESCRIPTION-- -Determines whether or not HTML Purifier should attempt to fix up the -contents of script tags for legacy browsers with comments. ---ALIASES-- -Core.CommentScriptContents ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt deleted file mode 100644 index 79f8ad82c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.Newline.txt +++ /dev/null @@ -1,13 +0,0 @@ -Output.Newline -TYPE: string/null -VERSION: 2.0.1 -DEFAULT: NULL ---DESCRIPTION-- - -

- Newline string to format final output with. If left null, HTML Purifier - will auto-detect the default newline type of the system and use that; - you can manually override it here. Remember, \r\n is Windows, \r - is Mac, and \n is Unix. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt deleted file mode 100644 index 232b02362..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.SortAttr.txt +++ /dev/null @@ -1,14 +0,0 @@ -Output.SortAttr -TYPE: bool -VERSION: 3.2.0 -DEFAULT: false ---DESCRIPTION-- -

- If true, HTML Purifier will sort attributes by name before writing them back - to the document, converting a tag like: <el b="" a="" c="" /> - to <el a="" b="" c="" />. This is a workaround for - a bug in FCKeditor which causes it to swap attributes order, adding noise - to text diffs. If you're not seeing this bug, chances are, you don't need - this directive. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt deleted file mode 100644 index 06bab00a0..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Output.TidyFormat.txt +++ /dev/null @@ -1,25 +0,0 @@ -Output.TidyFormat -TYPE: bool -VERSION: 1.1.1 -DEFAULT: false ---DESCRIPTION-- -

- Determines whether or not to run Tidy on the final output for pretty - formatting reasons, such as indentation and wrap. -

-

- This can greatly improve readability for editors who are hand-editing - the HTML, but is by no means necessary as HTML Purifier has already - fixed all major errors the HTML may have had. Tidy is a non-default - extension, and this directive will silently fail if Tidy is not - available. -

-

- If you are looking to make the overall look of your page's source - better, I recommend running Tidy on the entire page rather than just - user-content (after all, the indentation relative to the containing - blocks will be incorrect). -

---ALIASES-- -Core.TidyFormat ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt deleted file mode 100644 index 071bc0295..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/Test.ForceNoIconv.txt +++ /dev/null @@ -1,7 +0,0 @@ -Test.ForceNoIconv -TYPE: bool -DEFAULT: false ---DESCRIPTION-- -When set to true, HTMLPurifier_Encoder will act as if iconv does not exist -and use only pure PHP implementations. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt deleted file mode 100644 index 98fdfe922..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.AllowedSchemes.txt +++ /dev/null @@ -1,15 +0,0 @@ -URI.AllowedSchemes -TYPE: lookup ---DEFAULT-- -array ( - 'http' => true, - 'https' => true, - 'mailto' => true, - 'ftp' => true, - 'nntp' => true, - 'news' => true, -) ---DESCRIPTION-- -Whitelist that defines the schemes that a URI is allowed to have. This -prevents XSS attacks from using pseudo-schemes like javascript or mocha. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt deleted file mode 100644 index 876f0680c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Base.txt +++ /dev/null @@ -1,17 +0,0 @@ -URI.Base -TYPE: string/null -VERSION: 2.1.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- The base URI is the URI of the document this purified HTML will be - inserted into. This information is important if HTML Purifier needs - to calculate absolute URIs from relative URIs, such as when %URI.MakeAbsolute - is on. You may use a non-absolute URI for this value, but behavior - may vary (%URI.MakeAbsolute deals nicely with both absolute and - relative paths, but forwards-compatibility is not guaranteed). - Warning: If set, the scheme on this URI - overrides the one specified by %URI.DefaultScheme. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt deleted file mode 100644 index 728e378cb..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefaultScheme.txt +++ /dev/null @@ -1,10 +0,0 @@ -URI.DefaultScheme -TYPE: string -DEFAULT: 'http' ---DESCRIPTION-- - -

- Defines through what scheme the output will be served, in order to - select the proper object validator when no scheme information is present. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt deleted file mode 100644 index f05312ba8..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionID.txt +++ /dev/null @@ -1,11 +0,0 @@ -URI.DefinitionID -TYPE: string/null -VERSION: 2.1.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- Unique identifier for a custom-built URI definition. If you want - to add custom URIFilters, you must specify this value. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt deleted file mode 100644 index 80cfea93f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DefinitionRev.txt +++ /dev/null @@ -1,11 +0,0 @@ -URI.DefinitionRev -TYPE: int -VERSION: 2.1.0 -DEFAULT: 1 ---DESCRIPTION-- - -

- Revision identifier for your custom definition. See - %HTML.DefinitionRev for details. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt deleted file mode 100644 index 71ce025a2..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Disable.txt +++ /dev/null @@ -1,14 +0,0 @@ -URI.Disable -TYPE: bool -VERSION: 1.3.0 -DEFAULT: false ---DESCRIPTION-- - -

- Disables all URIs in all forms. Not sure why you'd want to do that - (after all, the Internet's founded on the notion of a hyperlink). -

- ---ALIASES-- -Attr.DisableURI ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt deleted file mode 100644 index 13c122c8c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternal.txt +++ /dev/null @@ -1,11 +0,0 @@ -URI.DisableExternal -TYPE: bool -VERSION: 1.2.0 -DEFAULT: false ---DESCRIPTION-- -Disables links to external websites. This is a highly effective anti-spam -and anti-pagerank-leech measure, but comes at a hefty price: nolinks or -images outside of your domain will be allowed. Non-linkified URIs will -still be preserved. If you want to be able to link to subdomains or use -absolute URIs, specify %URI.Host for your website. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt deleted file mode 100644 index abcc1efd6..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableExternalResources.txt +++ /dev/null @@ -1,13 +0,0 @@ -URI.DisableExternalResources -TYPE: bool -VERSION: 1.3.0 -DEFAULT: false ---DESCRIPTION-- -Disables the embedding of external resources, preventing users from -embedding things like images from other hosts. This prevents access -tracking (good for email viewers), bandwidth leeching, cross-site request -forging, goatse.cx posting, and other nasties, but also results in a loss -of end-user functionality (they can't directly post a pic they posted from -Flickr anymore). Use it if you don't have a robust user-content moderation -team. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt deleted file mode 100644 index 51e6ea91f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.DisableResources.txt +++ /dev/null @@ -1,12 +0,0 @@ -URI.DisableResources -TYPE: bool -VERSION: 1.3.0 -DEFAULT: false ---DESCRIPTION-- - -

- Disables embedding resources, essentially meaning no pictures. You can - still link to them though. See %URI.DisableExternalResources for why - this might be a good idea. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt deleted file mode 100644 index ee83b121d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Host.txt +++ /dev/null @@ -1,19 +0,0 @@ -URI.Host -TYPE: string/null -VERSION: 1.2.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- Defines the domain name of the server, so we can determine whether or - an absolute URI is from your website or not. Not strictly necessary, - as users should be using relative URIs to reference resources on your - website. It will, however, let you use absolute URIs to link to - subdomains of the domain you post here: i.e. example.com will allow - sub.example.com. However, higher up domains will still be excluded: - if you set %URI.Host to sub.example.com, example.com will be blocked. - Note: This directive overrides %URI.Base because - a given page may be on a sub-domain, but you wish HTML Purifier to be - more relaxed and allow some of the parent domains too. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt deleted file mode 100644 index 0b6df7625..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.HostBlacklist.txt +++ /dev/null @@ -1,9 +0,0 @@ -URI.HostBlacklist -TYPE: list -VERSION: 1.3.0 -DEFAULT: array() ---DESCRIPTION-- -List of strings that are forbidden in the host of any URI. Use it to kill -domain names of spam, etc. Note that it will catch anything in the domain, -so moo.com will catch moo.com.example.com. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt deleted file mode 100644 index 4214900a5..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MakeAbsolute.txt +++ /dev/null @@ -1,13 +0,0 @@ -URI.MakeAbsolute -TYPE: bool -VERSION: 2.1.0 -DEFAULT: false ---DESCRIPTION-- - -

- Converts all URIs into absolute forms. This is useful when the HTML - being filtered assumes a specific base path, but will actually be - viewed in a different context (and setting an alternate base URI is - not possible). %URI.Base must be set for this directive to work. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt deleted file mode 100644 index 58c81dcc4..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.Munge.txt +++ /dev/null @@ -1,83 +0,0 @@ -URI.Munge -TYPE: string/null -VERSION: 1.3.0 -DEFAULT: NULL ---DESCRIPTION-- - -

- Munges all browsable (usually http, https and ftp) - absolute URIs into another URI, usually a URI redirection service. - This directive accepts a URI, formatted with a %s where - the url-encoded original URI should be inserted (sample: - http://www.google.com/url?q=%s). -

-

- Uses for this directive: -

-
    -
  • - Prevent PageRank leaks, while being fairly transparent - to users (you may also want to add some client side JavaScript to - override the text in the statusbar). Notice: - Many security experts believe that this form of protection does not deter spam-bots. -
  • -
  • - Redirect users to a splash page telling them they are leaving your - website. While this is poor usability practice, it is often mandated - in corporate environments. -
  • -
-

- Prior to HTML Purifier 3.1.1, this directive also enabled the munging - of browsable external resources, which could break things if your redirection - script was a splash page or used meta tags. To revert to - previous behavior, please use %URI.MungeResources. -

-

- You may want to also use %URI.MungeSecretKey along with this directive - in order to enforce what URIs your redirector script allows. Open - redirector scripts can be a security risk and negatively affect the - reputation of your domain name. -

-

- Starting with HTML Purifier 3.1.1, there is also these substitutions: -

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
KeyDescriptionExample <a href="">
%r1 - The URI embeds a resource
(blank) - The URI is merely a link
%nThe name of the tag this URI came froma
%mThe name of the attribute this URI came fromhref
%pThe name of the CSS property this URI came from, or blank if irrelevant
-

- Admittedly, these letters are somewhat arbitrary; the only stipulation - was that they couldn't be a through f. r is for resource (I would have preferred - e, but you take what you can get), n is for name, m - was picked because it came after n (and I couldn't use a), p is for - property. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt deleted file mode 100644 index 6fce0fdc3..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeResources.txt +++ /dev/null @@ -1,17 +0,0 @@ -URI.MungeResources -TYPE: bool -VERSION: 3.1.1 -DEFAULT: false ---DESCRIPTION-- -

- If true, any URI munging directives like %URI.Munge - will also apply to embedded resources, such as <img src="">. - Be careful enabling this directive if you have a redirector script - that does not use the Location HTTP header; all of your images - and other embedded resources will break. -

-

- Warning: It is strongly advised you use this in conjunction - %URI.MungeSecretKey to mitigate the security risk of an open redirector. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt deleted file mode 100644 index 0d00f62ea..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.MungeSecretKey.txt +++ /dev/null @@ -1,30 +0,0 @@ -URI.MungeSecretKey -TYPE: string/null -VERSION: 3.1.1 -DEFAULT: NULL ---DESCRIPTION-- -

- This directive enables secure checksum generation along with %URI.Munge. - It should be set to a secure key that is not shared with anyone else. - The checksum can be placed in the URI using %t. Use of this checksum - affords an additional level of protection by allowing a redirector - to check if a URI has passed through HTML Purifier with this line: -

- -
$checksum === sha1($secret_key . ':' . $url)
- -

- If the output is TRUE, the redirector script should accept the URI. -

- -

- Please note that it would still be possible for an attacker to procure - secure hashes en-mass by abusing your website's Preview feature or the - like, but this service affords an additional level of protection - that should be combined with website blacklisting. -

- -

- Remember this has no effect if %URI.Munge is not on. -

---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt deleted file mode 100644 index 23331a4e7..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/URI.OverrideAllowedSchemes.txt +++ /dev/null @@ -1,9 +0,0 @@ -URI.OverrideAllowedSchemes -TYPE: bool -DEFAULT: true ---DESCRIPTION-- -If this is set to true (which it is by default), you can override -%URI.AllowedSchemes by simply registering a HTMLPurifier_URIScheme to the -registry. If false, you will also have to update that directive in order -to add more schemes. ---# vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini b/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini deleted file mode 100644 index 5de4505e1..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ConfigSchema/schema/info.ini +++ /dev/null @@ -1,3 +0,0 @@ -name = "HTML Purifier" - -; vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ContentSets.php b/extlib/HTMLPurifier/HTMLPurifier/ContentSets.php deleted file mode 100644 index 3b6e96f5f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ContentSets.php +++ /dev/null @@ -1,155 +0,0 @@ - true) indexed by name. - * @note This is in HTMLPurifier_HTMLDefinition->info_content_sets - */ - public $lookup = array(); - - /** - * Synchronized list of defined content sets (keys of info) - */ - protected $keys = array(); - /** - * Synchronized list of defined content values (values of info) - */ - protected $values = array(); - - /** - * Merges in module's content sets, expands identifiers in the content - * sets and populates the keys, values and lookup member variables. - * @param $modules List of HTMLPurifier_HTMLModule - */ - public function __construct($modules) { - if (!is_array($modules)) $modules = array($modules); - // populate content_sets based on module hints - // sorry, no way of overloading - foreach ($modules as $module_i => $module) { - foreach ($module->content_sets as $key => $value) { - $temp = $this->convertToLookup($value); - if (isset($this->lookup[$key])) { - // add it into the existing content set - $this->lookup[$key] = array_merge($this->lookup[$key], $temp); - } else { - $this->lookup[$key] = $temp; - } - } - } - $old_lookup = false; - while ($old_lookup !== $this->lookup) { - $old_lookup = $this->lookup; - foreach ($this->lookup as $i => $set) { - $add = array(); - foreach ($set as $element => $x) { - if (isset($this->lookup[$element])) { - $add += $this->lookup[$element]; - unset($this->lookup[$i][$element]); - } - } - $this->lookup[$i] += $add; - } - } - - foreach ($this->lookup as $key => $lookup) { - $this->info[$key] = implode(' | ', array_keys($lookup)); - } - $this->keys = array_keys($this->info); - $this->values = array_values($this->info); - } - - /** - * Accepts a definition; generates and assigns a ChildDef for it - * @param $def HTMLPurifier_ElementDef reference - * @param $module Module that defined the ElementDef - */ - public function generateChildDef(&$def, $module) { - if (!empty($def->child)) return; // already done! - $content_model = $def->content_model; - if (is_string($content_model)) { - // Assume that $this->keys is alphanumeric - $def->content_model = preg_replace_callback( - '/\b(' . implode('|', $this->keys) . ')\b/', - array($this, 'generateChildDefCallback'), - $content_model - ); - //$def->content_model = str_replace( - // $this->keys, $this->values, $content_model); - } - $def->child = $this->getChildDef($def, $module); - } - - public function generateChildDefCallback($matches) { - return $this->info[$matches[0]]; - } - - /** - * Instantiates a ChildDef based on content_model and content_model_type - * member variables in HTMLPurifier_ElementDef - * @note This will also defer to modules for custom HTMLPurifier_ChildDef - * subclasses that need content set expansion - * @param $def HTMLPurifier_ElementDef to have ChildDef extracted - * @return HTMLPurifier_ChildDef corresponding to ElementDef - */ - public function getChildDef($def, $module) { - $value = $def->content_model; - if (is_object($value)) { - trigger_error( - 'Literal object child definitions should be stored in '. - 'ElementDef->child not ElementDef->content_model', - E_USER_NOTICE - ); - return $value; - } - switch ($def->content_model_type) { - case 'required': - return new HTMLPurifier_ChildDef_Required($value); - case 'optional': - return new HTMLPurifier_ChildDef_Optional($value); - case 'empty': - return new HTMLPurifier_ChildDef_Empty(); - case 'custom': - return new HTMLPurifier_ChildDef_Custom($value); - } - // defer to its module - $return = false; - if ($module->defines_child_def) { // save a func call - $return = $module->getChildDef($def); - } - if ($return !== false) return $return; - // error-out - trigger_error( - 'Could not determine which ChildDef class to instantiate', - E_USER_ERROR - ); - return false; - } - - /** - * Converts a string list of elements separated by pipes into - * a lookup array. - * @param $string List of elements - * @return Lookup array of elements - */ - protected function convertToLookup($string) { - $array = explode('|', str_replace(' ', '', $string)); - $ret = array(); - foreach ($array as $i => $k) { - $ret[$k] = true; - } - return $ret; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Context.php b/extlib/HTMLPurifier/HTMLPurifier/Context.php deleted file mode 100644 index 9ddf0c547..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Context.php +++ /dev/null @@ -1,82 +0,0 @@ -_storage[$name])) { - trigger_error("Name $name produces collision, cannot re-register", - E_USER_ERROR); - return; - } - $this->_storage[$name] =& $ref; - } - - /** - * Retrieves a variable reference from the context. - * @param $name String name - * @param $ignore_error Boolean whether or not to ignore error - */ - public function &get($name, $ignore_error = false) { - if (!isset($this->_storage[$name])) { - if (!$ignore_error) { - trigger_error("Attempted to retrieve non-existent variable $name", - E_USER_ERROR); - } - $var = null; // so we can return by reference - return $var; - } - return $this->_storage[$name]; - } - - /** - * Destorys a variable in the context. - * @param $name String name - */ - public function destroy($name) { - if (!isset($this->_storage[$name])) { - trigger_error("Attempted to destroy non-existent variable $name", - E_USER_ERROR); - return; - } - unset($this->_storage[$name]); - } - - /** - * Checks whether or not the variable exists. - * @param $name String name - */ - public function exists($name) { - return isset($this->_storage[$name]); - } - - /** - * Loads a series of variables from an associative array - * @param $context_array Assoc array of variables to load - */ - public function loadArray($context_array) { - foreach ($context_array as $key => $discard) { - $this->register($key, $context_array[$key]); - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Definition.php b/extlib/HTMLPurifier/HTMLPurifier/Definition.php deleted file mode 100644 index a7408c974..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Definition.php +++ /dev/null @@ -1,39 +0,0 @@ -setup) return; - $this->setup = true; - $this->doSetup($config); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache.php b/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache.php deleted file mode 100644 index c6e1e388c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache.php +++ /dev/null @@ -1,108 +0,0 @@ -type = $type; - } - - /** - * Generates a unique identifier for a particular configuration - * @param Instance of HTMLPurifier_Config - */ - public function generateKey($config) { - return $config->version . ',' . // possibly replace with function calls - $config->getBatchSerial($this->type) . ',' . - $config->get($this->type . '.DefinitionRev'); - } - - /** - * Tests whether or not a key is old with respect to the configuration's - * version and revision number. - * @param $key Key to test - * @param $config Instance of HTMLPurifier_Config to test against - */ - public function isOld($key, $config) { - if (substr_count($key, ',') < 2) return true; - list($version, $hash, $revision) = explode(',', $key, 3); - $compare = version_compare($version, $config->version); - // version mismatch, is always old - if ($compare != 0) return true; - // versions match, ids match, check revision number - if ( - $hash == $config->getBatchSerial($this->type) && - $revision < $config->get($this->type . '.DefinitionRev') - ) return true; - return false; - } - - /** - * Checks if a definition's type jives with the cache's type - * @note Throws an error on failure - * @param $def Definition object to check - * @return Boolean true if good, false if not - */ - public function checkDefType($def) { - if ($def->type !== $this->type) { - trigger_error("Cannot use definition of type {$def->type} in cache for {$this->type}"); - return false; - } - return true; - } - - /** - * Adds a definition object to the cache - */ - abstract public function add($def, $config); - - /** - * Unconditionally saves a definition object to the cache - */ - abstract public function set($def, $config); - - /** - * Replace an object in the cache - */ - abstract public function replace($def, $config); - - /** - * Retrieves a definition object from the cache - */ - abstract public function get($config); - - /** - * Removes a definition object to the cache - */ - abstract public function remove($config); - - /** - * Clears all objects from cache - */ - abstract public function flush($config); - - /** - * Clears all expired (older version or revision) objects from cache - * @note Be carefuly implementing this method as flush. Flush must - * not interfere with other Definition types, and cleanup() - * should not be repeatedly called by userland code. - */ - abstract public function cleanup($config); - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php b/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php deleted file mode 100644 index b0fb6d0cd..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator.php +++ /dev/null @@ -1,62 +0,0 @@ -copy(); - // reference is necessary for mocks in PHP 4 - $decorator->cache =& $cache; - $decorator->type = $cache->type; - return $decorator; - } - - /** - * Cross-compatible clone substitute - */ - public function copy() { - return new HTMLPurifier_DefinitionCache_Decorator(); - } - - public function add($def, $config) { - return $this->cache->add($def, $config); - } - - public function set($def, $config) { - return $this->cache->set($def, $config); - } - - public function replace($def, $config) { - return $this->cache->replace($def, $config); - } - - public function get($config) { - return $this->cache->get($config); - } - - public function remove($config) { - return $this->cache->remove($config); - } - - public function flush($config) { - return $this->cache->flush($config); - } - - public function cleanup($config) { - return $this->cache->cleanup($config); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php b/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php deleted file mode 100644 index d4cc35c4b..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Cleanup.php +++ /dev/null @@ -1,43 +0,0 @@ -definitions[$this->generateKey($config)] = $def; - return $status; - } - - public function set($def, $config) { - $status = parent::set($def, $config); - if ($status) $this->definitions[$this->generateKey($config)] = $def; - return $status; - } - - public function replace($def, $config) { - $status = parent::replace($def, $config); - if ($status) $this->definitions[$this->generateKey($config)] = $def; - return $status; - } - - public function get($config) { - $key = $this->generateKey($config); - if (isset($this->definitions[$key])) return $this->definitions[$key]; - $this->definitions[$key] = parent::get($config); - return $this->definitions[$key]; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in b/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in deleted file mode 100644 index 21a8fcfda..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Decorator/Template.php.in +++ /dev/null @@ -1,47 +0,0 @@ -checkDefType($def)) return; - $file = $this->generateFilePath($config); - if (file_exists($file)) return false; - if (!$this->_prepareDir($config)) return false; - return $this->_write($file, serialize($def)); - } - - public function set($def, $config) { - if (!$this->checkDefType($def)) return; - $file = $this->generateFilePath($config); - if (!$this->_prepareDir($config)) return false; - return $this->_write($file, serialize($def)); - } - - public function replace($def, $config) { - if (!$this->checkDefType($def)) return; - $file = $this->generateFilePath($config); - if (!file_exists($file)) return false; - if (!$this->_prepareDir($config)) return false; - return $this->_write($file, serialize($def)); - } - - public function get($config) { - $file = $this->generateFilePath($config); - if (!file_exists($file)) return false; - return unserialize(file_get_contents($file)); - } - - public function remove($config) { - $file = $this->generateFilePath($config); - if (!file_exists($file)) return false; - return unlink($file); - } - - public function flush($config) { - if (!$this->_prepareDir($config)) return false; - $dir = $this->generateDirectoryPath($config); - $dh = opendir($dir); - while (false !== ($filename = readdir($dh))) { - if (empty($filename)) continue; - if ($filename[0] === '.') continue; - unlink($dir . '/' . $filename); - } - } - - public function cleanup($config) { - if (!$this->_prepareDir($config)) return false; - $dir = $this->generateDirectoryPath($config); - $dh = opendir($dir); - while (false !== ($filename = readdir($dh))) { - if (empty($filename)) continue; - if ($filename[0] === '.') continue; - $key = substr($filename, 0, strlen($filename) - 4); - if ($this->isOld($key, $config)) unlink($dir . '/' . $filename); - } - } - - /** - * Generates the file path to the serial file corresponding to - * the configuration and definition name - * @todo Make protected - */ - public function generateFilePath($config) { - $key = $this->generateKey($config); - return $this->generateDirectoryPath($config) . '/' . $key . '.ser'; - } - - /** - * Generates the path to the directory contain this cache's serial files - * @note No trailing slash - * @todo Make protected - */ - public function generateDirectoryPath($config) { - $base = $this->generateBaseDirectoryPath($config); - return $base . '/' . $this->type; - } - - /** - * Generates path to base directory that contains all definition type - * serials - * @todo Make protected - */ - public function generateBaseDirectoryPath($config) { - $base = $config->get('Cache.SerializerPath'); - $base = is_null($base) ? HTMLPURIFIER_PREFIX . '/HTMLPurifier/DefinitionCache/Serializer' : $base; - return $base; - } - - /** - * Convenience wrapper function for file_put_contents - * @param $file File name to write to - * @param $data Data to write into file - * @return Number of bytes written if success, or false if failure. - */ - private function _write($file, $data) { - return file_put_contents($file, $data); - } - - /** - * Prepares the directory that this type stores the serials in - * @return True if successful - */ - private function _prepareDir($config) { - $directory = $this->generateDirectoryPath($config); - if (!is_dir($directory)) { - $base = $this->generateBaseDirectoryPath($config); - if (!is_dir($base)) { - trigger_error('Base directory '.$base.' does not exist, - please create or change using %Cache.SerializerPath', - E_USER_WARNING); - return false; - } elseif (!$this->_testPermissions($base)) { - return false; - } - $old = umask(0022); // disable group and world writes - mkdir($directory); - umask($old); - } elseif (!$this->_testPermissions($directory)) { - return false; - } - return true; - } - - /** - * Tests permissions on a directory and throws out friendly - * error messages and attempts to chmod it itself if possible - */ - private function _testPermissions($dir) { - // early abort, if it is writable, everything is hunky-dory - if (is_writable($dir)) return true; - if (!is_dir($dir)) { - // generally, you'll want to handle this beforehand - // so a more specific error message can be given - trigger_error('Directory '.$dir.' does not exist', - E_USER_WARNING); - return false; - } - if (function_exists('posix_getuid')) { - // POSIX system, we can give more specific advice - if (fileowner($dir) === posix_getuid()) { - // we can chmod it ourselves - chmod($dir, 0755); - return true; - } elseif (filegroup($dir) === posix_getgid()) { - $chmod = '775'; - } else { - // PHP's probably running as nobody, so we'll - // need to give global permissions - $chmod = '777'; - } - trigger_error('Directory '.$dir.' not writable, '. - 'please chmod to ' . $chmod, - E_USER_WARNING); - } else { - // generic error message - trigger_error('Directory '.$dir.' not writable, '. - 'please alter file permissions', - E_USER_WARNING); - } - return false; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README b/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README deleted file mode 100755 index 2e35c1c3d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCache/Serializer/README +++ /dev/null @@ -1,3 +0,0 @@ -This is a dummy file to prevent Git from ignoring this empty directory. - - vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php b/extlib/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php deleted file mode 100644 index a6ead6281..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/DefinitionCacheFactory.php +++ /dev/null @@ -1,91 +0,0 @@ - array()); - protected $implementations = array(); - protected $decorators = array(); - - /** - * Initialize default decorators - */ - public function setup() { - $this->addDecorator('Cleanup'); - } - - /** - * Retrieves an instance of global definition cache factory. - */ - public static function instance($prototype = null) { - static $instance; - if ($prototype !== null) { - $instance = $prototype; - } elseif ($instance === null || $prototype === true) { - $instance = new HTMLPurifier_DefinitionCacheFactory(); - $instance->setup(); - } - return $instance; - } - - /** - * Registers a new definition cache object - * @param $short Short name of cache object, for reference - * @param $long Full class name of cache object, for construction - */ - public function register($short, $long) { - $this->implementations[$short] = $long; - } - - /** - * Factory method that creates a cache object based on configuration - * @param $name Name of definitions handled by cache - * @param $config Instance of HTMLPurifier_Config - */ - public function create($type, $config) { - $method = $config->get('Cache.DefinitionImpl'); - if ($method === null) { - return new HTMLPurifier_DefinitionCache_Null($type); - } - if (!empty($this->caches[$method][$type])) { - return $this->caches[$method][$type]; - } - if ( - isset($this->implementations[$method]) && - class_exists($class = $this->implementations[$method], false) - ) { - $cache = new $class($type); - } else { - if ($method != 'Serializer') { - trigger_error("Unrecognized DefinitionCache $method, using Serializer instead", E_USER_WARNING); - } - $cache = new HTMLPurifier_DefinitionCache_Serializer($type); - } - foreach ($this->decorators as $decorator) { - $new_cache = $decorator->decorate($cache); - // prevent infinite recursion in PHP 4 - unset($cache); - $cache = $new_cache; - } - $this->caches[$method][$type] = $cache; - return $this->caches[$method][$type]; - } - - /** - * Registers a decorator to add to all new cache objects - * @param - */ - public function addDecorator($decorator) { - if (is_string($decorator)) { - $class = "HTMLPurifier_DefinitionCache_Decorator_$decorator"; - $decorator = new $class; - } - $this->decorators[$decorator->name] = $decorator; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Doctype.php b/extlib/HTMLPurifier/HTMLPurifier/Doctype.php deleted file mode 100644 index 1e3c574c0..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Doctype.php +++ /dev/null @@ -1,60 +0,0 @@ -renderDoctype. - * If structure changes, please update that function. - */ -class HTMLPurifier_Doctype -{ - /** - * Full name of doctype - */ - public $name; - - /** - * List of standard modules (string identifiers or literal objects) - * that this doctype uses - */ - public $modules = array(); - - /** - * List of modules to use for tidying up code - */ - public $tidyModules = array(); - - /** - * Is the language derived from XML (i.e. XHTML)? - */ - public $xml = true; - - /** - * List of aliases for this doctype - */ - public $aliases = array(); - - /** - * Public DTD identifier - */ - public $dtdPublic; - - /** - * System DTD identifier - */ - public $dtdSystem; - - public function __construct($name = null, $xml = true, $modules = array(), - $tidyModules = array(), $aliases = array(), $dtd_public = null, $dtd_system = null - ) { - $this->name = $name; - $this->xml = $xml; - $this->modules = $modules; - $this->tidyModules = $tidyModules; - $this->aliases = $aliases; - $this->dtdPublic = $dtd_public; - $this->dtdSystem = $dtd_system; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php b/extlib/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php deleted file mode 100644 index 86049e939..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/DoctypeRegistry.php +++ /dev/null @@ -1,103 +0,0 @@ -doctypes[$doctype->name] = $doctype; - $name = $doctype->name; - // hookup aliases - foreach ($doctype->aliases as $alias) { - if (isset($this->doctypes[$alias])) continue; - $this->aliases[$alias] = $name; - } - // remove old aliases - if (isset($this->aliases[$name])) unset($this->aliases[$name]); - return $doctype; - } - - /** - * Retrieves reference to a doctype of a certain name - * @note This function resolves aliases - * @note When possible, use the more fully-featured make() - * @param $doctype Name of doctype - * @return Editable doctype object - */ - public function get($doctype) { - if (isset($this->aliases[$doctype])) $doctype = $this->aliases[$doctype]; - if (!isset($this->doctypes[$doctype])) { - trigger_error('Doctype ' . htmlspecialchars($doctype) . ' does not exist', E_USER_ERROR); - $anon = new HTMLPurifier_Doctype($doctype); - return $anon; - } - return $this->doctypes[$doctype]; - } - - /** - * Creates a doctype based on a configuration object, - * will perform initialization on the doctype - * @note Use this function to get a copy of doctype that config - * can hold on to (this is necessary in order to tell - * Generator whether or not the current document is XML - * based or not). - */ - public function make($config) { - return clone $this->get($this->getDoctypeFromConfig($config)); - } - - /** - * Retrieves the doctype from the configuration object - */ - public function getDoctypeFromConfig($config) { - // recommended test - $doctype = $config->get('HTML.Doctype'); - if (!empty($doctype)) return $doctype; - $doctype = $config->get('HTML.CustomDoctype'); - if (!empty($doctype)) return $doctype; - // backwards-compatibility - if ($config->get('HTML.XHTML')) { - $doctype = 'XHTML 1.0'; - } else { - $doctype = 'HTML 4.01'; - } - if ($config->get('HTML.Strict')) { - $doctype .= ' Strict'; - } else { - $doctype .= ' Transitional'; - } - return $doctype; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ElementDef.php b/extlib/HTMLPurifier/HTMLPurifier/ElementDef.php deleted file mode 100644 index aede2c3bb..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ElementDef.php +++ /dev/null @@ -1,176 +0,0 @@ -setup(), this array may also - * contain an array at index 0 that indicates which attribute - * collections to load into the full array. It may also - * contain string indentifiers in lieu of HTMLPurifier_AttrDef, - * see HTMLPurifier_AttrTypes on how they are expanded during - * HTMLPurifier_HTMLDefinition->setup() processing. - */ - public $attr = array(); - - /** - * Indexed list of tag's HTMLPurifier_AttrTransform to be done before validation - */ - public $attr_transform_pre = array(); - - /** - * Indexed list of tag's HTMLPurifier_AttrTransform to be done after validation - */ - public $attr_transform_post = array(); - - /** - * HTMLPurifier_ChildDef of this tag. - */ - public $child; - - /** - * Abstract string representation of internal ChildDef rules. See - * HTMLPurifier_ContentSets for how this is parsed and then transformed - * into an HTMLPurifier_ChildDef. - * @warning This is a temporary variable that is not available after - * being processed by HTMLDefinition - */ - public $content_model; - - /** - * Value of $child->type, used to determine which ChildDef to use, - * used in combination with $content_model. - * @warning This must be lowercase - * @warning This is a temporary variable that is not available after - * being processed by HTMLDefinition - */ - public $content_model_type; - - - - /** - * Does the element have a content model (#PCDATA | Inline)*? This - * is important for chameleon ins and del processing in - * HTMLPurifier_ChildDef_Chameleon. Dynamically set: modules don't - * have to worry about this one. - */ - public $descendants_are_inline = false; - - /** - * List of the names of required attributes this element has. Dynamically - * populated by HTMLPurifier_HTMLDefinition::getElement - */ - public $required_attr = array(); - - /** - * Lookup table of tags excluded from all descendants of this tag. - * @note SGML permits exclusions for all descendants, but this is - * not possible with DTDs or XML Schemas. W3C has elected to - * use complicated compositions of content_models to simulate - * exclusion for children, but we go the simpler, SGML-style - * route of flat-out exclusions, which correctly apply to - * all descendants and not just children. Note that the XHTML - * Modularization Abstract Modules are blithely unaware of such - * distinctions. - */ - public $excludes = array(); - - /** - * This tag is explicitly auto-closed by the following tags. - */ - public $autoclose = array(); - - /** - * Whether or not this is a formatting element affected by the - * "Active Formatting Elements" algorithm. - */ - public $formatting; - - /** - * Low-level factory constructor for creating new standalone element defs - */ - public static function create($content_model, $content_model_type, $attr) { - $def = new HTMLPurifier_ElementDef(); - $def->content_model = $content_model; - $def->content_model_type = $content_model_type; - $def->attr = $attr; - return $def; - } - - /** - * Merges the values of another element definition into this one. - * Values from the new element def take precedence if a value is - * not mergeable. - */ - public function mergeIn($def) { - - // later keys takes precedence - foreach($def->attr as $k => $v) { - if ($k === 0) { - // merge in the includes - // sorry, no way to override an include - foreach ($v as $v2) { - $this->attr[0][] = $v2; - } - continue; - } - if ($v === false) { - if (isset($this->attr[$k])) unset($this->attr[$k]); - continue; - } - $this->attr[$k] = $v; - } - $this->_mergeAssocArray($this->attr_transform_pre, $def->attr_transform_pre); - $this->_mergeAssocArray($this->attr_transform_post, $def->attr_transform_post); - $this->_mergeAssocArray($this->excludes, $def->excludes); - - if(!empty($def->content_model)) { - $this->content_model = - str_replace("#SUPER", $this->content_model, $def->content_model); - $this->child = false; - } - if(!empty($def->content_model_type)) { - $this->content_model_type = $def->content_model_type; - $this->child = false; - } - if(!is_null($def->child)) $this->child = $def->child; - if(!is_null($def->formatting)) $this->formatting = $def->formatting; - if($def->descendants_are_inline) $this->descendants_are_inline = $def->descendants_are_inline; - - } - - /** - * Merges one array into another, removes values which equal false - * @param $a1 Array by reference that is merged into - * @param $a2 Array that merges into $a1 - */ - private function _mergeAssocArray(&$a1, $a2) { - foreach ($a2 as $k => $v) { - if ($v === false) { - if (isset($a1[$k])) unset($a1[$k]); - continue; - } - $a1[$k] = $v; - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Encoder.php b/extlib/HTMLPurifier/HTMLPurifier/Encoder.php deleted file mode 100644 index 2b3140caa..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Encoder.php +++ /dev/null @@ -1,426 +0,0 @@ - under the - * LGPL license. Notes on what changed are inside, but in general, - * the original code transformed UTF-8 text into an array of integer - * Unicode codepoints. Understandably, transforming that back to - * a string would be somewhat expensive, so the function was modded to - * directly operate on the string. However, this discourages code - * reuse, and the logic enumerated here would be useful for any - * function that needs to be able to understand UTF-8 characters. - * As of right now, only smart lossless character encoding converters - * would need that, and I'm probably not going to implement them. - * Once again, PHP 6 should solve all our problems. - */ - public static function cleanUTF8($str, $force_php = false) { - - // UTF-8 validity is checked since PHP 4.3.5 - // This is an optimization: if the string is already valid UTF-8, no - // need to do PHP stuff. 99% of the time, this will be the case. - // The regexp matches the XML char production, as well as well as excluding - // non-SGML codepoints U+007F to U+009F - if (preg_match('/^[\x{9}\x{A}\x{D}\x{20}-\x{7E}\x{A0}-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]*$/Du', $str)) { - return $str; - } - - $mState = 0; // cached expected number of octets after the current octet - // until the beginning of the next UTF8 character sequence - $mUcs4 = 0; // cached Unicode character - $mBytes = 1; // cached expected number of octets in the current sequence - - // original code involved an $out that was an array of Unicode - // codepoints. Instead of having to convert back into UTF-8, we've - // decided to directly append valid UTF-8 characters onto a string - // $out once they're done. $char accumulates raw bytes, while $mUcs4 - // turns into the Unicode code point, so there's some redundancy. - - $out = ''; - $char = ''; - - $len = strlen($str); - for($i = 0; $i < $len; $i++) { - $in = ord($str{$i}); - $char .= $str[$i]; // append byte to char - if (0 == $mState) { - // When mState is zero we expect either a US-ASCII character - // or a multi-octet sequence. - if (0 == (0x80 & ($in))) { - // US-ASCII, pass straight through. - if (($in <= 31 || $in == 127) && - !($in == 9 || $in == 13 || $in == 10) // save \r\t\n - ) { - // control characters, remove - } else { - $out .= $char; - } - // reset - $char = ''; - $mBytes = 1; - } elseif (0xC0 == (0xE0 & ($in))) { - // First octet of 2 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x1F) << 6; - $mState = 1; - $mBytes = 2; - } elseif (0xE0 == (0xF0 & ($in))) { - // First octet of 3 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x0F) << 12; - $mState = 2; - $mBytes = 3; - } elseif (0xF0 == (0xF8 & ($in))) { - // First octet of 4 octet sequence - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x07) << 18; - $mState = 3; - $mBytes = 4; - } elseif (0xF8 == (0xFC & ($in))) { - // First octet of 5 octet sequence. - // - // This is illegal because the encoded codepoint must be - // either: - // (a) not the shortest form or - // (b) outside the Unicode range of 0-0x10FFFF. - // Rather than trying to resynchronize, we will carry on - // until the end of the sequence and let the later error - // handling code catch it. - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 0x03) << 24; - $mState = 4; - $mBytes = 5; - } elseif (0xFC == (0xFE & ($in))) { - // First octet of 6 octet sequence, see comments for 5 - // octet sequence. - $mUcs4 = ($in); - $mUcs4 = ($mUcs4 & 1) << 30; - $mState = 5; - $mBytes = 6; - } else { - // Current octet is neither in the US-ASCII range nor a - // legal first octet of a multi-octet sequence. - $mState = 0; - $mUcs4 = 0; - $mBytes = 1; - $char = ''; - } - } else { - // When mState is non-zero, we expect a continuation of the - // multi-octet sequence - if (0x80 == (0xC0 & ($in))) { - // Legal continuation. - $shift = ($mState - 1) * 6; - $tmp = $in; - $tmp = ($tmp & 0x0000003F) << $shift; - $mUcs4 |= $tmp; - - if (0 == --$mState) { - // End of the multi-octet sequence. mUcs4 now contains - // the final Unicode codepoint to be output - - // Check for illegal sequences and codepoints. - - // From Unicode 3.1, non-shortest form is illegal - if (((2 == $mBytes) && ($mUcs4 < 0x0080)) || - ((3 == $mBytes) && ($mUcs4 < 0x0800)) || - ((4 == $mBytes) && ($mUcs4 < 0x10000)) || - (4 < $mBytes) || - // From Unicode 3.2, surrogate characters = illegal - (($mUcs4 & 0xFFFFF800) == 0xD800) || - // Codepoints outside the Unicode range are illegal - ($mUcs4 > 0x10FFFF) - ) { - - } elseif (0xFEFF != $mUcs4 && // omit BOM - // check for valid Char unicode codepoints - ( - 0x9 == $mUcs4 || - 0xA == $mUcs4 || - 0xD == $mUcs4 || - (0x20 <= $mUcs4 && 0x7E >= $mUcs4) || - // 7F-9F is not strictly prohibited by XML, - // but it is non-SGML, and thus we don't allow it - (0xA0 <= $mUcs4 && 0xD7FF >= $mUcs4) || - (0x10000 <= $mUcs4 && 0x10FFFF >= $mUcs4) - ) - ) { - $out .= $char; - } - // initialize UTF8 cache (reset) - $mState = 0; - $mUcs4 = 0; - $mBytes = 1; - $char = ''; - } - } else { - // ((0xC0 & (*in) != 0x80) && (mState != 0)) - // Incomplete multi-octet sequence. - // used to result in complete fail, but we'll reset - $mState = 0; - $mUcs4 = 0; - $mBytes = 1; - $char =''; - } - } - } - return $out; - } - - /** - * Translates a Unicode codepoint into its corresponding UTF-8 character. - * @note Based on Feyd's function at - * , - * which is in public domain. - * @note While we're going to do code point parsing anyway, a good - * optimization would be to refuse to translate code points that - * are non-SGML characters. However, this could lead to duplication. - * @note This is very similar to the unichr function in - * maintenance/generate-entity-file.php (although this is superior, - * due to its sanity checks). - */ - - // +----------+----------+----------+----------+ - // | 33222222 | 22221111 | 111111 | | - // | 10987654 | 32109876 | 54321098 | 76543210 | bit - // +----------+----------+----------+----------+ - // | | | | 0xxxxxxx | 1 byte 0x00000000..0x0000007F - // | | | 110yyyyy | 10xxxxxx | 2 byte 0x00000080..0x000007FF - // | | 1110zzzz | 10yyyyyy | 10xxxxxx | 3 byte 0x00000800..0x0000FFFF - // | 11110www | 10wwzzzz | 10yyyyyy | 10xxxxxx | 4 byte 0x00010000..0x0010FFFF - // +----------+----------+----------+----------+ - // | 00000000 | 00011111 | 11111111 | 11111111 | Theoretical upper limit of legal scalars: 2097151 (0x001FFFFF) - // | 00000000 | 00010000 | 11111111 | 11111111 | Defined upper limit of legal scalar codes - // +----------+----------+----------+----------+ - - public static function unichr($code) { - if($code > 1114111 or $code < 0 or - ($code >= 55296 and $code <= 57343) ) { - // bits are set outside the "valid" range as defined - // by UNICODE 4.1.0 - return ''; - } - - $x = $y = $z = $w = 0; - if ($code < 128) { - // regular ASCII character - $x = $code; - } else { - // set up bits for UTF-8 - $x = ($code & 63) | 128; - if ($code < 2048) { - $y = (($code & 2047) >> 6) | 192; - } else { - $y = (($code & 4032) >> 6) | 128; - if($code < 65536) { - $z = (($code >> 12) & 15) | 224; - } else { - $z = (($code >> 12) & 63) | 128; - $w = (($code >> 18) & 7) | 240; - } - } - } - // set up the actual character - $ret = ''; - if($w) $ret .= chr($w); - if($z) $ret .= chr($z); - if($y) $ret .= chr($y); - $ret .= chr($x); - - return $ret; - } - - /** - * Converts a string to UTF-8 based on configuration. - */ - public static function convertToUTF8($str, $config, $context) { - $encoding = $config->get('Core.Encoding'); - if ($encoding === 'utf-8') return $str; - static $iconv = null; - if ($iconv === null) $iconv = function_exists('iconv'); - set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler')); - if ($iconv && !$config->get('Test.ForceNoIconv')) { - $str = iconv($encoding, 'utf-8//IGNORE', $str); - if ($str === false) { - // $encoding is not a valid encoding - restore_error_handler(); - trigger_error('Invalid encoding ' . $encoding, E_USER_ERROR); - return ''; - } - // If the string is bjorked by Shift_JIS or a similar encoding - // that doesn't support all of ASCII, convert the naughty - // characters to their true byte-wise ASCII/UTF-8 equivalents. - $str = strtr($str, HTMLPurifier_Encoder::testEncodingSupportsASCII($encoding)); - restore_error_handler(); - return $str; - } elseif ($encoding === 'iso-8859-1') { - $str = utf8_encode($str); - restore_error_handler(); - return $str; - } - trigger_error('Encoding not supported, please install iconv', E_USER_ERROR); - } - - /** - * Converts a string from UTF-8 based on configuration. - * @note Currently, this is a lossy conversion, with unexpressable - * characters being omitted. - */ - public static function convertFromUTF8($str, $config, $context) { - $encoding = $config->get('Core.Encoding'); - if ($encoding === 'utf-8') return $str; - static $iconv = null; - if ($iconv === null) $iconv = function_exists('iconv'); - if ($escape = $config->get('Core.EscapeNonASCIICharacters')) { - $str = HTMLPurifier_Encoder::convertToASCIIDumbLossless($str); - } - set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler')); - if ($iconv && !$config->get('Test.ForceNoIconv')) { - // Undo our previous fix in convertToUTF8, otherwise iconv will barf - $ascii_fix = HTMLPurifier_Encoder::testEncodingSupportsASCII($encoding); - if (!$escape && !empty($ascii_fix)) { - $clear_fix = array(); - foreach ($ascii_fix as $utf8 => $native) $clear_fix[$utf8] = ''; - $str = strtr($str, $clear_fix); - } - $str = strtr($str, array_flip($ascii_fix)); - // Normal stuff - $str = iconv('utf-8', $encoding . '//IGNORE', $str); - restore_error_handler(); - return $str; - } elseif ($encoding === 'iso-8859-1') { - $str = utf8_decode($str); - restore_error_handler(); - return $str; - } - trigger_error('Encoding not supported', E_USER_ERROR); - } - - /** - * Lossless (character-wise) conversion of HTML to ASCII - * @param $str UTF-8 string to be converted to ASCII - * @returns ASCII encoded string with non-ASCII character entity-ized - * @warning Adapted from MediaWiki, claiming fair use: this is a common - * algorithm. If you disagree with this license fudgery, - * implement it yourself. - * @note Uses decimal numeric entities since they are best supported. - * @note This is a DUMB function: it has no concept of keeping - * character entities that the projected character encoding - * can allow. We could possibly implement a smart version - * but that would require it to also know which Unicode - * codepoints the charset supported (not an easy task). - * @note Sort of with cleanUTF8() but it assumes that $str is - * well-formed UTF-8 - */ - public static function convertToASCIIDumbLossless($str) { - $bytesleft = 0; - $result = ''; - $working = 0; - $len = strlen($str); - for( $i = 0; $i < $len; $i++ ) { - $bytevalue = ord( $str[$i] ); - if( $bytevalue <= 0x7F ) { //0xxx xxxx - $result .= chr( $bytevalue ); - $bytesleft = 0; - } elseif( $bytevalue <= 0xBF ) { //10xx xxxx - $working = $working << 6; - $working += ($bytevalue & 0x3F); - $bytesleft--; - if( $bytesleft <= 0 ) { - $result .= "&#" . $working . ";"; - } - } elseif( $bytevalue <= 0xDF ) { //110x xxxx - $working = $bytevalue & 0x1F; - $bytesleft = 1; - } elseif( $bytevalue <= 0xEF ) { //1110 xxxx - $working = $bytevalue & 0x0F; - $bytesleft = 2; - } else { //1111 0xxx - $working = $bytevalue & 0x07; - $bytesleft = 3; - } - } - return $result; - } - - /** - * This expensive function tests whether or not a given character - * encoding supports ASCII. 7/8-bit encodings like Shift_JIS will - * fail this test, and require special processing. Variable width - * encodings shouldn't ever fail. - * - * @param string $encoding Encoding name to test, as per iconv format - * @param bool $bypass Whether or not to bypass the precompiled arrays. - * @return Array of UTF-8 characters to their corresponding ASCII, - * which can be used to "undo" any overzealous iconv action. - */ - public static function testEncodingSupportsASCII($encoding, $bypass = false) { - static $encodings = array(); - if (!$bypass) { - if (isset($encodings[$encoding])) return $encodings[$encoding]; - $lenc = strtolower($encoding); - switch ($lenc) { - case 'shift_jis': - return array("\xC2\xA5" => '\\', "\xE2\x80\xBE" => '~'); - case 'johab': - return array("\xE2\x82\xA9" => '\\'); - } - if (strpos($lenc, 'iso-8859-') === 0) return array(); - } - $ret = array(); - set_error_handler(array('HTMLPurifier_Encoder', 'muteErrorHandler')); - if (iconv('UTF-8', $encoding, 'a') === false) return false; - for ($i = 0x20; $i <= 0x7E; $i++) { // all printable ASCII chars - $c = chr($i); // UTF-8 char - $r = iconv('UTF-8', "$encoding//IGNORE", $c); // initial conversion - if ( - $r === '' || - // This line is needed for iconv implementations that do not - // omit characters that do not exist in the target character set - ($r === $c && iconv($encoding, 'UTF-8//IGNORE', $r) !== $c) - ) { - // Reverse engineer: what's the UTF-8 equiv of this byte - // sequence? This assumes that there's no variable width - // encoding that doesn't support ASCII. - $ret[iconv($encoding, 'UTF-8//IGNORE', $c)] = $c; - } - } - restore_error_handler(); - $encodings[$encoding] = $ret; - return $ret; - } - - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/EntityLookup.php b/extlib/HTMLPurifier/HTMLPurifier/EntityLookup.php deleted file mode 100644 index b4dfce94c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/EntityLookup.php +++ /dev/null @@ -1,44 +0,0 @@ -table = unserialize(file_get_contents($file)); - } - - /** - * Retrieves sole instance of the object. - * @param Optional prototype of custom lookup table to overload with. - */ - public static function instance($prototype = false) { - // no references, since PHP doesn't copy unless modified - static $instance = null; - if ($prototype) { - $instance = $prototype; - } elseif (!$instance) { - $instance = new HTMLPurifier_EntityLookup(); - $instance->setup(); - } - return $instance; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/EntityLookup/entities.ser b/extlib/HTMLPurifier/HTMLPurifier/EntityLookup/entities.ser deleted file mode 100644 index f2b8b8f2d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/EntityLookup/entities.ser +++ /dev/null @@ -1 +0,0 @@ -a:246:{s:4:"nbsp";s:2:" ";s:5:"iexcl";s:2:"¡";s:4:"cent";s:2:"¢";s:5:"pound";s:2:"£";s:6:"curren";s:2:"¤";s:3:"yen";s:2:"¥";s:6:"brvbar";s:2:"¦";s:4:"sect";s:2:"§";s:3:"uml";s:2:"¨";s:4:"copy";s:2:"©";s:4:"ordf";s:2:"ª";s:5:"laquo";s:2:"«";s:3:"not";s:2:"¬";s:3:"shy";s:2:"­";s:3:"reg";s:2:"®";s:4:"macr";s:2:"¯";s:3:"deg";s:2:"°";s:6:"plusmn";s:2:"±";s:5:"acute";s:2:"´";s:5:"micro";s:2:"µ";s:4:"para";s:2:"¶";s:6:"middot";s:2:"·";s:5:"cedil";s:2:"¸";s:4:"ordm";s:2:"º";s:5:"raquo";s:2:"»";s:6:"iquest";s:2:"¿";s:6:"Agrave";s:2:"À";s:6:"Aacute";s:2:"Á";s:5:"Acirc";s:2:"Â";s:6:"Atilde";s:2:"Ã";s:4:"Auml";s:2:"Ä";s:5:"Aring";s:2:"Å";s:5:"AElig";s:2:"Æ";s:6:"Ccedil";s:2:"Ç";s:6:"Egrave";s:2:"È";s:6:"Eacute";s:2:"É";s:5:"Ecirc";s:2:"Ê";s:4:"Euml";s:2:"Ë";s:6:"Igrave";s:2:"Ì";s:6:"Iacute";s:2:"Í";s:5:"Icirc";s:2:"Î";s:4:"Iuml";s:2:"Ï";s:3:"ETH";s:2:"Ð";s:6:"Ntilde";s:2:"Ñ";s:6:"Ograve";s:2:"Ò";s:6:"Oacute";s:2:"Ó";s:5:"Ocirc";s:2:"Ô";s:6:"Otilde";s:2:"Õ";s:4:"Ouml";s:2:"Ö";s:5:"times";s:2:"×";s:6:"Oslash";s:2:"Ø";s:6:"Ugrave";s:2:"Ù";s:6:"Uacute";s:2:"Ú";s:5:"Ucirc";s:2:"Û";s:4:"Uuml";s:2:"Ü";s:6:"Yacute";s:2:"Ý";s:5:"THORN";s:2:"Þ";s:5:"szlig";s:2:"ß";s:6:"agrave";s:2:"à";s:6:"aacute";s:2:"á";s:5:"acirc";s:2:"â";s:6:"atilde";s:2:"ã";s:4:"auml";s:2:"ä";s:5:"aring";s:2:"å";s:5:"aelig";s:2:"æ";s:6:"ccedil";s:2:"ç";s:6:"egrave";s:2:"è";s:6:"eacute";s:2:"é";s:5:"ecirc";s:2:"ê";s:4:"euml";s:2:"ë";s:6:"igrave";s:2:"ì";s:6:"iacute";s:2:"í";s:5:"icirc";s:2:"î";s:4:"iuml";s:2:"ï";s:3:"eth";s:2:"ð";s:6:"ntilde";s:2:"ñ";s:6:"ograve";s:2:"ò";s:6:"oacute";s:2:"ó";s:5:"ocirc";s:2:"ô";s:6:"otilde";s:2:"õ";s:4:"ouml";s:2:"ö";s:6:"divide";s:2:"÷";s:6:"oslash";s:2:"ø";s:6:"ugrave";s:2:"ù";s:6:"uacute";s:2:"ú";s:5:"ucirc";s:2:"û";s:4:"uuml";s:2:"ü";s:6:"yacute";s:2:"ý";s:5:"thorn";s:2:"þ";s:4:"yuml";s:2:"ÿ";s:4:"quot";s:1:""";s:3:"amp";s:1:"&";s:2:"lt";s:1:"<";s:2:"gt";s:1:">";s:4:"apos";s:1:"'";s:5:"OElig";s:2:"Œ";s:5:"oelig";s:2:"œ";s:6:"Scaron";s:2:"Š";s:6:"scaron";s:2:"š";s:4:"Yuml";s:2:"Ÿ";s:4:"circ";s:2:"ˆ";s:5:"tilde";s:2:"˜";s:4:"ensp";s:3:" ";s:4:"emsp";s:3:" ";s:6:"thinsp";s:3:" ";s:4:"zwnj";s:3:"‌";s:3:"zwj";s:3:"‍";s:3:"lrm";s:3:"‎";s:3:"rlm";s:3:"‏";s:5:"ndash";s:3:"–";s:5:"mdash";s:3:"—";s:5:"lsquo";s:3:"‘";s:5:"rsquo";s:3:"’";s:5:"sbquo";s:3:"‚";s:5:"ldquo";s:3:"“";s:5:"rdquo";s:3:"”";s:5:"bdquo";s:3:"„";s:6:"dagger";s:3:"†";s:6:"Dagger";s:3:"‡";s:6:"permil";s:3:"‰";s:6:"lsaquo";s:3:"‹";s:6:"rsaquo";s:3:"›";s:4:"euro";s:3:"€";s:4:"fnof";s:2:"ƒ";s:5:"Alpha";s:2:"Α";s:4:"Beta";s:2:"Β";s:5:"Gamma";s:2:"Γ";s:5:"Delta";s:2:"Δ";s:7:"Epsilon";s:2:"Ε";s:4:"Zeta";s:2:"Ζ";s:3:"Eta";s:2:"Η";s:5:"Theta";s:2:"Θ";s:4:"Iota";s:2:"Ι";s:5:"Kappa";s:2:"Κ";s:6:"Lambda";s:2:"Λ";s:2:"Mu";s:2:"Μ";s:2:"Nu";s:2:"Ν";s:2:"Xi";s:2:"Ξ";s:7:"Omicron";s:2:"Ο";s:2:"Pi";s:2:"Π";s:3:"Rho";s:2:"Ρ";s:5:"Sigma";s:2:"Σ";s:3:"Tau";s:2:"Τ";s:7:"Upsilon";s:2:"Υ";s:3:"Phi";s:2:"Φ";s:3:"Chi";s:2:"Χ";s:3:"Psi";s:2:"Ψ";s:5:"Omega";s:2:"Ω";s:5:"alpha";s:2:"α";s:4:"beta";s:2:"β";s:5:"gamma";s:2:"γ";s:5:"delta";s:2:"δ";s:7:"epsilon";s:2:"ε";s:4:"zeta";s:2:"ζ";s:3:"eta";s:2:"η";s:5:"theta";s:2:"θ";s:4:"iota";s:2:"ι";s:5:"kappa";s:2:"κ";s:6:"lambda";s:2:"λ";s:2:"mu";s:2:"μ";s:2:"nu";s:2:"ν";s:2:"xi";s:2:"ξ";s:7:"omicron";s:2:"ο";s:2:"pi";s:2:"π";s:3:"rho";s:2:"ρ";s:6:"sigmaf";s:2:"ς";s:5:"sigma";s:2:"σ";s:3:"tau";s:2:"τ";s:7:"upsilon";s:2:"υ";s:3:"phi";s:2:"φ";s:3:"chi";s:2:"χ";s:3:"psi";s:2:"ψ";s:5:"omega";s:2:"ω";s:8:"thetasym";s:2:"ϑ";s:5:"upsih";s:2:"ϒ";s:3:"piv";s:2:"ϖ";s:4:"bull";s:3:"•";s:6:"hellip";s:3:"…";s:5:"prime";s:3:"′";s:5:"Prime";s:3:"″";s:5:"oline";s:3:"‾";s:5:"frasl";s:3:"⁄";s:6:"weierp";s:3:"℘";s:5:"image";s:3:"ℑ";s:4:"real";s:3:"ℜ";s:5:"trade";s:3:"™";s:7:"alefsym";s:3:"ℵ";s:4:"larr";s:3:"←";s:4:"uarr";s:3:"↑";s:4:"rarr";s:3:"→";s:4:"darr";s:3:"↓";s:4:"harr";s:3:"↔";s:5:"crarr";s:3:"↵";s:4:"lArr";s:3:"⇐";s:4:"uArr";s:3:"⇑";s:4:"rArr";s:3:"⇒";s:4:"dArr";s:3:"⇓";s:4:"hArr";s:3:"⇔";s:6:"forall";s:3:"∀";s:4:"part";s:3:"∂";s:5:"exist";s:3:"∃";s:5:"empty";s:3:"∅";s:5:"nabla";s:3:"∇";s:4:"isin";s:3:"∈";s:5:"notin";s:3:"∉";s:2:"ni";s:3:"∋";s:4:"prod";s:3:"∏";s:3:"sum";s:3:"∑";s:5:"minus";s:3:"−";s:6:"lowast";s:3:"∗";s:5:"radic";s:3:"√";s:4:"prop";s:3:"∝";s:5:"infin";s:3:"∞";s:3:"ang";s:3:"∠";s:3:"and";s:3:"∧";s:2:"or";s:3:"∨";s:3:"cap";s:3:"∩";s:3:"cup";s:3:"∪";s:3:"int";s:3:"∫";s:3:"sim";s:3:"∼";s:4:"cong";s:3:"≅";s:5:"asymp";s:3:"≈";s:2:"ne";s:3:"≠";s:5:"equiv";s:3:"≡";s:2:"le";s:3:"≤";s:2:"ge";s:3:"≥";s:3:"sub";s:3:"⊂";s:3:"sup";s:3:"⊃";s:4:"nsub";s:3:"⊄";s:4:"sube";s:3:"⊆";s:4:"supe";s:3:"⊇";s:5:"oplus";s:3:"⊕";s:6:"otimes";s:3:"⊗";s:4:"perp";s:3:"⊥";s:4:"sdot";s:3:"⋅";s:5:"lceil";s:3:"⌈";s:5:"rceil";s:3:"⌉";s:6:"lfloor";s:3:"⌊";s:6:"rfloor";s:3:"⌋";s:4:"lang";s:3:"〈";s:4:"rang";s:3:"〉";s:3:"loz";s:3:"◊";s:6:"spades";s:3:"♠";s:5:"clubs";s:3:"♣";s:6:"hearts";s:3:"♥";s:5:"diams";s:3:"♦";} \ No newline at end of file diff --git a/extlib/HTMLPurifier/HTMLPurifier/EntityParser.php b/extlib/HTMLPurifier/HTMLPurifier/EntityParser.php deleted file mode 100644 index 8c384472d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/EntityParser.php +++ /dev/null @@ -1,144 +0,0 @@ - '"', - 38 => '&', - 39 => "'", - 60 => '<', - 62 => '>' - ); - - /** - * Stripped entity names to decimal conversion table for special entities. - */ - protected $_special_ent2dec = - array( - 'quot' => 34, - 'amp' => 38, - 'lt' => 60, - 'gt' => 62 - ); - - /** - * Substitutes non-special entities with their parsed equivalents. Since - * running this whenever you have parsed character is t3h 5uck, we run - * it before everything else. - * - * @param $string String to have non-special entities parsed. - * @returns Parsed string. - */ - public function substituteNonSpecialEntities($string) { - // it will try to detect missing semicolons, but don't rely on it - return preg_replace_callback( - $this->_substituteEntitiesRegex, - array($this, 'nonSpecialEntityCallback'), - $string - ); - } - - /** - * Callback function for substituteNonSpecialEntities() that does the work. - * - * @param $matches PCRE matches array, with 0 the entire match, and - * either index 1, 2 or 3 set with a hex value, dec value, - * or string (respectively). - * @returns Replacement string. - */ - - protected function nonSpecialEntityCallback($matches) { - // replaces all but big five - $entity = $matches[0]; - $is_num = (@$matches[0][1] === '#'); - if ($is_num) { - $is_hex = (@$entity[2] === 'x'); - $code = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; - - // abort for special characters - if (isset($this->_special_dec2str[$code])) return $entity; - - return HTMLPurifier_Encoder::unichr($code); - } else { - if (isset($this->_special_ent2dec[$matches[3]])) return $entity; - if (!$this->_entity_lookup) { - $this->_entity_lookup = HTMLPurifier_EntityLookup::instance(); - } - if (isset($this->_entity_lookup->table[$matches[3]])) { - return $this->_entity_lookup->table[$matches[3]]; - } else { - return $entity; - } - } - } - - /** - * Substitutes only special entities with their parsed equivalents. - * - * @notice We try to avoid calling this function because otherwise, it - * would have to be called a lot (for every parsed section). - * - * @param $string String to have non-special entities parsed. - * @returns Parsed string. - */ - public function substituteSpecialEntities($string) { - return preg_replace_callback( - $this->_substituteEntitiesRegex, - array($this, 'specialEntityCallback'), - $string); - } - - /** - * Callback function for substituteSpecialEntities() that does the work. - * - * This callback has same syntax as nonSpecialEntityCallback(). - * - * @param $matches PCRE-style matches array, with 0 the entire match, and - * either index 1, 2 or 3 set with a hex value, dec value, - * or string (respectively). - * @returns Replacement string. - */ - protected function specialEntityCallback($matches) { - $entity = $matches[0]; - $is_num = (@$matches[0][1] === '#'); - if ($is_num) { - $is_hex = (@$entity[2] === 'x'); - $int = $is_hex ? hexdec($matches[1]) : (int) $matches[2]; - return isset($this->_special_dec2str[$int]) ? - $this->_special_dec2str[$int] : - $entity; - } else { - return isset($this->_special_ent2dec[$matches[3]]) ? - $this->_special_ent2dec[$matches[3]] : - $entity; - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ErrorCollector.php b/extlib/HTMLPurifier/HTMLPurifier/ErrorCollector.php deleted file mode 100644 index 6713eaf77..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ErrorCollector.php +++ /dev/null @@ -1,209 +0,0 @@ -locale =& $context->get('Locale'); - $this->context = $context; - $this->_current =& $this->_stacks[0]; - $this->errors =& $this->_stacks[0]; - } - - /** - * Sends an error message to the collector for later use - * @param $severity int Error severity, PHP error style (don't use E_USER_) - * @param $msg string Error message text - * @param $subst1 string First substitution for $msg - * @param $subst2 string ... - */ - public function send($severity, $msg) { - - $args = array(); - if (func_num_args() > 2) { - $args = func_get_args(); - array_shift($args); - unset($args[0]); - } - - $token = $this->context->get('CurrentToken', true); - $line = $token ? $token->line : $this->context->get('CurrentLine', true); - $col = $token ? $token->col : $this->context->get('CurrentCol', true); - $attr = $this->context->get('CurrentAttr', true); - - // perform special substitutions, also add custom parameters - $subst = array(); - if (!is_null($token)) { - $args['CurrentToken'] = $token; - } - if (!is_null($attr)) { - $subst['$CurrentAttr.Name'] = $attr; - if (isset($token->attr[$attr])) $subst['$CurrentAttr.Value'] = $token->attr[$attr]; - } - - if (empty($args)) { - $msg = $this->locale->getMessage($msg); - } else { - $msg = $this->locale->formatMessage($msg, $args); - } - - if (!empty($subst)) $msg = strtr($msg, $subst); - - // (numerically indexed) - $error = array( - self::LINENO => $line, - self::SEVERITY => $severity, - self::MESSAGE => $msg, - self::CHILDREN => array() - ); - $this->_current[] = $error; - - - // NEW CODE BELOW ... - - $struct = null; - // Top-level errors are either: - // TOKEN type, if $value is set appropriately, or - // "syntax" type, if $value is null - $new_struct = new HTMLPurifier_ErrorStruct(); - $new_struct->type = HTMLPurifier_ErrorStruct::TOKEN; - if ($token) $new_struct->value = clone $token; - if (is_int($line) && is_int($col)) { - if (isset($this->lines[$line][$col])) { - $struct = $this->lines[$line][$col]; - } else { - $struct = $this->lines[$line][$col] = $new_struct; - } - // These ksorts may present a performance problem - ksort($this->lines[$line], SORT_NUMERIC); - } else { - if (isset($this->lines[-1])) { - $struct = $this->lines[-1]; - } else { - $struct = $this->lines[-1] = $new_struct; - } - } - ksort($this->lines, SORT_NUMERIC); - - // Now, check if we need to operate on a lower structure - if (!empty($attr)) { - $struct = $struct->getChild(HTMLPurifier_ErrorStruct::ATTR, $attr); - if (!$struct->value) { - $struct->value = array($attr, 'PUT VALUE HERE'); - } - } - if (!empty($cssprop)) { - $struct = $struct->getChild(HTMLPurifier_ErrorStruct::CSSPROP, $cssprop); - if (!$struct->value) { - // if we tokenize CSS this might be a little more difficult to do - $struct->value = array($cssprop, 'PUT VALUE HERE'); - } - } - - // Ok, structs are all setup, now time to register the error - $struct->addError($severity, $msg); - } - - /** - * Retrieves raw error data for custom formatter to use - * @param List of arrays in format of array(line of error, - * error severity, error message, - * recursive sub-errors array) - */ - public function getRaw() { - return $this->errors; - } - - /** - * Default HTML formatting implementation for error messages - * @param $config Configuration array, vital for HTML output nature - * @param $errors Errors array to display; used for recursion. - */ - public function getHTMLFormatted($config, $errors = null) { - $ret = array(); - - $this->generator = new HTMLPurifier_Generator($config, $this->context); - if ($errors === null) $errors = $this->errors; - - // 'At line' message needs to be removed - - // generation code for new structure goes here. It needs to be recursive. - foreach ($this->lines as $line => $col_array) { - if ($line == -1) continue; - foreach ($col_array as $col => $struct) { - $this->_renderStruct($ret, $struct, $line, $col); - } - } - if (isset($this->lines[-1])) { - $this->_renderStruct($ret, $this->lines[-1]); - } - - if (empty($errors)) { - return '

' . $this->locale->getMessage('ErrorCollector: No errors') . '

'; - } else { - return '
  • ' . implode('
  • ', $ret) . '
'; - } - - } - - private function _renderStruct(&$ret, $struct, $line = null, $col = null) { - $stack = array($struct); - $context_stack = array(array()); - while ($current = array_pop($stack)) { - $context = array_pop($context_stack); - foreach ($current->errors as $error) { - list($severity, $msg) = $error; - $string = ''; - $string .= '
'; - // W3C uses an icon to indicate the severity of the error. - $error = $this->locale->getErrorName($severity); - $string .= "$error "; - if (!is_null($line) && !is_null($col)) { - $string .= "Line $line, Column $col: "; - } else { - $string .= 'End of Document: '; - } - $string .= '' . $this->generator->escape($msg) . ' '; - $string .= '
'; - // Here, have a marker for the character on the column appropriate. - // Be sure to clip extremely long lines. - //$string .= '
';
-                //$string .= '';
-                //$string .= '
'; - $ret[] = $string; - } - foreach ($current->children as $type => $array) { - $context[] = $current; - $stack = array_merge($stack, array_reverse($array, true)); - for ($i = count($array); $i > 0; $i--) { - $context_stack[] = $context; - } - } - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/ErrorStruct.php b/extlib/HTMLPurifier/HTMLPurifier/ErrorStruct.php deleted file mode 100644 index 9bc8996ec..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/ErrorStruct.php +++ /dev/null @@ -1,60 +0,0 @@ -children[$type][$id])) { - $this->children[$type][$id] = new HTMLPurifier_ErrorStruct(); - $this->children[$type][$id]->type = $type; - } - return $this->children[$type][$id]; - } - - public function addError($severity, $message) { - $this->errors[] = array($severity, $message); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Exception.php b/extlib/HTMLPurifier/HTMLPurifier/Exception.php deleted file mode 100644 index be85b4c56..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Exception.php +++ /dev/null @@ -1,12 +0,0 @@ -preFilter, - * 2->preFilter, 3->preFilter, purify, 3->postFilter, 2->postFilter, - * 1->postFilter. - * - * @note Methods are not declared abstract as it is perfectly legitimate - * for an implementation not to want anything to happen on a step - */ - -class HTMLPurifier_Filter -{ - - /** - * Name of the filter for identification purposes - */ - public $name; - - /** - * Pre-processor function, handles HTML before HTML Purifier - */ - public function preFilter($html, $config, $context) { - return $html; - } - - /** - * Post-processor function, handles HTML after HTML Purifier - */ - public function postFilter($html, $config, $context) { - return $html; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php b/extlib/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php deleted file mode 100644 index bbf78a663..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Filter/ExtractStyleBlocks.php +++ /dev/null @@ -1,135 +0,0 @@ - blocks from input HTML, cleans them up - * using CSSTidy, and then places them in $purifier->context->get('StyleBlocks') - * so they can be used elsewhere in the document. - * - * @note - * See tests/HTMLPurifier/Filter/ExtractStyleBlocksTest.php for - * sample usage. - * - * @note - * This filter can also be used on stylesheets not included in the - * document--something purists would probably prefer. Just directly - * call HTMLPurifier_Filter_ExtractStyleBlocks->cleanCSS() - */ -class HTMLPurifier_Filter_ExtractStyleBlocks extends HTMLPurifier_Filter -{ - - public $name = 'ExtractStyleBlocks'; - private $_styleMatches = array(); - private $_tidy; - - public function __construct() { - $this->_tidy = new csstidy(); - } - - /** - * Save the contents of CSS blocks to style matches - * @param $matches preg_replace style $matches array - */ - protected function styleCallback($matches) { - $this->_styleMatches[] = $matches[1]; - } - - /** - * Removes inline #isU', array($this, 'styleCallback'), $html); - $style_blocks = $this->_styleMatches; - $this->_styleMatches = array(); // reset - $context->register('StyleBlocks', $style_blocks); // $context must not be reused - if ($this->_tidy) { - foreach ($style_blocks as &$style) { - $style = $this->cleanCSS($style, $config, $context); - } - } - return $html; - } - - /** - * Takes CSS (the stuff found in in a font-family prop). - if ($config->get('Filter.ExtractStyleBlocks.Escaping')) { - $css = str_replace( - array('<', '>', '&'), - array('\3C ', '\3E ', '\26 '), - $css - ); - } - return $css; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Filter/YouTube.php b/extlib/HTMLPurifier/HTMLPurifier/Filter/YouTube.php deleted file mode 100644 index aca972f6c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Filter/YouTube.php +++ /dev/null @@ -1,39 +0,0 @@ -]+>.+?'. - 'http://www.youtube.com/v/([A-Za-z0-9\-_]+).+?#s'; - $pre_replace = '\1'; - return preg_replace($pre_regex, $pre_replace, $html); - } - - public function postFilter($html, $config, $context) { - $post_regex = '#([A-Za-z0-9\-_]+)#'; - return preg_replace_callback($post_regex, array($this, 'postFilterCallback'), $html); - } - - protected function armorUrl($url) { - return str_replace('--', '--', $url); - } - - protected function postFilterCallback($matches) { - $url = $this->armorUrl($matches[1]); - return ''. - ''. - ''. - ''; - - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Generator.php b/extlib/HTMLPurifier/HTMLPurifier/Generator.php deleted file mode 100644 index 24bd8a54e..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Generator.php +++ /dev/null @@ -1,183 +0,0 @@ - tags - */ - private $_scriptFix = false; - - /** - * Cache of HTMLDefinition during HTML output to determine whether or - * not attributes should be minimized. - */ - private $_def; - - /** - * Cache of %Output.SortAttr - */ - private $_sortAttr; - - /** - * Configuration for the generator - */ - protected $config; - - /** - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - */ - public function __construct($config, $context) { - $this->config = $config; - $this->_scriptFix = $config->get('Output.CommentScriptContents'); - $this->_sortAttr = $config->get('Output.SortAttr'); - $this->_def = $config->getHTMLDefinition(); - $this->_xhtml = $this->_def->doctype->xml; - } - - /** - * Generates HTML from an array of tokens. - * @param $tokens Array of HTMLPurifier_Token - * @param $config HTMLPurifier_Config object - * @return Generated HTML - */ - public function generateFromTokens($tokens) { - if (!$tokens) return ''; - - // Basic algorithm - $html = ''; - for ($i = 0, $size = count($tokens); $i < $size; $i++) { - if ($this->_scriptFix && $tokens[$i]->name === 'script' - && $i + 2 < $size && $tokens[$i+2] instanceof HTMLPurifier_Token_End) { - // script special case - // the contents of the script block must be ONE token - // for this to work. - $html .= $this->generateFromToken($tokens[$i++]); - $html .= $this->generateScriptFromToken($tokens[$i++]); - } - $html .= $this->generateFromToken($tokens[$i]); - } - - // Tidy cleanup - if (extension_loaded('tidy') && $this->config->get('Output.TidyFormat')) { - $tidy = new Tidy; - $tidy->parseString($html, array( - 'indent'=> true, - 'output-xhtml' => $this->_xhtml, - 'show-body-only' => true, - 'indent-spaces' => 2, - 'wrap' => 68, - ), 'utf8'); - $tidy->cleanRepair(); - $html = (string) $tidy; // explicit cast necessary - } - - // Normalize newlines to system defined value - $nl = $this->config->get('Output.Newline'); - if ($nl === null) $nl = PHP_EOL; - if ($nl !== "\n") $html = str_replace("\n", $nl, $html); - return $html; - } - - /** - * Generates HTML from a single token. - * @param $token HTMLPurifier_Token object. - * @return Generated HTML - */ - public function generateFromToken($token) { - if (!$token instanceof HTMLPurifier_Token) { - trigger_error('Cannot generate HTML from non-HTMLPurifier_Token object', E_USER_WARNING); - return ''; - - } elseif ($token instanceof HTMLPurifier_Token_Start) { - $attr = $this->generateAttributes($token->attr, $token->name); - return '<' . $token->name . ($attr ? ' ' : '') . $attr . '>'; - - } elseif ($token instanceof HTMLPurifier_Token_End) { - return 'name . '>'; - - } elseif ($token instanceof HTMLPurifier_Token_Empty) { - $attr = $this->generateAttributes($token->attr, $token->name); - return '<' . $token->name . ($attr ? ' ' : '') . $attr . - ( $this->_xhtml ? ' /': '' ) //
v.
- . '>'; - - } elseif ($token instanceof HTMLPurifier_Token_Text) { - return $this->escape($token->data, ENT_NOQUOTES); - - } elseif ($token instanceof HTMLPurifier_Token_Comment) { - return ''; - } else { - return ''; - - } - } - - /** - * Special case processor for the contents of script tags - * @warning This runs into problems if there's already a literal - * --> somewhere inside the script contents. - */ - public function generateScriptFromToken($token) { - if (!$token instanceof HTMLPurifier_Token_Text) return $this->generateFromToken($token); - // Thanks - $data = preg_replace('#//\s*$#', '', $token->data); - return ''; - } - - /** - * Generates attribute declarations from attribute array. - * @note This does not include the leading or trailing space. - * @param $assoc_array_of_attributes Attribute array - * @param $element Name of element attributes are for, used to check - * attribute minimization. - * @return Generate HTML fragment for insertion. - */ - public function generateAttributes($assoc_array_of_attributes, $element = false) { - $html = ''; - if ($this->_sortAttr) ksort($assoc_array_of_attributes); - foreach ($assoc_array_of_attributes as $key => $value) { - if (!$this->_xhtml) { - // Remove namespaced attributes - if (strpos($key, ':') !== false) continue; - // Check if we should minimize the attribute: val="val" -> val - if ($element && !empty($this->_def->info[$element]->attr[$key]->minimized)) { - $html .= $key . ' '; - continue; - } - } - $html .= $key.'="'.$this->escape($value).'" '; - } - return rtrim($html); - } - - /** - * Escapes raw text data. - * @todo This really ought to be protected, but until we have a facility - * for properly generating HTML here w/o using tokens, it stays - * public. - * @param $string String data to escape for HTML. - * @param $quote Quoting style, like htmlspecialchars. ENT_NOQUOTES is - * permissible for non-attribute output. - * @return String escaped data. - */ - public function escape($string, $quote = ENT_COMPAT) { - return htmlspecialchars($string, $quote, 'UTF-8'); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLDefinition.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLDefinition.php deleted file mode 100644 index c99ac11eb..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLDefinition.php +++ /dev/null @@ -1,420 +0,0 @@ -getAnonymousModule(); - if (!isset($module->info[$element_name])) { - $element = $module->addBlankElement($element_name); - } else { - $element = $module->info[$element_name]; - } - $element->attr[$attr_name] = $def; - } - - /** - * Adds a custom element to your HTML definition - * @note See HTMLPurifier_HTMLModule::addElement for detailed - * parameter and return value descriptions. - */ - public function addElement($element_name, $type, $contents, $attr_collections, $attributes = array()) { - $module = $this->getAnonymousModule(); - // assume that if the user is calling this, the element - // is safe. This may not be a good idea - $element = $module->addElement($element_name, $type, $contents, $attr_collections, $attributes); - return $element; - } - - /** - * Adds a blank element to your HTML definition, for overriding - * existing behavior - * @note See HTMLPurifier_HTMLModule::addBlankElement for detailed - * parameter and return value descriptions. - */ - public function addBlankElement($element_name) { - $module = $this->getAnonymousModule(); - $element = $module->addBlankElement($element_name); - return $element; - } - - /** - * Retrieves a reference to the anonymous module, so you can - * bust out advanced features without having to make your own - * module. - */ - public function getAnonymousModule() { - if (!$this->_anonModule) { - $this->_anonModule = new HTMLPurifier_HTMLModule(); - $this->_anonModule->name = 'Anonymous'; - } - return $this->_anonModule; - } - - private $_anonModule; - - - // PUBLIC BUT INTERNAL VARIABLES -------------------------------------- - - public $type = 'HTML'; - public $manager; /**< Instance of HTMLPurifier_HTMLModuleManager */ - - /** - * Performs low-cost, preliminary initialization. - */ - public function __construct() { - $this->manager = new HTMLPurifier_HTMLModuleManager(); - } - - protected function doSetup($config) { - $this->processModules($config); - $this->setupConfigStuff($config); - unset($this->manager); - - // cleanup some of the element definitions - foreach ($this->info as $k => $v) { - unset($this->info[$k]->content_model); - unset($this->info[$k]->content_model_type); - } - } - - /** - * Extract out the information from the manager - */ - protected function processModules($config) { - - if ($this->_anonModule) { - // for user specific changes - // this is late-loaded so we don't have to deal with PHP4 - // reference wonky-ness - $this->manager->addModule($this->_anonModule); - unset($this->_anonModule); - } - - $this->manager->setup($config); - $this->doctype = $this->manager->doctype; - - foreach ($this->manager->modules as $module) { - foreach($module->info_tag_transform as $k => $v) { - if ($v === false) unset($this->info_tag_transform[$k]); - else $this->info_tag_transform[$k] = $v; - } - foreach($module->info_attr_transform_pre as $k => $v) { - if ($v === false) unset($this->info_attr_transform_pre[$k]); - else $this->info_attr_transform_pre[$k] = $v; - } - foreach($module->info_attr_transform_post as $k => $v) { - if ($v === false) unset($this->info_attr_transform_post[$k]); - else $this->info_attr_transform_post[$k] = $v; - } - foreach ($module->info_injector as $k => $v) { - if ($v === false) unset($this->info_injector[$k]); - else $this->info_injector[$k] = $v; - } - } - - $this->info = $this->manager->getElements(); - $this->info_content_sets = $this->manager->contentSets->lookup; - - } - - /** - * Sets up stuff based on config. We need a better way of doing this. - */ - protected function setupConfigStuff($config) { - - $block_wrapper = $config->get('HTML.BlockWrapper'); - if (isset($this->info_content_sets['Block'][$block_wrapper])) { - $this->info_block_wrapper = $block_wrapper; - } else { - trigger_error('Cannot use non-block element as block wrapper', - E_USER_ERROR); - } - - $parent = $config->get('HTML.Parent'); - $def = $this->manager->getElement($parent, true); - if ($def) { - $this->info_parent = $parent; - $this->info_parent_def = $def; - } else { - trigger_error('Cannot use unrecognized element as parent', - E_USER_ERROR); - $this->info_parent_def = $this->manager->getElement($this->info_parent, true); - } - - // support template text - $support = "(for information on implementing this, see the ". - "support forums) "; - - // setup allowed elements ----------------------------------------- - - $allowed_elements = $config->get('HTML.AllowedElements'); - $allowed_attributes = $config->get('HTML.AllowedAttributes'); // retrieve early - - if (!is_array($allowed_elements) && !is_array($allowed_attributes)) { - $allowed = $config->get('HTML.Allowed'); - if (is_string($allowed)) { - list($allowed_elements, $allowed_attributes) = $this->parseTinyMCEAllowedList($allowed); - } - } - - if (is_array($allowed_elements)) { - foreach ($this->info as $name => $d) { - if(!isset($allowed_elements[$name])) unset($this->info[$name]); - unset($allowed_elements[$name]); - } - // emit errors - foreach ($allowed_elements as $element => $d) { - $element = htmlspecialchars($element); // PHP doesn't escape errors, be careful! - trigger_error("Element '$element' is not supported $support", E_USER_WARNING); - } - } - - // setup allowed attributes --------------------------------------- - - $allowed_attributes_mutable = $allowed_attributes; // by copy! - if (is_array($allowed_attributes)) { - - // This actually doesn't do anything, since we went away from - // global attributes. It's possible that userland code uses - // it, but HTMLModuleManager doesn't! - foreach ($this->info_global_attr as $attr => $x) { - $keys = array($attr, "*@$attr", "*.$attr"); - $delete = true; - foreach ($keys as $key) { - if ($delete && isset($allowed_attributes[$key])) { - $delete = false; - } - if (isset($allowed_attributes_mutable[$key])) { - unset($allowed_attributes_mutable[$key]); - } - } - if ($delete) unset($this->info_global_attr[$attr]); - } - - foreach ($this->info as $tag => $info) { - foreach ($info->attr as $attr => $x) { - $keys = array("$tag@$attr", $attr, "*@$attr", "$tag.$attr", "*.$attr"); - $delete = true; - foreach ($keys as $key) { - if ($delete && isset($allowed_attributes[$key])) { - $delete = false; - } - if (isset($allowed_attributes_mutable[$key])) { - unset($allowed_attributes_mutable[$key]); - } - } - if ($delete) unset($this->info[$tag]->attr[$attr]); - } - } - // emit errors - foreach ($allowed_attributes_mutable as $elattr => $d) { - $bits = preg_split('/[.@]/', $elattr, 2); - $c = count($bits); - switch ($c) { - case 2: - if ($bits[0] !== '*') { - $element = htmlspecialchars($bits[0]); - $attribute = htmlspecialchars($bits[1]); - if (!isset($this->info[$element])) { - trigger_error("Cannot allow attribute '$attribute' if element '$element' is not allowed/supported $support"); - } else { - trigger_error("Attribute '$attribute' in element '$element' not supported $support", - E_USER_WARNING); - } - break; - } - // otherwise fall through - case 1: - $attribute = htmlspecialchars($bits[0]); - trigger_error("Global attribute '$attribute' is not ". - "supported in any elements $support", - E_USER_WARNING); - break; - } - } - - } - - // setup forbidden elements --------------------------------------- - - $forbidden_elements = $config->get('HTML.ForbiddenElements'); - $forbidden_attributes = $config->get('HTML.ForbiddenAttributes'); - - foreach ($this->info as $tag => $info) { - if (isset($forbidden_elements[$tag])) { - unset($this->info[$tag]); - continue; - } - foreach ($info->attr as $attr => $x) { - if ( - isset($forbidden_attributes["$tag@$attr"]) || - isset($forbidden_attributes["*@$attr"]) || - isset($forbidden_attributes[$attr]) - ) { - unset($this->info[$tag]->attr[$attr]); - continue; - } // this segment might get removed eventually - elseif (isset($forbidden_attributes["$tag.$attr"])) { - // $tag.$attr are not user supplied, so no worries! - trigger_error("Error with $tag.$attr: tag.attr syntax not supported for HTML.ForbiddenAttributes; use tag@attr instead", E_USER_WARNING); - } - } - } - foreach ($forbidden_attributes as $key => $v) { - if (strlen($key) < 2) continue; - if ($key[0] != '*') continue; - if ($key[1] == '.') { - trigger_error("Error with $key: *.attr syntax not supported for HTML.ForbiddenAttributes; use attr instead", E_USER_WARNING); - } - } - - // setup injectors ----------------------------------------------------- - foreach ($this->info_injector as $i => $injector) { - if ($injector->checkNeeded($config) !== false) { - // remove injector that does not have it's required - // elements/attributes present, and is thus not needed. - unset($this->info_injector[$i]); - } - } - } - - /** - * Parses a TinyMCE-flavored Allowed Elements and Attributes list into - * separate lists for processing. Format is element[attr1|attr2],element2... - * @warning Although it's largely drawn from TinyMCE's implementation, - * it is different, and you'll probably have to modify your lists - * @param $list String list to parse - * @param array($allowed_elements, $allowed_attributes) - * @todo Give this its own class, probably static interface - */ - public function parseTinyMCEAllowedList($list) { - - $list = str_replace(array(' ', "\t"), '', $list); - - $elements = array(); - $attributes = array(); - - $chunks = preg_split('/(,|[\n\r]+)/', $list); - foreach ($chunks as $chunk) { - if (empty($chunk)) continue; - // remove TinyMCE element control characters - if (!strpos($chunk, '[')) { - $element = $chunk; - $attr = false; - } else { - list($element, $attr) = explode('[', $chunk); - } - if ($element !== '*') $elements[$element] = true; - if (!$attr) continue; - $attr = substr($attr, 0, strlen($attr) - 1); // remove trailing ] - $attr = explode('|', $attr); - foreach ($attr as $key) { - $attributes["$element.$key"] = true; - } - } - - return array($elements, $attributes); - - } - - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule.php deleted file mode 100644 index 072cf6808..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule.php +++ /dev/null @@ -1,244 +0,0 @@ -info, since the object's data is only info, - * with extra behavior associated with it. - */ - public $attr_collections = array(); - - /** - * Associative array of deprecated tag name to HTMLPurifier_TagTransform - */ - public $info_tag_transform = array(); - - /** - * List of HTMLPurifier_AttrTransform to be performed before validation. - */ - public $info_attr_transform_pre = array(); - - /** - * List of HTMLPurifier_AttrTransform to be performed after validation. - */ - public $info_attr_transform_post = array(); - - /** - * List of HTMLPurifier_Injector to be performed during well-formedness fixing. - * An injector will only be invoked if all of it's pre-requisites are met; - * if an injector fails setup, there will be no error; it will simply be - * silently disabled. - */ - public $info_injector = array(); - - /** - * Boolean flag that indicates whether or not getChildDef is implemented. - * For optimization reasons: may save a call to a function. Be sure - * to set it if you do implement getChildDef(), otherwise it will have - * no effect! - */ - public $defines_child_def = false; - - /** - * Boolean flag whether or not this module is safe. If it is not safe, all - * of its members are unsafe. Modules are safe by default (this might be - * slightly dangerous, but it doesn't make much sense to force HTML Purifier, - * which is based off of safe HTML, to explicitly say, "This is safe," even - * though there are modules which are "unsafe") - * - * @note Previously, safety could be applied at an element level granularity. - * We've removed this ability, so in order to add "unsafe" elements - * or attributes, a dedicated module with this property set to false - * must be used. - */ - public $safe = true; - - /** - * Retrieves a proper HTMLPurifier_ChildDef subclass based on - * content_model and content_model_type member variables of - * the HTMLPurifier_ElementDef class. There is a similar function - * in HTMLPurifier_HTMLDefinition. - * @param $def HTMLPurifier_ElementDef instance - * @return HTMLPurifier_ChildDef subclass - */ - public function getChildDef($def) {return false;} - - // -- Convenience ----------------------------------------------------- - - /** - * Convenience function that sets up a new element - * @param $element Name of element to add - * @param $type What content set should element be registered to? - * Set as false to skip this step. - * @param $contents Allowed children in form of: - * "$content_model_type: $content_model" - * @param $attr_includes What attribute collections to register to - * element? - * @param $attr What unique attributes does the element define? - * @note See ElementDef for in-depth descriptions of these parameters. - * @return Created element definition object, so you - * can set advanced parameters - */ - public function addElement($element, $type, $contents, $attr_includes = array(), $attr = array()) { - $this->elements[] = $element; - // parse content_model - list($content_model_type, $content_model) = $this->parseContents($contents); - // merge in attribute inclusions - $this->mergeInAttrIncludes($attr, $attr_includes); - // add element to content sets - if ($type) $this->addElementToContentSet($element, $type); - // create element - $this->info[$element] = HTMLPurifier_ElementDef::create( - $content_model, $content_model_type, $attr - ); - // literal object $contents means direct child manipulation - if (!is_string($contents)) $this->info[$element]->child = $contents; - return $this->info[$element]; - } - - /** - * Convenience function that creates a totally blank, non-standalone - * element. - * @param $element Name of element to create - * @return Created element - */ - public function addBlankElement($element) { - if (!isset($this->info[$element])) { - $this->elements[] = $element; - $this->info[$element] = new HTMLPurifier_ElementDef(); - $this->info[$element]->standalone = false; - } else { - trigger_error("Definition for $element already exists in module, cannot redefine"); - } - return $this->info[$element]; - } - - /** - * Convenience function that registers an element to a content set - * @param Element to register - * @param Name content set (warning: case sensitive, usually upper-case - * first letter) - */ - public function addElementToContentSet($element, $type) { - if (!isset($this->content_sets[$type])) $this->content_sets[$type] = ''; - else $this->content_sets[$type] .= ' | '; - $this->content_sets[$type] .= $element; - } - - /** - * Convenience function that transforms single-string contents - * into separate content model and content model type - * @param $contents Allowed children in form of: - * "$content_model_type: $content_model" - * @note If contents is an object, an array of two nulls will be - * returned, and the callee needs to take the original $contents - * and use it directly. - */ - public function parseContents($contents) { - if (!is_string($contents)) return array(null, null); // defer - switch ($contents) { - // check for shorthand content model forms - case 'Empty': - return array('empty', ''); - case 'Inline': - return array('optional', 'Inline | #PCDATA'); - case 'Flow': - return array('optional', 'Flow | #PCDATA'); - } - list($content_model_type, $content_model) = explode(':', $contents); - $content_model_type = strtolower(trim($content_model_type)); - $content_model = trim($content_model); - return array($content_model_type, $content_model); - } - - /** - * Convenience function that merges a list of attribute includes into - * an attribute array. - * @param $attr Reference to attr array to modify - * @param $attr_includes Array of includes / string include to merge in - */ - public function mergeInAttrIncludes(&$attr, $attr_includes) { - if (!is_array($attr_includes)) { - if (empty($attr_includes)) $attr_includes = array(); - else $attr_includes = array($attr_includes); - } - $attr[0] = $attr_includes; - } - - /** - * Convenience function that generates a lookup table with boolean - * true as value. - * @param $list List of values to turn into a lookup - * @note You can also pass an arbitrary number of arguments in - * place of the regular argument - * @return Lookup array equivalent of list - */ - public function makeLookup($list) { - if (is_string($list)) $list = func_get_args(); - $ret = array(); - foreach ($list as $value) { - if (is_null($value)) continue; - $ret[$value] = true; - } - return $ret; - } - - /** - * Lazy load construction of the module after determining whether - * or not it's needed, and also when a finalized configuration object - * is available. - * @param $config Instance of HTMLPurifier_Config - */ - public function setup($config) {} - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php deleted file mode 100644 index 3d66f1b4e..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Bdo.php +++ /dev/null @@ -1,31 +0,0 @@ - array('dir' => false) - ); - - public function setup($config) { - $bdo = $this->addElement( - 'bdo', 'Inline', 'Inline', array('Core', 'Lang'), - array( - 'dir' => 'Enum#ltr,rtl', // required - // The Abstract Module specification has the attribute - // inclusions wrong for bdo: bdo allows Lang - ) - ); - $bdo->attr_transform_post['required-dir'] = new HTMLPurifier_AttrTransform_BdoDir(); - - $this->attr_collections['I18N']['dir'] = 'Enum#ltr,rtl'; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php deleted file mode 100644 index 7c15da84f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/CommonAttributes.php +++ /dev/null @@ -1,26 +0,0 @@ - array( - 0 => array('Style'), - // 'xml:space' => false, - 'class' => 'Class', - 'id' => 'ID', - 'title' => 'CDATA', - ), - 'Lang' => array(), - 'I18N' => array( - 0 => array('Lang'), // proprietary, for xml:lang/lang - ), - 'Common' => array( - 0 => array('Core', 'I18N') - ) - ); - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php deleted file mode 100644 index ff9369055..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Edit.php +++ /dev/null @@ -1,38 +0,0 @@ - 'URI', - // 'datetime' => 'Datetime', // not implemented - ); - $this->addElement('del', 'Inline', $contents, 'Common', $attr); - $this->addElement('ins', 'Inline', $contents, 'Common', $attr); - } - - // HTML 4.01 specifies that ins/del must not contain block - // elements when used in an inline context, chameleon is - // a complicated workaround to acheive this effect - - // Inline context ! Block context (exclamation mark is - // separator, see getChildDef for parsing) - - public $defines_child_def = true; - public function getChildDef($def) { - if ($def->content_model_type != 'chameleon') return false; - $value = explode('!', $def->content_model); - return new HTMLPurifier_ChildDef_Chameleon($value[0], $value[1]); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php deleted file mode 100644 index 44c22f6f8..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Forms.php +++ /dev/null @@ -1,118 +0,0 @@ - 'Form', - 'Inline' => 'Formctrl', - ); - - public function setup($config) { - $form = $this->addElement('form', 'Form', - 'Required: Heading | List | Block | fieldset', 'Common', array( - 'accept' => 'ContentTypes', - 'accept-charset' => 'Charsets', - 'action*' => 'URI', - 'method' => 'Enum#get,post', - // really ContentType, but these two are the only ones used today - 'enctype' => 'Enum#application/x-www-form-urlencoded,multipart/form-data', - )); - $form->excludes = array('form' => true); - - $input = $this->addElement('input', 'Formctrl', 'Empty', 'Common', array( - 'accept' => 'ContentTypes', - 'accesskey' => 'Character', - 'alt' => 'Text', - 'checked' => 'Bool#checked', - 'disabled' => 'Bool#disabled', - 'maxlength' => 'Number', - 'name' => 'CDATA', - 'readonly' => 'Bool#readonly', - 'size' => 'Number', - 'src' => 'URI#embeds', - 'tabindex' => 'Number', - 'type' => 'Enum#text,password,checkbox,button,radio,submit,reset,file,hidden,image', - 'value' => 'CDATA', - )); - $input->attr_transform_post[] = new HTMLPurifier_AttrTransform_Input(); - - $this->addElement('select', 'Formctrl', 'Required: optgroup | option', 'Common', array( - 'disabled' => 'Bool#disabled', - 'multiple' => 'Bool#multiple', - 'name' => 'CDATA', - 'size' => 'Number', - 'tabindex' => 'Number', - )); - - $this->addElement('option', false, 'Optional: #PCDATA', 'Common', array( - 'disabled' => 'Bool#disabled', - 'label' => 'Text', - 'selected' => 'Bool#selected', - 'value' => 'CDATA', - )); - // It's illegal for there to be more than one selected, but not - // be multiple. Also, no selected means undefined behavior. This might - // be difficult to implement; perhaps an injector, or a context variable. - - $textarea = $this->addElement('textarea', 'Formctrl', 'Optional: #PCDATA', 'Common', array( - 'accesskey' => 'Character', - 'cols*' => 'Number', - 'disabled' => 'Bool#disabled', - 'name' => 'CDATA', - 'readonly' => 'Bool#readonly', - 'rows*' => 'Number', - 'tabindex' => 'Number', - )); - $textarea->attr_transform_pre[] = new HTMLPurifier_AttrTransform_Textarea(); - - $button = $this->addElement('button', 'Formctrl', 'Optional: #PCDATA | Heading | List | Block | Inline', 'Common', array( - 'accesskey' => 'Character', - 'disabled' => 'Bool#disabled', - 'name' => 'CDATA', - 'tabindex' => 'Number', - 'type' => 'Enum#button,submit,reset', - 'value' => 'CDATA', - )); - - // For exclusions, ideally we'd specify content sets, not literal elements - $button->excludes = $this->makeLookup( - 'form', 'fieldset', // Form - 'input', 'select', 'textarea', 'label', 'button', // Formctrl - 'a' // as per HTML 4.01 spec, this is omitted by modularization - ); - - // Extra exclusion: img usemap="" is not permitted within this element. - // We'll omit this for now, since we don't have any good way of - // indicating it yet. - - // This is HIGHLY user-unfriendly; we need a custom child-def for this - $this->addElement('fieldset', 'Form', 'Custom: (#WS?,legend,(Flow|#PCDATA)*)', 'Common'); - - $label = $this->addElement('label', 'Formctrl', 'Optional: #PCDATA | Inline', 'Common', array( - 'accesskey' => 'Character', - // 'for' => 'IDREF', // IDREF not implemented, cannot allow - )); - $label->excludes = array('label' => true); - - $this->addElement('legend', false, 'Optional: #PCDATA | Inline', 'Common', array( - 'accesskey' => 'Character', - )); - - $this->addElement('optgroup', false, 'Required: option', 'Common', array( - 'disabled' => 'Bool#disabled', - 'label*' => 'Text', - )); - - // Don't forget an injector for . This one's a little complex - // because it maps to multiple elements. - - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php deleted file mode 100644 index d7e9bdd27..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Hypertext.php +++ /dev/null @@ -1,31 +0,0 @@ -addElement( - 'a', 'Inline', 'Inline', 'Common', - array( - // 'accesskey' => 'Character', - // 'charset' => 'Charset', - 'href' => 'URI', - // 'hreflang' => 'LanguageCode', - 'rel' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rel'), - 'rev' => new HTMLPurifier_AttrDef_HTML_LinkTypes('rev'), - // 'tabindex' => 'Number', - // 'type' => 'ContentType', - ) - ); - $a->formatting = true; - $a->excludes = array('a' => true); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php deleted file mode 100644 index 948d435bc..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Image.php +++ /dev/null @@ -1,40 +0,0 @@ -get('HTML.MaxImgLength'); - $img = $this->addElement( - 'img', 'Inline', 'Empty', 'Common', - array( - 'alt*' => 'Text', - // According to the spec, it's Length, but percents can - // be abused, so we allow only Pixels. - 'height' => 'Pixels#' . $max, - 'width' => 'Pixels#' . $max, - 'longdesc' => 'URI', - 'src*' => new HTMLPurifier_AttrDef_URI(true), // embedded - ) - ); - if ($max === null || $config->get('HTML.Trusted')) { - $img->attr['height'] = - $img->attr['width'] = 'Length'; - } - - // kind of strange, but splitting things up would be inefficient - $img->attr_transform_pre[] = - $img->attr_transform_post[] = - new HTMLPurifier_AttrTransform_ImgRequired(); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php deleted file mode 100644 index df33927ba..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Legacy.php +++ /dev/null @@ -1,143 +0,0 @@ -addElement('basefont', 'Inline', 'Empty', false, array( - 'color' => 'Color', - 'face' => 'Text', // extremely broad, we should - 'size' => 'Text', // tighten it - 'id' => 'ID' - )); - $this->addElement('center', 'Block', 'Flow', 'Common'); - $this->addElement('dir', 'Block', 'Required: li', 'Common', array( - 'compact' => 'Bool#compact' - )); - $this->addElement('font', 'Inline', 'Inline', array('Core', 'I18N'), array( - 'color' => 'Color', - 'face' => 'Text', // extremely broad, we should - 'size' => 'Text', // tighten it - )); - $this->addElement('menu', 'Block', 'Required: li', 'Common', array( - 'compact' => 'Bool#compact' - )); - - $s = $this->addElement('s', 'Inline', 'Inline', 'Common'); - $s->formatting = true; - - $strike = $this->addElement('strike', 'Inline', 'Inline', 'Common'); - $strike->formatting = true; - - $u = $this->addElement('u', 'Inline', 'Inline', 'Common'); - $u->formatting = true; - - // setup modifications to old elements - - $align = 'Enum#left,right,center,justify'; - - $address = $this->addBlankElement('address'); - $address->content_model = 'Inline | #PCDATA | p'; - $address->content_model_type = 'optional'; - $address->child = false; - - $blockquote = $this->addBlankElement('blockquote'); - $blockquote->content_model = 'Flow | #PCDATA'; - $blockquote->content_model_type = 'optional'; - $blockquote->child = false; - - $br = $this->addBlankElement('br'); - $br->attr['clear'] = 'Enum#left,all,right,none'; - - $caption = $this->addBlankElement('caption'); - $caption->attr['align'] = 'Enum#top,bottom,left,right'; - - $div = $this->addBlankElement('div'); - $div->attr['align'] = $align; - - $dl = $this->addBlankElement('dl'); - $dl->attr['compact'] = 'Bool#compact'; - - for ($i = 1; $i <= 6; $i++) { - $h = $this->addBlankElement("h$i"); - $h->attr['align'] = $align; - } - - $hr = $this->addBlankElement('hr'); - $hr->attr['align'] = $align; - $hr->attr['noshade'] = 'Bool#noshade'; - $hr->attr['size'] = 'Pixels'; - $hr->attr['width'] = 'Length'; - - $img = $this->addBlankElement('img'); - $img->attr['align'] = 'Enum#top,middle,bottom,left,right'; - $img->attr['border'] = 'Pixels'; - $img->attr['hspace'] = 'Pixels'; - $img->attr['vspace'] = 'Pixels'; - - // figure out this integer business - - $li = $this->addBlankElement('li'); - $li->attr['value'] = new HTMLPurifier_AttrDef_Integer(); - $li->attr['type'] = 'Enum#s:1,i,I,a,A,disc,square,circle'; - - $ol = $this->addBlankElement('ol'); - $ol->attr['compact'] = 'Bool#compact'; - $ol->attr['start'] = new HTMLPurifier_AttrDef_Integer(); - $ol->attr['type'] = 'Enum#s:1,i,I,a,A'; - - $p = $this->addBlankElement('p'); - $p->attr['align'] = $align; - - $pre = $this->addBlankElement('pre'); - $pre->attr['width'] = 'Number'; - - // script omitted - - $table = $this->addBlankElement('table'); - $table->attr['align'] = 'Enum#left,center,right'; - $table->attr['bgcolor'] = 'Color'; - - $tr = $this->addBlankElement('tr'); - $tr->attr['bgcolor'] = 'Color'; - - $th = $this->addBlankElement('th'); - $th->attr['bgcolor'] = 'Color'; - $th->attr['height'] = 'Length'; - $th->attr['nowrap'] = 'Bool#nowrap'; - $th->attr['width'] = 'Length'; - - $td = $this->addBlankElement('td'); - $td->attr['bgcolor'] = 'Color'; - $td->attr['height'] = 'Length'; - $td->attr['nowrap'] = 'Bool#nowrap'; - $td->attr['width'] = 'Length'; - - $ul = $this->addBlankElement('ul'); - $ul->attr['compact'] = 'Bool#compact'; - $ul->attr['type'] = 'Enum#square,disc,circle'; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/List.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/List.php deleted file mode 100644 index 1d15f2729..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/List.php +++ /dev/null @@ -1,35 +0,0 @@ - 'List'); - - public function setup($config) { - $this->addElement('ol', 'List', 'Required: li', 'Common'); - $this->addElement('ul', 'List', 'Required: li', 'Common'); - $this->addElement('dl', 'List', 'Required: dt | dd', 'Common'); - - $this->addElement('li', false, 'Flow', 'Common'); - - $this->addElement('dd', false, 'Flow', 'Common'); - $this->addElement('dt', false, 'Inline', 'Common'); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php deleted file mode 100644 index 05694b450..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Name.php +++ /dev/null @@ -1,21 +0,0 @@ -addBlankElement($name); - $element->attr['name'] = 'CDATA'; - if (!$config->get('HTML.Attr.Name.UseCDATA')) { - $element->attr_transform_post['NameSync'] = new HTMLPurifier_AttrTransform_NameSync(); - } - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php deleted file mode 100644 index 5f1b14abb..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/NonXMLCommonAttributes.php +++ /dev/null @@ -1,14 +0,0 @@ - array( - 'lang' => 'LanguageCode', - ) - ); -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php deleted file mode 100644 index 193c1011f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Object.php +++ /dev/null @@ -1,47 +0,0 @@ - to cater to legacy browsers: this - * module does not allow this sort of behavior - */ -class HTMLPurifier_HTMLModule_Object extends HTMLPurifier_HTMLModule -{ - - public $name = 'Object'; - public $safe = false; - - public function setup($config) { - - $this->addElement('object', 'Inline', 'Optional: #PCDATA | Flow | param', 'Common', - array( - 'archive' => 'URI', - 'classid' => 'URI', - 'codebase' => 'URI', - 'codetype' => 'Text', - 'data' => 'URI', - 'declare' => 'Bool#declare', - 'height' => 'Length', - 'name' => 'CDATA', - 'standby' => 'Text', - 'tabindex' => 'Number', - 'type' => 'ContentType', - 'width' => 'Length' - ) - ); - - $this->addElement('param', false, 'Empty', false, - array( - 'id' => 'ID', - 'name*' => 'Text', - 'type' => 'Text', - 'value' => 'Text', - 'valuetype' => 'Enum#data,ref,object' - ) - ); - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php deleted file mode 100644 index 8ff0b5ed7..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Presentation.php +++ /dev/null @@ -1,36 +0,0 @@ -addElement('hr', 'Block', 'Empty', 'Common'); - $this->addElement('sub', 'Inline', 'Inline', 'Common'); - $this->addElement('sup', 'Inline', 'Inline', 'Common'); - $b = $this->addElement('b', 'Inline', 'Inline', 'Common'); - $b->formatting = true; - $big = $this->addElement('big', 'Inline', 'Inline', 'Common'); - $big->formatting = true; - $i = $this->addElement('i', 'Inline', 'Inline', 'Common'); - $i->formatting = true; - $small = $this->addElement('small', 'Inline', 'Inline', 'Common'); - $small->formatting = true; - $tt = $this->addElement('tt', 'Inline', 'Inline', 'Common'); - $tt->formatting = true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php deleted file mode 100644 index dd36a3de0..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Proprietary.php +++ /dev/null @@ -1,33 +0,0 @@ -addElement('marquee', 'Inline', 'Flow', 'Common', - array( - 'direction' => 'Enum#left,right,up,down', - 'behavior' => 'Enum#alternate', - 'width' => 'Length', - 'height' => 'Length', - 'scrolldelay' => 'Number', - 'scrollamount' => 'Number', - 'loop' => 'Number', - 'bgcolor' => 'Color', - 'hspace' => 'Pixels', - 'vspace' => 'Pixels', - ) - ); - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php deleted file mode 100644 index b26a0a30a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Ruby.php +++ /dev/null @@ -1,27 +0,0 @@ -addElement('ruby', 'Inline', - 'Custom: ((rb, (rt | (rp, rt, rp))) | (rbc, rtc, rtc?))', - 'Common'); - $this->addElement('rbc', false, 'Required: rb', 'Common'); - $this->addElement('rtc', false, 'Required: rt', 'Common'); - $rb = $this->addElement('rb', false, 'Inline', 'Common'); - $rb->excludes = array('ruby' => true); - $rt = $this->addElement('rt', false, 'Inline', 'Common', array('rbspan' => 'Number')); - $rt->excludes = array('ruby' => true); - $this->addElement('rp', false, 'Optional: #PCDATA', 'Common'); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php deleted file mode 100644 index 8fc03cb1c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/SafeEmbed.php +++ /dev/null @@ -1,33 +0,0 @@ -get('HTML.MaxImgLength'); - $embed = $this->addElement( - 'embed', 'Inline', 'Empty', 'Common', - array( - 'src*' => 'URI#embedded', - 'type' => 'Enum#application/x-shockwave-flash', - 'width' => 'Pixels#' . $max, - 'height' => 'Pixels#' . $max, - 'allowscriptaccess' => 'Enum#never', - 'allownetworking' => 'Enum#internal', - 'wmode' => 'Enum#window', - 'name' => 'ID', - ) - ); - $embed->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeEmbed(); - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php deleted file mode 100644 index 33bac00cf..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/SafeObject.php +++ /dev/null @@ -1,50 +0,0 @@ -get('HTML.MaxImgLength'); - $object = $this->addElement( - 'object', - 'Inline', - 'Optional: param | Flow | #PCDATA', - 'Common', - array( - // While technically not required by the spec, we're forcing - // it to this value. - 'type' => 'Enum#application/x-shockwave-flash', - 'width' => 'Pixels#' . $max, - 'height' => 'Pixels#' . $max, - 'data' => 'URI#embedded' - ) - ); - $object->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeObject(); - - $param = $this->addElement('param', false, 'Empty', false, - array( - 'id' => 'ID', - 'name*' => 'Text', - 'value' => 'Text' - ) - ); - $param->attr_transform_post[] = new HTMLPurifier_AttrTransform_SafeParam(); - $this->info_injector[] = 'SafeObject'; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php deleted file mode 100644 index cecdea6c3..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Scripting.php +++ /dev/null @@ -1,54 +0,0 @@ - 'script | noscript', 'Inline' => 'script | noscript'); - public $safe = false; - - public function setup($config) { - // TODO: create custom child-definition for noscript that - // auto-wraps stray #PCDATA in a similar manner to - // blockquote's custom definition (we would use it but - // blockquote's contents are optional while noscript's contents - // are required) - - // TODO: convert this to new syntax, main problem is getting - // both content sets working - - // In theory, this could be safe, but I don't see any reason to - // allow it. - $this->info['noscript'] = new HTMLPurifier_ElementDef(); - $this->info['noscript']->attr = array( 0 => array('Common') ); - $this->info['noscript']->content_model = 'Heading | List | Block'; - $this->info['noscript']->content_model_type = 'required'; - - $this->info['script'] = new HTMLPurifier_ElementDef(); - $this->info['script']->attr = array( - 'defer' => new HTMLPurifier_AttrDef_Enum(array('defer')), - 'src' => new HTMLPurifier_AttrDef_URI(true), - 'type' => new HTMLPurifier_AttrDef_Enum(array('text/javascript')) - ); - $this->info['script']->content_model = '#PCDATA'; - $this->info['script']->content_model_type = 'optional'; - $this->info['script']->attr_transform_pre['type'] = - $this->info['script']->attr_transform_post['type'] = - new HTMLPurifier_AttrTransform_ScriptRequired(); - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php deleted file mode 100644 index eb78464cc..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/StyleAttribute.php +++ /dev/null @@ -1,24 +0,0 @@ - array('style' => false), // see constructor - 'Core' => array(0 => array('Style')) - ); - - public function setup($config) { - $this->attr_collections['Style']['style'] = new HTMLPurifier_AttrDef_CSS(); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php deleted file mode 100644 index f314ced3f..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tables.php +++ /dev/null @@ -1,66 +0,0 @@ -addElement('caption', false, 'Inline', 'Common'); - - $this->addElement('table', 'Block', - new HTMLPurifier_ChildDef_Table(), 'Common', - array( - 'border' => 'Pixels', - 'cellpadding' => 'Length', - 'cellspacing' => 'Length', - 'frame' => 'Enum#void,above,below,hsides,lhs,rhs,vsides,box,border', - 'rules' => 'Enum#none,groups,rows,cols,all', - 'summary' => 'Text', - 'width' => 'Length' - ) - ); - - // common attributes - $cell_align = array( - 'align' => 'Enum#left,center,right,justify,char', - 'charoff' => 'Length', - 'valign' => 'Enum#top,middle,bottom,baseline', - ); - - $cell_t = array_merge( - array( - 'abbr' => 'Text', - 'colspan' => 'Number', - 'rowspan' => 'Number', - ), - $cell_align - ); - $this->addElement('td', false, 'Flow', 'Common', $cell_t); - $this->addElement('th', false, 'Flow', 'Common', $cell_t); - - $this->addElement('tr', false, 'Required: td | th', 'Common', $cell_align); - - $cell_col = array_merge( - array( - 'span' => 'Number', - 'width' => 'MultiLength', - ), - $cell_align - ); - $this->addElement('col', false, 'Empty', 'Common', $cell_col); - $this->addElement('colgroup', false, 'Optional: col', 'Common', $cell_col); - - $this->addElement('tbody', false, 'Required: tr', 'Common', $cell_align); - $this->addElement('thead', false, 'Required: tr', 'Common', $cell_align); - $this->addElement('tfoot', false, 'Required: tr', 'Common', $cell_align); - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php deleted file mode 100644 index 2b844ecc4..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Target.php +++ /dev/null @@ -1,23 +0,0 @@ -addBlankElement($name); - $e->attr = array( - 'target' => new HTMLPurifier_AttrDef_HTML_FrameTarget() - ); - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php deleted file mode 100644 index ae77c7188..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Text.php +++ /dev/null @@ -1,71 +0,0 @@ - 'Heading | Block | Inline' - ); - - public function setup($config) { - - // Inline Phrasal ------------------------------------------------- - $this->addElement('abbr', 'Inline', 'Inline', 'Common'); - $this->addElement('acronym', 'Inline', 'Inline', 'Common'); - $this->addElement('cite', 'Inline', 'Inline', 'Common'); - $this->addElement('dfn', 'Inline', 'Inline', 'Common'); - $this->addElement('kbd', 'Inline', 'Inline', 'Common'); - $this->addElement('q', 'Inline', 'Inline', 'Common', array('cite' => 'URI')); - $this->addElement('samp', 'Inline', 'Inline', 'Common'); - $this->addElement('var', 'Inline', 'Inline', 'Common'); - - $em = $this->addElement('em', 'Inline', 'Inline', 'Common'); - $em->formatting = true; - - $strong = $this->addElement('strong', 'Inline', 'Inline', 'Common'); - $strong->formatting = true; - - $code = $this->addElement('code', 'Inline', 'Inline', 'Common'); - $code->formatting = true; - - // Inline Structural ---------------------------------------------- - $this->addElement('span', 'Inline', 'Inline', 'Common'); - $this->addElement('br', 'Inline', 'Empty', 'Core'); - - // Block Phrasal -------------------------------------------------- - $this->addElement('address', 'Block', 'Inline', 'Common'); - $this->addElement('blockquote', 'Block', 'Optional: Heading | Block | List', 'Common', array('cite' => 'URI') ); - $pre = $this->addElement('pre', 'Block', 'Inline', 'Common'); - $pre->excludes = $this->makeLookup( - 'img', 'big', 'small', 'object', 'applet', 'font', 'basefont' ); - $this->addElement('h1', 'Heading', 'Inline', 'Common'); - $this->addElement('h2', 'Heading', 'Inline', 'Common'); - $this->addElement('h3', 'Heading', 'Inline', 'Common'); - $this->addElement('h4', 'Heading', 'Inline', 'Common'); - $this->addElement('h5', 'Heading', 'Inline', 'Common'); - $this->addElement('h6', 'Heading', 'Inline', 'Common'); - - // Block Structural ----------------------------------------------- - $p = $this->addElement('p', 'Block', 'Inline', 'Common'); - $p->autoclose = array_flip(array("address", "blockquote", "center", "dir", "div", "dl", "fieldset", "ol", "p", "ul")); - - $this->addElement('div', 'Block', 'Flow', 'Common'); - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php deleted file mode 100644 index 21783f18e..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy.php +++ /dev/null @@ -1,207 +0,0 @@ - 'none', 'light', 'medium', 'heavy'); - - /** - * Default level to place all fixes in. Disabled by default - */ - public $defaultLevel = null; - - /** - * Lists of fixes used by getFixesForLevel(). Format is: - * HTMLModule_Tidy->fixesForLevel[$level] = array('fix-1', 'fix-2'); - */ - public $fixesForLevel = array( - 'light' => array(), - 'medium' => array(), - 'heavy' => array() - ); - - /** - * Lazy load constructs the module by determining the necessary - * fixes to create and then delegating to the populate() function. - * @todo Wildcard matching and error reporting when an added or - * subtracted fix has no effect. - */ - public function setup($config) { - - // create fixes, initialize fixesForLevel - $fixes = $this->makeFixes(); - $this->makeFixesForLevel($fixes); - - // figure out which fixes to use - $level = $config->get('HTML.TidyLevel'); - $fixes_lookup = $this->getFixesForLevel($level); - - // get custom fix declarations: these need namespace processing - $add_fixes = $config->get('HTML.TidyAdd'); - $remove_fixes = $config->get('HTML.TidyRemove'); - - foreach ($fixes as $name => $fix) { - // needs to be refactored a little to implement globbing - if ( - isset($remove_fixes[$name]) || - (!isset($add_fixes[$name]) && !isset($fixes_lookup[$name])) - ) { - unset($fixes[$name]); - } - } - - // populate this module with necessary fixes - $this->populate($fixes); - - } - - /** - * Retrieves all fixes per a level, returning fixes for that specific - * level as well as all levels below it. - * @param $level String level identifier, see $levels for valid values - * @return Lookup up table of fixes - */ - public function getFixesForLevel($level) { - if ($level == $this->levels[0]) { - return array(); - } - $activated_levels = array(); - for ($i = 1, $c = count($this->levels); $i < $c; $i++) { - $activated_levels[] = $this->levels[$i]; - if ($this->levels[$i] == $level) break; - } - if ($i == $c) { - trigger_error( - 'Tidy level ' . htmlspecialchars($level) . ' not recognized', - E_USER_WARNING - ); - return array(); - } - $ret = array(); - foreach ($activated_levels as $level) { - foreach ($this->fixesForLevel[$level] as $fix) { - $ret[$fix] = true; - } - } - return $ret; - } - - /** - * Dynamically populates the $fixesForLevel member variable using - * the fixes array. It may be custom overloaded, used in conjunction - * with $defaultLevel, or not used at all. - */ - public function makeFixesForLevel($fixes) { - if (!isset($this->defaultLevel)) return; - if (!isset($this->fixesForLevel[$this->defaultLevel])) { - trigger_error( - 'Default level ' . $this->defaultLevel . ' does not exist', - E_USER_ERROR - ); - return; - } - $this->fixesForLevel[$this->defaultLevel] = array_keys($fixes); - } - - /** - * Populates the module with transforms and other special-case code - * based on a list of fixes passed to it - * @param $lookup Lookup table of fixes to activate - */ - public function populate($fixes) { - foreach ($fixes as $name => $fix) { - // determine what the fix is for - list($type, $params) = $this->getFixType($name); - switch ($type) { - case 'attr_transform_pre': - case 'attr_transform_post': - $attr = $params['attr']; - if (isset($params['element'])) { - $element = $params['element']; - if (empty($this->info[$element])) { - $e = $this->addBlankElement($element); - } else { - $e = $this->info[$element]; - } - } else { - $type = "info_$type"; - $e = $this; - } - // PHP does some weird parsing when I do - // $e->$type[$attr], so I have to assign a ref. - $f =& $e->$type; - $f[$attr] = $fix; - break; - case 'tag_transform': - $this->info_tag_transform[$params['element']] = $fix; - break; - case 'child': - case 'content_model_type': - $element = $params['element']; - if (empty($this->info[$element])) { - $e = $this->addBlankElement($element); - } else { - $e = $this->info[$element]; - } - $e->$type = $fix; - break; - default: - trigger_error("Fix type $type not supported", E_USER_ERROR); - break; - } - } - } - - /** - * Parses a fix name and determines what kind of fix it is, as well - * as other information defined by the fix - * @param $name String name of fix - * @return array(string $fix_type, array $fix_parameters) - * @note $fix_parameters is type dependant, see populate() for usage - * of these parameters - */ - public function getFixType($name) { - // parse it - $property = $attr = null; - if (strpos($name, '#') !== false) list($name, $property) = explode('#', $name); - if (strpos($name, '@') !== false) list($name, $attr) = explode('@', $name); - - // figure out the parameters - $params = array(); - if ($name !== '') $params['element'] = $name; - if (!is_null($attr)) $params['attr'] = $attr; - - // special case: attribute transform - if (!is_null($attr)) { - if (is_null($property)) $property = 'pre'; - $type = 'attr_transform_' . $property; - return array($type, $params); - } - - // special case: tag transform - if (is_null($property)) { - return array('tag_transform', $params); - } - - return array($property, $params); - - } - - /** - * Defines all fixes the module will perform in a compact - * associative array of fix name to fix implementation. - */ - public function makeFixes() {} - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php deleted file mode 100644 index 61ff85ce2..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Name.php +++ /dev/null @@ -1,24 +0,0 @@ -content_model_type != 'strictblockquote') return parent::getChildDef($def); - return new HTMLPurifier_ChildDef_StrictBlockquote($def->content_model); - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php deleted file mode 100644 index 9960b1dd1..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/Tidy/Transitional.php +++ /dev/null @@ -1,9 +0,0 @@ - 'text-align:left;', - 'right' => 'text-align:right;', - 'top' => 'caption-side:top;', - 'bottom' => 'caption-side:bottom;' // not supported by IE - )); - - // @align for img ------------------------------------------------- - $r['img@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS('align', array( - 'left' => 'float:left;', - 'right' => 'float:right;', - 'top' => 'vertical-align:top;', - 'middle' => 'vertical-align:middle;', - 'bottom' => 'vertical-align:baseline;', - )); - - // @align for table ----------------------------------------------- - $r['table@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS('align', array( - 'left' => 'float:left;', - 'center' => 'margin-left:auto;margin-right:auto;', - 'right' => 'float:right;' - )); - - // @align for hr ----------------------------------------------- - $r['hr@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS('align', array( - // we use both text-align and margin because these work - // for different browsers (IE and Firefox, respectively) - // and the melange makes for a pretty cross-compatible - // solution - 'left' => 'margin-left:0;margin-right:auto;text-align:left;', - 'center' => 'margin-left:auto;margin-right:auto;text-align:center;', - 'right' => 'margin-left:auto;margin-right:0;text-align:right;' - )); - - // @align for h1, h2, h3, h4, h5, h6, p, div ---------------------- - // {{{ - $align_lookup = array(); - $align_values = array('left', 'right', 'center', 'justify'); - foreach ($align_values as $v) $align_lookup[$v] = "text-align:$v;"; - // }}} - $r['h1@align'] = - $r['h2@align'] = - $r['h3@align'] = - $r['h4@align'] = - $r['h5@align'] = - $r['h6@align'] = - $r['p@align'] = - $r['div@align'] = - new HTMLPurifier_AttrTransform_EnumToCSS('align', $align_lookup); - - // @bgcolor for table, tr, td, th --------------------------------- - $r['table@bgcolor'] = - $r['td@bgcolor'] = - $r['th@bgcolor'] = - new HTMLPurifier_AttrTransform_BgColor(); - - // @border for img ------------------------------------------------ - $r['img@border'] = new HTMLPurifier_AttrTransform_Border(); - - // @clear for br -------------------------------------------------- - $r['br@clear'] = - new HTMLPurifier_AttrTransform_EnumToCSS('clear', array( - 'left' => 'clear:left;', - 'right' => 'clear:right;', - 'all' => 'clear:both;', - 'none' => 'clear:none;', - )); - - // @height for td, th --------------------------------------------- - $r['td@height'] = - $r['th@height'] = - new HTMLPurifier_AttrTransform_Length('height'); - - // @hspace for img ------------------------------------------------ - $r['img@hspace'] = new HTMLPurifier_AttrTransform_ImgSpace('hspace'); - - // @noshade for hr ------------------------------------------------ - // this transformation is not precise but often good enough. - // different browsers use different styles to designate noshade - $r['hr@noshade'] = - new HTMLPurifier_AttrTransform_BoolToCSS( - 'noshade', - 'color:#808080;background-color:#808080;border:0;' - ); - - // @nowrap for td, th --------------------------------------------- - $r['td@nowrap'] = - $r['th@nowrap'] = - new HTMLPurifier_AttrTransform_BoolToCSS( - 'nowrap', - 'white-space:nowrap;' - ); - - // @size for hr -------------------------------------------------- - $r['hr@size'] = new HTMLPurifier_AttrTransform_Length('size', 'height'); - - // @type for li, ol, ul ------------------------------------------- - // {{{ - $ul_types = array( - 'disc' => 'list-style-type:disc;', - 'square' => 'list-style-type:square;', - 'circle' => 'list-style-type:circle;' - ); - $ol_types = array( - '1' => 'list-style-type:decimal;', - 'i' => 'list-style-type:lower-roman;', - 'I' => 'list-style-type:upper-roman;', - 'a' => 'list-style-type:lower-alpha;', - 'A' => 'list-style-type:upper-alpha;' - ); - $li_types = $ul_types + $ol_types; - // }}} - - $r['ul@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ul_types); - $r['ol@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $ol_types, true); - $r['li@type'] = new HTMLPurifier_AttrTransform_EnumToCSS('type', $li_types, true); - - // @vspace for img ------------------------------------------------ - $r['img@vspace'] = new HTMLPurifier_AttrTransform_ImgSpace('vspace'); - - // @width for hr, td, th ------------------------------------------ - $r['td@width'] = - $r['th@width'] = - $r['hr@width'] = new HTMLPurifier_AttrTransform_Length('width'); - - return $r; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php deleted file mode 100644 index 9c0e03198..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModule/XMLCommonAttributes.php +++ /dev/null @@ -1,14 +0,0 @@ - array( - 'xml:lang' => 'LanguageCode', - ) - ); -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php b/extlib/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php deleted file mode 100644 index f5c4a1d2c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/HTMLModuleManager.php +++ /dev/null @@ -1,403 +0,0 @@ -attrTypes = new HTMLPurifier_AttrTypes(); - $this->doctypes = new HTMLPurifier_DoctypeRegistry(); - - // setup basic modules - $common = array( - 'CommonAttributes', 'Text', 'Hypertext', 'List', - 'Presentation', 'Edit', 'Bdo', 'Tables', 'Image', - 'StyleAttribute', - // Unsafe: - 'Scripting', 'Object', 'Forms', - // Sorta legacy, but present in strict: - 'Name', - ); - $transitional = array('Legacy', 'Target'); - $xml = array('XMLCommonAttributes'); - $non_xml = array('NonXMLCommonAttributes'); - - // setup basic doctypes - $this->doctypes->register( - 'HTML 4.01 Transitional', false, - array_merge($common, $transitional, $non_xml), - array('Tidy_Transitional', 'Tidy_Proprietary'), - array(), - '-//W3C//DTD HTML 4.01 Transitional//EN', - 'http://www.w3.org/TR/html4/loose.dtd' - ); - - $this->doctypes->register( - 'HTML 4.01 Strict', false, - array_merge($common, $non_xml), - array('Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'), - array(), - '-//W3C//DTD HTML 4.01//EN', - 'http://www.w3.org/TR/html4/strict.dtd' - ); - - $this->doctypes->register( - 'XHTML 1.0 Transitional', true, - array_merge($common, $transitional, $xml, $non_xml), - array('Tidy_Transitional', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Name'), - array(), - '-//W3C//DTD XHTML 1.0 Transitional//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd' - ); - - $this->doctypes->register( - 'XHTML 1.0 Strict', true, - array_merge($common, $xml, $non_xml), - array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Strict', 'Tidy_Proprietary', 'Tidy_Name'), - array(), - '-//W3C//DTD XHTML 1.0 Strict//EN', - 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd' - ); - - $this->doctypes->register( - 'XHTML 1.1', true, - array_merge($common, $xml, array('Ruby')), - array('Tidy_Strict', 'Tidy_XHTML', 'Tidy_Proprietary', 'Tidy_Strict', 'Tidy_Name'), // Tidy_XHTML1_1 - array(), - '-//W3C//DTD XHTML 1.1//EN', - 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd' - ); - - } - - /** - * Registers a module to the recognized module list, useful for - * overloading pre-existing modules. - * @param $module Mixed: string module name, with or without - * HTMLPurifier_HTMLModule prefix, or instance of - * subclass of HTMLPurifier_HTMLModule. - * @param $overload Boolean whether or not to overload previous modules. - * If this is not set, and you do overload a module, - * HTML Purifier will complain with a warning. - * @note This function will not call autoload, you must instantiate - * (and thus invoke) autoload outside the method. - * @note If a string is passed as a module name, different variants - * will be tested in this order: - * - Check for HTMLPurifier_HTMLModule_$name - * - Check all prefixes with $name in order they were added - * - Check for literal object name - * - Throw fatal error - * If your object name collides with an internal class, specify - * your module manually. All modules must have been included - * externally: registerModule will not perform inclusions for you! - */ - public function registerModule($module, $overload = false) { - if (is_string($module)) { - // attempt to load the module - $original_module = $module; - $ok = false; - foreach ($this->prefixes as $prefix) { - $module = $prefix . $original_module; - if (class_exists($module)) { - $ok = true; - break; - } - } - if (!$ok) { - $module = $original_module; - if (!class_exists($module)) { - trigger_error($original_module . ' module does not exist', - E_USER_ERROR); - return; - } - } - $module = new $module(); - } - if (empty($module->name)) { - trigger_error('Module instance of ' . get_class($module) . ' must have name'); - return; - } - if (!$overload && isset($this->registeredModules[$module->name])) { - trigger_error('Overloading ' . $module->name . ' without explicit overload parameter', E_USER_WARNING); - } - $this->registeredModules[$module->name] = $module; - } - - /** - * Adds a module to the current doctype by first registering it, - * and then tacking it on to the active doctype - */ - public function addModule($module) { - $this->registerModule($module); - if (is_object($module)) $module = $module->name; - $this->userModules[] = $module; - } - - /** - * Adds a class prefix that registerModule() will use to resolve a - * string name to a concrete class - */ - public function addPrefix($prefix) { - $this->prefixes[] = $prefix; - } - - /** - * Performs processing on modules, after being called you may - * use getElement() and getElements() - * @param $config Instance of HTMLPurifier_Config - */ - public function setup($config) { - - $this->trusted = $config->get('HTML.Trusted'); - - // generate - $this->doctype = $this->doctypes->make($config); - $modules = $this->doctype->modules; - - // take out the default modules that aren't allowed - $lookup = $config->get('HTML.AllowedModules'); - $special_cases = $config->get('HTML.CoreModules'); - - if (is_array($lookup)) { - foreach ($modules as $k => $m) { - if (isset($special_cases[$m])) continue; - if (!isset($lookup[$m])) unset($modules[$k]); - } - } - - // add proprietary module (this gets special treatment because - // it is completely removed from doctypes, etc.) - if ($config->get('HTML.Proprietary')) { - $modules[] = 'Proprietary'; - } - - // add SafeObject/Safeembed modules - if ($config->get('HTML.SafeObject')) { - $modules[] = 'SafeObject'; - } - if ($config->get('HTML.SafeEmbed')) { - $modules[] = 'SafeEmbed'; - } - - // merge in custom modules - $modules = array_merge($modules, $this->userModules); - - foreach ($modules as $module) { - $this->processModule($module); - $this->modules[$module]->setup($config); - } - - foreach ($this->doctype->tidyModules as $module) { - $this->processModule($module); - $this->modules[$module]->setup($config); - } - - // prepare any injectors - foreach ($this->modules as $module) { - $n = array(); - foreach ($module->info_injector as $i => $injector) { - if (!is_object($injector)) { - $class = "HTMLPurifier_Injector_$injector"; - $injector = new $class; - } - $n[$injector->name] = $injector; - } - $module->info_injector = $n; - } - - // setup lookup table based on all valid modules - foreach ($this->modules as $module) { - foreach ($module->info as $name => $def) { - if (!isset($this->elementLookup[$name])) { - $this->elementLookup[$name] = array(); - } - $this->elementLookup[$name][] = $module->name; - } - } - - // note the different choice - $this->contentSets = new HTMLPurifier_ContentSets( - // content set assembly deals with all possible modules, - // not just ones deemed to be "safe" - $this->modules - ); - $this->attrCollections = new HTMLPurifier_AttrCollections( - $this->attrTypes, - // there is no way to directly disable a global attribute, - // but using AllowedAttributes or simply not including - // the module in your custom doctype should be sufficient - $this->modules - ); - } - - /** - * Takes a module and adds it to the active module collection, - * registering it if necessary. - */ - public function processModule($module) { - if (!isset($this->registeredModules[$module]) || is_object($module)) { - $this->registerModule($module); - } - $this->modules[$module] = $this->registeredModules[$module]; - } - - /** - * Retrieves merged element definitions. - * @return Array of HTMLPurifier_ElementDef - */ - public function getElements() { - - $elements = array(); - foreach ($this->modules as $module) { - if (!$this->trusted && !$module->safe) continue; - foreach ($module->info as $name => $v) { - if (isset($elements[$name])) continue; - $elements[$name] = $this->getElement($name); - } - } - - // remove dud elements, this happens when an element that - // appeared to be safe actually wasn't - foreach ($elements as $n => $v) { - if ($v === false) unset($elements[$n]); - } - - return $elements; - - } - - /** - * Retrieves a single merged element definition - * @param $name Name of element - * @param $trusted Boolean trusted overriding parameter: set to true - * if you want the full version of an element - * @return Merged HTMLPurifier_ElementDef - * @note You may notice that modules are getting iterated over twice (once - * in getElements() and once here). This - * is because - */ - public function getElement($name, $trusted = null) { - - if (!isset($this->elementLookup[$name])) { - return false; - } - - // setup global state variables - $def = false; - if ($trusted === null) $trusted = $this->trusted; - - // iterate through each module that has registered itself to this - // element - foreach($this->elementLookup[$name] as $module_name) { - - $module = $this->modules[$module_name]; - - // refuse to create/merge from a module that is deemed unsafe-- - // pretend the module doesn't exist--when trusted mode is not on. - if (!$trusted && !$module->safe) { - continue; - } - - // clone is used because, ideally speaking, the original - // definition should not be modified. Usually, this will - // make no difference, but for consistency's sake - $new_def = clone $module->info[$name]; - - if (!$def && $new_def->standalone) { - $def = $new_def; - } elseif ($def) { - // This will occur even if $new_def is standalone. In practice, - // this will usually result in a full replacement. - $def->mergeIn($new_def); - } else { - // :TODO: - // non-standalone definitions that don't have a standalone - // to merge into could be deferred to the end - continue; - } - - // attribute value expansions - $this->attrCollections->performInclusions($def->attr); - $this->attrCollections->expandIdentifiers($def->attr, $this->attrTypes); - - // descendants_are_inline, for ChildDef_Chameleon - if (is_string($def->content_model) && - strpos($def->content_model, 'Inline') !== false) { - if ($name != 'del' && $name != 'ins') { - // this is for you, ins/del - $def->descendants_are_inline = true; - } - } - - $this->contentSets->generateChildDef($def, $module); - } - - // This can occur if there is a blank definition, but no base to - // mix it in with - if (!$def) return false; - - // add information on required attributes - foreach ($def->attr as $attr_name => $attr_def) { - if ($attr_def->required) { - $def->required_attr[] = $attr_name; - } - } - - return $def; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/IDAccumulator.php b/extlib/HTMLPurifier/HTMLPurifier/IDAccumulator.php deleted file mode 100644 index 73215295a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/IDAccumulator.php +++ /dev/null @@ -1,53 +0,0 @@ -load($config->get('Attr.IDBlacklist')); - return $id_accumulator; - } - - /** - * Add an ID to the lookup table. - * @param $id ID to be added. - * @return Bool status, true if success, false if there's a dupe - */ - public function add($id) { - if (isset($this->ids[$id])) return false; - return $this->ids[$id] = true; - } - - /** - * Load a list of IDs into the lookup table - * @param $array_of_ids Array of IDs to load - * @note This function doesn't care about duplicates - */ - public function load($array_of_ids) { - foreach ($array_of_ids as $id) { - $this->ids[$id] = true; - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Injector.php b/extlib/HTMLPurifier/HTMLPurifier/Injector.php deleted file mode 100644 index 5922f8130..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Injector.php +++ /dev/null @@ -1,239 +0,0 @@ -processToken() - * documentation. - * - * @todo Allow injectors to request a re-run on their output. This - * would help if an operation is recursive. - */ -abstract class HTMLPurifier_Injector -{ - - /** - * Advisory name of injector, this is for friendly error messages - */ - public $name; - - /** - * Instance of HTMLPurifier_HTMLDefinition - */ - protected $htmlDefinition; - - /** - * Reference to CurrentNesting variable in Context. This is an array - * list of tokens that we are currently "inside" - */ - protected $currentNesting; - - /** - * Reference to InputTokens variable in Context. This is an array - * list of the input tokens that are being processed. - */ - protected $inputTokens; - - /** - * Reference to InputIndex variable in Context. This is an integer - * array index for $this->inputTokens that indicates what token - * is currently being processed. - */ - protected $inputIndex; - - /** - * Array of elements and attributes this injector creates and therefore - * need to be allowed by the definition. Takes form of - * array('element' => array('attr', 'attr2'), 'element2') - */ - public $needed = array(); - - /** - * Index of inputTokens to rewind to. - */ - protected $rewind = false; - - /** - * Rewind to a spot to re-perform processing. This is useful if you - * deleted a node, and now need to see if this change affected any - * earlier nodes. Rewinding does not affect other injectors, and can - * result in infinite loops if not used carefully. - * @warning HTML Purifier will prevent you from fast-forwarding with this - * function. - */ - public function rewind($index) { - $this->rewind = $index; - } - - /** - * Retrieves rewind, and then unsets it. - */ - public function getRewind() { - $r = $this->rewind; - $this->rewind = false; - return $r; - } - - /** - * Prepares the injector by giving it the config and context objects: - * this allows references to important variables to be made within - * the injector. This function also checks if the HTML environment - * will work with the Injector (see checkNeeded()). - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return Boolean false if success, string of missing needed element/attribute if failure - */ - public function prepare($config, $context) { - $this->htmlDefinition = $config->getHTMLDefinition(); - // Even though this might fail, some unit tests ignore this and - // still test checkNeeded, so be careful. Maybe get rid of that - // dependency. - $result = $this->checkNeeded($config); - if ($result !== false) return $result; - $this->currentNesting =& $context->get('CurrentNesting'); - $this->inputTokens =& $context->get('InputTokens'); - $this->inputIndex =& $context->get('InputIndex'); - return false; - } - - /** - * This function checks if the HTML environment - * will work with the Injector: if p tags are not allowed, the - * Auto-Paragraphing injector should not be enabled. - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return Boolean false if success, string of missing needed element/attribute if failure - */ - public function checkNeeded($config) { - $def = $config->getHTMLDefinition(); - foreach ($this->needed as $element => $attributes) { - if (is_int($element)) $element = $attributes; - if (!isset($def->info[$element])) return $element; - if (!is_array($attributes)) continue; - foreach ($attributes as $name) { - if (!isset($def->info[$element]->attr[$name])) return "$element.$name"; - } - } - return false; - } - - /** - * Tests if the context node allows a certain element - * @param $name Name of element to test for - * @return True if element is allowed, false if it is not - */ - public function allowsElement($name) { - if (!empty($this->currentNesting)) { - $parent_token = array_pop($this->currentNesting); - $this->currentNesting[] = $parent_token; - $parent = $this->htmlDefinition->info[$parent_token->name]; - } else { - $parent = $this->htmlDefinition->info_parent_def; - } - if (!isset($parent->child->elements[$name]) || isset($parent->excludes[$name])) { - return false; - } - // check for exclusion - for ($i = count($this->currentNesting) - 2; $i >= 0; $i--) { - $node = $this->currentNesting[$i]; - $def = $this->htmlDefinition->info[$node->name]; - if (isset($def->excludes[$name])) return false; - } - return true; - } - - /** - * Iterator function, which starts with the next token and continues until - * you reach the end of the input tokens. - * @warning Please prevent previous references from interfering with this - * functions by setting $i = null beforehand! - * @param &$i Current integer index variable for inputTokens - * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference - */ - protected function forward(&$i, &$current) { - if ($i === null) $i = $this->inputIndex + 1; - else $i++; - if (!isset($this->inputTokens[$i])) return false; - $current = $this->inputTokens[$i]; - return true; - } - - /** - * Similar to _forward, but accepts a third parameter $nesting (which - * should be initialized at 0) and stops when we hit the end tag - * for the node $this->inputIndex starts in. - */ - protected function forwardUntilEndToken(&$i, &$current, &$nesting) { - $result = $this->forward($i, $current); - if (!$result) return false; - if ($nesting === null) $nesting = 0; - if ($current instanceof HTMLPurifier_Token_Start) $nesting++; - elseif ($current instanceof HTMLPurifier_Token_End) { - if ($nesting <= 0) return false; - $nesting--; - } - return true; - } - - /** - * Iterator function, starts with the previous token and continues until - * you reach the beginning of input tokens. - * @warning Please prevent previous references from interfering with this - * functions by setting $i = null beforehand! - * @param &$i Current integer index variable for inputTokens - * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference - */ - protected function backward(&$i, &$current) { - if ($i === null) $i = $this->inputIndex - 1; - else $i--; - if ($i < 0) return false; - $current = $this->inputTokens[$i]; - return true; - } - - /** - * Initializes the iterator at the current position. Use in a do {} while; - * loop to force the _forward and _backward functions to start at the - * current location. - * @warning Please prevent previous references from interfering with this - * functions by setting $i = null beforehand! - * @param &$i Current integer index variable for inputTokens - * @param &$current Current token variable. Do NOT use $token, as that variable is also a reference - */ - protected function current(&$i, &$current) { - if ($i === null) $i = $this->inputIndex; - $current = $this->inputTokens[$i]; - } - - /** - * Handler that is called when a text token is processed - */ - public function handleText(&$token) {} - - /** - * Handler that is called when a start or empty token is processed - */ - public function handleElement(&$token) {} - - /** - * Handler that is called when an end token is processed - */ - public function handleEnd(&$token) { - $this->notifyEnd($token); - } - - /** - * Notifier that is called when an end token is processed - * @note This differs from handlers in that the token is read-only - * @deprecated - */ - public function notifyEnd($token) {} - - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php b/extlib/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php deleted file mode 100644 index 8cc952549..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Injector/AutoParagraph.php +++ /dev/null @@ -1,340 +0,0 @@ -armor['MakeWellFormed_TagClosedError'] = true; - return $par; - } - - public function handleText(&$token) { - $text = $token->data; - // Does the current parent allow

tags? - if ($this->allowsElement('p')) { - if (empty($this->currentNesting) || strpos($text, "\n\n") !== false) { - // Note that we have differing behavior when dealing with text - // in the anonymous root node, or a node inside the document. - // If the text as a double-newline, the treatment is the same; - // if it doesn't, see the next if-block if you're in the document. - - $i = $nesting = null; - if (!$this->forwardUntilEndToken($i, $current, $nesting) && $token->is_whitespace) { - // State 1.1: ... ^ (whitespace, then document end) - // ---- - // This is a degenerate case - } else { - // State 1.2: PAR1 - // ---- - - // State 1.3: PAR1\n\nPAR2 - // ------------ - - // State 1.4:

PAR1\n\nPAR2 (see State 2) - // ------------ - $token = array($this->_pStart()); - $this->_splitText($text, $token); - } - } else { - // State 2:
PAR1... (similar to 1.4) - // ---- - - // We're in an element that allows paragraph tags, but we're not - // sure if we're going to need them. - if ($this->_pLookAhead()) { - // State 2.1:
PAR1PAR1\n\nPAR2 - // ---- - // Note: This will always be the first child, since any - // previous inline element would have triggered this very - // same routine, and found the double newline. One possible - // exception would be a comment. - $token = array($this->_pStart(), $token); - } else { - // State 2.2.1:
PAR1
- // ---- - - // State 2.2.2:
PAR1PAR1
- // ---- - } - } - // Is the current parent a

tag? - } elseif ( - !empty($this->currentNesting) && - $this->currentNesting[count($this->currentNesting)-1]->name == 'p' - ) { - // State 3.1: ...

PAR1 - // ---- - - // State 3.2: ...

PAR1\n\nPAR2 - // ------------ - $token = array(); - $this->_splitText($text, $token); - // Abort! - } else { - // State 4.1: ...PAR1 - // ---- - - // State 4.2: ...PAR1\n\nPAR2 - // ------------ - } - } - - public function handleElement(&$token) { - // We don't have to check if we're already in a

tag for block - // tokens, because the tag would have been autoclosed by MakeWellFormed. - if ($this->allowsElement('p')) { - if (!empty($this->currentNesting)) { - if ($this->_isInline($token)) { - // State 1:

... - // --- - - // Check if this token is adjacent to the parent token - // (seek backwards until token isn't whitespace) - $i = null; - $this->backward($i, $prev); - - if (!$prev instanceof HTMLPurifier_Token_Start) { - // Token wasn't adjacent - - if ( - $prev instanceof HTMLPurifier_Token_Text && - substr($prev->data, -2) === "\n\n" - ) { - // State 1.1.4:

PAR1

\n\n - // --- - - // Quite frankly, this should be handled by splitText - $token = array($this->_pStart(), $token); - } else { - // State 1.1.1:

PAR1

- // --- - - // State 1.1.2:

- // --- - - // State 1.1.3:
PAR - // --- - } - - } else { - // State 1.2.1:
- // --- - - // Lookahead to see if

is needed. - if ($this->_pLookAhead()) { - // State 1.3.1:

PAR1\n\nPAR2 - // --- - $token = array($this->_pStart(), $token); - } else { - // State 1.3.2:
PAR1
- // --- - - // State 1.3.3:
PAR1
\n\n
- // --- - } - } - } else { - // State 2.3: ...
- // ----- - } - } else { - if ($this->_isInline($token)) { - // State 3.1: - // --- - // This is where the {p} tag is inserted, not reflected in - // inputTokens yet, however. - $token = array($this->_pStart(), $token); - } else { - // State 3.2:
- // ----- - } - - $i = null; - if ($this->backward($i, $prev)) { - if ( - !$prev instanceof HTMLPurifier_Token_Text - ) { - // State 3.1.1: ...

{p} - // --- - - // State 3.2.1: ...

- // ----- - - if (!is_array($token)) $token = array($token); - array_unshift($token, new HTMLPurifier_Token_Text("\n\n")); - } else { - // State 3.1.2: ...

\n\n{p} - // --- - - // State 3.2.2: ...

\n\n
- // ----- - - // Note: PAR cannot occur because PAR would have been - // wrapped in

tags. - } - } - } - } else { - // State 2.2:

  • - // ---- - - // State 2.4:

    - // --- - } - } - - /** - * Splits up a text in paragraph tokens and appends them - * to the result stream that will replace the original - * @param $data String text data that will be processed - * into paragraphs - * @param $result Reference to array of tokens that the - * tags will be appended onto - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - */ - private function _splitText($data, &$result) { - $raw_paragraphs = explode("\n\n", $data); - $paragraphs = array(); // without empty paragraphs - $needs_start = false; - $needs_end = false; - - $c = count($raw_paragraphs); - if ($c == 1) { - // There were no double-newlines, abort quickly. In theory this - // should never happen. - $result[] = new HTMLPurifier_Token_Text($data); - return; - } - for ($i = 0; $i < $c; $i++) { - $par = $raw_paragraphs[$i]; - if (trim($par) !== '') { - $paragraphs[] = $par; - } else { - if ($i == 0) { - // Double newline at the front - if (empty($result)) { - // The empty result indicates that the AutoParagraph - // injector did not add any start paragraph tokens. - // This means that we have been in a paragraph for - // a while, and the newline means we should start a new one. - $result[] = new HTMLPurifier_Token_End('p'); - $result[] = new HTMLPurifier_Token_Text("\n\n"); - // However, the start token should only be added if - // there is more processing to be done (i.e. there are - // real paragraphs in here). If there are none, the - // next start paragraph tag will be handled by the - // next call to the injector - $needs_start = true; - } else { - // We just started a new paragraph! - // Reinstate a double-newline for presentation's sake, since - // it was in the source code. - array_unshift($result, new HTMLPurifier_Token_Text("\n\n")); - } - } elseif ($i + 1 == $c) { - // Double newline at the end - // There should be a trailing

    when we're finally done. - $needs_end = true; - } - } - } - - // Check if this was just a giant blob of whitespace. Move this earlier, - // perhaps? - if (empty($paragraphs)) { - return; - } - - // Add the start tag indicated by \n\n at the beginning of $data - if ($needs_start) { - $result[] = $this->_pStart(); - } - - // Append the paragraphs onto the result - foreach ($paragraphs as $par) { - $result[] = new HTMLPurifier_Token_Text($par); - $result[] = new HTMLPurifier_Token_End('p'); - $result[] = new HTMLPurifier_Token_Text("\n\n"); - $result[] = $this->_pStart(); - } - - // Remove trailing start token; Injector will handle this later if - // it was indeed needed. This prevents from needing to do a lookahead, - // at the cost of a lookbehind later. - array_pop($result); - - // If there is no need for an end tag, remove all of it and let - // MakeWellFormed close it later. - if (!$needs_end) { - array_pop($result); // removes \n\n - array_pop($result); // removes

    - } - - } - - /** - * Returns true if passed token is inline (and, ergo, allowed in - * paragraph tags) - */ - private function _isInline($token) { - return isset($this->htmlDefinition->info['p']->child->elements[$token->name]); - } - - /** - * Looks ahead in the token list and determines whether or not we need - * to insert a

    tag. - */ - private function _pLookAhead() { - $this->current($i, $current); - if ($current instanceof HTMLPurifier_Token_Start) $nesting = 1; - else $nesting = 0; - $ok = false; - while ($this->forwardUntilEndToken($i, $current, $nesting)) { - $result = $this->_checkNeedsP($current); - if ($result !== null) { - $ok = $result; - break; - } - } - return $ok; - } - - /** - * Determines if a particular token requires an earlier inline token - * to get a paragraph. This should be used with _forwardUntilEndToken - */ - private function _checkNeedsP($current) { - if ($current instanceof HTMLPurifier_Token_Start){ - if (!$this->_isInline($current)) { - //

    PAR1
    - // ---- - // Terminate early, since we hit a block element - return false; - } - } elseif ($current instanceof HTMLPurifier_Token_Text) { - if (strpos($current->data, "\n\n") !== false) { - //
    PAR1PAR1\n\nPAR2 - // ---- - return true; - } else { - //
    PAR1PAR1... - // ---- - } - } - return null; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php b/extlib/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php deleted file mode 100644 index 9dce9bd08..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Injector/DisplayLinkURI.php +++ /dev/null @@ -1,26 +0,0 @@ -start->attr['href'])){ - $url = $token->start->attr['href']; - unset($token->start->attr['href']); - $token = array($token, new HTMLPurifier_Token_Text(" ($url)")); - } else { - // nothing to display - } - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Injector/Linkify.php b/extlib/HTMLPurifier/HTMLPurifier/Injector/Linkify.php deleted file mode 100644 index 296dac282..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Injector/Linkify.php +++ /dev/null @@ -1,46 +0,0 @@ - array('href')); - - public function handleText(&$token) { - if (!$this->allowsElement('a')) return; - - if (strpos($token->data, '://') === false) { - // our really quick heuristic failed, abort - // this may not work so well if we want to match things like - // "google.com", but then again, most people don't - return; - } - - // there is/are URL(s). Let's split the string: - // Note: this regex is extremely permissive - $bits = preg_split('#((?:https?|ftp)://[^\s\'"<>()]+)#S', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); - - $token = array(); - - // $i = index - // $c = count - // $l = is link - for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { - if (!$l) { - if ($bits[$i] === '') continue; - $token[] = new HTMLPurifier_Token_Text($bits[$i]); - } else { - $token[] = new HTMLPurifier_Token_Start('a', array('href' => $bits[$i])); - $token[] = new HTMLPurifier_Token_Text($bits[$i]); - $token[] = new HTMLPurifier_Token_End('a'); - } - } - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php b/extlib/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php deleted file mode 100644 index ad2455a91..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Injector/PurifierLinkify.php +++ /dev/null @@ -1,45 +0,0 @@ - array('href')); - - public function prepare($config, $context) { - $this->docURL = $config->get('AutoFormat.PurifierLinkify.DocURL'); - return parent::prepare($config, $context); - } - - public function handleText(&$token) { - if (!$this->allowsElement('a')) return; - if (strpos($token->data, '%') === false) return; - - $bits = preg_split('#%([a-z0-9]+\.[a-z0-9]+)#Si', $token->data, -1, PREG_SPLIT_DELIM_CAPTURE); - $token = array(); - - // $i = index - // $c = count - // $l = is link - for ($i = 0, $c = count($bits), $l = false; $i < $c; $i++, $l = !$l) { - if (!$l) { - if ($bits[$i] === '') continue; - $token[] = new HTMLPurifier_Token_Text($bits[$i]); - } else { - $token[] = new HTMLPurifier_Token_Start('a', - array('href' => str_replace('%s', $bits[$i], $this->docURL))); - $token[] = new HTMLPurifier_Token_Text('%' . $bits[$i]); - $token[] = new HTMLPurifier_Token_End('a'); - } - } - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php b/extlib/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php deleted file mode 100644 index 638bfca03..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Injector/RemoveEmpty.php +++ /dev/null @@ -1,51 +0,0 @@ -config = $config; - $this->context = $context; - $this->removeNbsp = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp'); - $this->removeNbspExceptions = $config->get('AutoFormat.RemoveEmpty.RemoveNbsp.Exceptions'); - $this->attrValidator = new HTMLPurifier_AttrValidator(); - } - - public function handleElement(&$token) { - if (!$token instanceof HTMLPurifier_Token_Start) return; - $next = false; - for ($i = $this->inputIndex + 1, $c = count($this->inputTokens); $i < $c; $i++) { - $next = $this->inputTokens[$i]; - if ($next instanceof HTMLPurifier_Token_Text) { - if ($next->is_whitespace) continue; - if ($this->removeNbsp && !isset($this->removeNbspExceptions[$token->name])) { - $plain = str_replace("\xC2\xA0", "", $next->data); - $isWsOrNbsp = $plain === '' || ctype_space($plain); - if ($isWsOrNbsp) continue; - } - } - break; - } - if (!$next || ($next instanceof HTMLPurifier_Token_End && $next->name == $token->name)) { - if ($token->name == 'colgroup') return; - $this->attrValidator->validateToken($token, $this->config, $this->context); - $token->armor['ValidateAttributes'] = true; - if (isset($token->attr['id']) || isset($token->attr['name'])) return; - $token = $i - $this->inputIndex + 1; - for ($b = $this->inputIndex - 1; $b > 0; $b--) { - $prev = $this->inputTokens[$b]; - if ($prev instanceof HTMLPurifier_Token_Text && $prev->is_whitespace) continue; - break; - } - // This is safe because we removed the token that triggered this. - $this->rewind($b - 1); - return; - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php b/extlib/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php deleted file mode 100644 index 341582868..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Injector/SafeObject.php +++ /dev/null @@ -1,87 +0,0 @@ - 'never', - 'allowNetworking' => 'internal', - ); - protected $allowedParam = array( - 'wmode' => true, - 'movie' => true, - ); - - public function prepare($config, $context) { - parent::prepare($config, $context); - } - - public function handleElement(&$token) { - if ($token->name == 'object') { - $this->objectStack[] = $token; - $this->paramStack[] = array(); - $new = array($token); - foreach ($this->addParam as $name => $value) { - $new[] = new HTMLPurifier_Token_Empty('param', array('name' => $name, 'value' => $value)); - } - $token = $new; - } elseif ($token->name == 'param') { - $nest = count($this->currentNesting) - 1; - if ($nest >= 0 && $this->currentNesting[$nest]->name === 'object') { - $i = count($this->objectStack) - 1; - if (!isset($token->attr['name'])) { - $token = false; - return; - } - $n = $token->attr['name']; - // We need this fix because YouTube doesn't supply a data - // attribute, which we need if a type is specified. This is - // *very* Flash specific. - if (!isset($this->objectStack[$i]->attr['data']) && $token->attr['name'] == 'movie') { - $this->objectStack[$i]->attr['data'] = $token->attr['value']; - } - // Check if the parameter is the correct value but has not - // already been added - if ( - !isset($this->paramStack[$i][$n]) && - isset($this->addParam[$n]) && - $token->attr['name'] === $this->addParam[$n] - ) { - // keep token, and add to param stack - $this->paramStack[$i][$n] = true; - } elseif (isset($this->allowedParam[$n])) { - // keep token, don't do anything to it - // (could possibly check for duplicates here) - } else { - $token = false; - } - } else { - // not directly inside an object, DENY! - $token = false; - } - } - } - - public function handleEnd(&$token) { - // This is the WRONG way of handling the object and param stacks; - // we should be inserting them directly on the relevant object tokens - // so that the global stack handling handles it. - if ($token->name == 'object') { - array_pop($this->objectStack); - array_pop($this->paramStack); - } - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Language.php b/extlib/HTMLPurifier/HTMLPurifier/Language.php deleted file mode 100644 index 3e2be03b5..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Language.php +++ /dev/null @@ -1,163 +0,0 @@ -config = $config; - $this->context = $context; - } - - /** - * Loads language object with necessary info from factory cache - * @note This is a lazy loader - */ - public function load() { - if ($this->_loaded) return; - $factory = HTMLPurifier_LanguageFactory::instance(); - $factory->loadLanguage($this->code); - foreach ($factory->keys as $key) { - $this->$key = $factory->cache[$this->code][$key]; - } - $this->_loaded = true; - } - - /** - * Retrieves a localised message. - * @param $key string identifier of message - * @return string localised message - */ - public function getMessage($key) { - if (!$this->_loaded) $this->load(); - if (!isset($this->messages[$key])) return "[$key]"; - return $this->messages[$key]; - } - - /** - * Retrieves a localised error name. - * @param $int integer error number, corresponding to PHP's error - * reporting - * @return string localised message - */ - public function getErrorName($int) { - if (!$this->_loaded) $this->load(); - if (!isset($this->errorNames[$int])) return "[Error: $int]"; - return $this->errorNames[$int]; - } - - /** - * Converts an array list into a string readable representation - */ - public function listify($array) { - $sep = $this->getMessage('Item separator'); - $sep_last = $this->getMessage('Item separator last'); - $ret = ''; - for ($i = 0, $c = count($array); $i < $c; $i++) { - if ($i == 0) { - } elseif ($i + 1 < $c) { - $ret .= $sep; - } else { - $ret .= $sep_last; - } - $ret .= $array[$i]; - } - return $ret; - } - - /** - * Formats a localised message with passed parameters - * @param $key string identifier of message - * @param $args Parameters to substitute in - * @return string localised message - * @todo Implement conditionals? Right now, some messages make - * reference to line numbers, but those aren't always available - */ - public function formatMessage($key, $args = array()) { - if (!$this->_loaded) $this->load(); - if (!isset($this->messages[$key])) return "[$key]"; - $raw = $this->messages[$key]; - $subst = array(); - $generator = false; - foreach ($args as $i => $value) { - if (is_object($value)) { - if ($value instanceof HTMLPurifier_Token) { - // factor this out some time - if (!$generator) $generator = $this->context->get('Generator'); - if (isset($value->name)) $subst['$'.$i.'.Name'] = $value->name; - if (isset($value->data)) $subst['$'.$i.'.Data'] = $value->data; - $subst['$'.$i.'.Compact'] = - $subst['$'.$i.'.Serialized'] = $generator->generateFromToken($value); - // a more complex algorithm for compact representation - // could be introduced for all types of tokens. This - // may need to be factored out into a dedicated class - if (!empty($value->attr)) { - $stripped_token = clone $value; - $stripped_token->attr = array(); - $subst['$'.$i.'.Compact'] = $generator->generateFromToken($stripped_token); - } - $subst['$'.$i.'.Line'] = $value->line ? $value->line : 'unknown'; - } - continue; - } elseif (is_array($value)) { - $keys = array_keys($value); - if (array_keys($keys) === $keys) { - // list - $subst['$'.$i] = $this->listify($value); - } else { - // associative array - // no $i implementation yet, sorry - $subst['$'.$i.'.Keys'] = $this->listify($keys); - $subst['$'.$i.'.Values'] = $this->listify(array_values($value)); - } - continue; - } - $subst['$' . $i] = $value; - } - return strtr($raw, $subst); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php b/extlib/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php deleted file mode 100644 index d52fcb7ac..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Language/classes/en-x-test.php +++ /dev/null @@ -1,12 +0,0 @@ - 'HTML Purifier X' -); - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php b/extlib/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php deleted file mode 100644 index 806c83fbf..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Language/messages/en-x-testmini.php +++ /dev/null @@ -1,12 +0,0 @@ - 'HTML Purifier XNone' -); - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Language/messages/en.php b/extlib/HTMLPurifier/HTMLPurifier/Language/messages/en.php deleted file mode 100644 index aab2e52eb..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Language/messages/en.php +++ /dev/null @@ -1,62 +0,0 @@ - 'HTML Purifier', - -// for unit testing purposes -'LanguageFactoryTest: Pizza' => 'Pizza', -'LanguageTest: List' => '$1', -'LanguageTest: Hash' => '$1.Keys; $1.Values', - -'Item separator' => ', ', -'Item separator last' => ' and ', // non-Harvard style - -'ErrorCollector: No errors' => 'No errors detected. However, because error reporting is still incomplete, there may have been errors that the error collector was not notified of; please inspect the output HTML carefully.', -'ErrorCollector: At line' => ' at line $line', -'ErrorCollector: Incidental errors' => 'Incidental errors', - -'Lexer: Unclosed comment' => 'Unclosed comment', -'Lexer: Unescaped lt' => 'Unescaped less-than sign (<) should be <', -'Lexer: Missing gt' => 'Missing greater-than sign (>), previous less-than sign (<) should be escaped', -'Lexer: Missing attribute key' => 'Attribute declaration has no key', -'Lexer: Missing end quote' => 'Attribute declaration has no end quote', - -'Strategy_RemoveForeignElements: Tag transform' => '<$1> element transformed into $CurrentToken.Serialized', -'Strategy_RemoveForeignElements: Missing required attribute' => '$CurrentToken.Compact element missing required attribute $1', -'Strategy_RemoveForeignElements: Foreign element to text' => 'Unrecognized $CurrentToken.Serialized tag converted to text', -'Strategy_RemoveForeignElements: Foreign element removed' => 'Unrecognized $CurrentToken.Serialized tag removed', -'Strategy_RemoveForeignElements: Comment removed' => 'Comment containing "$CurrentToken.Data" removed', -'Strategy_RemoveForeignElements: Foreign meta element removed' => 'Unrecognized $CurrentToken.Serialized meta tag and all descendants removed', -'Strategy_RemoveForeignElements: Token removed to end' => 'Tags and text starting from $1 element where removed to end', -'Strategy_RemoveForeignElements: Trailing hyphen in comment removed' => 'Trailing hyphen(s) in comment removed', -'Strategy_RemoveForeignElements: Hyphens in comment collapsed' => 'Double hyphens in comments are not allowed, and were collapsed into single hyphens', - -'Strategy_MakeWellFormed: Unnecessary end tag removed' => 'Unnecessary $CurrentToken.Serialized tag removed', -'Strategy_MakeWellFormed: Unnecessary end tag to text' => 'Unnecessary $CurrentToken.Serialized tag converted to text', -'Strategy_MakeWellFormed: Tag auto closed' => '$1.Compact started on line $1.Line auto-closed by $CurrentToken.Compact', -'Strategy_MakeWellFormed: Tag carryover' => '$1.Compact started on line $1.Line auto-continued into $CurrentToken.Compact', -'Strategy_MakeWellFormed: Stray end tag removed' => 'Stray $CurrentToken.Serialized tag removed', -'Strategy_MakeWellFormed: Stray end tag to text' => 'Stray $CurrentToken.Serialized tag converted to text', -'Strategy_MakeWellFormed: Tag closed by element end' => '$1.Compact tag started on line $1.Line closed by end of $CurrentToken.Serialized', -'Strategy_MakeWellFormed: Tag closed by document end' => '$1.Compact tag started on line $1.Line closed by end of document', - -'Strategy_FixNesting: Node removed' => '$CurrentToken.Compact node removed', -'Strategy_FixNesting: Node excluded' => '$CurrentToken.Compact node removed due to descendant exclusion by ancestor element', -'Strategy_FixNesting: Node reorganized' => 'Contents of $CurrentToken.Compact node reorganized to enforce its content model', -'Strategy_FixNesting: Node contents removed' => 'Contents of $CurrentToken.Compact node removed', - -'AttrValidator: Attributes transformed' => 'Attributes on $CurrentToken.Compact transformed from $1.Keys to $2.Keys', -'AttrValidator: Attribute removed' => '$CurrentAttr.Name attribute on $CurrentToken.Compact removed', - -); - -$errorNames = array( - E_ERROR => 'Error', - E_WARNING => 'Warning', - E_NOTICE => 'Notice' -); - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/LanguageFactory.php b/extlib/HTMLPurifier/HTMLPurifier/LanguageFactory.php deleted file mode 100644 index 134ef8c74..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/LanguageFactory.php +++ /dev/null @@ -1,198 +0,0 @@ -cache[$language_code][$key] = $value - * @value array map - */ - public $cache; - - /** - * Valid keys in the HTMLPurifier_Language object. Designates which - * variables to slurp out of a message file. - * @value array list - */ - public $keys = array('fallback', 'messages', 'errorNames'); - - /** - * Instance of HTMLPurifier_AttrDef_Lang to validate language codes - * @value object HTMLPurifier_AttrDef_Lang - */ - protected $validator; - - /** - * Cached copy of dirname(__FILE__), directory of current file without - * trailing slash - * @value string filename - */ - protected $dir; - - /** - * Keys whose contents are a hash map and can be merged - * @value array lookup - */ - protected $mergeable_keys_map = array('messages' => true, 'errorNames' => true); - - /** - * Keys whose contents are a list and can be merged - * @value array lookup - */ - protected $mergeable_keys_list = array(); - - /** - * Retrieve sole instance of the factory. - * @param $prototype Optional prototype to overload sole instance with, - * or bool true to reset to default factory. - */ - public static function instance($prototype = null) { - static $instance = null; - if ($prototype !== null) { - $instance = $prototype; - } elseif ($instance === null || $prototype == true) { - $instance = new HTMLPurifier_LanguageFactory(); - $instance->setup(); - } - return $instance; - } - - /** - * Sets up the singleton, much like a constructor - * @note Prevents people from getting this outside of the singleton - */ - public function setup() { - $this->validator = new HTMLPurifier_AttrDef_Lang(); - $this->dir = HTMLPURIFIER_PREFIX . '/HTMLPurifier'; - } - - /** - * Creates a language object, handles class fallbacks - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @param $code Code to override configuration with. Private parameter. - */ - public function create($config, $context, $code = false) { - - // validate language code - if ($code === false) { - $code = $this->validator->validate( - $config->get('Core.Language'), $config, $context - ); - } else { - $code = $this->validator->validate($code, $config, $context); - } - if ($code === false) $code = 'en'; // malformed code becomes English - - $pcode = str_replace('-', '_', $code); // make valid PHP classname - static $depth = 0; // recursion protection - - if ($code == 'en') { - $lang = new HTMLPurifier_Language($config, $context); - } else { - $class = 'HTMLPurifier_Language_' . $pcode; - $file = $this->dir . '/Language/classes/' . $code . '.php'; - if (file_exists($file) || class_exists($class, false)) { - $lang = new $class($config, $context); - } else { - // Go fallback - $raw_fallback = $this->getFallbackFor($code); - $fallback = $raw_fallback ? $raw_fallback : 'en'; - $depth++; - $lang = $this->create($config, $context, $fallback); - if (!$raw_fallback) { - $lang->error = true; - } - $depth--; - } - } - - $lang->code = $code; - - return $lang; - - } - - /** - * Returns the fallback language for language - * @note Loads the original language into cache - * @param $code string language code - */ - public function getFallbackFor($code) { - $this->loadLanguage($code); - return $this->cache[$code]['fallback']; - } - - /** - * Loads language into the cache, handles message file and fallbacks - * @param $code string language code - */ - public function loadLanguage($code) { - static $languages_seen = array(); // recursion guard - - // abort if we've already loaded it - if (isset($this->cache[$code])) return; - - // generate filename - $filename = $this->dir . '/Language/messages/' . $code . '.php'; - - // default fallback : may be overwritten by the ensuing include - $fallback = ($code != 'en') ? 'en' : false; - - // load primary localisation - if (!file_exists($filename)) { - // skip the include: will rely solely on fallback - $filename = $this->dir . '/Language/messages/en.php'; - $cache = array(); - } else { - include $filename; - $cache = compact($this->keys); - } - - // load fallback localisation - if (!empty($fallback)) { - - // infinite recursion guard - if (isset($languages_seen[$code])) { - trigger_error('Circular fallback reference in language ' . - $code, E_USER_ERROR); - $fallback = 'en'; - } - $language_seen[$code] = true; - - // load the fallback recursively - $this->loadLanguage($fallback); - $fallback_cache = $this->cache[$fallback]; - - // merge fallback with current language - foreach ( $this->keys as $key ) { - if (isset($cache[$key]) && isset($fallback_cache[$key])) { - if (isset($this->mergeable_keys_map[$key])) { - $cache[$key] = $cache[$key] + $fallback_cache[$key]; - } elseif (isset($this->mergeable_keys_list[$key])) { - $cache[$key] = array_merge( $fallback_cache[$key], $cache[$key] ); - } - } else { - $cache[$key] = $fallback_cache[$key]; - } - } - - } - - // save to cache for later retrieval - $this->cache[$code] = $cache; - - return; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Length.php b/extlib/HTMLPurifier/HTMLPurifier/Length.php deleted file mode 100644 index 8d2a46b7d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Length.php +++ /dev/null @@ -1,115 +0,0 @@ - true, 'ex' => true, 'px' => true, 'in' => true, - 'cm' => true, 'mm' => true, 'pt' => true, 'pc' => true - ); - - /** - * @param number $n Magnitude - * @param string $u Unit - */ - public function __construct($n = '0', $u = false) { - $this->n = (string) $n; - $this->unit = $u !== false ? (string) $u : false; - } - - /** - * @param string $s Unit string, like '2em' or '3.4in' - * @warning Does not perform validation. - */ - static public function make($s) { - if ($s instanceof HTMLPurifier_Length) return $s; - $n_length = strspn($s, '1234567890.+-'); - $n = substr($s, 0, $n_length); - $unit = substr($s, $n_length); - if ($unit === '') $unit = false; - return new HTMLPurifier_Length($n, $unit); - } - - /** - * Validates the number and unit. - */ - protected function validate() { - // Special case: - if ($this->n === '+0' || $this->n === '-0') $this->n = '0'; - if ($this->n === '0' && $this->unit === false) return true; - if (!ctype_lower($this->unit)) $this->unit = strtolower($this->unit); - if (!isset(HTMLPurifier_Length::$allowedUnits[$this->unit])) return false; - // Hack: - $def = new HTMLPurifier_AttrDef_CSS_Number(); - $result = $def->validate($this->n, false, false); - if ($result === false) return false; - $this->n = $result; - return true; - } - - /** - * Returns string representation of number. - */ - public function toString() { - if (!$this->isValid()) return false; - return $this->n . $this->unit; - } - - /** - * Retrieves string numeric magnitude. - */ - public function getN() {return $this->n;} - - /** - * Retrieves string unit. - */ - public function getUnit() {return $this->unit;} - - /** - * Returns true if this length unit is valid. - */ - public function isValid() { - if ($this->isValid === null) $this->isValid = $this->validate(); - return $this->isValid; - } - - /** - * Compares two lengths, and returns 1 if greater, -1 if less and 0 if equal. - * @warning If both values are too large or small, this calculation will - * not work properly - */ - public function compareTo($l) { - if ($l === false) return false; - if ($l->unit !== $this->unit) { - $converter = new HTMLPurifier_UnitConverter(); - $l = $converter->convert($l, $this->unit); - if ($l === false) return false; - } - return $this->n - $l->n; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Lexer.php b/extlib/HTMLPurifier/HTMLPurifier/Lexer.php deleted file mode 100644 index 8cce008d3..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Lexer.php +++ /dev/null @@ -1,298 +0,0 @@ -get('Core.LexerImpl'); - } - - $needs_tracking = - $config->get('Core.MaintainLineNumbers') || - $config->get('Core.CollectErrors'); - - $inst = null; - if (is_object($lexer)) { - $inst = $lexer; - } else { - - if (is_null($lexer)) { do { - // auto-detection algorithm - - if ($needs_tracking) { - $lexer = 'DirectLex'; - break; - } - - if ( - class_exists('DOMDocument') && - method_exists('DOMDocument', 'loadHTML') && - !extension_loaded('domxml') - ) { - // check for DOM support, because while it's part of the - // core, it can be disabled compile time. Also, the PECL - // domxml extension overrides the default DOM, and is evil - // and nasty and we shan't bother to support it - $lexer = 'DOMLex'; - } else { - $lexer = 'DirectLex'; - } - - } while(0); } // do..while so we can break - - // instantiate recognized string names - switch ($lexer) { - case 'DOMLex': - $inst = new HTMLPurifier_Lexer_DOMLex(); - break; - case 'DirectLex': - $inst = new HTMLPurifier_Lexer_DirectLex(); - break; - case 'PH5P': - $inst = new HTMLPurifier_Lexer_PH5P(); - break; - default: - throw new HTMLPurifier_Exception("Cannot instantiate unrecognized Lexer type " . htmlspecialchars($lexer)); - } - } - - if (!$inst) throw new HTMLPurifier_Exception('No lexer was instantiated'); - - // once PHP DOM implements native line numbers, or we - // hack out something using XSLT, remove this stipulation - if ($needs_tracking && !$inst->tracksLineNumbers) { - throw new HTMLPurifier_Exception('Cannot use lexer that does not support line numbers with Core.MaintainLineNumbers or Core.CollectErrors (use DirectLex instead)'); - } - - return $inst; - - } - - // -- CONVENIENCE MEMBERS --------------------------------------------- - - public function __construct() { - $this->_entity_parser = new HTMLPurifier_EntityParser(); - } - - /** - * Most common entity to raw value conversion table for special entities. - */ - protected $_special_entity2str = - array( - '"' => '"', - '&' => '&', - '<' => '<', - '>' => '>', - ''' => "'", - ''' => "'", - ''' => "'" - ); - - /** - * Parses special entities into the proper characters. - * - * This string will translate escaped versions of the special characters - * into the correct ones. - * - * @warning - * You should be able to treat the output of this function as - * completely parsed, but that's only because all other entities should - * have been handled previously in substituteNonSpecialEntities() - * - * @param $string String character data to be parsed. - * @returns Parsed character data. - */ - public function parseData($string) { - - // following functions require at least one character - if ($string === '') return ''; - - // subtracts amps that cannot possibly be escaped - $num_amp = substr_count($string, '&') - substr_count($string, '& ') - - ($string[strlen($string)-1] === '&' ? 1 : 0); - - if (!$num_amp) return $string; // abort if no entities - $num_esc_amp = substr_count($string, '&'); - $string = strtr($string, $this->_special_entity2str); - - // code duplication for sake of optimization, see above - $num_amp_2 = substr_count($string, '&') - substr_count($string, '& ') - - ($string[strlen($string)-1] === '&' ? 1 : 0); - - if ($num_amp_2 <= $num_esc_amp) return $string; - - // hmm... now we have some uncommon entities. Use the callback. - $string = $this->_entity_parser->substituteSpecialEntities($string); - return $string; - } - - /** - * Lexes an HTML string into tokens. - * - * @param $string String HTML. - * @return HTMLPurifier_Token array representation of HTML. - */ - public function tokenizeHTML($string, $config, $context) { - trigger_error('Call to abstract class', E_USER_ERROR); - } - - /** - * Translates CDATA sections into regular sections (through escaping). - * - * @param $string HTML string to process. - * @returns HTML with CDATA sections escaped. - */ - protected static function escapeCDATA($string) { - return preg_replace_callback( - '//s', - array('HTMLPurifier_Lexer', 'CDATACallback'), - $string - ); - } - - /** - * Special CDATA case that is especially convoluted for )#si', - array($this, 'scriptCallback'), $html); - } - - $html = $this->normalize($html, $config, $context); - - $cursor = 0; // our location in the text - $inside_tag = false; // whether or not we're parsing the inside of a tag - $array = array(); // result array - - // This is also treated to mean maintain *column* numbers too - $maintain_line_numbers = $config->get('Core.MaintainLineNumbers'); - - if ($maintain_line_numbers === null) { - // automatically determine line numbering by checking - // if error collection is on - $maintain_line_numbers = $config->get('Core.CollectErrors'); - } - - if ($maintain_line_numbers) { - $current_line = 1; - $current_col = 0; - $length = strlen($html); - } else { - $current_line = false; - $current_col = false; - $length = false; - } - $context->register('CurrentLine', $current_line); - $context->register('CurrentCol', $current_col); - $nl = "\n"; - // how often to manually recalculate. This will ALWAYS be right, - // but it's pretty wasteful. Set to 0 to turn off - $synchronize_interval = $config->get('Core.DirectLexLineNumberSyncInterval'); - - $e = false; - if ($config->get('Core.CollectErrors')) { - $e =& $context->get('ErrorCollector'); - } - - // for testing synchronization - $loops = 0; - - while(++$loops) { - - // $cursor is either at the start of a token, or inside of - // a tag (i.e. there was a < immediately before it), as indicated - // by $inside_tag - - if ($maintain_line_numbers) { - - // $rcursor, however, is always at the start of a token. - $rcursor = $cursor - (int) $inside_tag; - - // Column number is cheap, so we calculate it every round. - // We're interested at the *end* of the newline string, so - // we need to add strlen($nl) == 1 to $nl_pos before subtracting it - // from our "rcursor" position. - $nl_pos = strrpos($html, $nl, $rcursor - $length); - $current_col = $rcursor - (is_bool($nl_pos) ? 0 : $nl_pos + 1); - - // recalculate lines - if ( - $synchronize_interval && // synchronization is on - $cursor > 0 && // cursor is further than zero - $loops % $synchronize_interval === 0 // time to synchronize! - ) { - $current_line = 1 + $this->substrCount($html, $nl, 0, $cursor); - } - - } - - $position_next_lt = strpos($html, '<', $cursor); - $position_next_gt = strpos($html, '>', $cursor); - - // triggers on "asdf" but not "asdf " - // special case to set up context - if ($position_next_lt === $cursor) { - $inside_tag = true; - $cursor++; - } - - if (!$inside_tag && $position_next_lt !== false) { - // We are not inside tag and there still is another tag to parse - $token = new - HTMLPurifier_Token_Text( - $this->parseData( - substr( - $html, $cursor, $position_next_lt - $cursor - ) - ) - ); - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_lt - $cursor); - } - $array[] = $token; - $cursor = $position_next_lt + 1; - $inside_tag = true; - continue; - } elseif (!$inside_tag) { - // We are not inside tag but there are no more tags - // If we're already at the end, break - if ($cursor === strlen($html)) break; - // Create Text of rest of string - $token = new - HTMLPurifier_Token_Text( - $this->parseData( - substr( - $html, $cursor - ) - ) - ); - if ($maintain_line_numbers) $token->rawPosition($current_line, $current_col); - $array[] = $token; - break; - } elseif ($inside_tag && $position_next_gt !== false) { - // We are in tag and it is well formed - // Grab the internals of the tag - $strlen_segment = $position_next_gt - $cursor; - - if ($strlen_segment < 1) { - // there's nothing to process! - $token = new HTMLPurifier_Token_Text('<'); - $cursor++; - continue; - } - - $segment = substr($html, $cursor, $strlen_segment); - - if ($segment === false) { - // somehow, we attempted to access beyond the end of - // the string, defense-in-depth, reported by Nate Abele - break; - } - - // Check if it's a comment - if ( - substr($segment, 0, 3) === '!--' - ) { - // re-determine segment length, looking for --> - $position_comment_end = strpos($html, '-->', $cursor); - if ($position_comment_end === false) { - // uh oh, we have a comment that extends to - // infinity. Can't be helped: set comment - // end position to end of string - if ($e) $e->send(E_WARNING, 'Lexer: Unclosed comment'); - $position_comment_end = strlen($html); - $end = true; - } else { - $end = false; - } - $strlen_segment = $position_comment_end - $cursor; - $segment = substr($html, $cursor, $strlen_segment); - $token = new - HTMLPurifier_Token_Comment( - substr( - $segment, 3, $strlen_segment - 3 - ) - ); - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $strlen_segment); - } - $array[] = $token; - $cursor = $end ? $position_comment_end : $position_comment_end + 3; - $inside_tag = false; - continue; - } - - // Check if it's an end tag - $is_end_tag = (strpos($segment,'/') === 0); - if ($is_end_tag) { - $type = substr($segment, 1); - $token = new HTMLPurifier_Token_End($type); - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $inside_tag = false; - $cursor = $position_next_gt + 1; - continue; - } - - // Check leading character is alnum, if not, we may - // have accidently grabbed an emoticon. Translate into - // text and go our merry way - if (!ctype_alpha($segment[0])) { - // XML: $segment[0] !== '_' && $segment[0] !== ':' - if ($e) $e->send(E_NOTICE, 'Lexer: Unescaped lt'); - $token = new HTMLPurifier_Token_Text('<'); - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $inside_tag = false; - continue; - } - - // Check if it is explicitly self closing, if so, remove - // trailing slash. Remember, we could have a tag like
    , so - // any later token processing scripts must convert improperly - // classified EmptyTags from StartTags. - $is_self_closing = (strrpos($segment,'/') === $strlen_segment-1); - if ($is_self_closing) { - $strlen_segment--; - $segment = substr($segment, 0, $strlen_segment); - } - - // Check if there are any attributes - $position_first_space = strcspn($segment, $this->_whitespace); - - if ($position_first_space >= $strlen_segment) { - if ($is_self_closing) { - $token = new HTMLPurifier_Token_Empty($segment); - } else { - $token = new HTMLPurifier_Token_Start($segment); - } - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $inside_tag = false; - $cursor = $position_next_gt + 1; - continue; - } - - // Grab out all the data - $type = substr($segment, 0, $position_first_space); - $attribute_string = - trim( - substr( - $segment, $position_first_space - ) - ); - if ($attribute_string) { - $attr = $this->parseAttributeString( - $attribute_string - , $config, $context - ); - } else { - $attr = array(); - } - - if ($is_self_closing) { - $token = new HTMLPurifier_Token_Empty($type, $attr); - } else { - $token = new HTMLPurifier_Token_Start($type, $attr); - } - if ($maintain_line_numbers) { - $token->rawPosition($current_line, $current_col); - $current_line += $this->substrCount($html, $nl, $cursor, $position_next_gt - $cursor); - } - $array[] = $token; - $cursor = $position_next_gt + 1; - $inside_tag = false; - continue; - } else { - // inside tag, but there's no ending > sign - if ($e) $e->send(E_WARNING, 'Lexer: Missing gt'); - $token = new - HTMLPurifier_Token_Text( - '<' . - $this->parseData( - substr($html, $cursor) - ) - ); - if ($maintain_line_numbers) $token->rawPosition($current_line, $current_col); - // no cursor scroll? Hmm... - $array[] = $token; - break; - } - break; - } - - $context->destroy('CurrentLine'); - $context->destroy('CurrentCol'); - return $array; - } - - /** - * PHP 5.0.x compatible substr_count that implements offset and length - */ - protected function substrCount($haystack, $needle, $offset, $length) { - static $oldVersion; - if ($oldVersion === null) { - $oldVersion = version_compare(PHP_VERSION, '5.1', '<'); - } - if ($oldVersion) { - $haystack = substr($haystack, $offset, $length); - return substr_count($haystack, $needle); - } else { - return substr_count($haystack, $needle, $offset, $length); - } - } - - /** - * Takes the inside of an HTML tag and makes an assoc array of attributes. - * - * @param $string Inside of tag excluding name. - * @returns Assoc array of attributes. - */ - public function parseAttributeString($string, $config, $context) { - $string = (string) $string; // quick typecast - - if ($string == '') return array(); // no attributes - - $e = false; - if ($config->get('Core.CollectErrors')) { - $e =& $context->get('ErrorCollector'); - } - - // let's see if we can abort as quickly as possible - // one equal sign, no spaces => one attribute - $num_equal = substr_count($string, '='); - $has_space = strpos($string, ' '); - if ($num_equal === 0 && !$has_space) { - // bool attribute - return array($string => $string); - } elseif ($num_equal === 1 && !$has_space) { - // only one attribute - list($key, $quoted_value) = explode('=', $string); - $quoted_value = trim($quoted_value); - if (!$key) { - if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); - return array(); - } - if (!$quoted_value) return array($key => ''); - $first_char = @$quoted_value[0]; - $last_char = @$quoted_value[strlen($quoted_value)-1]; - - $same_quote = ($first_char == $last_char); - $open_quote = ($first_char == '"' || $first_char == "'"); - - if ( $same_quote && $open_quote) { - // well behaved - $value = substr($quoted_value, 1, strlen($quoted_value) - 2); - } else { - // not well behaved - if ($open_quote) { - if ($e) $e->send(E_ERROR, 'Lexer: Missing end quote'); - $value = substr($quoted_value, 1); - } else { - $value = $quoted_value; - } - } - if ($value === false) $value = ''; - return array($key => $value); - } - - // setup loop environment - $array = array(); // return assoc array of attributes - $cursor = 0; // current position in string (moves forward) - $size = strlen($string); // size of the string (stays the same) - - // if we have unquoted attributes, the parser expects a terminating - // space, so let's guarantee that there's always a terminating space. - $string .= ' '; - - while(true) { - - if ($cursor >= $size) { - break; - } - - $cursor += ($value = strspn($string, $this->_whitespace, $cursor)); - // grab the key - - $key_begin = $cursor; //we're currently at the start of the key - - // scroll past all characters that are the key (not whitespace or =) - $cursor += strcspn($string, $this->_whitespace . '=', $cursor); - - $key_end = $cursor; // now at the end of the key - - $key = substr($string, $key_begin, $key_end - $key_begin); - - if (!$key) { - if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); - $cursor += strcspn($string, $this->_whitespace, $cursor + 1); // prevent infinite loop - continue; // empty key - } - - // scroll past all whitespace - $cursor += strspn($string, $this->_whitespace, $cursor); - - if ($cursor >= $size) { - $array[$key] = $key; - break; - } - - // if the next character is an equal sign, we've got a regular - // pair, otherwise, it's a bool attribute - $first_char = @$string[$cursor]; - - if ($first_char == '=') { - // key="value" - - $cursor++; - $cursor += strspn($string, $this->_whitespace, $cursor); - - if ($cursor === false) { - $array[$key] = ''; - break; - } - - // we might be in front of a quote right now - - $char = @$string[$cursor]; - - if ($char == '"' || $char == "'") { - // it's quoted, end bound is $char - $cursor++; - $value_begin = $cursor; - $cursor = strpos($string, $char, $cursor); - $value_end = $cursor; - } else { - // it's not quoted, end bound is whitespace - $value_begin = $cursor; - $cursor += strcspn($string, $this->_whitespace, $cursor); - $value_end = $cursor; - } - - // we reached a premature end - if ($cursor === false) { - $cursor = $size; - $value_end = $cursor; - } - - $value = substr($string, $value_begin, $value_end - $value_begin); - if ($value === false) $value = ''; - $array[$key] = $this->parseData($value); - $cursor++; - - } else { - // boolattr - if ($key !== '') { - $array[$key] = $key; - } else { - // purely theoretical - if ($e) $e->send(E_ERROR, 'Lexer: Missing attribute key'); - } - - } - } - return $array; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Lexer/PEARSax3.php b/extlib/HTMLPurifier/HTMLPurifier/Lexer/PEARSax3.php deleted file mode 100644 index 57cffa82a..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Lexer/PEARSax3.php +++ /dev/null @@ -1,106 +0,0 @@ -tokens = array(); - - $string = $this->normalize($string, $config, $context); - - $parser = new XML_HTMLSax3(); - $parser->set_object($this); - $parser->set_element_handler('openHandler','closeHandler'); - $parser->set_data_handler('dataHandler'); - $parser->set_escape_handler('escapeHandler'); - - // doesn't seem to work correctly for attributes - $parser->set_option('XML_OPTION_ENTITIES_PARSED', 1); - - $parser->parse($string); - - return $this->tokens; - - } - - /** - * Open tag event handler, interface is defined by PEAR package. - */ - public function openHandler(&$parser, $name, $attrs, $closed) { - // entities are not resolved in attrs - foreach ($attrs as $key => $attr) { - $attrs[$key] = $this->parseData($attr); - } - if ($closed) { - $this->tokens[] = new HTMLPurifier_Token_Empty($name, $attrs); - } else { - $this->tokens[] = new HTMLPurifier_Token_Start($name, $attrs); - } - return true; - } - - /** - * Close tag event handler, interface is defined by PEAR package. - */ - public function closeHandler(&$parser, $name) { - // HTMLSax3 seems to always send empty tags an extra close tag - // check and ignore if you see it: - // [TESTME] to make sure it doesn't overreach - if ($this->tokens[count($this->tokens)-1] instanceof HTMLPurifier_Token_Empty) { - return true; - } - $this->tokens[] = new HTMLPurifier_Token_End($name); - return true; - } - - /** - * Data event handler, interface is defined by PEAR package. - */ - public function dataHandler(&$parser, $data) { - $this->tokens[] = new HTMLPurifier_Token_Text($data); - return true; - } - - /** - * Escaped text handler, interface is defined by PEAR package. - */ - public function escapeHandler(&$parser, $data) { - if (strpos($data, '--') === 0) { - $this->tokens[] = new HTMLPurifier_Token_Comment($data); - } - // CDATA is handled elsewhere, but if it was handled here: - //if (strpos($data, '[CDATA[') === 0) { - // $this->tokens[] = new HTMLPurifier_Token_Text( - // substr($data, 7, strlen($data) - 9) ); - //} - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php b/extlib/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php deleted file mode 100644 index fa1bf973e..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Lexer/PH5P.php +++ /dev/null @@ -1,3906 +0,0 @@ -normalize($html, $config, $context); - $new_html = $this->wrapHTML($new_html, $config, $context); - try { - $parser = new HTML5($new_html); - $doc = $parser->save(); - } catch (DOMException $e) { - // Uh oh, it failed. Punt to DirectLex. - $lexer = new HTMLPurifier_Lexer_DirectLex(); - $context->register('PH5PError', $e); // save the error, so we can detect it - return $lexer->tokenizeHTML($html, $config, $context); // use original HTML - } - $tokens = array(); - $this->tokenizeDOM( - $doc->getElementsByTagName('html')->item(0)-> // - getElementsByTagName('body')->item(0)-> // - getElementsByTagName('div')->item(0) //
    - , $tokens); - return $tokens; - } - -} - -/* - -Copyright 2007 Jeroen van der Meer - -Permission is hereby granted, free of charge, to any person obtaining a -copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be included -in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. -IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY -CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, -TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE -SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -*/ - -class HTML5 { - private $data; - private $char; - private $EOF; - private $state; - private $tree; - private $token; - private $content_model; - private $escape = false; - private $entities = array('AElig;','AElig','AMP;','AMP','Aacute;','Aacute', - 'Acirc;','Acirc','Agrave;','Agrave','Alpha;','Aring;','Aring','Atilde;', - 'Atilde','Auml;','Auml','Beta;','COPY;','COPY','Ccedil;','Ccedil','Chi;', - 'Dagger;','Delta;','ETH;','ETH','Eacute;','Eacute','Ecirc;','Ecirc','Egrave;', - 'Egrave','Epsilon;','Eta;','Euml;','Euml','GT;','GT','Gamma;','Iacute;', - 'Iacute','Icirc;','Icirc','Igrave;','Igrave','Iota;','Iuml;','Iuml','Kappa;', - 'LT;','LT','Lambda;','Mu;','Ntilde;','Ntilde','Nu;','OElig;','Oacute;', - 'Oacute','Ocirc;','Ocirc','Ograve;','Ograve','Omega;','Omicron;','Oslash;', - 'Oslash','Otilde;','Otilde','Ouml;','Ouml','Phi;','Pi;','Prime;','Psi;', - 'QUOT;','QUOT','REG;','REG','Rho;','Scaron;','Sigma;','THORN;','THORN', - 'TRADE;','Tau;','Theta;','Uacute;','Uacute','Ucirc;','Ucirc','Ugrave;', - 'Ugrave','Upsilon;','Uuml;','Uuml','Xi;','Yacute;','Yacute','Yuml;','Zeta;', - 'aacute;','aacute','acirc;','acirc','acute;','acute','aelig;','aelig', - 'agrave;','agrave','alefsym;','alpha;','amp;','amp','and;','ang;','apos;', - 'aring;','aring','asymp;','atilde;','atilde','auml;','auml','bdquo;','beta;', - 'brvbar;','brvbar','bull;','cap;','ccedil;','ccedil','cedil;','cedil', - 'cent;','cent','chi;','circ;','clubs;','cong;','copy;','copy','crarr;', - 'cup;','curren;','curren','dArr;','dagger;','darr;','deg;','deg','delta;', - 'diams;','divide;','divide','eacute;','eacute','ecirc;','ecirc','egrave;', - 'egrave','empty;','emsp;','ensp;','epsilon;','equiv;','eta;','eth;','eth', - 'euml;','euml','euro;','exist;','fnof;','forall;','frac12;','frac12', - 'frac14;','frac14','frac34;','frac34','frasl;','gamma;','ge;','gt;','gt', - 'hArr;','harr;','hearts;','hellip;','iacute;','iacute','icirc;','icirc', - 'iexcl;','iexcl','igrave;','igrave','image;','infin;','int;','iota;', - 'iquest;','iquest','isin;','iuml;','iuml','kappa;','lArr;','lambda;','lang;', - 'laquo;','laquo','larr;','lceil;','ldquo;','le;','lfloor;','lowast;','loz;', - 'lrm;','lsaquo;','lsquo;','lt;','lt','macr;','macr','mdash;','micro;','micro', - 'middot;','middot','minus;','mu;','nabla;','nbsp;','nbsp','ndash;','ne;', - 'ni;','not;','not','notin;','nsub;','ntilde;','ntilde','nu;','oacute;', - 'oacute','ocirc;','ocirc','oelig;','ograve;','ograve','oline;','omega;', - 'omicron;','oplus;','or;','ordf;','ordf','ordm;','ordm','oslash;','oslash', - 'otilde;','otilde','otimes;','ouml;','ouml','para;','para','part;','permil;', - 'perp;','phi;','pi;','piv;','plusmn;','plusmn','pound;','pound','prime;', - 'prod;','prop;','psi;','quot;','quot','rArr;','radic;','rang;','raquo;', - 'raquo','rarr;','rceil;','rdquo;','real;','reg;','reg','rfloor;','rho;', - 'rlm;','rsaquo;','rsquo;','sbquo;','scaron;','sdot;','sect;','sect','shy;', - 'shy','sigma;','sigmaf;','sim;','spades;','sub;','sube;','sum;','sup1;', - 'sup1','sup2;','sup2','sup3;','sup3','sup;','supe;','szlig;','szlig','tau;', - 'there4;','theta;','thetasym;','thinsp;','thorn;','thorn','tilde;','times;', - 'times','trade;','uArr;','uacute;','uacute','uarr;','ucirc;','ucirc', - 'ugrave;','ugrave','uml;','uml','upsih;','upsilon;','uuml;','uuml','weierp;', - 'xi;','yacute;','yacute','yen;','yen','yuml;','yuml','zeta;','zwj;','zwnj;'); - - const PCDATA = 0; - const RCDATA = 1; - const CDATA = 2; - const PLAINTEXT = 3; - - const DOCTYPE = 0; - const STARTTAG = 1; - const ENDTAG = 2; - const COMMENT = 3; - const CHARACTR = 4; - const EOF = 5; - - public function __construct($data) { - $data = str_replace("\r\n", "\n", $data); - $data = str_replace("\r", null, $data); - - $this->data = $data; - $this->char = -1; - $this->EOF = strlen($data); - $this->tree = new HTML5TreeConstructer; - $this->content_model = self::PCDATA; - - $this->state = 'data'; - - while($this->state !== null) { - $this->{$this->state.'State'}(); - } - } - - public function save() { - return $this->tree->save(); - } - - private function char() { - return ($this->char < $this->EOF) - ? $this->data[$this->char] - : false; - } - - private function character($s, $l = 0) { - if($s + $l < $this->EOF) { - if($l === 0) { - return $this->data[$s]; - } else { - return substr($this->data, $s, $l); - } - } - } - - private function characters($char_class, $start) { - return preg_replace('#^(['.$char_class.']+).*#s', '\\1', substr($this->data, $start)); - } - - private function dataState() { - // Consume the next input character - $this->char++; - $char = $this->char(); - - if($char === '&' && ($this->content_model === self::PCDATA || $this->content_model === self::RCDATA)) { - /* U+0026 AMPERSAND (&) - When the content model flag is set to one of the PCDATA or RCDATA - states: switch to the entity data state. Otherwise: treat it as per - the "anything else" entry below. */ - $this->state = 'entityData'; - - } elseif($char === '-') { - /* If the content model flag is set to either the RCDATA state or - the CDATA state, and the escape flag is false, and there are at - least three characters before this one in the input stream, and the - last four characters in the input stream, including this one, are - U+003C LESS-THAN SIGN, U+0021 EXCLAMATION MARK, U+002D HYPHEN-MINUS, - and U+002D HYPHEN-MINUS (""), - set the escape flag to false. */ - if(($this->content_model === self::RCDATA || - $this->content_model === self::CDATA) && $this->escape === true && - $this->character($this->char, 3) === '-->') { - $this->escape = false; - } - - /* In any case, emit the input character as a character token. - Stay in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - } elseif($this->char === $this->EOF) { - /* EOF - Emit an end-of-file token. */ - $this->EOF(); - - } elseif($this->content_model === self::PLAINTEXT) { - /* When the content model flag is set to the PLAINTEXT state - THIS DIFFERS GREATLY FROM THE SPEC: Get the remaining characters of - the text and emit it as a character token. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => substr($this->data, $this->char) - )); - - $this->EOF(); - - } else { - /* Anything else - THIS DIFFERS GREATLY FROM THE SPEC: Get as many character that - otherwise would also be treated as a character token and emit it - as a single character token. Stay in the data state. */ - $len = strcspn($this->data, '<&', $this->char); - $char = substr($this->data, $this->char, $len); - $this->char += $len - 1; - - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - $this->state = 'data'; - } - } - - private function entityDataState() { - // Attempt to consume an entity. - $entity = $this->entity(); - - // If nothing is returned, emit a U+0026 AMPERSAND character token. - // Otherwise, emit the character token that was returned. - $char = (!$entity) ? '&' : $entity; - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => $char - )); - - // Finally, switch to the data state. - $this->state = 'data'; - } - - private function tagOpenState() { - switch($this->content_model) { - case self::RCDATA: - case self::CDATA: - /* If the next input character is a U+002F SOLIDUS (/) character, - consume it and switch to the close tag open state. If the next - input character is not a U+002F SOLIDUS (/) character, emit a - U+003C LESS-THAN SIGN character token and switch to the data - state to process the next input character. */ - if($this->character($this->char + 1) === '/') { - $this->char++; - $this->state = 'closeTagOpen'; - - } else { - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<' - )); - - $this->state = 'data'; - } - break; - - case self::PCDATA: - // If the content model flag is set to the PCDATA state - // Consume the next input character: - $this->char++; - $char = $this->char(); - - if($char === '!') { - /* U+0021 EXCLAMATION MARK (!) - Switch to the markup declaration open state. */ - $this->state = 'markupDeclarationOpen'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Switch to the close tag open state. */ - $this->state = 'closeTagOpen'; - - } elseif(preg_match('/^[A-Za-z]$/', $char)) { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new start tag token, set its tag name to the lowercase - version of the input character (add 0x0020 to the character's code - point), then switch to the tag name state. (Don't emit the token - yet; further details will be filled in before it is emitted.) */ - $this->token = array( - 'name' => strtolower($char), - 'type' => self::STARTTAG, - 'attr' => array() - ); - - $this->state = 'tagName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Emit a U+003C LESS-THAN SIGN character token and a - U+003E GREATER-THAN SIGN character token. Switch to the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<>' - )); - - $this->state = 'data'; - - } elseif($char === '?') { - /* U+003F QUESTION MARK (?) - Parse error. Switch to the bogus comment state. */ - $this->state = 'bogusComment'; - - } else { - /* Anything else - Parse error. Emit a U+003C LESS-THAN SIGN character token and - reconsume the current input character in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => '<' - )); - - $this->char--; - $this->state = 'data'; - } - break; - } - } - - private function closeTagOpenState() { - $next_node = strtolower($this->characters('A-Za-z', $this->char + 1)); - $the_same = count($this->tree->stack) > 0 && $next_node === end($this->tree->stack)->nodeName; - - if(($this->content_model === self::RCDATA || $this->content_model === self::CDATA) && - (!$the_same || ($the_same && (!preg_match('/[\t\n\x0b\x0c >\/]/', - $this->character($this->char + 1 + strlen($next_node))) || $this->EOF === $this->char)))) { - /* If the content model flag is set to the RCDATA or CDATA states then - examine the next few characters. If they do not match the tag name of - the last start tag token emitted (case insensitively), or if they do but - they are not immediately followed by one of the following characters: - * U+0009 CHARACTER TABULATION - * U+000A LINE FEED (LF) - * U+000B LINE TABULATION - * U+000C FORM FEED (FF) - * U+0020 SPACE - * U+003E GREATER-THAN SIGN (>) - * U+002F SOLIDUS (/) - * EOF - ...then there is a parse error. Emit a U+003C LESS-THAN SIGN character - token, a U+002F SOLIDUS character token, and switch to the data state - to process the next input character. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => 'state = 'data'; - - } else { - /* Otherwise, if the content model flag is set to the PCDATA state, - or if the next few characters do match that tag name, consume the - next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[A-Za-z]$/', $char)) { - /* U+0041 LATIN LETTER A through to U+005A LATIN LETTER Z - Create a new end tag token, set its tag name to the lowercase version - of the input character (add 0x0020 to the character's code point), then - switch to the tag name state. (Don't emit the token yet; further details - will be filled in before it is emitted.) */ - $this->token = array( - 'name' => strtolower($char), - 'type' => self::ENDTAG - ); - - $this->state = 'tagName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Parse error. Switch to the data state. */ - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit a U+003C LESS-THAN SIGN character token and a U+002F - SOLIDUS character token. Reconsume the EOF character in the data state. */ - $this->emitToken(array( - 'type' => self::CHARACTR, - 'data' => 'char--; - $this->state = 'data'; - - } else { - /* Parse error. Switch to the bogus comment state. */ - $this->state = 'bogusComment'; - } - } - } - - private function tagNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } else { - /* Anything else - Append the current input character to the current tag token's tag name. - Stay in the tag name state. */ - $this->token['name'] .= strtolower($char); - $this->state = 'tagName'; - } - } - - private function beforeAttributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Stay in the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = array( - 'name' => strtolower($char), - 'value' => null - ); - - $this->state = 'attributeName'; - } - } - - private function attributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute name state. */ - $this->state = 'afterAttributeName'; - - } elseif($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/' && $this->character($this->char + 1) !== '>') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the before - attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's name. - Stay in the attribute name state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['name'] .= strtolower($char); - - $this->state = 'attributeName'; - } - } - - private function afterAttributeNameState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the after attribute name state. */ - $this->state = 'afterAttributeName'; - - } elseif($char === '=') { - /* U+003D EQUALS SIGN (=) - Switch to the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '/' && $this->character($this->char + 1) !== '>') { - /* U+002F SOLIDUS (/) - Parse error unless this is a permitted slash. Switch to the - before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the EOF - character in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Start a new attribute in the current tag token. Set that attribute's - name to the current input character, and its value to the empty string. - Switch to the attribute name state. */ - $this->token['attr'][] = array( - 'name' => strtolower($char), - 'value' => null - ); - - $this->state = 'attributeName'; - } - } - - private function beforeAttributeValueState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Stay in the before attribute value state. */ - $this->state = 'beforeAttributeValue'; - - } elseif($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the attribute value (double-quoted) state. */ - $this->state = 'attributeValueDoubleQuoted'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the attribute value (unquoted) state and reconsume - this input character. */ - $this->char--; - $this->state = 'attributeValueUnquoted'; - - } elseif($char === '\'') { - /* U+0027 APOSTROPHE (') - Switch to the attribute value (single-quoted) state. */ - $this->state = 'attributeValueSingleQuoted'; - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Switch to the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueUnquoted'; - } - } - - private function attributeValueDoubleQuotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if($char === '"') { - /* U+0022 QUOTATION MARK (") - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('double'); - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the character - in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (double-quoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueDoubleQuoted'; - } - } - - private function attributeValueSingleQuotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if($char === '\'') { - /* U+0022 QUOTATION MARK (') - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState('single'); - - } elseif($this->char === $this->EOF) { - /* EOF - Parse error. Emit the current tag token. Reconsume the character - in the data state. */ - $this->emitToken($this->token); - - $this->char--; - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (single-quoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueSingleQuoted'; - } - } - - private function attributeValueUnquotedState() { - // Consume the next input character: - $this->char++; - $char = $this->character($this->char); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - /* U+0009 CHARACTER TABULATION - U+000A LINE FEED (LF) - U+000B LINE TABULATION - U+000C FORM FEED (FF) - U+0020 SPACE - Switch to the before attribute name state. */ - $this->state = 'beforeAttributeName'; - - } elseif($char === '&') { - /* U+0026 AMPERSAND (&) - Switch to the entity in attribute value state. */ - $this->entityInAttributeValueState(); - - } elseif($char === '>') { - /* U+003E GREATER-THAN SIGN (>) - Emit the current tag token. Switch to the data state. */ - $this->emitToken($this->token); - $this->state = 'data'; - - } else { - /* Anything else - Append the current input character to the current attribute's value. - Stay in the attribute value (unquoted) state. */ - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - - $this->state = 'attributeValueUnquoted'; - } - } - - private function entityInAttributeValueState() { - // Attempt to consume an entity. - $entity = $this->entity(); - - // If nothing is returned, append a U+0026 AMPERSAND character to the - // current attribute's value. Otherwise, emit the character token that - // was returned. - $char = (!$entity) - ? '&' - : $entity; - - $last = count($this->token['attr']) - 1; - $this->token['attr'][$last]['value'] .= $char; - } - - private function bogusCommentState() { - /* Consume every character up to the first U+003E GREATER-THAN SIGN - character (>) or the end of the file (EOF), whichever comes first. Emit - a comment token whose data is the concatenation of all the characters - starting from and including the character that caused the state machine - to switch into the bogus comment state, up to and including the last - consumed character before the U+003E character, if any, or up to the - end of the file otherwise. (If the comment was started by the end of - the file (EOF), the token is empty.) */ - $data = $this->characters('^>', $this->char); - $this->emitToken(array( - 'data' => $data, - 'type' => self::COMMENT - )); - - $this->char += strlen($data); - - /* Switch to the data state. */ - $this->state = 'data'; - - /* If the end of the file was reached, reconsume the EOF character. */ - if($this->char === $this->EOF) { - $this->char = $this->EOF - 1; - } - } - - private function markupDeclarationOpenState() { - /* If the next two characters are both U+002D HYPHEN-MINUS (-) - characters, consume those two characters, create a comment token whose - data is the empty string, and switch to the comment state. */ - if($this->character($this->char + 1, 2) === '--') { - $this->char += 2; - $this->state = 'comment'; - $this->token = array( - 'data' => null, - 'type' => self::COMMENT - ); - - /* Otherwise if the next seven chacacters are a case-insensitive match - for the word "DOCTYPE", then consume those characters and switch to the - DOCTYPE state. */ - } elseif(strtolower($this->character($this->char + 1, 7)) === 'doctype') { - $this->char += 7; - $this->state = 'doctype'; - - /* Otherwise, is is a parse error. Switch to the bogus comment state. - The next character that is consumed, if any, is the first character - that will be in the comment. */ - } else { - $this->char++; - $this->state = 'bogusComment'; - } - } - - private function commentState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - /* U+002D HYPHEN-MINUS (-) */ - if($char === '-') { - /* Switch to the comment dash state */ - $this->state = 'commentDash'; - - /* EOF */ - } elseif($this->char === $this->EOF) { - /* Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - /* Anything else */ - } else { - /* Append the input character to the comment token's data. Stay in - the comment state. */ - $this->token['data'] .= $char; - } - } - - private function commentDashState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - /* U+002D HYPHEN-MINUS (-) */ - if($char === '-') { - /* Switch to the comment end state */ - $this->state = 'commentEnd'; - - /* EOF */ - } elseif($this->char === $this->EOF) { - /* Parse error. Emit the comment token. Reconsume the EOF character - in the data state. */ - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - /* Anything else */ - } else { - /* Append a U+002D HYPHEN-MINUS (-) character and the input - character to the comment token's data. Switch to the comment state. */ - $this->token['data'] .= '-'.$char; - $this->state = 'comment'; - } - } - - private function commentEndState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($char === '-') { - $this->token['data'] .= '-'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['data'] .= '--'.$char; - $this->state = 'comment'; - } - } - - private function doctypeState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - $this->state = 'beforeDoctypeName'; - - } else { - $this->char--; - $this->state = 'beforeDoctypeName'; - } - } - - private function beforeDoctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - // Stay in the before DOCTYPE name state. - - } elseif(preg_match('/^[a-z]$/', $char)) { - $this->token = array( - 'name' => strtoupper($char), - 'type' => self::DOCTYPE, - 'error' => true - ); - - $this->state = 'doctypeName'; - - } elseif($char === '>') { - $this->emitToken(array( - 'name' => null, - 'type' => self::DOCTYPE, - 'error' => true - )); - - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken(array( - 'name' => null, - 'type' => self::DOCTYPE, - 'error' => true - )); - - $this->char--; - $this->state = 'data'; - - } else { - $this->token = array( - 'name' => $char, - 'type' => self::DOCTYPE, - 'error' => true - ); - - $this->state = 'doctypeName'; - } - } - - private function doctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - $this->state = 'AfterDoctypeName'; - - } elseif($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif(preg_match('/^[a-z]$/', $char)) { - $this->token['name'] .= strtoupper($char); - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['name'] .= $char; - } - - $this->token['error'] = ($this->token['name'] === 'HTML') - ? false - : true; - } - - private function afterDoctypeNameState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if(preg_match('/^[\t\n\x0b\x0c ]$/', $char)) { - // Stay in the DOCTYPE name state. - - } elseif($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - $this->token['error'] = true; - $this->state = 'bogusDoctype'; - } - } - - private function bogusDoctypeState() { - /* Consume the next input character: */ - $this->char++; - $char = $this->char(); - - if($char === '>') { - $this->emitToken($this->token); - $this->state = 'data'; - - } elseif($this->char === $this->EOF) { - $this->emitToken($this->token); - $this->char--; - $this->state = 'data'; - - } else { - // Stay in the bogus DOCTYPE state. - } - } - - private function entity() { - $start = $this->char; - - // This section defines how to consume an entity. This definition is - // used when parsing entities in text and in attributes. - - // The behaviour depends on the identity of the next character (the - // one immediately after the U+0026 AMPERSAND character): - - switch($this->character($this->char + 1)) { - // U+0023 NUMBER SIGN (#) - case '#': - - // The behaviour further depends on the character after the - // U+0023 NUMBER SIGN: - switch($this->character($this->char + 1)) { - // U+0078 LATIN SMALL LETTER X - // U+0058 LATIN CAPITAL LETTER X - case 'x': - case 'X': - // Follow the steps below, but using the range of - // characters U+0030 DIGIT ZERO through to U+0039 DIGIT - // NINE, U+0061 LATIN SMALL LETTER A through to U+0066 - // LATIN SMALL LETTER F, and U+0041 LATIN CAPITAL LETTER - // A, through to U+0046 LATIN CAPITAL LETTER F (in other - // words, 0-9, A-F, a-f). - $char = 1; - $char_class = '0-9A-Fa-f'; - break; - - // Anything else - default: - // Follow the steps below, but using the range of - // characters U+0030 DIGIT ZERO through to U+0039 DIGIT - // NINE (i.e. just 0-9). - $char = 0; - $char_class = '0-9'; - break; - } - - // Consume as many characters as match the range of characters - // given above. - $this->char++; - $e_name = $this->characters($char_class, $this->char + $char + 1); - $entity = $this->character($start, $this->char); - $cond = strlen($e_name) > 0; - - // The rest of the parsing happens bellow. - break; - - // Anything else - default: - // Consume the maximum number of characters possible, with the - // consumed characters case-sensitively matching one of the - // identifiers in the first column of the entities table. - $e_name = $this->characters('0-9A-Za-z;', $this->char + 1); - $len = strlen($e_name); - - for($c = 1; $c <= $len; $c++) { - $id = substr($e_name, 0, $c); - $this->char++; - - if(in_array($id, $this->entities)) { - if ($e_name[$c-1] !== ';') { - if ($c < $len && $e_name[$c] == ';') { - $this->char++; // consume extra semicolon - } - } - $entity = $id; - break; - } - } - - $cond = isset($entity); - // The rest of the parsing happens bellow. - break; - } - - if(!$cond) { - // If no match can be made, then this is a parse error. No - // characters are consumed, and nothing is returned. - $this->char = $start; - return false; - } - - // Return a character token for the character corresponding to the - // entity name (as given by the second column of the entities table). - return html_entity_decode('&'.$entity.';', ENT_QUOTES, 'UTF-8'); - } - - private function emitToken($token) { - $emit = $this->tree->emitToken($token); - - if(is_int($emit)) { - $this->content_model = $emit; - - } elseif($token['type'] === self::ENDTAG) { - $this->content_model = self::PCDATA; - } - } - - private function EOF() { - $this->state = null; - $this->tree->emitToken(array( - 'type' => self::EOF - )); - } -} - -class HTML5TreeConstructer { - public $stack = array(); - - private $phase; - private $mode; - private $dom; - private $foster_parent = null; - private $a_formatting = array(); - - private $head_pointer = null; - private $form_pointer = null; - - private $scoping = array('button','caption','html','marquee','object','table','td','th'); - private $formatting = array('a','b','big','em','font','i','nobr','s','small','strike','strong','tt','u'); - private $special = array('address','area','base','basefont','bgsound', - 'blockquote','body','br','center','col','colgroup','dd','dir','div','dl', - 'dt','embed','fieldset','form','frame','frameset','h1','h2','h3','h4','h5', - 'h6','head','hr','iframe','image','img','input','isindex','li','link', - 'listing','menu','meta','noembed','noframes','noscript','ol','optgroup', - 'option','p','param','plaintext','pre','script','select','spacer','style', - 'tbody','textarea','tfoot','thead','title','tr','ul','wbr'); - - // The different phases. - const INIT_PHASE = 0; - const ROOT_PHASE = 1; - const MAIN_PHASE = 2; - const END_PHASE = 3; - - // The different insertion modes for the main phase. - const BEFOR_HEAD = 0; - const IN_HEAD = 1; - const AFTER_HEAD = 2; - const IN_BODY = 3; - const IN_TABLE = 4; - const IN_CAPTION = 5; - const IN_CGROUP = 6; - const IN_TBODY = 7; - const IN_ROW = 8; - const IN_CELL = 9; - const IN_SELECT = 10; - const AFTER_BODY = 11; - const IN_FRAME = 12; - const AFTR_FRAME = 13; - - // The different types of elements. - const SPECIAL = 0; - const SCOPING = 1; - const FORMATTING = 2; - const PHRASING = 3; - - const MARKER = 0; - - public function __construct() { - $this->phase = self::INIT_PHASE; - $this->mode = self::BEFOR_HEAD; - $this->dom = new DOMDocument; - - $this->dom->encoding = 'UTF-8'; - $this->dom->preserveWhiteSpace = true; - $this->dom->substituteEntities = true; - $this->dom->strictErrorChecking = false; - } - - // Process tag tokens - public function emitToken($token) { - switch($this->phase) { - case self::INIT_PHASE: return $this->initPhase($token); break; - case self::ROOT_PHASE: return $this->rootElementPhase($token); break; - case self::MAIN_PHASE: return $this->mainPhase($token); break; - case self::END_PHASE : return $this->trailingEndPhase($token); break; - } - } - - private function initPhase($token) { - /* Initially, the tree construction stage must handle each token - emitted from the tokenisation stage as follows: */ - - /* A DOCTYPE token that is marked as being in error - A comment token - A start tag token - An end tag token - A character token that is not one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE - An end-of-file token */ - if((isset($token['error']) && $token['error']) || - $token['type'] === HTML5::COMMENT || - $token['type'] === HTML5::STARTTAG || - $token['type'] === HTML5::ENDTAG || - $token['type'] === HTML5::EOF || - ($token['type'] === HTML5::CHARACTR && isset($token['data']) && - !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data']))) { - /* This specification does not define how to handle this case. In - particular, user agents may ignore the entirety of this specification - altogether for such documents, and instead invoke special parse modes - with a greater emphasis on backwards compatibility. */ - - $this->phase = self::ROOT_PHASE; - return $this->rootElementPhase($token); - - /* A DOCTYPE token marked as being correct */ - } elseif(isset($token['error']) && !$token['error']) { - /* Append a DocumentType node to the Document node, with the name - attribute set to the name given in the DOCTYPE token (which will be - "HTML"), and the other attributes specific to DocumentType objects - set to null, empty lists, or the empty string as appropriate. */ - $doctype = new DOMDocumentType(null, null, 'HTML'); - - /* Then, switch to the root element phase of the tree construction - stage. */ - $this->phase = self::ROOT_PHASE; - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif(isset($token['data']) && preg_match('/^[\t\n\x0b\x0c ]+$/', - $token['data'])) { - /* Append that character to the Document node. */ - $text = $this->dom->createTextNode($token['data']); - $this->dom->appendChild($text); - } - } - - private function rootElementPhase($token) { - /* After the initial phase, as each token is emitted from the tokenisation - stage, it must be processed as described in this section. */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append that character to the Document node. */ - $text = $this->dom->createTextNode($token['data']); - $this->dom->appendChild($text); - - /* A character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED - (FF), or U+0020 SPACE - A start tag token - An end tag token - An end-of-file token */ - } elseif(($token['type'] === HTML5::CHARACTR && - !preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || - $token['type'] === HTML5::STARTTAG || - $token['type'] === HTML5::ENDTAG || - $token['type'] === HTML5::EOF) { - /* Create an HTMLElement node with the tag name html, in the HTML - namespace. Append it to the Document object. Switch to the main - phase and reprocess the current token. */ - $html = $this->dom->createElement('html'); - $this->dom->appendChild($html); - $this->stack[] = $html; - - $this->phase = self::MAIN_PHASE; - return $this->mainPhase($token); - } - } - - private function mainPhase($token) { - /* Tokens in the main phase must be handled as follows: */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A start tag token with the tag name "html" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'html') { - /* If this start tag token was not the first start tag token, then - it is a parse error. */ - - /* For each attribute on the token, check to see if the attribute - is already present on the top element of the stack of open elements. - If it is not, add the attribute and its corresponding value to that - element. */ - foreach($token['attr'] as $attr) { - if(!$this->stack[0]->hasAttribute($attr['name'])) { - $this->stack[0]->setAttribute($attr['name'], $attr['value']); - } - } - - /* An end-of-file token */ - } elseif($token['type'] === HTML5::EOF) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Anything else. */ - } else { - /* Depends on the insertion mode: */ - switch($this->mode) { - case self::BEFOR_HEAD: return $this->beforeHead($token); break; - case self::IN_HEAD: return $this->inHead($token); break; - case self::AFTER_HEAD: return $this->afterHead($token); break; - case self::IN_BODY: return $this->inBody($token); break; - case self::IN_TABLE: return $this->inTable($token); break; - case self::IN_CAPTION: return $this->inCaption($token); break; - case self::IN_CGROUP: return $this->inColumnGroup($token); break; - case self::IN_TBODY: return $this->inTableBody($token); break; - case self::IN_ROW: return $this->inRow($token); break; - case self::IN_CELL: return $this->inCell($token); break; - case self::IN_SELECT: return $this->inSelect($token); break; - case self::AFTER_BODY: return $this->afterBody($token); break; - case self::IN_FRAME: return $this->inFrameset($token); break; - case self::AFTR_FRAME: return $this->afterFrameset($token); break; - case self::END_PHASE: return $this->trailingEndPhase($token); break; - } - } - } - - private function beforeHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token with the tag name "head" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') { - /* Create an element for the token, append the new element to the - current node and push it onto the stack of open elements. */ - $element = $this->insertElement($token); - - /* Set the head element pointer to this new element node. */ - $this->head_pointer = $element; - - /* Change the insertion mode to "in head". */ - $this->mode = self::IN_HEAD; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title". Or an end tag with the tag name "html". - Or a character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. Or any other start tag token */ - } elseif($token['type'] === HTML5::STARTTAG || - ($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') || - ($token['type'] === HTML5::CHARACTR && !preg_match('/^[\t\n\x0b\x0c ]$/', - $token['data']))) { - /* Act as if a start tag token with the tag name "head" and no - attributes had been seen, then reprocess the current token. */ - $this->beforeHead(array( - 'name' => 'head', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inHead($token); - - /* Any other end tag */ - } elseif($token['type'] === HTML5::ENDTAG) { - /* Parse error. Ignore the token. */ - } - } - - private function inHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. - - THIS DIFFERS FROM THE SPEC: If the current node is either a title, style - or script element, append the character to the current node regardless - of its content. */ - if(($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || ( - $token['type'] === HTML5::CHARACTR && in_array(end($this->stack)->nodeName, - array('title', 'style', 'script')))) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('title', 'style', 'script'))) { - array_pop($this->stack); - return HTML5::PCDATA; - - /* A start tag with the tag name "title" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'title') { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - } else { - $element = $this->insertElement($token); - } - - /* Switch the tokeniser's content model flag to the RCDATA state. */ - return HTML5::RCDATA; - - /* A start tag with the tag name "style" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'style') { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - } else { - $this->insertElement($token); - } - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - - /* A start tag with the tag name "script" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'script') { - /* Create an element for the token. */ - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - - /* A start tag with the tag name "base", "link", or "meta" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('base', 'link', 'meta'))) { - /* Create an element for the token and append the new element to the - node pointed to by the head element pointer, or, if that is null - (innerHTML case), to the current node. */ - if($this->head_pointer !== null) { - $element = $this->insertElement($token, false); - $this->head_pointer->appendChild($element); - array_pop($this->stack); - - } else { - $this->insertElement($token); - } - - /* An end tag with the tag name "head" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'head') { - /* If the current node is a head element, pop the current node off - the stack of open elements. */ - if($this->head_pointer->isSameNode(end($this->stack))) { - array_pop($this->stack); - - /* Otherwise, this is a parse error. */ - } else { - // k - } - - /* Change the insertion mode to "after head". */ - $this->mode = self::AFTER_HEAD; - - /* A start tag with the tag name "head" or an end tag except "html". */ - } elseif(($token['type'] === HTML5::STARTTAG && $token['name'] === 'head') || - ($token['type'] === HTML5::ENDTAG && $token['name'] !== 'html')) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* If the current node is a head element, act as if an end tag - token with the tag name "head" had been seen. */ - if($this->head_pointer->isSameNode(end($this->stack))) { - $this->inHead(array( - 'name' => 'head', - 'type' => HTML5::ENDTAG - )); - - /* Otherwise, change the insertion mode to "after head". */ - } else { - $this->mode = self::AFTER_HEAD; - } - - /* Then, reprocess the current token. */ - return $this->afterHead($token); - } - } - - private function afterHead($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data attribute - set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token with the tag name "body" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'body') { - /* Insert a body element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in body". */ - $this->mode = self::IN_BODY; - - /* A start tag token with the tag name "frameset" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'frameset') { - /* Insert a frameset element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in frameset". */ - $this->mode = self::IN_FRAME; - - /* A start tag token whose tag name is one of: "base", "link", "meta", - "script", "style", "title" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('base', 'link', 'meta', 'script', 'style', 'title'))) { - /* Parse error. Switch the insertion mode back to "in head" and - reprocess the token. */ - $this->mode = self::IN_HEAD; - return $this->inHead($token); - - /* Anything else */ - } else { - /* Act as if a start tag token with the tag name "body" and no - attributes had been seen, and then reprocess the current token. */ - $this->afterHead(array( - 'name' => 'body', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inBody($token); - } - } - - private function inBody($token) { - /* Handle the token as follows: */ - - switch($token['type']) { - /* A character token */ - case HTML5::CHARACTR: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - break; - - /* A comment token */ - case HTML5::COMMENT: - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - break; - - case HTML5::STARTTAG: - switch($token['name']) { - /* A start tag token whose tag name is one of: "script", - "style" */ - case 'script': case 'style': - /* Process the token as if the insertion mode had been "in - head". */ - return $this->inHead($token); - break; - - /* A start tag token whose tag name is one of: "base", "link", - "meta", "title" */ - case 'base': case 'link': case 'meta': case 'title': - /* Parse error. Process the token as if the insertion mode - had been "in head". */ - return $this->inHead($token); - break; - - /* A start tag token with the tag name "body" */ - case 'body': - /* Parse error. If the second element on the stack of open - elements is not a body element, or, if the stack of open - elements has only one node on it, then ignore the token. - (innerHTML case) */ - if(count($this->stack) === 1 || $this->stack[1]->nodeName !== 'body') { - // Ignore - - /* Otherwise, for each attribute on the token, check to see - if the attribute is already present on the body element (the - second element) on the stack of open elements. If it is not, - add the attribute and its corresponding value to that - element. */ - } else { - foreach($token['attr'] as $attr) { - if(!$this->stack[1]->hasAttribute($attr['name'])) { - $this->stack[1]->setAttribute($attr['name'], $attr['value']); - } - } - } - break; - - /* A start tag whose tag name is one of: "address", - "blockquote", "center", "dir", "div", "dl", "fieldset", - "listing", "menu", "ol", "p", "ul" */ - case 'address': case 'blockquote': case 'center': case 'dir': - case 'div': case 'dl': case 'fieldset': case 'listing': - case 'menu': case 'ol': case 'p': case 'ul': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is "form" */ - case 'form': - /* If the form element pointer is not null, ignore the - token with a parse error. */ - if($this->form_pointer !== null) { - // Ignore. - - /* Otherwise: */ - } else { - /* If the stack of open elements has a p element in - scope, then act as if an end tag with the tag name p - had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token, and set the - form element pointer to point to the element created. */ - $element = $this->insertElement($token); - $this->form_pointer = $element; - } - break; - - /* A start tag whose tag name is "li", "dd" or "dt" */ - case 'li': case 'dd': case 'dt': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - $stack_length = count($this->stack) - 1; - - for($n = $stack_length; 0 <= $n; $n--) { - /* 1. Initialise node to be the current node (the - bottommost node of the stack). */ - $stop = false; - $node = $this->stack[$n]; - $cat = $this->getElementCategory($node->tagName); - - /* 2. If node is an li, dd or dt element, then pop all - the nodes from the current node up to node, including - node, then stop this algorithm. */ - if($token['name'] === $node->tagName || ($token['name'] !== 'li' - && ($node->tagName === 'dd' || $node->tagName === 'dt'))) { - for($x = $stack_length; $x >= $n ; $x--) { - array_pop($this->stack); - } - - break; - } - - /* 3. If node is not in the formatting category, and is - not in the phrasing category, and is not an address or - div element, then stop this algorithm. */ - if($cat !== self::FORMATTING && $cat !== self::PHRASING && - $node->tagName !== 'address' && $node->tagName !== 'div') { - break; - } - } - - /* Finally, insert an HTML element with the same tag - name as the token's. */ - $this->insertElement($token); - break; - - /* A start tag token whose tag name is "plaintext" */ - case 'plaintext': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been - seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - return HTML5::PLAINTEXT; - break; - - /* A start tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - this is a parse error; pop elements from the stack until an - element with one of those tag names has been popped from the - stack. */ - while($this->elementInScope(array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'))) { - array_pop($this->stack); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - break; - - /* A start tag whose tag name is "a" */ - case 'a': - /* If the list of active formatting elements contains - an element whose tag name is "a" between the end of the - list and the last marker on the list (or the start of - the list if there is no marker on the list), then this - is a parse error; act as if an end tag with the tag name - "a" had been seen, then remove that element from the list - of active formatting elements and the stack of open - elements if the end tag didn't already remove it (it - might not have if the element is not in table scope). */ - $leng = count($this->a_formatting); - - for($n = $leng - 1; $n >= 0; $n--) { - if($this->a_formatting[$n] === self::MARKER) { - break; - - } elseif($this->a_formatting[$n]->nodeName === 'a') { - $this->emitToken(array( - 'name' => 'a', - 'type' => HTML5::ENDTAG - )); - break; - } - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - /* A start tag whose tag name is one of: "b", "big", "em", "font", - "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'b': case 'big': case 'em': case 'font': case 'i': - case 'nobr': case 's': case 'small': case 'strike': - case 'strong': case 'tt': case 'u': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $el = $this->insertElement($token); - - /* Add that element to the list of active formatting - elements. */ - $this->a_formatting[] = $el; - break; - - /* A start tag token whose tag name is "button" */ - case 'button': - /* If the stack of open elements has a button element in scope, - then this is a parse error; act as if an end tag with the tag - name "button" had been seen, then reprocess the token. (We don't - do that. Unnecessary.) */ - if($this->elementInScope('button')) { - $this->inBody(array( - 'name' => 'button', - 'type' => HTML5::ENDTAG - )); - } - - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - break; - - /* A start tag token whose tag name is one of: "marquee", "object" */ - case 'marquee': case 'object': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - break; - - /* A start tag token whose tag name is "xmp" */ - case 'xmp': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Switch the content model flag to the CDATA state. */ - return HTML5::CDATA; - break; - - /* A start tag whose tag name is "table" */ - case 'table': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - break; - - /* A start tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "img", "param", "spacer", "wbr" */ - case 'area': case 'basefont': case 'bgsound': case 'br': - case 'embed': case 'img': case 'param': case 'spacer': - case 'wbr': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "hr" */ - case 'hr': - /* If the stack of open elements has a p element in scope, - then act as if an end tag with the tag name p had been seen. */ - if($this->elementInScope('p')) { - $this->emitToken(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "image" */ - case 'image': - /* Parse error. Change the token's tag name to "img" and - reprocess it. (Don't ask.) */ - $token['name'] = 'img'; - return $this->inBody($token); - break; - - /* A start tag whose tag name is "input" */ - case 'input': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an input element for the token. */ - $element = $this->insertElement($token, false); - - /* If the form element pointer is not null, then associate the - input element with the form element pointed to by the form - element pointer. */ - $this->form_pointer !== null - ? $this->form_pointer->appendChild($element) - : end($this->stack)->appendChild($element); - - /* Pop that input element off the stack of open elements. */ - array_pop($this->stack); - break; - - /* A start tag whose tag name is "isindex" */ - case 'isindex': - /* Parse error. */ - // w/e - - /* If the form element pointer is not null, - then ignore the token. */ - if($this->form_pointer === null) { - /* Act as if a start tag token with the tag name "form" had - been seen. */ - $this->inBody(array( - 'name' => 'body', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->inBody(array( - 'name' => 'hr', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "p" had - been seen. */ - $this->inBody(array( - 'name' => 'p', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a start tag token with the tag name "label" - had been seen. */ - $this->inBody(array( - 'name' => 'label', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - /* Act as if a stream of character tokens had been seen. */ - $this->insertText('This is a searchable index. '. - 'Insert your search keywords here: '); - - /* Act as if a start tag token with the tag name "input" - had been seen, with all the attributes from the "isindex" - token, except with the "name" attribute set to the value - "isindex" (ignoring any explicit "name" attribute). */ - $attr = $token['attr']; - $attr[] = array('name' => 'name', 'value' => 'isindex'); - - $this->inBody(array( - 'name' => 'input', - 'type' => HTML5::STARTTAG, - 'attr' => $attr - )); - - /* Act as if a stream of character tokens had been seen - (see below for what they should say). */ - $this->insertText('This is a searchable index. '. - 'Insert your search keywords here: '); - - /* Act as if an end tag token with the tag name "label" - had been seen. */ - $this->inBody(array( - 'name' => 'label', - 'type' => HTML5::ENDTAG - )); - - /* Act as if an end tag token with the tag name "p" had - been seen. */ - $this->inBody(array( - 'name' => 'p', - 'type' => HTML5::ENDTAG - )); - - /* Act as if a start tag token with the tag name "hr" had - been seen. */ - $this->inBody(array( - 'name' => 'hr', - 'type' => HTML5::ENDTAG - )); - - /* Act as if an end tag token with the tag name "form" had - been seen. */ - $this->inBody(array( - 'name' => 'form', - 'type' => HTML5::ENDTAG - )); - } - break; - - /* A start tag whose tag name is "textarea" */ - case 'textarea': - $this->insertElement($token); - - /* Switch the tokeniser's content model flag to the - RCDATA state. */ - return HTML5::RCDATA; - break; - - /* A start tag whose tag name is one of: "iframe", "noembed", - "noframes" */ - case 'iframe': case 'noembed': case 'noframes': - $this->insertElement($token); - - /* Switch the tokeniser's content model flag to the CDATA state. */ - return HTML5::CDATA; - break; - - /* A start tag whose tag name is "select" */ - case 'select': - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Change the insertion mode to "in select". */ - $this->mode = self::IN_SELECT; - break; - - /* A start or end tag whose tag name is one of: "caption", "col", - "colgroup", "frame", "frameset", "head", "option", "optgroup", - "tbody", "td", "tfoot", "th", "thead", "tr". */ - case 'caption': case 'col': case 'colgroup': case 'frame': - case 'frameset': case 'head': case 'option': case 'optgroup': - case 'tbody': case 'td': case 'tfoot': case 'th': case 'thead': - case 'tr': - // Parse error. Ignore the token. - break; - - /* A start or end tag whose tag name is one of: "event-source", - "section", "nav", "article", "aside", "header", "footer", - "datagrid", "command" */ - case 'event-source': case 'section': case 'nav': case 'article': - case 'aside': case 'header': case 'footer': case 'datagrid': - case 'command': - // Work in progress! - break; - - /* A start tag token not covered by the previous entries */ - default: - /* Reconstruct the active formatting elements, if any. */ - $this->reconstructActiveFormattingElements(); - - $this->insertElement($token, true, true); - break; - } - break; - - case HTML5::ENDTAG: - switch($token['name']) { - /* An end tag with the tag name "body" */ - case 'body': - /* If the second element in the stack of open elements is - not a body element, this is a parse error. Ignore the token. - (innerHTML case) */ - if(count($this->stack) < 2 || $this->stack[1]->nodeName !== 'body') { - // Ignore. - - /* If the current node is not the body element, then this - is a parse error. */ - } elseif(end($this->stack)->nodeName !== 'body') { - // Parse error. - } - - /* Change the insertion mode to "after body". */ - $this->mode = self::AFTER_BODY; - break; - - /* An end tag with the tag name "html" */ - case 'html': - /* Act as if an end tag with tag name "body" had been seen, - then, if that token wasn't ignored, reprocess the current - token. */ - $this->inBody(array( - 'name' => 'body', - 'type' => HTML5::ENDTAG - )); - - return $this->afterBody($token); - break; - - /* An end tag whose tag name is one of: "address", "blockquote", - "center", "dir", "div", "dl", "fieldset", "listing", "menu", - "ol", "pre", "ul" */ - case 'address': case 'blockquote': case 'center': case 'dir': - case 'div': case 'dl': case 'fieldset': case 'listing': - case 'menu': case 'ol': case 'pre': case 'ul': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with - the same tag name as that of the token, then this - is a parse error. */ - // w/e - - /* If the stack of open elements has an element in - scope with the same tag name as that of the token, - then pop elements from this stack until an element - with that tag name has been popped from the stack. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is "form" */ - case 'form': - /* If the stack of open elements has an element in scope - with the same tag name as that of the token, then generate - implied end tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - } - - if(end($this->stack)->nodeName !== $token['name']) { - /* Now, if the current node is not an element with the - same tag name as that of the token, then this is a parse - error. */ - // w/e - - } else { - /* Otherwise, if the current node is an element with - the same tag name as that of the token pop that element - from the stack. */ - array_pop($this->stack); - } - - /* In any case, set the form element pointer to null. */ - $this->form_pointer = null; - break; - - /* An end tag whose tag name is "p" */ - case 'p': - /* If the stack of open elements has a p element in scope, - then generate implied end tags, except for p elements. */ - if($this->elementInScope('p')) { - $this->generateImpliedEndTags(array('p')); - - /* If the current node is not a p element, then this is - a parse error. */ - // k - - /* If the stack of open elements has a p element in - scope, then pop elements from this stack until the stack - no longer has a p element in scope. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->elementInScope('p')) { - array_pop($this->stack); - - } else { - break; - } - } - } - break; - - /* An end tag whose tag name is "dd", "dt", or "li" */ - case 'dd': case 'dt': case 'li': - /* If the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then - generate implied end tags, except for elements with the - same tag name as the token. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(array($token['name'])); - - /* If the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // w/e - - /* If the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then - pop elements from this stack until an element with that - tag name has been popped from the stack. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is one of: "h1", "h2", "h3", "h4", - "h5", "h6" */ - case 'h1': case 'h2': case 'h3': case 'h4': case 'h5': case 'h6': - $elements = array('h1', 'h2', 'h3', 'h4', 'h5', 'h6'); - - /* If the stack of open elements has in scope an element whose - tag name is one of "h1", "h2", "h3", "h4", "h5", or "h6", then - generate implied end tags. */ - if($this->elementInScope($elements)) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as that of the token, then this is a parse error. */ - // w/e - - /* If the stack of open elements has in scope an element - whose tag name is one of "h1", "h2", "h3", "h4", "h5", or - "h6", then pop elements from the stack until an element - with one of those tag names has been popped from the stack. */ - while($this->elementInScope($elements)) { - array_pop($this->stack); - } - } - break; - - /* An end tag whose tag name is one of: "a", "b", "big", "em", - "font", "i", "nobr", "s", "small", "strike", "strong", "tt", "u" */ - case 'a': case 'b': case 'big': case 'em': case 'font': - case 'i': case 'nobr': case 's': case 'small': case 'strike': - case 'strong': case 'tt': case 'u': - /* 1. Let the formatting element be the last element in - the list of active formatting elements that: - * is between the end of the list and the last scope - marker in the list, if any, or the start of the list - otherwise, and - * has the same tag name as the token. - */ - while(true) { - for($a = count($this->a_formatting) - 1; $a >= 0; $a--) { - if($this->a_formatting[$a] === self::MARKER) { - break; - - } elseif($this->a_formatting[$a]->tagName === $token['name']) { - $formatting_element = $this->a_formatting[$a]; - $in_stack = in_array($formatting_element, $this->stack, true); - $fe_af_pos = $a; - break; - } - } - - /* If there is no such node, or, if that node is - also in the stack of open elements but the element - is not in scope, then this is a parse error. Abort - these steps. The token is ignored. */ - if(!isset($formatting_element) || ($in_stack && - !$this->elementInScope($token['name']))) { - break; - - /* Otherwise, if there is such a node, but that node - is not in the stack of open elements, then this is a - parse error; remove the element from the list, and - abort these steps. */ - } elseif(isset($formatting_element) && !$in_stack) { - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 2. Let the furthest block be the topmost node in the - stack of open elements that is lower in the stack - than the formatting element, and is not an element in - the phrasing or formatting categories. There might - not be one. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $length = count($this->stack); - - for($s = $fe_s_pos + 1; $s < $length; $s++) { - $category = $this->getElementCategory($this->stack[$s]->nodeName); - - if($category !== self::PHRASING && $category !== self::FORMATTING) { - $furthest_block = $this->stack[$s]; - } - } - - /* 3. If there is no furthest block, then the UA must - skip the subsequent steps and instead just pop all - the nodes from the bottom of the stack of open - elements, from the current node up to the formatting - element, and remove the formatting element from the - list of active formatting elements. */ - if(!isset($furthest_block)) { - for($n = $length - 1; $n >= $fe_s_pos; $n--) { - array_pop($this->stack); - } - - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - break; - } - - /* 4. Let the common ancestor be the element - immediately above the formatting element in the stack - of open elements. */ - $common_ancestor = $this->stack[$fe_s_pos - 1]; - - /* 5. If the furthest block has a parent node, then - remove the furthest block from its parent node. */ - if($furthest_block->parentNode !== null) { - $furthest_block->parentNode->removeChild($furthest_block); - } - - /* 6. Let a bookmark note the position of the - formatting element in the list of active formatting - elements relative to the elements on either side - of it in the list. */ - $bookmark = $fe_af_pos; - - /* 7. Let node and last node be the furthest block. - Follow these steps: */ - $node = $furthest_block; - $last_node = $furthest_block; - - while(true) { - for($n = array_search($node, $this->stack, true) - 1; $n >= 0; $n--) { - /* 7.1 Let node be the element immediately - prior to node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 7.2 If node is not in the list of active - formatting elements, then remove node from - the stack of open elements and then go back - to step 1. */ - if(!in_array($node, $this->a_formatting, true)) { - unset($this->stack[$n]); - $this->stack = array_merge($this->stack); - - } else { - break; - } - } - - /* 7.3 Otherwise, if node is the formatting - element, then go to the next step in the overall - algorithm. */ - if($node === $formatting_element) { - break; - - /* 7.4 Otherwise, if last node is the furthest - block, then move the aforementioned bookmark to - be immediately after the node in the list of - active formatting elements. */ - } elseif($last_node === $furthest_block) { - $bookmark = array_search($node, $this->a_formatting, true) + 1; - } - - /* 7.5 If node has any children, perform a - shallow clone of node, replace the entry for - node in the list of active formatting elements - with an entry for the clone, replace the entry - for node in the stack of open elements with an - entry for the clone, and let node be the clone. */ - if($node->hasChildNodes()) { - $clone = $node->cloneNode(); - $s_pos = array_search($node, $this->stack, true); - $a_pos = array_search($node, $this->a_formatting, true); - - $this->stack[$s_pos] = $clone; - $this->a_formatting[$a_pos] = $clone; - $node = $clone; - } - - /* 7.6 Insert last node into node, first removing - it from its previous parent node if any. */ - if($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - $node->appendChild($last_node); - - /* 7.7 Let last node be node. */ - $last_node = $node; - } - - /* 8. Insert whatever last node ended up being in - the previous step into the common ancestor node, - first removing it from its previous parent node if - any. */ - if($last_node->parentNode !== null) { - $last_node->parentNode->removeChild($last_node); - } - - $common_ancestor->appendChild($last_node); - - /* 9. Perform a shallow clone of the formatting - element. */ - $clone = $formatting_element->cloneNode(); - - /* 10. Take all of the child nodes of the furthest - block and append them to the clone created in the - last step. */ - while($furthest_block->hasChildNodes()) { - $child = $furthest_block->firstChild; - $furthest_block->removeChild($child); - $clone->appendChild($child); - } - - /* 11. Append that clone to the furthest block. */ - $furthest_block->appendChild($clone); - - /* 12. Remove the formatting element from the list - of active formatting elements, and insert the clone - into the list of active formatting elements at the - position of the aforementioned bookmark. */ - $fe_af_pos = array_search($formatting_element, $this->a_formatting, true); - unset($this->a_formatting[$fe_af_pos]); - $this->a_formatting = array_merge($this->a_formatting); - - $af_part1 = array_slice($this->a_formatting, 0, $bookmark - 1); - $af_part2 = array_slice($this->a_formatting, $bookmark, count($this->a_formatting)); - $this->a_formatting = array_merge($af_part1, array($clone), $af_part2); - - /* 13. Remove the formatting element from the stack - of open elements, and insert the clone into the stack - of open elements immediately after (i.e. in a more - deeply nested position than) the position of the - furthest block in that stack. */ - $fe_s_pos = array_search($formatting_element, $this->stack, true); - $fb_s_pos = array_search($furthest_block, $this->stack, true); - unset($this->stack[$fe_s_pos]); - - $s_part1 = array_slice($this->stack, 0, $fb_s_pos); - $s_part2 = array_slice($this->stack, $fb_s_pos + 1, count($this->stack)); - $this->stack = array_merge($s_part1, array($clone), $s_part2); - - /* 14. Jump back to step 1 in this series of steps. */ - unset($formatting_element, $fe_af_pos, $fe_s_pos, $furthest_block); - } - break; - - /* An end tag token whose tag name is one of: "button", - "marquee", "object" */ - case 'button': case 'marquee': case 'object': - /* If the stack of open elements has an element in scope whose - tag name matches the tag name of the token, then generate implied - tags. */ - if($this->elementInScope($token['name'])) { - $this->generateImpliedEndTags(); - - /* Now, if the current node is not an element with the same - tag name as the token, then this is a parse error. */ - // k - - /* Now, if the stack of open elements has an element in scope - whose tag name matches the tag name of the token, then pop - elements from the stack until that element has been popped from - the stack, and clear the list of active formatting elements up - to the last marker. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === $token['name']) { - $n = -1; - } - - array_pop($this->stack); - } - - $marker = end(array_keys($this->a_formatting, self::MARKER, true)); - - for($n = count($this->a_formatting) - 1; $n > $marker; $n--) { - array_pop($this->a_formatting); - } - } - break; - - /* Or an end tag whose tag name is one of: "area", "basefont", - "bgsound", "br", "embed", "hr", "iframe", "image", "img", - "input", "isindex", "noembed", "noframes", "param", "select", - "spacer", "table", "textarea", "wbr" */ - case 'area': case 'basefont': case 'bgsound': case 'br': - case 'embed': case 'hr': case 'iframe': case 'image': - case 'img': case 'input': case 'isindex': case 'noembed': - case 'noframes': case 'param': case 'select': case 'spacer': - case 'table': case 'textarea': case 'wbr': - // Parse error. Ignore the token. - break; - - /* An end tag token not covered by the previous entries */ - default: - for($n = count($this->stack) - 1; $n >= 0; $n--) { - /* Initialise node to be the current node (the bottommost - node of the stack). */ - $node = end($this->stack); - - /* If node has the same tag name as the end tag token, - then: */ - if($token['name'] === $node->nodeName) { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* If the tag name of the end tag token does not - match the tag name of the current node, this is a - parse error. */ - // k - - /* Pop all the nodes from the current node up to - node, including node, then stop this algorithm. */ - for($x = count($this->stack) - $n; $x >= $n; $x--) { - array_pop($this->stack); - } - - } else { - $category = $this->getElementCategory($node); - - if($category !== self::SPECIAL && $category !== self::SCOPING) { - /* Otherwise, if node is in neither the formatting - category nor the phrasing category, then this is a - parse error. Stop this algorithm. The end tag token - is ignored. */ - return false; - } - } - } - break; - } - break; - } - } - - private function inTable($token) { - $clear = array('html', 'table'); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $text = $this->dom->createTextNode($token['data']); - end($this->stack)->appendChild($text); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - end($this->stack)->appendChild($comment); - - /* A start tag whose tag name is "caption" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'caption') { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert a marker at the end of the list of active - formatting elements. */ - $this->a_formatting[] = self::MARKER; - - /* Insert an HTML element for the token, then switch the - insertion mode to "in caption". */ - $this->insertElement($token); - $this->mode = self::IN_CAPTION; - - /* A start tag whose tag name is "colgroup" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'colgroup') { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the - insertion mode to "in column group". */ - $this->insertElement($token); - $this->mode = self::IN_CGROUP; - - /* A start tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'col') { - $this->inTable(array( - 'name' => 'colgroup', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - $this->inColumnGroup($token); - - /* A start tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('tbody', 'tfoot', 'thead'))) { - /* Clear the stack back to a table context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in table body". */ - $this->insertElement($token); - $this->mode = self::IN_TBODY; - - /* A start tag whose tag name is one of: "td", "th", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && - in_array($token['name'], array('td', 'th', 'tr'))) { - /* Act as if a start tag token with the tag name "tbody" had been - seen, then reprocess the current token. */ - $this->inTable(array( - 'name' => 'tbody', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inTableBody($token); - - /* A start tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'table') { - /* Parse error. Act as if an end tag token with the tag name "table" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->inTable(array( - 'name' => 'table', - 'type' => HTML5::ENDTAG - )); - - return $this->mainPhase($token); - - /* An end tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'table') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - return false; - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a table element, then this - is a parse error. */ - // w/e - - /* Pop elements from this stack until a table element has been - popped from the stack. */ - while(true) { - $current = end($this->stack)->nodeName; - array_pop($this->stack); - - if($current === 'table') { - break; - } - } - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'tbody', 'td', - 'tfoot', 'th', 'thead', 'tr'))) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* Parse error. Process the token as if the insertion mode was "in - body", with the following exception: */ - - /* If the current node is a table, tbody, tfoot, thead, or tr - element, then, whenever a node would be inserted into the current - node, it must instead be inserted into the foster parent element. */ - if(in_array(end($this->stack)->nodeName, - array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* The foster parent element is the parent element of the last - table element in the stack of open elements, if there is a - table element and it has such a parent element. If there is no - table element in the stack of open elements (innerHTML case), - then the foster parent element is the first element in the - stack of open elements (the html element). Otherwise, if there - is a table element in the stack of open elements, but the last - table element in the stack of open elements has no parent, or - its parent node is not an element, then the foster parent - element is the element before the last table element in the - stack of open elements. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === 'table') { - $table = $this->stack[$n]; - break; - } - } - - if(isset($table) && $table->parentNode !== null) { - $this->foster_parent = $table->parentNode; - - } elseif(!isset($table)) { - $this->foster_parent = $this->stack[0]; - - } elseif(isset($table) && ($table->parentNode === null || - $table->parentNode->nodeType !== XML_ELEMENT_NODE)) { - $this->foster_parent = $this->stack[$n - 1]; - } - } - - $this->inBody($token); - } - } - - private function inCaption($token) { - /* An end tag whose tag name is "caption" */ - if($token['type'] === HTML5::ENDTAG && $token['name'] === 'caption') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore - - /* Otherwise: */ - } else { - /* Generate implied end tags. */ - $this->generateImpliedEndTags(); - - /* Now, if the current node is not a caption element, then this - is a parse error. */ - // w/e - - /* Pop elements from this stack until a caption element has - been popped from the stack. */ - while(true) { - $node = end($this->stack)->nodeName; - array_pop($this->stack); - - if($node === 'caption') { - break; - } - } - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in table". */ - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr", or an end tag whose tag - name is "table" */ - } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) || ($token['type'] === HTML5::ENDTAG && - $token['name'] === 'table')) { - /* Parse error. Act as if an end tag with the tag name "caption" - had been seen, then, if that token wasn't ignored, reprocess the - current token. */ - $this->inCaption(array( - 'name' => 'caption', - 'type' => HTML5::ENDTAG - )); - - return $this->inTable($token); - - /* An end tag whose tag name is one of: "body", "col", "colgroup", - "html", "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'col', 'colgroup', 'html', 'tbody', 'tfoot', 'th', - 'thead', 'tr'))) { - // Parse error. Ignore the token. - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->inBody($token); - } - } - - private function inColumnGroup($token) { - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $text = $this->dom->createTextNode($token['data']); - end($this->stack)->appendChild($text); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - end($this->stack)->appendChild($comment); - - /* A start tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::STARTTAG && $token['name'] === 'col') { - /* Insert a col element for the token. Immediately pop the current - node off the stack of open elements. */ - $this->insertElement($token); - array_pop($this->stack); - - /* An end tag whose tag name is "colgroup" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'colgroup') { - /* If the current node is the root html element, then this is a - parse error, ignore the token. (innerHTML case) */ - if(end($this->stack)->nodeName === 'html') { - // Ignore - - /* Otherwise, pop the current node (which will be a colgroup - element) from the stack of open elements. Switch the insertion - mode to "in table". */ - } else { - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* An end tag whose tag name is "col" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'col') { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Act as if an end tag with the tag name "colgroup" had been seen, - and then, if that token wasn't ignored, reprocess the current token. */ - $this->inColumnGroup(array( - 'name' => 'colgroup', - 'type' => HTML5::ENDTAG - )); - - return $this->inTable($token); - } - } - - private function inTableBody($token) { - $clear = array('tbody', 'tfoot', 'thead', 'html'); - - /* A start tag whose tag name is "tr" */ - if($token['type'] === HTML5::STARTTAG && $token['name'] === 'tr') { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Insert a tr element for the token, then switch the insertion - mode to "in row". */ - $this->insertElement($token); - $this->mode = self::IN_ROW; - - /* A start tag whose tag name is one of: "th", "td" */ - } elseif($token['type'] === HTML5::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td')) { - /* Parse error. Act as if a start tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->inTableBody(array( - 'name' => 'tr', - 'type' => HTML5::STARTTAG, - 'attr' => array() - )); - - return $this->inRow($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node from the stack of open elements. Switch - the insertion mode to "in table". */ - array_pop($this->stack); - $this->mode = self::IN_TABLE; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", or an end tag whose tag name is "table" */ - } elseif(($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoor', 'thead'))) || - ($token['type'] === HTML5::STARTTAG && $token['name'] === 'table')) { - /* If the stack of open elements does not have a tbody, thead, or - tfoot element in table scope, this is a parse error. Ignore the - token. (innerHTML case) */ - if(!$this->elementInScope(array('tbody', 'thead', 'tfoot'), true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Clear the stack back to a table body context. */ - $this->clearStackToTableContext($clear); - - /* Act as if an end tag with the same tag name as the current - node ("tbody", "tfoot", or "thead") had been seen, then - reprocess the current token. */ - $this->inTableBody(array( - 'name' => end($this->stack)->nodeName, - 'type' => HTML5::ENDTAG - )); - - return $this->mainPhase($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->inTable($token); - } - } - - private function inRow($token) { - $clear = array('tr', 'html'); - - /* A start tag whose tag name is one of: "th", "td" */ - if($token['type'] === HTML5::STARTTAG && - ($token['name'] === 'th' || $token['name'] === 'td')) { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Insert an HTML element for the token, then switch the insertion - mode to "in cell". */ - $this->insertElement($token); - $this->mode = self::IN_CELL; - - /* Insert a marker at the end of the list of active formatting - elements. */ - $this->a_formatting[] = self::MARKER; - - /* An end tag whose tag name is "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'tr') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Clear the stack back to a table row context. */ - $this->clearStackToTableContext($clear); - - /* Pop the current node (which will be a tr element) from the - stack of open elements. Switch the insertion mode to "in table - body". */ - array_pop($this->stack); - $this->mode = self::IN_TBODY; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "tfoot", "thead", "tr" or an end tag whose tag name is "table" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* Act as if an end tag with the tag name "tr" had been seen, then, - if that token wasn't ignored, reprocess the current token. */ - $this->inRow(array( - 'name' => 'tr', - 'type' => HTML5::ENDTAG - )); - - return $this->inCell($token); - - /* An end tag whose tag name is one of: "tbody", "tfoot", "thead" */ - } elseif($token['type'] === HTML5::ENDTAG && - in_array($token['name'], array('tbody', 'tfoot', 'thead'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Otherwise, act as if an end tag with the tag name "tr" had - been seen, then reprocess the current token. */ - $this->inRow(array( - 'name' => 'tr', - 'type' => HTML5::ENDTAG - )); - - return $this->inCell($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html", "td", "th" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html', 'td', 'th', 'tr'))) { - /* Parse error. Ignore the token. */ - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in table". */ - $this->inTable($token); - } - } - - private function inCell($token) { - /* An end tag whose tag name is one of: "td", "th" */ - if($token['type'] === HTML5::ENDTAG && - ($token['name'] === 'td' || $token['name'] === 'th')) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token, then this is a - parse error and the token must be ignored. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise: */ - } else { - /* Generate implied end tags, except for elements with the same - tag name as the token. */ - $this->generateImpliedEndTags(array($token['name'])); - - /* Now, if the current node is not an element with the same tag - name as the token, then this is a parse error. */ - // k - - /* Pop elements from this stack until an element with the same - tag name as the token has been popped from the stack. */ - while(true) { - $node = end($this->stack)->nodeName; - array_pop($this->stack); - - if($node === $token['name']) { - break; - } - } - - /* Clear the list of active formatting elements up to the last - marker. */ - $this->clearTheActiveFormattingElementsUpToTheLastMarker(); - - /* Switch the insertion mode to "in row". (The current node - will be a tr element at this point.) */ - $this->mode = self::IN_ROW; - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if(!$this->elementInScope(array('td', 'th'), true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* A start tag whose tag name is one of: "caption", "col", "colgroup", - "tbody", "td", "tfoot", "th", "thead", "tr" */ - } elseif($token['type'] === HTML5::STARTTAG && in_array($token['name'], - array('caption', 'col', 'colgroup', 'tbody', 'td', 'tfoot', 'th', - 'thead', 'tr'))) { - /* If the stack of open elements does not have a td or th element - in table scope, then this is a parse error; ignore the token. - (innerHTML case) */ - if(!$this->elementInScope(array('td', 'th'), true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* An end tag whose tag name is one of: "body", "caption", "col", - "colgroup", "html" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('body', 'caption', 'col', 'colgroup', 'html'))) { - /* Parse error. Ignore the token. */ - - /* An end tag whose tag name is one of: "table", "tbody", "tfoot", - "thead", "tr" */ - } elseif($token['type'] === HTML5::ENDTAG && in_array($token['name'], - array('table', 'tbody', 'tfoot', 'thead', 'tr'))) { - /* If the stack of open elements does not have an element in table - scope with the same tag name as that of the token (which can only - happen for "tbody", "tfoot" and "thead", or, in the innerHTML case), - then this is a parse error and the token must be ignored. */ - if(!$this->elementInScope($token['name'], true)) { - // Ignore. - - /* Otherwise, close the cell (see below) and reprocess the current - token. */ - } else { - $this->closeCell(); - return $this->inRow($token); - } - - /* Anything else */ - } else { - /* Process the token as if the insertion mode was "in body". */ - $this->inBody($token); - } - } - - private function inSelect($token) { - /* Handle the token as follows: */ - - /* A character token */ - if($token['type'] === HTML5::CHARACTR) { - /* Append the token's character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag token whose tag name is "option" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'option') { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if(end($this->stack)->nodeName === 'option') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* A start tag token whose tag name is "optgroup" */ - } elseif($token['type'] === HTML5::STARTTAG && - $token['name'] === 'optgroup') { - /* If the current node is an option element, act as if an end tag - with the tag name "option" had been seen. */ - if(end($this->stack)->nodeName === 'option') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* If the current node is an optgroup element, act as if an end tag - with the tag name "optgroup" had been seen. */ - if(end($this->stack)->nodeName === 'optgroup') { - $this->inSelect(array( - 'name' => 'optgroup', - 'type' => HTML5::ENDTAG - )); - } - - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* An end tag token whose tag name is "optgroup" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'optgroup') { - /* First, if the current node is an option element, and the node - immediately before it in the stack of open elements is an optgroup - element, then act as if an end tag with the tag name "option" had - been seen. */ - $elements_in_stack = count($this->stack); - - if($this->stack[$elements_in_stack - 1]->nodeName === 'option' && - $this->stack[$elements_in_stack - 2]->nodeName === 'optgroup') { - $this->inSelect(array( - 'name' => 'option', - 'type' => HTML5::ENDTAG - )); - } - - /* If the current node is an optgroup element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if($this->stack[$elements_in_stack - 1] === 'optgroup') { - array_pop($this->stack); - } - - /* An end tag token whose tag name is "option" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'option') { - /* If the current node is an option element, then pop that node - from the stack of open elements. Otherwise, this is a parse error, - ignore the token. */ - if(end($this->stack)->nodeName === 'option') { - array_pop($this->stack); - } - - /* An end tag whose tag name is "select" */ - } elseif($token['type'] === HTML5::ENDTAG && - $token['name'] === 'select') { - /* If the stack of open elements does not have an element in table - scope with the same tag name as the token, this is a parse error. - Ignore the token. (innerHTML case) */ - if(!$this->elementInScope($token['name'], true)) { - // w/e - - /* Otherwise: */ - } else { - /* Pop elements from the stack of open elements until a select - element has been popped from the stack. */ - while(true) { - $current = end($this->stack)->nodeName; - array_pop($this->stack); - - if($current === 'select') { - break; - } - } - - /* Reset the insertion mode appropriately. */ - $this->resetInsertionMode(); - } - - /* A start tag whose tag name is "select" */ - } elseif($token['name'] === 'select' && - $token['type'] === HTML5::STARTTAG) { - /* Parse error. Act as if the token had been an end tag with the - tag name "select" instead. */ - $this->inSelect(array( - 'name' => 'select', - 'type' => HTML5::ENDTAG - )); - - /* An end tag whose tag name is one of: "caption", "table", "tbody", - "tfoot", "thead", "tr", "td", "th" */ - } elseif(in_array($token['name'], array('caption', 'table', 'tbody', - 'tfoot', 'thead', 'tr', 'td', 'th')) && $token['type'] === HTML5::ENDTAG) { - /* Parse error. */ - // w/e - - /* If the stack of open elements has an element in table scope with - the same tag name as that of the token, then act as if an end tag - with the tag name "select" had been seen, and reprocess the token. - Otherwise, ignore the token. */ - if($this->elementInScope($token['name'], true)) { - $this->inSelect(array( - 'name' => 'select', - 'type' => HTML5::ENDTAG - )); - - $this->mainPhase($token); - } - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function afterBody($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Process the token as it would be processed if the insertion mode - was "in body". */ - $this->inBody($token); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the first element in the stack of open - elements (the html element), with the data attribute set to the - data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->stack[0]->appendChild($comment); - - /* An end tag with the tag name "html" */ - } elseif($token['type'] === HTML5::ENDTAG && $token['name'] === 'html') { - /* If the parser was originally created in order to handle the - setting of an element's innerHTML attribute, this is a parse error; - ignore the token. (The element will be an html element in this - case.) (innerHTML case) */ - - /* Otherwise, switch to the trailing end phase. */ - $this->phase = self::END_PHASE; - - /* Anything else */ - } else { - /* Parse error. Set the insertion mode to "in body" and reprocess - the token. */ - $this->mode = self::IN_BODY; - return $this->inBody($token); - } - } - - private function inFrameset($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* A start tag with the tag name "frameset" */ - } elseif($token['name'] === 'frameset' && - $token['type'] === HTML5::STARTTAG) { - $this->insertElement($token); - - /* An end tag with the tag name "frameset" */ - } elseif($token['name'] === 'frameset' && - $token['type'] === HTML5::ENDTAG) { - /* If the current node is the root html element, then this is a - parse error; ignore the token. (innerHTML case) */ - if(end($this->stack)->nodeName === 'html') { - // Ignore - - } else { - /* Otherwise, pop the current node from the stack of open - elements. */ - array_pop($this->stack); - - /* If the parser was not originally created in order to handle - the setting of an element's innerHTML attribute (innerHTML case), - and the current node is no longer a frameset element, then change - the insertion mode to "after frameset". */ - $this->mode = self::AFTR_FRAME; - } - - /* A start tag with the tag name "frame" */ - } elseif($token['name'] === 'frame' && - $token['type'] === HTML5::STARTTAG) { - /* Insert an HTML element for the token. */ - $this->insertElement($token); - - /* Immediately pop the current node off the stack of open elements. */ - array_pop($this->stack); - - /* A start tag with the tag name "noframes" */ - } elseif($token['name'] === 'noframes' && - $token['type'] === HTML5::STARTTAG) { - /* Process the token as if the insertion mode had been "in body". */ - $this->inBody($token); - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function afterFrameset($token) { - /* Handle the token as follows: */ - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - U+000D CARRIAGE RETURN (CR), or U+0020 SPACE */ - if($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Append the character to the current node. */ - $this->insertText($token['data']); - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the current node with the data - attribute set to the data given in the comment token. */ - $this->insertComment($token['data']); - - /* An end tag with the tag name "html" */ - } elseif($token['name'] === 'html' && - $token['type'] === HTML5::ENDTAG) { - /* Switch to the trailing end phase. */ - $this->phase = self::END_PHASE; - - /* A start tag with the tag name "noframes" */ - } elseif($token['name'] === 'noframes' && - $token['type'] === HTML5::STARTTAG) { - /* Process the token as if the insertion mode had been "in body". */ - $this->inBody($token); - - /* Anything else */ - } else { - /* Parse error. Ignore the token. */ - } - } - - private function trailingEndPhase($token) { - /* After the main phase, as each token is emitted from the tokenisation - stage, it must be processed as described in this section. */ - - /* A DOCTYPE token */ - if($token['type'] === HTML5::DOCTYPE) { - // Parse error. Ignore the token. - - /* A comment token */ - } elseif($token['type'] === HTML5::COMMENT) { - /* Append a Comment node to the Document object with the data - attribute set to the data given in the comment token. */ - $comment = $this->dom->createComment($token['data']); - $this->dom->appendChild($comment); - - /* A character token that is one of one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE */ - } elseif($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) { - /* Process the token as it would be processed in the main phase. */ - $this->mainPhase($token); - - /* A character token that is not one of U+0009 CHARACTER TABULATION, - U+000A LINE FEED (LF), U+000B LINE TABULATION, U+000C FORM FEED (FF), - or U+0020 SPACE. Or a start tag token. Or an end tag token. */ - } elseif(($token['type'] === HTML5::CHARACTR && - preg_match('/^[\t\n\x0b\x0c ]+$/', $token['data'])) || - $token['type'] === HTML5::STARTTAG || $token['type'] === HTML5::ENDTAG) { - /* Parse error. Switch back to the main phase and reprocess the - token. */ - $this->phase = self::MAIN_PHASE; - return $this->mainPhase($token); - - /* An end-of-file token */ - } elseif($token['type'] === HTML5::EOF) { - /* OMG DONE!! */ - } - } - - private function insertElement($token, $append = true, $check = false) { - // Proprietary workaround for libxml2's limitations with tag names - if ($check) { - // Slightly modified HTML5 tag-name modification, - // removing anything that's not an ASCII letter, digit, or hyphen - $token['name'] = preg_replace('/[^a-z0-9-]/i', '', $token['name']); - // Remove leading hyphens and numbers - $token['name'] = ltrim($token['name'], '-0..9'); - // In theory, this should ever be needed, but just in case - if ($token['name'] === '') $token['name'] = 'span'; // arbitrary generic choice - } - - $el = $this->dom->createElement($token['name']); - - foreach($token['attr'] as $attr) { - if(!$el->hasAttribute($attr['name'])) { - $el->setAttribute($attr['name'], $attr['value']); - } - } - - $this->appendToRealParent($el); - $this->stack[] = $el; - - return $el; - } - - private function insertText($data) { - $text = $this->dom->createTextNode($data); - $this->appendToRealParent($text); - } - - private function insertComment($data) { - $comment = $this->dom->createComment($data); - $this->appendToRealParent($comment); - } - - private function appendToRealParent($node) { - if($this->foster_parent === null) { - end($this->stack)->appendChild($node); - - } elseif($this->foster_parent !== null) { - /* If the foster parent element is the parent element of the - last table element in the stack of open elements, then the new - node must be inserted immediately before the last table element - in the stack of open elements in the foster parent element; - otherwise, the new node must be appended to the foster parent - element. */ - for($n = count($this->stack) - 1; $n >= 0; $n--) { - if($this->stack[$n]->nodeName === 'table' && - $this->stack[$n]->parentNode !== null) { - $table = $this->stack[$n]; - break; - } - } - - if(isset($table) && $this->foster_parent->isSameNode($table->parentNode)) - $this->foster_parent->insertBefore($node, $table); - else - $this->foster_parent->appendChild($node); - - $this->foster_parent = null; - } - } - - private function elementInScope($el, $table = false) { - if(is_array($el)) { - foreach($el as $element) { - if($this->elementInScope($element, $table)) { - return true; - } - } - - return false; - } - - $leng = count($this->stack); - - for($n = 0; $n < $leng; $n++) { - /* 1. Initialise node to be the current node (the bottommost node of - the stack). */ - $node = $this->stack[$leng - 1 - $n]; - - if($node->tagName === $el) { - /* 2. If node is the target node, terminate in a match state. */ - return true; - - } elseif($node->tagName === 'table') { - /* 3. Otherwise, if node is a table element, terminate in a failure - state. */ - return false; - - } elseif($table === true && in_array($node->tagName, array('caption', 'td', - 'th', 'button', 'marquee', 'object'))) { - /* 4. Otherwise, if the algorithm is the "has an element in scope" - variant (rather than the "has an element in table scope" variant), - and node is one of the following, terminate in a failure state. */ - return false; - - } elseif($node === $node->ownerDocument->documentElement) { - /* 5. Otherwise, if node is an html element (root element), terminate - in a failure state. (This can only happen if the node is the topmost - node of the stack of open elements, and prevents the next step from - being invoked if there are no more elements in the stack.) */ - return false; - } - - /* Otherwise, set node to the previous entry in the stack of open - elements and return to step 2. (This will never fail, since the loop - will always terminate in the previous step if the top of the stack - is reached.) */ - } - } - - private function reconstructActiveFormattingElements() { - /* 1. If there are no entries in the list of active formatting elements, - then there is nothing to reconstruct; stop this algorithm. */ - $formatting_elements = count($this->a_formatting); - - if($formatting_elements === 0) { - return false; - } - - /* 3. Let entry be the last (most recently added) element in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. If the last (most recently added) entry in the list of active - formatting elements is a marker, or if it is an element that is in the - stack of open elements, then there is nothing to reconstruct; stop this - algorithm. */ - if($entry === self::MARKER || in_array($entry, $this->stack, true)) { - return false; - } - - for($a = $formatting_elements - 1; $a >= 0; true) { - /* 4. If there are no entries before entry in the list of active - formatting elements, then jump to step 8. */ - if($a === 0) { - $step_seven = false; - break; - } - - /* 5. Let entry be the entry one earlier than entry in the list of - active formatting elements. */ - $a--; - $entry = $this->a_formatting[$a]; - - /* 6. If entry is neither a marker nor an element that is also in - thetack of open elements, go to step 4. */ - if($entry === self::MARKER || in_array($entry, $this->stack, true)) { - break; - } - } - - while(true) { - /* 7. Let entry be the element one later than entry in the list of - active formatting elements. */ - if(isset($step_seven) && $step_seven === true) { - $a++; - $entry = $this->a_formatting[$a]; - } - - /* 8. Perform a shallow clone of the element entry to obtain clone. */ - $clone = $entry->cloneNode(); - - /* 9. Append clone to the current node and push it onto the stack - of open elements so that it is the new current node. */ - end($this->stack)->appendChild($clone); - $this->stack[] = $clone; - - /* 10. Replace the entry for entry in the list with an entry for - clone. */ - $this->a_formatting[$a] = $clone; - - /* 11. If the entry for clone in the list of active formatting - elements is not the last entry in the list, return to step 7. */ - if(end($this->a_formatting) !== $clone) { - $step_seven = true; - } else { - break; - } - } - } - - private function clearTheActiveFormattingElementsUpToTheLastMarker() { - /* When the steps below require the UA to clear the list of active - formatting elements up to the last marker, the UA must perform the - following steps: */ - - while(true) { - /* 1. Let entry be the last (most recently added) entry in the list - of active formatting elements. */ - $entry = end($this->a_formatting); - - /* 2. Remove entry from the list of active formatting elements. */ - array_pop($this->a_formatting); - - /* 3. If entry was a marker, then stop the algorithm at this point. - The list has been cleared up to the last marker. */ - if($entry === self::MARKER) { - break; - } - } - } - - private function generateImpliedEndTags($exclude = array()) { - /* When the steps below require the UA to generate implied end tags, - then, if the current node is a dd element, a dt element, an li element, - a p element, a td element, a th element, or a tr element, the UA must - act as if an end tag with the respective tag name had been seen and - then generate implied end tags again. */ - $node = end($this->stack); - $elements = array_diff(array('dd', 'dt', 'li', 'p', 'td', 'th', 'tr'), $exclude); - - while(in_array(end($this->stack)->nodeName, $elements)) { - array_pop($this->stack); - } - } - - private function getElementCategory($node) { - $name = $node->tagName; - if(in_array($name, $this->special)) - return self::SPECIAL; - - elseif(in_array($name, $this->scoping)) - return self::SCOPING; - - elseif(in_array($name, $this->formatting)) - return self::FORMATTING; - - else - return self::PHRASING; - } - - private function clearStackToTableContext($elements) { - /* When the steps above require the UA to clear the stack back to a - table context, it means that the UA must, while the current node is not - a table element or an html element, pop elements from the stack of open - elements. If this causes any elements to be popped from the stack, then - this is a parse error. */ - while(true) { - $node = end($this->stack)->nodeName; - - if(in_array($node, $elements)) { - break; - } else { - array_pop($this->stack); - } - } - } - - private function resetInsertionMode() { - /* 1. Let last be false. */ - $last = false; - $leng = count($this->stack); - - for($n = $leng - 1; $n >= 0; $n--) { - /* 2. Let node be the last node in the stack of open elements. */ - $node = $this->stack[$n]; - - /* 3. If node is the first node in the stack of open elements, then - set last to true. If the element whose innerHTML attribute is being - set is neither a td element nor a th element, then set node to the - element whose innerHTML attribute is being set. (innerHTML case) */ - if($this->stack[0]->isSameNode($node)) { - $last = true; - } - - /* 4. If node is a select element, then switch the insertion mode to - "in select" and abort these steps. (innerHTML case) */ - if($node->nodeName === 'select') { - $this->mode = self::IN_SELECT; - break; - - /* 5. If node is a td or th element, then switch the insertion mode - to "in cell" and abort these steps. */ - } elseif($node->nodeName === 'td' || $node->nodeName === 'th') { - $this->mode = self::IN_CELL; - break; - - /* 6. If node is a tr element, then switch the insertion mode to - "in row" and abort these steps. */ - } elseif($node->nodeName === 'tr') { - $this->mode = self::IN_ROW; - break; - - /* 7. If node is a tbody, thead, or tfoot element, then switch the - insertion mode to "in table body" and abort these steps. */ - } elseif(in_array($node->nodeName, array('tbody', 'thead', 'tfoot'))) { - $this->mode = self::IN_TBODY; - break; - - /* 8. If node is a caption element, then switch the insertion mode - to "in caption" and abort these steps. */ - } elseif($node->nodeName === 'caption') { - $this->mode = self::IN_CAPTION; - break; - - /* 9. If node is a colgroup element, then switch the insertion mode - to "in column group" and abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'colgroup') { - $this->mode = self::IN_CGROUP; - break; - - /* 10. If node is a table element, then switch the insertion mode - to "in table" and abort these steps. */ - } elseif($node->nodeName === 'table') { - $this->mode = self::IN_TABLE; - break; - - /* 11. If node is a head element, then switch the insertion mode - to "in body" ("in body"! not "in head"!) and abort these steps. - (innerHTML case) */ - } elseif($node->nodeName === 'head') { - $this->mode = self::IN_BODY; - break; - - /* 12. If node is a body element, then switch the insertion mode to - "in body" and abort these steps. */ - } elseif($node->nodeName === 'body') { - $this->mode = self::IN_BODY; - break; - - /* 13. If node is a frameset element, then switch the insertion - mode to "in frameset" and abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'frameset') { - $this->mode = self::IN_FRAME; - break; - - /* 14. If node is an html element, then: if the head element - pointer is null, switch the insertion mode to "before head", - otherwise, switch the insertion mode to "after head". In either - case, abort these steps. (innerHTML case) */ - } elseif($node->nodeName === 'html') { - $this->mode = ($this->head_pointer === null) - ? self::BEFOR_HEAD - : self::AFTER_HEAD; - - break; - - /* 15. If last is true, then set the insertion mode to "in body" - and abort these steps. (innerHTML case) */ - } elseif($last) { - $this->mode = self::IN_BODY; - break; - } - } - } - - private function closeCell() { - /* If the stack of open elements has a td or th element in table scope, - then act as if an end tag token with that tag name had been seen. */ - foreach(array('td', 'th') as $cell) { - if($this->elementInScope($cell, true)) { - $this->inCell(array( - 'name' => $cell, - 'type' => HTML5::ENDTAG - )); - - break; - } - } - } - - public function save() { - return $this->dom; - } -} -?> diff --git a/extlib/HTMLPurifier/HTMLPurifier/PercentEncoder.php b/extlib/HTMLPurifier/HTMLPurifier/PercentEncoder.php deleted file mode 100644 index a43c44f4c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/PercentEncoder.php +++ /dev/null @@ -1,98 +0,0 @@ -preserve[$i] = true; // digits - for ($i = 65; $i <= 90; $i++) $this->preserve[$i] = true; // upper-case - for ($i = 97; $i <= 122; $i++) $this->preserve[$i] = true; // lower-case - $this->preserve[45] = true; // Dash - - $this->preserve[46] = true; // Period . - $this->preserve[95] = true; // Underscore _ - $this->preserve[126]= true; // Tilde ~ - - // extra letters not to escape - if ($preserve !== false) { - for ($i = 0, $c = strlen($preserve); $i < $c; $i++) { - $this->preserve[ord($preserve[$i])] = true; - } - } - } - - /** - * Our replacement for urlencode, it encodes all non-reserved characters, - * as well as any extra characters that were instructed to be preserved. - * @note - * Assumes that the string has already been normalized, making any - * and all percent escape sequences valid. Percents will not be - * re-escaped, regardless of their status in $preserve - * @param $string String to be encoded - * @return Encoded string. - */ - public function encode($string) { - $ret = ''; - for ($i = 0, $c = strlen($string); $i < $c; $i++) { - if ($string[$i] !== '%' && !isset($this->preserve[$int = ord($string[$i])]) ) { - $ret .= '%' . sprintf('%02X', $int); - } else { - $ret .= $string[$i]; - } - } - return $ret; - } - - /** - * Fix up percent-encoding by decoding unreserved characters and normalizing. - * @warning This function is affected by $preserve, even though the - * usual desired behavior is for this not to preserve those - * characters. Be careful when reusing instances of PercentEncoder! - * @param $string String to normalize - */ - public function normalize($string) { - if ($string == '') return ''; - $parts = explode('%', $string); - $ret = array_shift($parts); - foreach ($parts as $part) { - $length = strlen($part); - if ($length < 2) { - $ret .= '%25' . $part; - continue; - } - $encoding = substr($part, 0, 2); - $text = substr($part, 2); - if (!ctype_xdigit($encoding)) { - $ret .= '%25' . $part; - continue; - } - $int = hexdec($encoding); - if (isset($this->preserve[$int])) { - $ret .= chr($int) . $text; - continue; - } - $encoding = strtoupper($encoding); - $ret .= '%' . $encoding . $text; - } - return $ret; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Printer.php b/extlib/HTMLPurifier/HTMLPurifier/Printer.php deleted file mode 100644 index e7eb82e83..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Printer.php +++ /dev/null @@ -1,176 +0,0 @@ -getAll(); - $context = new HTMLPurifier_Context(); - $this->generator = new HTMLPurifier_Generator($config, $context); - } - - /** - * Main function that renders object or aspect of that object - * @note Parameters vary depending on printer - */ - // function render() {} - - /** - * Returns a start tag - * @param $tag Tag name - * @param $attr Attribute array - */ - protected function start($tag, $attr = array()) { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_Start($tag, $attr ? $attr : array()) - ); - } - - /** - * Returns an end teg - * @param $tag Tag name - */ - protected function end($tag) { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_End($tag) - ); - } - - /** - * Prints a complete element with content inside - * @param $tag Tag name - * @param $contents Element contents - * @param $attr Tag attributes - * @param $escape Bool whether or not to escape contents - */ - protected function element($tag, $contents, $attr = array(), $escape = true) { - return $this->start($tag, $attr) . - ($escape ? $this->escape($contents) : $contents) . - $this->end($tag); - } - - protected function elementEmpty($tag, $attr = array()) { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_Empty($tag, $attr) - ); - } - - protected function text($text) { - return $this->generator->generateFromToken( - new HTMLPurifier_Token_Text($text) - ); - } - - /** - * Prints a simple key/value row in a table. - * @param $name Key - * @param $value Value - */ - protected function row($name, $value) { - if (is_bool($value)) $value = $value ? 'On' : 'Off'; - return - $this->start('tr') . "\n" . - $this->element('th', $name) . "\n" . - $this->element('td', $value) . "\n" . - $this->end('tr') - ; - } - - /** - * Escapes a string for HTML output. - * @param $string String to escape - */ - protected function escape($string) { - $string = HTMLPurifier_Encoder::cleanUTF8($string); - $string = htmlspecialchars($string, ENT_COMPAT, 'UTF-8'); - return $string; - } - - /** - * Takes a list of strings and turns them into a single list - * @param $array List of strings - * @param $polite Bool whether or not to add an end before the last - */ - protected function listify($array, $polite = false) { - if (empty($array)) return 'None'; - $ret = ''; - $i = count($array); - foreach ($array as $value) { - $i--; - $ret .= $value; - if ($i > 0 && !($polite && $i == 1)) $ret .= ', '; - if ($polite && $i == 1) $ret .= 'and '; - } - return $ret; - } - - /** - * Retrieves the class of an object without prefixes, as well as metadata - * @param $obj Object to determine class of - * @param $prefix Further prefix to remove - */ - protected function getClass($obj, $sec_prefix = '') { - static $five = null; - if ($five === null) $five = version_compare(PHP_VERSION, '5', '>='); - $prefix = 'HTMLPurifier_' . $sec_prefix; - if (!$five) $prefix = strtolower($prefix); - $class = str_replace($prefix, '', get_class($obj)); - $lclass = strtolower($class); - $class .= '('; - switch ($lclass) { - case 'enum': - $values = array(); - foreach ($obj->valid_values as $value => $bool) { - $values[] = $value; - } - $class .= implode(', ', $values); - break; - case 'css_composite': - $values = array(); - foreach ($obj->defs as $def) { - $values[] = $this->getClass($def, $sec_prefix); - } - $class .= implode(', ', $values); - break; - case 'css_multiple': - $class .= $this->getClass($obj->single, $sec_prefix) . ', '; - $class .= $obj->max; - break; - case 'css_denyelementdecorator': - $class .= $this->getClass($obj->def, $sec_prefix) . ', '; - $class .= $obj->element; - break; - case 'css_importantdecorator': - $class .= $this->getClass($obj->def, $sec_prefix); - if ($obj->allow) $class .= ', !important'; - break; - } - $class .= ')'; - return $class; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php b/extlib/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php deleted file mode 100644 index 81f986590..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Printer/CSSDefinition.php +++ /dev/null @@ -1,38 +0,0 @@ -def = $config->getCSSDefinition(); - $ret = ''; - - $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); - $ret .= $this->start('table'); - - $ret .= $this->element('caption', 'Properties ($info)'); - - $ret .= $this->start('thead'); - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Property', array('class' => 'heavy')); - $ret .= $this->element('th', 'Definition', array('class' => 'heavy', 'style' => 'width:auto;')); - $ret .= $this->end('tr'); - $ret .= $this->end('thead'); - - ksort($this->def->info); - foreach ($this->def->info as $property => $obj) { - $name = $this->getClass($obj, 'AttrDef_'); - $ret .= $this->row($property, $name); - } - - $ret .= $this->end('table'); - $ret .= $this->end('div'); - - return $ret; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css b/extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css deleted file mode 100644 index 3ff1a88aa..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.css +++ /dev/null @@ -1,10 +0,0 @@ - -.hp-config {} - -.hp-config tbody th {text-align:right; padding-right:0.5em;} -.hp-config thead, .hp-config .namespace {background:#3C578C; color:#FFF;} -.hp-config .namespace th {text-align:center;} -.hp-config .verbose {display:none;} -.hp-config .controls {text-align:center;} - -/* vim: et sw=4 sts=4 */ diff --git a/extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js b/extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js deleted file mode 100644 index cba00c9b8..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.js +++ /dev/null @@ -1,5 +0,0 @@ -function toggleWriteability(id_of_patient, checked) { - document.getElementById(id_of_patient).disabled = checked; -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php b/extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php deleted file mode 100644 index 02aa65689..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Printer/ConfigForm.php +++ /dev/null @@ -1,368 +0,0 @@ -docURL = $doc_url; - $this->name = $name; - $this->compress = $compress; - // initialize sub-printers - $this->fields[0] = new HTMLPurifier_Printer_ConfigForm_default(); - $this->fields[HTMLPurifier_VarParser::BOOL] = new HTMLPurifier_Printer_ConfigForm_bool(); - } - - /** - * Sets default column and row size for textareas in sub-printers - * @param $cols Integer columns of textarea, null to use default - * @param $rows Integer rows of textarea, null to use default - */ - public function setTextareaDimensions($cols = null, $rows = null) { - if ($cols) $this->fields['default']->cols = $cols; - if ($rows) $this->fields['default']->rows = $rows; - } - - /** - * Retrieves styling, in case it is not accessible by webserver - */ - public static function getCSS() { - return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.css'); - } - - /** - * Retrieves JavaScript, in case it is not accessible by webserver - */ - public static function getJavaScript() { - return file_get_contents(HTMLPURIFIER_PREFIX . '/HTMLPurifier/Printer/ConfigForm.js'); - } - - /** - * Returns HTML output for a configuration form - * @param $config Configuration object of current form state, or an array - * where [0] has an HTML namespace and [1] is being rendered. - * @param $allowed Optional namespace(s) and directives to restrict form to. - */ - public function render($config, $allowed = true, $render_controls = true) { - if (is_array($config) && isset($config[0])) { - $gen_config = $config[0]; - $config = $config[1]; - } else { - $gen_config = $config; - } - - $this->config = $config; - $this->genConfig = $gen_config; - $this->prepareGenerator($gen_config); - - $allowed = HTMLPurifier_Config::getAllowedDirectivesForForm($allowed, $config->def); - $all = array(); - foreach ($allowed as $key) { - list($ns, $directive) = $key; - $all[$ns][$directive] = $config->get($ns .'.'. $directive); - } - - $ret = ''; - $ret .= $this->start('table', array('class' => 'hp-config')); - $ret .= $this->start('thead'); - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Directive', array('class' => 'hp-directive')); - $ret .= $this->element('th', 'Value', array('class' => 'hp-value')); - $ret .= $this->end('tr'); - $ret .= $this->end('thead'); - foreach ($all as $ns => $directives) { - $ret .= $this->renderNamespace($ns, $directives); - } - if ($render_controls) { - $ret .= $this->start('tbody'); - $ret .= $this->start('tr'); - $ret .= $this->start('td', array('colspan' => 2, 'class' => 'controls')); - $ret .= $this->elementEmpty('input', array('type' => 'submit', 'value' => 'Submit')); - $ret .= '[Reset]'; - $ret .= $this->end('td'); - $ret .= $this->end('tr'); - $ret .= $this->end('tbody'); - } - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders a single namespace - * @param $ns String namespace name - * @param $directive Associative array of directives to values - */ - protected function renderNamespace($ns, $directives) { - $ret = ''; - $ret .= $this->start('tbody', array('class' => 'namespace')); - $ret .= $this->start('tr'); - $ret .= $this->element('th', $ns, array('colspan' => 2)); - $ret .= $this->end('tr'); - $ret .= $this->end('tbody'); - $ret .= $this->start('tbody'); - foreach ($directives as $directive => $value) { - $ret .= $this->start('tr'); - $ret .= $this->start('th'); - if ($this->docURL) { - $url = str_replace('%s', urlencode("$ns.$directive"), $this->docURL); - $ret .= $this->start('a', array('href' => $url)); - } - $attr = array('for' => "{$this->name}:$ns.$directive"); - - // crop directive name if it's too long - if (!$this->compress || (strlen($directive) < $this->compress)) { - $directive_disp = $directive; - } else { - $directive_disp = substr($directive, 0, $this->compress - 2) . '...'; - $attr['title'] = $directive; - } - - $ret .= $this->element( - 'label', - $directive_disp, - // component printers must create an element with this id - $attr - ); - if ($this->docURL) $ret .= $this->end('a'); - $ret .= $this->end('th'); - - $ret .= $this->start('td'); - $def = $this->config->def->info["$ns.$directive"]; - if (is_int($def)) { - $allow_null = $def < 0; - $type = abs($def); - } else { - $type = $def->type; - $allow_null = isset($def->allow_null); - } - if (!isset($this->fields[$type])) $type = 0; // default - $type_obj = $this->fields[$type]; - if ($allow_null) { - $type_obj = new HTMLPurifier_Printer_ConfigForm_NullDecorator($type_obj); - } - $ret .= $type_obj->render($ns, $directive, $value, $this->name, array($this->genConfig, $this->config)); - $ret .= $this->end('td'); - $ret .= $this->end('tr'); - } - $ret .= $this->end('tbody'); - return $ret; - } - -} - -/** - * Printer decorator for directives that accept null - */ -class HTMLPurifier_Printer_ConfigForm_NullDecorator extends HTMLPurifier_Printer { - /** - * Printer being decorated - */ - protected $obj; - /** - * @param $obj Printer to decorate - */ - public function __construct($obj) { - parent::__construct(); - $this->obj = $obj; - } - public function render($ns, $directive, $value, $name, $config) { - if (is_array($config) && isset($config[0])) { - $gen_config = $config[0]; - $config = $config[1]; - } else { - $gen_config = $config; - } - $this->prepareGenerator($gen_config); - - $ret = ''; - $ret .= $this->start('label', array('for' => "$name:Null_$ns.$directive")); - $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); - $ret .= $this->text(' Null/Disabled'); - $ret .= $this->end('label'); - $attr = array( - 'type' => 'checkbox', - 'value' => '1', - 'class' => 'null-toggle', - 'name' => "$name"."[Null_$ns.$directive]", - 'id' => "$name:Null_$ns.$directive", - 'onclick' => "toggleWriteability('$name:$ns.$directive',checked)" // INLINE JAVASCRIPT!!!! - ); - if ($this->obj instanceof HTMLPurifier_Printer_ConfigForm_bool) { - // modify inline javascript slightly - $attr['onclick'] = "toggleWriteability('$name:Yes_$ns.$directive',checked);toggleWriteability('$name:No_$ns.$directive',checked)"; - } - if ($value === null) $attr['checked'] = 'checked'; - $ret .= $this->elementEmpty('input', $attr); - $ret .= $this->text(' or '); - $ret .= $this->elementEmpty('br'); - $ret .= $this->obj->render($ns, $directive, $value, $name, array($gen_config, $config)); - return $ret; - } -} - -/** - * Swiss-army knife configuration form field printer - */ -class HTMLPurifier_Printer_ConfigForm_default extends HTMLPurifier_Printer { - public $cols = 18; - public $rows = 5; - public function render($ns, $directive, $value, $name, $config) { - if (is_array($config) && isset($config[0])) { - $gen_config = $config[0]; - $config = $config[1]; - } else { - $gen_config = $config; - } - $this->prepareGenerator($gen_config); - // this should probably be split up a little - $ret = ''; - $def = $config->def->info["$ns.$directive"]; - if (is_int($def)) { - $type = abs($def); - } else { - $type = $def->type; - } - if (is_array($value)) { - switch ($type) { - case HTMLPurifier_VarParser::LOOKUP: - $array = $value; - $value = array(); - foreach ($array as $val => $b) { - $value[] = $val; - } - case HTMLPurifier_VarParser::ALIST: - $value = implode(PHP_EOL, $value); - break; - case HTMLPurifier_VarParser::HASH: - $nvalue = ''; - foreach ($value as $i => $v) { - $nvalue .= "$i:$v" . PHP_EOL; - } - $value = $nvalue; - break; - default: - $value = ''; - } - } - if ($type === HTMLPurifier_VarParser::MIXED) { - return 'Not supported'; - $value = serialize($value); - } - $attr = array( - 'name' => "$name"."[$ns.$directive]", - 'id' => "$name:$ns.$directive" - ); - if ($value === null) $attr['disabled'] = 'disabled'; - if (isset($def->allowed)) { - $ret .= $this->start('select', $attr); - foreach ($def->allowed as $val => $b) { - $attr = array(); - if ($value == $val) $attr['selected'] = 'selected'; - $ret .= $this->element('option', $val, $attr); - } - $ret .= $this->end('select'); - } elseif ( - $type === HTMLPurifier_VarParser::TEXT || - $type === HTMLPurifier_VarParser::ITEXT || - $type === HTMLPurifier_VarParser::ALIST || - $type === HTMLPurifier_VarParser::HASH || - $type === HTMLPurifier_VarParser::LOOKUP - ) { - $attr['cols'] = $this->cols; - $attr['rows'] = $this->rows; - $ret .= $this->start('textarea', $attr); - $ret .= $this->text($value); - $ret .= $this->end('textarea'); - } else { - $attr['value'] = $value; - $attr['type'] = 'text'; - $ret .= $this->elementEmpty('input', $attr); - } - return $ret; - } -} - -/** - * Bool form field printer - */ -class HTMLPurifier_Printer_ConfigForm_bool extends HTMLPurifier_Printer { - public function render($ns, $directive, $value, $name, $config) { - if (is_array($config) && isset($config[0])) { - $gen_config = $config[0]; - $config = $config[1]; - } else { - $gen_config = $config; - } - $this->prepareGenerator($gen_config); - $ret = ''; - $ret .= $this->start('div', array('id' => "$name:$ns.$directive")); - - $ret .= $this->start('label', array('for' => "$name:Yes_$ns.$directive")); - $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); - $ret .= $this->text(' Yes'); - $ret .= $this->end('label'); - - $attr = array( - 'type' => 'radio', - 'name' => "$name"."[$ns.$directive]", - 'id' => "$name:Yes_$ns.$directive", - 'value' => '1' - ); - if ($value === true) $attr['checked'] = 'checked'; - if ($value === null) $attr['disabled'] = 'disabled'; - $ret .= $this->elementEmpty('input', $attr); - - $ret .= $this->start('label', array('for' => "$name:No_$ns.$directive")); - $ret .= $this->element('span', "$ns.$directive:", array('class' => 'verbose')); - $ret .= $this->text(' No'); - $ret .= $this->end('label'); - - $attr = array( - 'type' => 'radio', - 'name' => "$name"."[$ns.$directive]", - 'id' => "$name:No_$ns.$directive", - 'value' => '0' - ); - if ($value === false) $attr['checked'] = 'checked'; - if ($value === null) $attr['disabled'] = 'disabled'; - $ret .= $this->elementEmpty('input', $attr); - - $ret .= $this->end('div'); - - return $ret; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php b/extlib/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php deleted file mode 100644 index 8a8f126b8..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Printer/HTMLDefinition.php +++ /dev/null @@ -1,272 +0,0 @@ -config =& $config; - - $this->def = $config->getHTMLDefinition(); - - $ret .= $this->start('div', array('class' => 'HTMLPurifier_Printer')); - - $ret .= $this->renderDoctype(); - $ret .= $this->renderEnvironment(); - $ret .= $this->renderContentSets(); - $ret .= $this->renderInfo(); - - $ret .= $this->end('div'); - - return $ret; - } - - /** - * Renders the Doctype table - */ - protected function renderDoctype() { - $doctype = $this->def->doctype; - $ret = ''; - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Doctype'); - $ret .= $this->row('Name', $doctype->name); - $ret .= $this->row('XML', $doctype->xml ? 'Yes' : 'No'); - $ret .= $this->row('Default Modules', implode($doctype->modules, ', ')); - $ret .= $this->row('Default Tidy Modules', implode($doctype->tidyModules, ', ')); - $ret .= $this->end('table'); - return $ret; - } - - - /** - * Renders environment table, which is miscellaneous info - */ - protected function renderEnvironment() { - $def = $this->def; - - $ret = ''; - - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Environment'); - - $ret .= $this->row('Parent of fragment', $def->info_parent); - $ret .= $this->renderChildren($def->info_parent_def->child); - $ret .= $this->row('Block wrap name', $def->info_block_wrapper); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Global attributes'); - $ret .= $this->element('td', $this->listifyAttr($def->info_global_attr),0,0); - $ret .= $this->end('tr'); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Tag transforms'); - $list = array(); - foreach ($def->info_tag_transform as $old => $new) { - $new = $this->getClass($new, 'TagTransform_'); - $list[] = "<$old> with $new"; - } - $ret .= $this->element('td', $this->listify($list)); - $ret .= $this->end('tr'); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Pre-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_pre)); - $ret .= $this->end('tr'); - - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Post-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->info_attr_transform_post)); - $ret .= $this->end('tr'); - - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders the Content Sets table - */ - protected function renderContentSets() { - $ret = ''; - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Content Sets'); - foreach ($this->def->info_content_sets as $name => $lookup) { - $ret .= $this->heavyHeader($name); - $ret .= $this->start('tr'); - $ret .= $this->element('td', $this->listifyTagLookup($lookup)); - $ret .= $this->end('tr'); - } - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders the Elements ($info) table - */ - protected function renderInfo() { - $ret = ''; - $ret .= $this->start('table'); - $ret .= $this->element('caption', 'Elements ($info)'); - ksort($this->def->info); - $ret .= $this->heavyHeader('Allowed tags', 2); - $ret .= $this->start('tr'); - $ret .= $this->element('td', $this->listifyTagLookup($this->def->info), array('colspan' => 2)); - $ret .= $this->end('tr'); - foreach ($this->def->info as $name => $def) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', "<$name>", array('class'=>'heavy', 'colspan' => 2)); - $ret .= $this->end('tr'); - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Inline content'); - $ret .= $this->element('td', $def->descendants_are_inline ? 'Yes' : 'No'); - $ret .= $this->end('tr'); - if (!empty($def->excludes)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Excludes'); - $ret .= $this->element('td', $this->listifyTagLookup($def->excludes)); - $ret .= $this->end('tr'); - } - if (!empty($def->attr_transform_pre)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Pre-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_pre)); - $ret .= $this->end('tr'); - } - if (!empty($def->attr_transform_post)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Post-AttrTransform'); - $ret .= $this->element('td', $this->listifyObjectList($def->attr_transform_post)); - $ret .= $this->end('tr'); - } - if (!empty($def->auto_close)) { - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Auto closed by'); - $ret .= $this->element('td', $this->listifyTagLookup($def->auto_close)); - $ret .= $this->end('tr'); - } - $ret .= $this->start('tr'); - $ret .= $this->element('th', 'Allowed attributes'); - $ret .= $this->element('td',$this->listifyAttr($def->attr), array(), 0); - $ret .= $this->end('tr'); - - if (!empty($def->required_attr)) { - $ret .= $this->row('Required attributes', $this->listify($def->required_attr)); - } - - $ret .= $this->renderChildren($def->child); - } - $ret .= $this->end('table'); - return $ret; - } - - /** - * Renders a row describing the allowed children of an element - * @param $def HTMLPurifier_ChildDef of pertinent element - */ - protected function renderChildren($def) { - $context = new HTMLPurifier_Context(); - $ret = ''; - $ret .= $this->start('tr'); - $elements = array(); - $attr = array(); - if (isset($def->elements)) { - if ($def->type == 'strictblockquote') { - $def->validateChildren(array(), $this->config, $context); - } - $elements = $def->elements; - } - if ($def->type == 'chameleon') { - $attr['rowspan'] = 2; - } elseif ($def->type == 'empty') { - $elements = array(); - } elseif ($def->type == 'table') { - $elements = array_flip(array('col', 'caption', 'colgroup', 'thead', - 'tfoot', 'tbody', 'tr')); - } - $ret .= $this->element('th', 'Allowed children', $attr); - - if ($def->type == 'chameleon') { - - $ret .= $this->element('td', - 'Block: ' . - $this->escape($this->listifyTagLookup($def->block->elements)),0,0); - $ret .= $this->end('tr'); - $ret .= $this->start('tr'); - $ret .= $this->element('td', - 'Inline: ' . - $this->escape($this->listifyTagLookup($def->inline->elements)),0,0); - - } elseif ($def->type == 'custom') { - - $ret .= $this->element('td', ''.ucfirst($def->type).': ' . - $def->dtd_regex); - - } else { - $ret .= $this->element('td', - ''.ucfirst($def->type).': ' . - $this->escape($this->listifyTagLookup($elements)),0,0); - } - $ret .= $this->end('tr'); - return $ret; - } - - /** - * Listifies a tag lookup table. - * @param $array Tag lookup array in form of array('tagname' => true) - */ - protected function listifyTagLookup($array) { - ksort($array); - $list = array(); - foreach ($array as $name => $discard) { - if ($name !== '#PCDATA' && !isset($this->def->info[$name])) continue; - $list[] = $name; - } - return $this->listify($list); - } - - /** - * Listifies a list of objects by retrieving class names and internal state - * @param $array List of objects - * @todo Also add information about internal state - */ - protected function listifyObjectList($array) { - ksort($array); - $list = array(); - foreach ($array as $discard => $obj) { - $list[] = $this->getClass($obj, 'AttrTransform_'); - } - return $this->listify($list); - } - - /** - * Listifies a hash of attributes to AttrDef classes - * @param $array Array hash in form of array('attrname' => HTMLPurifier_AttrDef) - */ - protected function listifyAttr($array) { - ksort($array); - $list = array(); - foreach ($array as $name => $obj) { - if ($obj === false) continue; - $list[] = "$name = " . $this->getClass($obj, 'AttrDef_') . ''; - } - return $this->listify($list); - } - - /** - * Creates a heavy header row - */ - protected function heavyHeader($text, $num = 1) { - $ret = ''; - $ret .= $this->start('tr'); - $ret .= $this->element('th', $text, array('colspan' => $num, 'class' => 'heavy')); - $ret .= $this->end('tr'); - return $ret; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/PropertyList.php b/extlib/HTMLPurifier/HTMLPurifier/PropertyList.php deleted file mode 100644 index 2b99fb7bc..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/PropertyList.php +++ /dev/null @@ -1,86 +0,0 @@ -parent = $parent; - } - - /** - * Recursively retrieves the value for a key - */ - public function get($name) { - if ($this->has($name)) return $this->data[$name]; - // possible performance bottleneck, convert to iterative if necessary - if ($this->parent) return $this->parent->get($name); - throw new HTMLPurifier_Exception("Key '$name' not found"); - } - - /** - * Sets the value of a key, for this plist - */ - public function set($name, $value) { - $this->data[$name] = $value; - } - - /** - * Returns true if a given key exists - */ - public function has($name) { - return array_key_exists($name, $this->data); - } - - /** - * Resets a value to the value of it's parent, usually the default. If - * no value is specified, the entire plist is reset. - */ - public function reset($name = null) { - if ($name == null) $this->data = array(); - else unset($this->data[$name]); - } - - /** - * Squashes this property list and all of its property lists into a single - * array, and returns the array. This value is cached by default. - * @param $force If true, ignores the cache and regenerates the array. - */ - public function squash($force = false) { - if ($this->cache !== null && !$force) return $this->cache; - if ($this->parent) { - return $this->cache = array_merge($this->parent->squash($force), $this->data); - } else { - return $this->cache = $this->data; - } - } - - /** - * Returns the parent plist. - */ - public function getParent() { - return $this->parent; - } - - /** - * Sets the parent plist. - */ - public function setParent($plist) { - $this->parent = $plist; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/PropertyListIterator.php b/extlib/HTMLPurifier/HTMLPurifier/PropertyListIterator.php deleted file mode 100644 index 8f250443e..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/PropertyListIterator.php +++ /dev/null @@ -1,32 +0,0 @@ -l = strlen($filter); - $this->filter = $filter; - } - - public function accept() { - $key = $this->getInnerIterator()->key(); - if( strncmp($key, $this->filter, $this->l) !== 0 ) { - return false; - } - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Strategy.php b/extlib/HTMLPurifier/HTMLPurifier/Strategy.php deleted file mode 100644 index 246286521..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Strategy.php +++ /dev/null @@ -1,26 +0,0 @@ -strategies as $strategy) { - $tokens = $strategy->execute($tokens, $config, $context); - } - return $tokens; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Strategy/Core.php b/extlib/HTMLPurifier/HTMLPurifier/Strategy/Core.php deleted file mode 100644 index d90e15860..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Strategy/Core.php +++ /dev/null @@ -1,18 +0,0 @@ -strategies[] = new HTMLPurifier_Strategy_RemoveForeignElements(); - $this->strategies[] = new HTMLPurifier_Strategy_MakeWellFormed(); - $this->strategies[] = new HTMLPurifier_Strategy_FixNesting(); - $this->strategies[] = new HTMLPurifier_Strategy_ValidateAttributes(); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php b/extlib/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php deleted file mode 100644 index f81802391..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Strategy/FixNesting.php +++ /dev/null @@ -1,328 +0,0 @@ -getHTMLDefinition(); - - // insert implicit "parent" node, will be removed at end. - // DEFINITION CALL - $parent_name = $definition->info_parent; - array_unshift($tokens, new HTMLPurifier_Token_Start($parent_name)); - $tokens[] = new HTMLPurifier_Token_End($parent_name); - - // setup the context variable 'IsInline', for chameleon processing - // is 'false' when we are not inline, 'true' when it must always - // be inline, and an integer when it is inline for a certain - // branch of the document tree - $is_inline = $definition->info_parent_def->descendants_are_inline; - $context->register('IsInline', $is_inline); - - // setup error collector - $e =& $context->get('ErrorCollector', true); - - //####################################################################// - // Loop initialization - - // stack that contains the indexes of all parents, - // $stack[count($stack)-1] being the current parent - $stack = array(); - - // stack that contains all elements that are excluded - // it is organized by parent elements, similar to $stack, - // but it is only populated when an element with exclusions is - // processed, i.e. there won't be empty exclusions. - $exclude_stack = array(); - - // variable that contains the start token while we are processing - // nodes. This enables error reporting to do its job - $start_token = false; - $context->register('CurrentToken', $start_token); - - //####################################################################// - // Loop - - // iterate through all start nodes. Determining the start node - // is complicated so it has been omitted from the loop construct - for ($i = 0, $size = count($tokens) ; $i < $size; ) { - - //################################################################// - // Gather information on children - - // child token accumulator - $child_tokens = array(); - - // scroll to the end of this node, report number, and collect - // all children - for ($j = $i, $depth = 0; ; $j++) { - if ($tokens[$j] instanceof HTMLPurifier_Token_Start) { - $depth++; - // skip token assignment on first iteration, this is the - // token we currently are on - if ($depth == 1) continue; - } elseif ($tokens[$j] instanceof HTMLPurifier_Token_End) { - $depth--; - // skip token assignment on last iteration, this is the - // end token of the token we're currently on - if ($depth == 0) break; - } - $child_tokens[] = $tokens[$j]; - } - - // $i is index of start token - // $j is index of end token - - $start_token = $tokens[$i]; // to make token available via CurrentToken - - //################################################################// - // Gather information on parent - - // calculate parent information - if ($count = count($stack)) { - $parent_index = $stack[$count-1]; - $parent_name = $tokens[$parent_index]->name; - if ($parent_index == 0) { - $parent_def = $definition->info_parent_def; - } else { - $parent_def = $definition->info[$parent_name]; - } - } else { - // processing as if the parent were the "root" node - // unknown info, it won't be used anyway, in the future, - // we may want to enforce one element only (this is - // necessary for HTML Purifier to clean entire documents - $parent_index = $parent_name = $parent_def = null; - } - - // calculate context - if ($is_inline === false) { - // check if conditions make it inline - if (!empty($parent_def) && $parent_def->descendants_are_inline) { - $is_inline = $count - 1; - } - } else { - // check if we're out of inline - if ($count === $is_inline) { - $is_inline = false; - } - } - - //################################################################// - // Determine whether element is explicitly excluded SGML-style - - // determine whether or not element is excluded by checking all - // parent exclusions. The array should not be very large, two - // elements at most. - $excluded = false; - if (!empty($exclude_stack)) { - foreach ($exclude_stack as $lookup) { - if (isset($lookup[$tokens[$i]->name])) { - $excluded = true; - // no need to continue processing - break; - } - } - } - - //################################################################// - // Perform child validation - - if ($excluded) { - // there is an exclusion, remove the entire node - $result = false; - $excludes = array(); // not used, but good to initialize anyway - } else { - // DEFINITION CALL - if ($i === 0) { - // special processing for the first node - $def = $definition->info_parent_def; - } else { - $def = $definition->info[$tokens[$i]->name]; - - } - - if (!empty($def->child)) { - // have DTD child def validate children - $result = $def->child->validateChildren( - $child_tokens, $config, $context); - } else { - // weird, no child definition, get rid of everything - $result = false; - } - - // determine whether or not this element has any exclusions - $excludes = $def->excludes; - } - - // $result is now a bool or array - - //################################################################// - // Process result by interpreting $result - - if ($result === true || $child_tokens === $result) { - // leave the node as is - - // register start token as a parental node start - $stack[] = $i; - - // register exclusions if there are any - if (!empty($excludes)) $exclude_stack[] = $excludes; - - // move cursor to next possible start node - $i++; - - } elseif($result === false) { - // remove entire node - - if ($e) { - if ($excluded) { - $e->send(E_ERROR, 'Strategy_FixNesting: Node excluded'); - } else { - $e->send(E_ERROR, 'Strategy_FixNesting: Node removed'); - } - } - - // calculate length of inner tokens and current tokens - $length = $j - $i + 1; - - // perform removal - array_splice($tokens, $i, $length); - - // update size - $size -= $length; - - // there is no start token to register, - // current node is now the next possible start node - // unless it turns out that we need to do a double-check - - // this is a rought heuristic that covers 100% of HTML's - // cases and 99% of all other cases. A child definition - // that would be tricked by this would be something like: - // ( | a b c) where it's all or nothing. Fortunately, - // our current implementation claims that that case would - // not allow empty, even if it did - if (!$parent_def->child->allow_empty) { - // we need to do a double-check - $i = $parent_index; - array_pop($stack); - } - - // PROJECTED OPTIMIZATION: Process all children elements before - // reprocessing parent node. - - } else { - // replace node with $result - - // calculate length of inner tokens - $length = $j - $i - 1; - - if ($e) { - if (empty($result) && $length) { - $e->send(E_ERROR, 'Strategy_FixNesting: Node contents removed'); - } else { - $e->send(E_WARNING, 'Strategy_FixNesting: Node reorganized'); - } - } - - // perform replacement - array_splice($tokens, $i + 1, $length, $result); - - // update size - $size -= $length; - $size += count($result); - - // register start token as a parental node start - $stack[] = $i; - - // register exclusions if there are any - if (!empty($excludes)) $exclude_stack[] = $excludes; - - // move cursor to next possible start node - $i++; - - } - - //################################################################// - // Scroll to next start node - - // We assume, at this point, that $i is the index of the token - // that is the first possible new start point for a node. - - // Test if the token indeed is a start tag, if not, move forward - // and test again. - $size = count($tokens); - while ($i < $size and !$tokens[$i] instanceof HTMLPurifier_Token_Start) { - if ($tokens[$i] instanceof HTMLPurifier_Token_End) { - // pop a token index off the stack if we ended a node - array_pop($stack); - // pop an exclusion lookup off exclusion stack if - // we ended node and that node had exclusions - if ($i == 0 || $i == $size - 1) { - // use specialized var if it's the super-parent - $s_excludes = $definition->info_parent_def->excludes; - } else { - $s_excludes = $definition->info[$tokens[$i]->name]->excludes; - } - if ($s_excludes) { - array_pop($exclude_stack); - } - } - $i++; - } - - } - - //####################################################################// - // Post-processing - - // remove implicit parent tokens at the beginning and end - array_shift($tokens); - array_pop($tokens); - - // remove context variables - $context->destroy('IsInline'); - $context->destroy('CurrentToken'); - - //####################################################################// - // Return - - return $tokens; - - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php b/extlib/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php deleted file mode 100644 index feb0c32b4..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Strategy/MakeWellFormed.php +++ /dev/null @@ -1,457 +0,0 @@ -getHTMLDefinition(); - - // local variables - $generator = new HTMLPurifier_Generator($config, $context); - $escape_invalid_tags = $config->get('Core.EscapeInvalidTags'); - $e = $context->get('ErrorCollector', true); - $t = false; // token index - $i = false; // injector index - $token = false; // the current token - $reprocess = false; // whether or not to reprocess the same token - $stack = array(); - - // member variables - $this->stack =& $stack; - $this->t =& $t; - $this->tokens =& $tokens; - $this->config = $config; - $this->context = $context; - - // context variables - $context->register('CurrentNesting', $stack); - $context->register('InputIndex', $t); - $context->register('InputTokens', $tokens); - $context->register('CurrentToken', $token); - - // -- begin INJECTOR -- - - $this->injectors = array(); - - $injectors = $config->getBatch('AutoFormat'); - $def_injectors = $definition->info_injector; - $custom_injectors = $injectors['Custom']; - unset($injectors['Custom']); // special case - foreach ($injectors as $injector => $b) { - // XXX: Fix with a legitimate lookup table of enabled filters - if (strpos($injector, '.') !== false) continue; - $injector = "HTMLPurifier_Injector_$injector"; - if (!$b) continue; - $this->injectors[] = new $injector; - } - foreach ($def_injectors as $injector) { - // assumed to be objects - $this->injectors[] = $injector; - } - foreach ($custom_injectors as $injector) { - if (is_string($injector)) { - $injector = "HTMLPurifier_Injector_$injector"; - $injector = new $injector; - } - $this->injectors[] = $injector; - } - - // give the injectors references to the definition and context - // variables for performance reasons - foreach ($this->injectors as $ix => $injector) { - $error = $injector->prepare($config, $context); - if (!$error) continue; - array_splice($this->injectors, $ix, 1); // rm the injector - trigger_error("Cannot enable {$injector->name} injector because $error is not allowed", E_USER_WARNING); - } - - // -- end INJECTOR -- - - // a note on punting: - // In order to reduce code duplication, whenever some code needs - // to make HTML changes in order to make things "correct", the - // new HTML gets sent through the purifier, regardless of its - // status. This means that if we add a start token, because it - // was totally necessary, we don't have to update nesting; we just - // punt ($reprocess = true; continue;) and it does that for us. - - // isset is in loop because $tokens size changes during loop exec - for ( - $t = 0; - $t == 0 || isset($tokens[$t - 1]); - // only increment if we don't need to reprocess - $reprocess ? $reprocess = false : $t++ - ) { - - // check for a rewind - if (is_int($i) && $i >= 0) { - // possibility: disable rewinding if the current token has a - // rewind set on it already. This would offer protection from - // infinite loop, but might hinder some advanced rewinding. - $rewind_to = $this->injectors[$i]->getRewind(); - if (is_int($rewind_to) && $rewind_to < $t) { - if ($rewind_to < 0) $rewind_to = 0; - while ($t > $rewind_to) { - $t--; - $prev = $tokens[$t]; - // indicate that other injectors should not process this token, - // but we need to reprocess it - unset($prev->skip[$i]); - $prev->rewind = $i; - if ($prev instanceof HTMLPurifier_Token_Start) array_pop($this->stack); - elseif ($prev instanceof HTMLPurifier_Token_End) $this->stack[] = $prev->start; - } - } - $i = false; - } - - // handle case of document end - if (!isset($tokens[$t])) { - // kill processing if stack is empty - if (empty($this->stack)) break; - - // peek - $top_nesting = array_pop($this->stack); - $this->stack[] = $top_nesting; - - // send error - if ($e && !isset($top_nesting->armor['MakeWellFormed_TagClosedError'])) { - $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by document end', $top_nesting); - } - - // append, don't splice, since this is the end - $tokens[] = new HTMLPurifier_Token_End($top_nesting->name); - - // punt! - $reprocess = true; - continue; - } - - $token = $tokens[$t]; - - //echo '
    '; printTokens($tokens, $t); printTokens($this->stack); - - // quick-check: if it's not a tag, no need to process - if (empty($token->is_tag)) { - if ($token instanceof HTMLPurifier_Token_Text) { - foreach ($this->injectors as $i => $injector) { - if (isset($token->skip[$i])) continue; - if ($token->rewind !== null && $token->rewind !== $i) continue; - $injector->handleText($token); - $this->processToken($token, $i); - $reprocess = true; - break; - } - } - // another possibility is a comment - continue; - } - - if (isset($definition->info[$token->name])) { - $type = $definition->info[$token->name]->child->type; - } else { - $type = false; // Type is unknown, treat accordingly - } - - // quick tag checks: anything that's *not* an end tag - $ok = false; - if ($type === 'empty' && $token instanceof HTMLPurifier_Token_Start) { - // claims to be a start tag but is empty - $token = new HTMLPurifier_Token_Empty($token->name, $token->attr); - $ok = true; - } elseif ($type && $type !== 'empty' && $token instanceof HTMLPurifier_Token_Empty) { - // claims to be empty but really is a start tag - $this->swap(new HTMLPurifier_Token_End($token->name)); - $this->insertBefore(new HTMLPurifier_Token_Start($token->name, $token->attr)); - // punt (since we had to modify the input stream in a non-trivial way) - $reprocess = true; - continue; - } elseif ($token instanceof HTMLPurifier_Token_Empty) { - // real empty token - $ok = true; - } elseif ($token instanceof HTMLPurifier_Token_Start) { - // start tag - - // ...unless they also have to close their parent - if (!empty($this->stack)) { - - $parent = array_pop($this->stack); - $this->stack[] = $parent; - - if (isset($definition->info[$parent->name])) { - $elements = $definition->info[$parent->name]->child->getAllowedElements($config); - $autoclose = !isset($elements[$token->name]); - } else { - $autoclose = false; - } - - $carryover = false; - if ($autoclose && $definition->info[$parent->name]->formatting) { - $carryover = true; - } - - if ($autoclose) { - // errors need to be updated - $new_token = new HTMLPurifier_Token_End($parent->name); - $new_token->start = $parent; - if ($carryover) { - $element = clone $parent; - $element->armor['MakeWellFormed_TagClosedError'] = true; - $element->carryover = true; - $this->processToken(array($new_token, $token, $element)); - } else { - $this->insertBefore($new_token); - } - if ($e && !isset($parent->armor['MakeWellFormed_TagClosedError'])) { - if (!$carryover) { - $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag auto closed', $parent); - } else { - $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag carryover', $parent); - } - } - $reprocess = true; - continue; - } - - } - $ok = true; - } - - if ($ok) { - foreach ($this->injectors as $i => $injector) { - if (isset($token->skip[$i])) continue; - if ($token->rewind !== null && $token->rewind !== $i) continue; - $injector->handleElement($token); - $this->processToken($token, $i); - $reprocess = true; - break; - } - if (!$reprocess) { - // ah, nothing interesting happened; do normal processing - $this->swap($token); - if ($token instanceof HTMLPurifier_Token_Start) { - $this->stack[] = $token; - } elseif ($token instanceof HTMLPurifier_Token_End) { - throw new HTMLPurifier_Exception('Improper handling of end tag in start code; possible error in MakeWellFormed'); - } - } - continue; - } - - // sanity check: we should be dealing with a closing tag - if (!$token instanceof HTMLPurifier_Token_End) { - throw new HTMLPurifier_Exception('Unaccounted for tag token in input stream, bug in HTML Purifier'); - } - - // make sure that we have something open - if (empty($this->stack)) { - if ($escape_invalid_tags) { - if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag to text'); - $this->swap(new HTMLPurifier_Token_Text( - $generator->generateFromToken($token) - )); - } else { - $this->remove(); - if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Unnecessary end tag removed'); - } - $reprocess = true; - continue; - } - - // first, check for the simplest case: everything closes neatly. - // Eventually, everything passes through here; if there are problems - // we modify the input stream accordingly and then punt, so that - // the tokens get processed again. - $current_parent = array_pop($this->stack); - if ($current_parent->name == $token->name) { - $token->start = $current_parent; - foreach ($this->injectors as $i => $injector) { - if (isset($token->skip[$i])) continue; - if ($token->rewind !== null && $token->rewind !== $i) continue; - $injector->handleEnd($token); - $this->processToken($token, $i); - $this->stack[] = $current_parent; - $reprocess = true; - break; - } - continue; - } - - // okay, so we're trying to close the wrong tag - - // undo the pop previous pop - $this->stack[] = $current_parent; - - // scroll back the entire nest, trying to find our tag. - // (feature could be to specify how far you'd like to go) - $size = count($this->stack); - // -2 because -1 is the last element, but we already checked that - $skipped_tags = false; - for ($j = $size - 2; $j >= 0; $j--) { - if ($this->stack[$j]->name == $token->name) { - $skipped_tags = array_slice($this->stack, $j); - break; - } - } - - // we didn't find the tag, so remove - if ($skipped_tags === false) { - if ($escape_invalid_tags) { - $this->swap(new HTMLPurifier_Token_Text( - $generator->generateFromToken($token) - )); - if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag to text'); - } else { - $this->remove(); - if ($e) $e->send(E_WARNING, 'Strategy_MakeWellFormed: Stray end tag removed'); - } - $reprocess = true; - continue; - } - - // do errors, in REVERSE $j order: a,b,c with
    - $c = count($skipped_tags); - if ($e) { - for ($j = $c - 1; $j > 0; $j--) { - // notice we exclude $j == 0, i.e. the current ending tag, from - // the errors... - if (!isset($skipped_tags[$j]->armor['MakeWellFormed_TagClosedError'])) { - $e->send(E_NOTICE, 'Strategy_MakeWellFormed: Tag closed by element end', $skipped_tags[$j]); - } - } - } - - // insert tags, in FORWARD $j order: c,b,a with
    - $replace = array($token); - for ($j = 1; $j < $c; $j++) { - // ...as well as from the insertions - $new_token = new HTMLPurifier_Token_End($skipped_tags[$j]->name); - $new_token->start = $skipped_tags[$j]; - array_unshift($replace, $new_token); - if (isset($definition->info[$new_token->name]) && $definition->info[$new_token->name]->formatting) { - $element = clone $skipped_tags[$j]; - $element->carryover = true; - $element->armor['MakeWellFormed_TagClosedError'] = true; - $replace[] = $element; - } - } - $this->processToken($replace); - $reprocess = true; - continue; - } - - $context->destroy('CurrentNesting'); - $context->destroy('InputTokens'); - $context->destroy('InputIndex'); - $context->destroy('CurrentToken'); - - unset($this->injectors, $this->stack, $this->tokens, $this->t); - return $tokens; - } - - /** - * Processes arbitrary token values for complicated substitution patterns. - * In general: - * - * If $token is an array, it is a list of tokens to substitute for the - * current token. These tokens then get individually processed. If there - * is a leading integer in the list, that integer determines how many - * tokens from the stream should be removed. - * - * If $token is a regular token, it is swapped with the current token. - * - * If $token is false, the current token is deleted. - * - * If $token is an integer, that number of tokens (with the first token - * being the current one) will be deleted. - * - * @param $token Token substitution value - * @param $injector Injector that performed the substitution; default is if - * this is not an injector related operation. - */ - protected function processToken($token, $injector = -1) { - - // normalize forms of token - if (is_object($token)) $token = array(1, $token); - if (is_int($token)) $token = array($token); - if ($token === false) $token = array(1); - if (!is_array($token)) throw new HTMLPurifier_Exception('Invalid token type from injector'); - if (!is_int($token[0])) array_unshift($token, 1); - if ($token[0] === 0) throw new HTMLPurifier_Exception('Deleting zero tokens is not valid'); - - // $token is now an array with the following form: - // array(number nodes to delete, new node 1, new node 2, ...) - - $delete = array_shift($token); - $old = array_splice($this->tokens, $this->t, $delete, $token); - - if ($injector > -1) { - // determine appropriate skips - $oldskip = isset($old[0]) ? $old[0]->skip : array(); - foreach ($token as $object) { - $object->skip = $oldskip; - $object->skip[$injector] = true; - } - } - - } - - /** - * Inserts a token before the current token. Cursor now points to this token - */ - private function insertBefore($token) { - array_splice($this->tokens, $this->t, 0, array($token)); - } - - /** - * Removes current token. Cursor now points to new token occupying previously - * occupied space. - */ - private function remove() { - array_splice($this->tokens, $this->t, 1); - } - - /** - * Swap current token with new token. Cursor points to new token (no change). - */ - private function swap($token) { - $this->tokens[$this->t] = $token; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php b/extlib/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php deleted file mode 100644 index cf3a33e40..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Strategy/RemoveForeignElements.php +++ /dev/null @@ -1,171 +0,0 @@ -getHTMLDefinition(); - $generator = new HTMLPurifier_Generator($config, $context); - $result = array(); - - $escape_invalid_tags = $config->get('Core.EscapeInvalidTags'); - $remove_invalid_img = $config->get('Core.RemoveInvalidImg'); - - // currently only used to determine if comments should be kept - $trusted = $config->get('HTML.Trusted'); - - $remove_script_contents = $config->get('Core.RemoveScriptContents'); - $hidden_elements = $config->get('Core.HiddenElements'); - - // remove script contents compatibility - if ($remove_script_contents === true) { - $hidden_elements['script'] = true; - } elseif ($remove_script_contents === false && isset($hidden_elements['script'])) { - unset($hidden_elements['script']); - } - - $attr_validator = new HTMLPurifier_AttrValidator(); - - // removes tokens until it reaches a closing tag with its value - $remove_until = false; - - // converts comments into text tokens when this is equal to a tag name - $textify_comments = false; - - $token = false; - $context->register('CurrentToken', $token); - - $e = false; - if ($config->get('Core.CollectErrors')) { - $e =& $context->get('ErrorCollector'); - } - - foreach($tokens as $token) { - if ($remove_until) { - if (empty($token->is_tag) || $token->name !== $remove_until) { - continue; - } - } - if (!empty( $token->is_tag )) { - // DEFINITION CALL - - // before any processing, try to transform the element - if ( - isset($definition->info_tag_transform[$token->name]) - ) { - $original_name = $token->name; - // there is a transformation for this tag - // DEFINITION CALL - $token = $definition-> - info_tag_transform[$token->name]-> - transform($token, $config, $context); - if ($e) $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Tag transform', $original_name); - } - - if (isset($definition->info[$token->name])) { - - // mostly everything's good, but - // we need to make sure required attributes are in order - if ( - ($token instanceof HTMLPurifier_Token_Start || $token instanceof HTMLPurifier_Token_Empty) && - $definition->info[$token->name]->required_attr && - ($token->name != 'img' || $remove_invalid_img) // ensure config option still works - ) { - $attr_validator->validateToken($token, $config, $context); - $ok = true; - foreach ($definition->info[$token->name]->required_attr as $name) { - if (!isset($token->attr[$name])) { - $ok = false; - break; - } - } - if (!$ok) { - if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Missing required attribute', $name); - continue; - } - $token->armor['ValidateAttributes'] = true; - } - - if (isset($hidden_elements[$token->name]) && $token instanceof HTMLPurifier_Token_Start) { - $textify_comments = $token->name; - } elseif ($token->name === $textify_comments && $token instanceof HTMLPurifier_Token_End) { - $textify_comments = false; - } - - } elseif ($escape_invalid_tags) { - // invalid tag, generate HTML representation and insert in - if ($e) $e->send(E_WARNING, 'Strategy_RemoveForeignElements: Foreign element to text'); - $token = new HTMLPurifier_Token_Text( - $generator->generateFromToken($token) - ); - } else { - // check if we need to destroy all of the tag's children - // CAN BE GENERICIZED - if (isset($hidden_elements[$token->name])) { - if ($token instanceof HTMLPurifier_Token_Start) { - $remove_until = $token->name; - } elseif ($token instanceof HTMLPurifier_Token_Empty) { - // do nothing: we're still looking - } else { - $remove_until = false; - } - if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign meta element removed'); - } else { - if ($e) $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Foreign element removed'); - } - continue; - } - } elseif ($token instanceof HTMLPurifier_Token_Comment) { - // textify comments in script tags when they are allowed - if ($textify_comments !== false) { - $data = $token->data; - $token = new HTMLPurifier_Token_Text($data); - } elseif ($trusted) { - // keep, but perform comment cleaning - if ($e) { - // perform check whether or not there's a trailing hyphen - if (substr($token->data, -1) == '-') { - $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Trailing hyphen in comment removed'); - } - } - $token->data = rtrim($token->data, '-'); - $found_double_hyphen = false; - while (strpos($token->data, '--') !== false) { - if ($e && !$found_double_hyphen) { - $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Hyphens in comment collapsed'); - } - $found_double_hyphen = true; // prevent double-erroring - $token->data = str_replace('--', '-', $token->data); - } - } else { - // strip comments - if ($e) $e->send(E_NOTICE, 'Strategy_RemoveForeignElements: Comment removed'); - continue; - } - } elseif ($token instanceof HTMLPurifier_Token_Text) { - } else { - continue; - } - $result[] = $token; - } - if ($remove_until && $e) { - // we removed tokens until the end, throw error - $e->send(E_ERROR, 'Strategy_RemoveForeignElements: Token removed to end', $remove_until); - } - - $context->destroy('CurrentToken'); - - return $result; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php b/extlib/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php deleted file mode 100644 index c3328a9d4..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Strategy/ValidateAttributes.php +++ /dev/null @@ -1,39 +0,0 @@ -register('CurrentToken', $token); - - foreach ($tokens as $key => $token) { - - // only process tokens that have attributes, - // namely start and empty tags - if (!$token instanceof HTMLPurifier_Token_Start && !$token instanceof HTMLPurifier_Token_Empty) continue; - - // skip tokens that are armored - if (!empty($token->armor['ValidateAttributes'])) continue; - - // note that we have no facilities here for removing tokens - $validator->validateToken($token, $config, $context); - - $tokens[$key] = $token; // for PHP 4 - } - $context->destroy('CurrentToken'); - - return $tokens; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/StringHash.php b/extlib/HTMLPurifier/HTMLPurifier/StringHash.php deleted file mode 100644 index 62085c5c2..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/StringHash.php +++ /dev/null @@ -1,39 +0,0 @@ -accessed[$index] = true; - return parent::offsetGet($index); - } - - /** - * Returns a lookup array of all array indexes that have been accessed. - * @return Array in form array($index => true). - */ - public function getAccessed() { - return $this->accessed; - } - - /** - * Resets the access array. - */ - public function resetAccessed() { - $this->accessed = array(); - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/StringHashParser.php b/extlib/HTMLPurifier/HTMLPurifier/StringHashParser.php deleted file mode 100644 index f3e70c712..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/StringHashParser.php +++ /dev/null @@ -1,110 +0,0 @@ - 'DefaultKeyValue', - * 'KEY' => 'Value', - * 'KEY2' => 'Value2', - * 'MULTILINE-KEY' => "Multiline\nvalue.\n", - * ) - * - * We use this as an easy to use file-format for configuration schema - * files, but the class itself is usage agnostic. - * - * You can use ---- to forcibly terminate parsing of a single string-hash; - * this marker is used in multi string-hashes to delimit boundaries. - */ -class HTMLPurifier_StringHashParser -{ - - public $default = 'ID'; - - /** - * Parses a file that contains a single string-hash. - */ - public function parseFile($file) { - if (!file_exists($file)) return false; - $fh = fopen($file, 'r'); - if (!$fh) return false; - $ret = $this->parseHandle($fh); - fclose($fh); - return $ret; - } - - /** - * Parses a file that contains multiple string-hashes delimited by '----' - */ - public function parseMultiFile($file) { - if (!file_exists($file)) return false; - $ret = array(); - $fh = fopen($file, 'r'); - if (!$fh) return false; - while (!feof($fh)) { - $ret[] = $this->parseHandle($fh); - } - fclose($fh); - return $ret; - } - - /** - * Internal parser that acepts a file handle. - * @note While it's possible to simulate in-memory parsing by using - * custom stream wrappers, if such a use-case arises we should - * factor out the file handle into its own class. - * @param $fh File handle with pointer at start of valid string-hash - * block. - */ - protected function parseHandle($fh) { - $state = false; - $single = false; - $ret = array(); - do { - $line = fgets($fh); - if ($line === false) break; - $line = rtrim($line, "\n\r"); - if (!$state && $line === '') continue; - if ($line === '----') break; - if (strncmp('--#', $line, 3) === 0) { - // Comment - continue; - } elseif (strncmp('--', $line, 2) === 0) { - // Multiline declaration - $state = trim($line, '- '); - if (!isset($ret[$state])) $ret[$state] = ''; - continue; - } elseif (!$state) { - $single = true; - if (strpos($line, ':') !== false) { - // Single-line declaration - list($state, $line) = explode(':', $line, 2); - $line = trim($line); - } else { - // Use default declaration - $state = $this->default; - } - } - if ($single) { - $ret[$state] = $line; - $single = false; - $state = false; - } else { - $ret[$state] .= "$line\n"; - } - } while (!feof($fh)); - return $ret; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/TagTransform.php b/extlib/HTMLPurifier/HTMLPurifier/TagTransform.php deleted file mode 100644 index 210a44721..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/TagTransform.php +++ /dev/null @@ -1,36 +0,0 @@ - 'xx-small', - '1' => 'xx-small', - '2' => 'small', - '3' => 'medium', - '4' => 'large', - '5' => 'x-large', - '6' => 'xx-large', - '7' => '300%', - '-1' => 'smaller', - '-2' => '60%', - '+1' => 'larger', - '+2' => '150%', - '+3' => '200%', - '+4' => '300%' - ); - - public function transform($tag, $config, $context) { - - if ($tag instanceof HTMLPurifier_Token_End) { - $new_tag = clone $tag; - $new_tag->name = $this->transform_to; - return $new_tag; - } - - $attr = $tag->attr; - $prepend_style = ''; - - // handle color transform - if (isset($attr['color'])) { - $prepend_style .= 'color:' . $attr['color'] . ';'; - unset($attr['color']); - } - - // handle face transform - if (isset($attr['face'])) { - $prepend_style .= 'font-family:' . $attr['face'] . ';'; - unset($attr['face']); - } - - // handle size transform - if (isset($attr['size'])) { - // normalize large numbers - if ($attr['size']{0} == '+' || $attr['size']{0} == '-') { - $size = (int) $attr['size']; - if ($size < -2) $attr['size'] = '-2'; - if ($size > 4) $attr['size'] = '+4'; - } else { - $size = (int) $attr['size']; - if ($size > 7) $attr['size'] = '7'; - } - if (isset($this->_size_lookup[$attr['size']])) { - $prepend_style .= 'font-size:' . - $this->_size_lookup[$attr['size']] . ';'; - } - unset($attr['size']); - } - - if ($prepend_style) { - $attr['style'] = isset($attr['style']) ? - $prepend_style . $attr['style'] : - $prepend_style; - } - - $new_tag = clone $tag; - $new_tag->name = $this->transform_to; - $new_tag->attr = $attr; - - return $new_tag; - - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php b/extlib/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php deleted file mode 100644 index 0e36130f2..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/TagTransform/Simple.php +++ /dev/null @@ -1,35 +0,0 @@ -transform_to = $transform_to; - $this->style = $style; - } - - public function transform($tag, $config, $context) { - $new_tag = clone $tag; - $new_tag->name = $this->transform_to; - if (!is_null($this->style) && - ($new_tag instanceof HTMLPurifier_Token_Start || $new_tag instanceof HTMLPurifier_Token_Empty) - ) { - $this->prependCSS($new_tag->attr, $this->style); - } - return $new_tag; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Token.php b/extlib/HTMLPurifier/HTMLPurifier/Token.php deleted file mode 100644 index 7900e6cb1..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Token.php +++ /dev/null @@ -1,57 +0,0 @@ -line = $l; - $this->col = $c; - } - - /** - * Convenience function for DirectLex settings line/col position. - */ - public function rawPosition($l, $c) { - if ($c === -1) $l++; - $this->line = $l; - $this->col = $c; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Token/Comment.php b/extlib/HTMLPurifier/HTMLPurifier/Token/Comment.php deleted file mode 100644 index dc6bdcabb..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Token/Comment.php +++ /dev/null @@ -1,22 +0,0 @@ -data = $data; - $this->line = $line; - $this->col = $col; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Token/Empty.php b/extlib/HTMLPurifier/HTMLPurifier/Token/Empty.php deleted file mode 100644 index 2a82b47ad..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Token/Empty.php +++ /dev/null @@ -1,11 +0,0 @@ -!empty($obj->is_tag) - * without having to use a function call is_a(). - */ - public $is_tag = true; - - /** - * The lower-case name of the tag, like 'a', 'b' or 'blockquote'. - * - * @note Strictly speaking, XML tags are case sensitive, so we shouldn't - * be lower-casing them, but these tokens cater to HTML tags, which are - * insensitive. - */ - public $name; - - /** - * Associative array of the tag's attributes. - */ - public $attr = array(); - - /** - * Non-overloaded constructor, which lower-cases passed tag name. - * - * @param $name String name. - * @param $attr Associative array of attributes. - */ - public function __construct($name, $attr = array(), $line = null, $col = null) { - $this->name = ctype_lower($name) ? $name : strtolower($name); - foreach ($attr as $key => $value) { - // normalization only necessary when key is not lowercase - if (!ctype_lower($key)) { - $new_key = strtolower($key); - if (!isset($attr[$new_key])) { - $attr[$new_key] = $attr[$key]; - } - if ($new_key !== $key) { - unset($attr[$key]); - } - } - } - $this->attr = $attr; - $this->line = $line; - $this->col = $col; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/Token/Text.php b/extlib/HTMLPurifier/HTMLPurifier/Token/Text.php deleted file mode 100644 index 82efd823d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/Token/Text.php +++ /dev/null @@ -1,33 +0,0 @@ -data = $data; - $this->is_whitespace = ctype_space($data); - $this->line = $line; - $this->col = $col; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/TokenFactory.php b/extlib/HTMLPurifier/HTMLPurifier/TokenFactory.php deleted file mode 100644 index 7cf48fb41..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/TokenFactory.php +++ /dev/null @@ -1,94 +0,0 @@ -p_start = new HTMLPurifier_Token_Start('', array()); - $this->p_end = new HTMLPurifier_Token_End(''); - $this->p_empty = new HTMLPurifier_Token_Empty('', array()); - $this->p_text = new HTMLPurifier_Token_Text(''); - $this->p_comment= new HTMLPurifier_Token_Comment(''); - } - - /** - * Creates a HTMLPurifier_Token_Start. - * @param $name Tag name - * @param $attr Associative array of attributes - * @return Generated HTMLPurifier_Token_Start - */ - public function createStart($name, $attr = array()) { - $p = clone $this->p_start; - $p->__construct($name, $attr); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_End. - * @param $name Tag name - * @return Generated HTMLPurifier_Token_End - */ - public function createEnd($name) { - $p = clone $this->p_end; - $p->__construct($name); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Empty. - * @param $name Tag name - * @param $attr Associative array of attributes - * @return Generated HTMLPurifier_Token_Empty - */ - public function createEmpty($name, $attr = array()) { - $p = clone $this->p_empty; - $p->__construct($name, $attr); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Text. - * @param $data Data of text token - * @return Generated HTMLPurifier_Token_Text - */ - public function createText($data) { - $p = clone $this->p_text; - $p->__construct($data); - return $p; - } - - /** - * Creates a HTMLPurifier_Token_Comment. - * @param $data Data of comment token - * @return Generated HTMLPurifier_Token_Comment - */ - public function createComment($data) { - $p = clone $this->p_comment; - $p->__construct($data); - return $p; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URI.php b/extlib/HTMLPurifier/HTMLPurifier/URI.php deleted file mode 100644 index 8b50d0d18..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URI.php +++ /dev/null @@ -1,173 +0,0 @@ -scheme = is_null($scheme) || ctype_lower($scheme) ? $scheme : strtolower($scheme); - $this->userinfo = $userinfo; - $this->host = $host; - $this->port = is_null($port) ? $port : (int) $port; - $this->path = $path; - $this->query = $query; - $this->fragment = $fragment; - } - - /** - * Retrieves a scheme object corresponding to the URI's scheme/default - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return Scheme object appropriate for validating this URI - */ - public function getSchemeObj($config, $context) { - $registry = HTMLPurifier_URISchemeRegistry::instance(); - if ($this->scheme !== null) { - $scheme_obj = $registry->getScheme($this->scheme, $config, $context); - if (!$scheme_obj) return false; // invalid scheme, clean it out - } else { - // no scheme: retrieve the default one - $def = $config->getDefinition('URI'); - $scheme_obj = $registry->getScheme($def->defaultScheme, $config, $context); - if (!$scheme_obj) { - // something funky happened to the default scheme object - trigger_error( - 'Default scheme object "' . $def->defaultScheme . '" was not readable', - E_USER_WARNING - ); - return false; - } - } - return $scheme_obj; - } - - /** - * Generic validation method applicable for all schemes. May modify - * this URI in order to get it into a compliant form. - * @param $config Instance of HTMLPurifier_Config - * @param $context Instance of HTMLPurifier_Context - * @return True if validation/filtering succeeds, false if failure - */ - public function validate($config, $context) { - - // ABNF definitions from RFC 3986 - $chars_sub_delims = '!$&\'()*+,;='; - $chars_gen_delims = ':/?#[]@'; - $chars_pchar = $chars_sub_delims . ':@'; - - // validate scheme (MUST BE FIRST!) - if (!is_null($this->scheme) && is_null($this->host)) { - $def = $config->getDefinition('URI'); - if ($def->defaultScheme === $this->scheme) { - $this->scheme = null; - } - } - - // validate host - if (!is_null($this->host)) { - $host_def = new HTMLPurifier_AttrDef_URI_Host(); - $this->host = $host_def->validate($this->host, $config, $context); - if ($this->host === false) $this->host = null; - } - - // validate username - if (!is_null($this->userinfo)) { - $encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . ':'); - $this->userinfo = $encoder->encode($this->userinfo); - } - - // validate port - if (!is_null($this->port)) { - if ($this->port < 1 || $this->port > 65535) $this->port = null; - } - - // validate path - $path_parts = array(); - $segments_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/'); - if (!is_null($this->host)) { - // path-abempty (hier and relative) - $this->path = $segments_encoder->encode($this->path); - } elseif ($this->path !== '' && $this->path[0] === '/') { - // path-absolute (hier and relative) - if (strlen($this->path) >= 2 && $this->path[1] === '/') { - // This shouldn't ever happen! - $this->path = ''; - } else { - $this->path = $segments_encoder->encode($this->path); - } - } elseif (!is_null($this->scheme) && $this->path !== '') { - // path-rootless (hier) - // Short circuit evaluation means we don't need to check nz - $this->path = $segments_encoder->encode($this->path); - } elseif (is_null($this->scheme) && $this->path !== '') { - // path-noscheme (relative) - // (once again, not checking nz) - $segment_nc_encoder = new HTMLPurifier_PercentEncoder($chars_sub_delims . '@'); - $c = strpos($this->path, '/'); - if ($c !== false) { - $this->path = - $segment_nc_encoder->encode(substr($this->path, 0, $c)) . - $segments_encoder->encode(substr($this->path, $c)); - } else { - $this->path = $segment_nc_encoder->encode($this->path); - } - } else { - // path-empty (hier and relative) - $this->path = ''; // just to be safe - } - - // qf = query and fragment - $qf_encoder = new HTMLPurifier_PercentEncoder($chars_pchar . '/?'); - - if (!is_null($this->query)) { - $this->query = $qf_encoder->encode($this->query); - } - - if (!is_null($this->fragment)) { - $this->fragment = $qf_encoder->encode($this->fragment); - } - - return true; - - } - - /** - * Convert URI back to string - * @return String URI appropriate for output - */ - public function toString() { - // reconstruct authority - $authority = null; - if (!is_null($this->host)) { - $authority = ''; - if(!is_null($this->userinfo)) $authority .= $this->userinfo . '@'; - $authority .= $this->host; - if(!is_null($this->port)) $authority .= ':' . $this->port; - } - - // reconstruct the result - $result = ''; - if (!is_null($this->scheme)) $result .= $this->scheme . ':'; - if (!is_null($authority)) $result .= '//' . $authority; - $result .= $this->path; - if (!is_null($this->query)) $result .= '?' . $this->query; - if (!is_null($this->fragment)) $result .= '#' . $this->fragment; - - return $result; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIDefinition.php b/extlib/HTMLPurifier/HTMLPurifier/URIDefinition.php deleted file mode 100644 index ea2b8fe24..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIDefinition.php +++ /dev/null @@ -1,93 +0,0 @@ -registerFilter(new HTMLPurifier_URIFilter_DisableExternal()); - $this->registerFilter(new HTMLPurifier_URIFilter_DisableExternalResources()); - $this->registerFilter(new HTMLPurifier_URIFilter_HostBlacklist()); - $this->registerFilter(new HTMLPurifier_URIFilter_MakeAbsolute()); - $this->registerFilter(new HTMLPurifier_URIFilter_Munge()); - } - - public function registerFilter($filter) { - $this->registeredFilters[$filter->name] = $filter; - } - - public function addFilter($filter, $config) { - $r = $filter->prepare($config); - if ($r === false) return; // null is ok, for backwards compat - if ($filter->post) { - $this->postFilters[$filter->name] = $filter; - } else { - $this->filters[$filter->name] = $filter; - } - } - - protected function doSetup($config) { - $this->setupMemberVariables($config); - $this->setupFilters($config); - } - - protected function setupFilters($config) { - foreach ($this->registeredFilters as $name => $filter) { - $conf = $config->get('URI.' . $name); - if ($conf !== false && $conf !== null) { - $this->addFilter($filter, $config); - } - } - unset($this->registeredFilters); - } - - protected function setupMemberVariables($config) { - $this->host = $config->get('URI.Host'); - $base_uri = $config->get('URI.Base'); - if (!is_null($base_uri)) { - $parser = new HTMLPurifier_URIParser(); - $this->base = $parser->parse($base_uri); - $this->defaultScheme = $this->base->scheme; - if (is_null($this->host)) $this->host = $this->base->host; - } - if (is_null($this->defaultScheme)) $this->defaultScheme = $config->get('URI.DefaultScheme'); - } - - public function filter(&$uri, $config, $context) { - foreach ($this->filters as $name => $f) { - $result = $f->filter($uri, $config, $context); - if (!$result) return false; - } - return true; - } - - public function postFilter(&$uri, $config, $context) { - foreach ($this->postFilters as $name => $f) { - $result = $f->filter($uri, $config, $context); - if (!$result) return false; - } - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIFilter.php b/extlib/HTMLPurifier/HTMLPurifier/URIFilter.php deleted file mode 100644 index c116f93df..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIFilter.php +++ /dev/null @@ -1,45 +0,0 @@ -getDefinition('URI')->host; - if ($our_host !== null) $this->ourHostParts = array_reverse(explode('.', $our_host)); - } - public function filter(&$uri, $config, $context) { - if (is_null($uri->host)) return true; - if ($this->ourHostParts === false) return false; - $host_parts = array_reverse(explode('.', $uri->host)); - foreach ($this->ourHostParts as $i => $x) { - if (!isset($host_parts[$i])) return false; - if ($host_parts[$i] != $this->ourHostParts[$i]) return false; - } - return true; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php b/extlib/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php deleted file mode 100644 index 881abc43c..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIFilter/DisableExternalResources.php +++ /dev/null @@ -1,12 +0,0 @@ -get('EmbeddedURI', true)) return true; - return parent::filter($uri, $config, $context); - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php b/extlib/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php deleted file mode 100644 index 045aa0992..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIFilter/HostBlacklist.php +++ /dev/null @@ -1,21 +0,0 @@ -blacklist = $config->get('URI.HostBlacklist'); - return true; - } - public function filter(&$uri, $config, $context) { - foreach($this->blacklist as $blacklisted_host_fragment) { - if (strpos($uri->host, $blacklisted_host_fragment) !== false) { - return false; - } - } - return true; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php b/extlib/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php deleted file mode 100644 index f46ab2630..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIFilter/MakeAbsolute.php +++ /dev/null @@ -1,114 +0,0 @@ -getDefinition('URI'); - $this->base = $def->base; - if (is_null($this->base)) { - trigger_error('URI.MakeAbsolute is being ignored due to lack of value for URI.Base configuration', E_USER_WARNING); - return false; - } - $this->base->fragment = null; // fragment is invalid for base URI - $stack = explode('/', $this->base->path); - array_pop($stack); // discard last segment - $stack = $this->_collapseStack($stack); // do pre-parsing - $this->basePathStack = $stack; - return true; - } - public function filter(&$uri, $config, $context) { - if (is_null($this->base)) return true; // abort early - if ( - $uri->path === '' && is_null($uri->scheme) && - is_null($uri->host) && is_null($uri->query) && is_null($uri->fragment) - ) { - // reference to current document - $uri = clone $this->base; - return true; - } - if (!is_null($uri->scheme)) { - // absolute URI already: don't change - if (!is_null($uri->host)) return true; - $scheme_obj = $uri->getSchemeObj($config, $context); - if (!$scheme_obj) { - // scheme not recognized - return false; - } - if (!$scheme_obj->hierarchical) { - // non-hierarchal URI with explicit scheme, don't change - return true; - } - // special case: had a scheme but always is hierarchical and had no authority - } - if (!is_null($uri->host)) { - // network path, don't bother - return true; - } - if ($uri->path === '') { - $uri->path = $this->base->path; - } elseif ($uri->path[0] !== '/') { - // relative path, needs more complicated processing - $stack = explode('/', $uri->path); - $new_stack = array_merge($this->basePathStack, $stack); - if ($new_stack[0] !== '' && !is_null($this->base->host)) { - array_unshift($new_stack, ''); - } - $new_stack = $this->_collapseStack($new_stack); - $uri->path = implode('/', $new_stack); - } else { - // absolute path, but still we should collapse - $uri->path = implode('/', $this->_collapseStack(explode('/', $uri->path))); - } - // re-combine - $uri->scheme = $this->base->scheme; - if (is_null($uri->userinfo)) $uri->userinfo = $this->base->userinfo; - if (is_null($uri->host)) $uri->host = $this->base->host; - if (is_null($uri->port)) $uri->port = $this->base->port; - return true; - } - - /** - * Resolve dots and double-dots in a path stack - */ - private function _collapseStack($stack) { - $result = array(); - $is_folder = false; - for ($i = 0; isset($stack[$i]); $i++) { - $is_folder = false; - // absorb an internally duplicated slash - if ($stack[$i] == '' && $i && isset($stack[$i+1])) continue; - if ($stack[$i] == '..') { - if (!empty($result)) { - $segment = array_pop($result); - if ($segment === '' && empty($result)) { - // error case: attempted to back out too far: - // restore the leading slash - $result[] = ''; - } elseif ($segment === '..') { - $result[] = '..'; // cannot remove .. with .. - } - } else { - // relative path, preserve the double-dots - $result[] = '..'; - } - $is_folder = true; - continue; - } - if ($stack[$i] == '.') { - // silently absorb - $is_folder = true; - continue; - } - $result[] = $stack[$i]; - } - if ($is_folder) $result[] = ''; - return $result; - } -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php b/extlib/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php deleted file mode 100644 index efa10a645..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIFilter/Munge.php +++ /dev/null @@ -1,58 +0,0 @@ -target = $config->get('URI.' . $this->name); - $this->parser = new HTMLPurifier_URIParser(); - $this->doEmbed = $config->get('URI.MungeResources'); - $this->secretKey = $config->get('URI.MungeSecretKey'); - return true; - } - public function filter(&$uri, $config, $context) { - if ($context->get('EmbeddedURI', true) && !$this->doEmbed) return true; - - $scheme_obj = $uri->getSchemeObj($config, $context); - if (!$scheme_obj) return true; // ignore unknown schemes, maybe another postfilter did it - if (is_null($uri->host) || empty($scheme_obj->browsable)) { - return true; - } - // don't redirect if target host is our host - if ($uri->host === $config->getDefinition('URI')->host) { - return true; - } - - $this->makeReplace($uri, $config, $context); - $this->replace = array_map('rawurlencode', $this->replace); - - $new_uri = strtr($this->target, $this->replace); - $new_uri = $this->parser->parse($new_uri); - // don't redirect if the target host is the same as the - // starting host - if ($uri->host === $new_uri->host) return true; - $uri = $new_uri; // overwrite - return true; - } - - protected function makeReplace($uri, $config, $context) { - $string = $uri->toString(); - // always available - $this->replace['%s'] = $string; - $this->replace['%r'] = $context->get('EmbeddedURI', true); - $token = $context->get('CurrentToken', true); - $this->replace['%n'] = $token ? $token->name : null; - $this->replace['%m'] = $context->get('CurrentAttr', true); - $this->replace['%p'] = $context->get('CurrentCSSProperty', true); - // not always available - if ($this->secretKey) $this->replace['%t'] = sha1($this->secretKey . ':' . $string); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIParser.php b/extlib/HTMLPurifier/HTMLPurifier/URIParser.php deleted file mode 100644 index 7179e4ab8..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIParser.php +++ /dev/null @@ -1,70 +0,0 @@ -percentEncoder = new HTMLPurifier_PercentEncoder(); - } - - /** - * Parses a URI. - * @param $uri string URI to parse - * @return HTMLPurifier_URI representation of URI. This representation has - * not been validated yet and may not conform to RFC. - */ - public function parse($uri) { - - $uri = $this->percentEncoder->normalize($uri); - - // Regexp is as per Appendix B. - // Note that ["<>] are an addition to the RFC's recommended - // characters, because they represent external delimeters. - $r_URI = '!'. - '(([^:/?#"<>]+):)?'. // 2. Scheme - '(//([^/?#"<>]*))?'. // 4. Authority - '([^?#"<>]*)'. // 5. Path - '(\?([^#"<>]*))?'. // 7. Query - '(#([^"<>]*))?'. // 8. Fragment - '!'; - - $matches = array(); - $result = preg_match($r_URI, $uri, $matches); - - if (!$result) return false; // *really* invalid URI - - // seperate out parts - $scheme = !empty($matches[1]) ? $matches[2] : null; - $authority = !empty($matches[3]) ? $matches[4] : null; - $path = $matches[5]; // always present, can be empty - $query = !empty($matches[6]) ? $matches[7] : null; - $fragment = !empty($matches[8]) ? $matches[9] : null; - - // further parse authority - if ($authority !== null) { - $r_authority = "/^((.+?)@)?(\[[^\]]+\]|[^:]*)(:(\d*))?/"; - $matches = array(); - preg_match($r_authority, $authority, $matches); - $userinfo = !empty($matches[1]) ? $matches[2] : null; - $host = !empty($matches[3]) ? $matches[3] : ''; - $port = !empty($matches[4]) ? (int) $matches[5] : null; - } else { - $port = $host = $userinfo = null; - } - - return new HTMLPurifier_URI( - $scheme, $userinfo, $host, $port, $path, $query, $fragment); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIScheme.php b/extlib/HTMLPurifier/HTMLPurifier/URIScheme.php deleted file mode 100644 index 039710fd1..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIScheme.php +++ /dev/null @@ -1,42 +0,0 @@ -, resolves edge cases - * with making relative URIs absolute - */ - public $hierarchical = false; - - /** - * Validates the components of a URI - * @note This implementation should be called by children if they define - * a default port, as it does port processing. - * @param $uri Instance of HTMLPurifier_URI - * @param $config HTMLPurifier_Config object - * @param $context HTMLPurifier_Context object - * @return Bool success or failure - */ - public function validate(&$uri, $config, $context) { - if ($this->default_port == $uri->port) $uri->port = null; - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php b/extlib/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php deleted file mode 100644 index 5849bf7ff..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIScheme/ftp.php +++ /dev/null @@ -1,43 +0,0 @@ -query = null; - - // typecode check - $semicolon_pos = strrpos($uri->path, ';'); // reverse - if ($semicolon_pos !== false) { - $type = substr($uri->path, $semicolon_pos + 1); // no semicolon - $uri->path = substr($uri->path, 0, $semicolon_pos); - $type_ret = ''; - if (strpos($type, '=') !== false) { - // figure out whether or not the declaration is correct - list($key, $typecode) = explode('=', $type, 2); - if ($key !== 'type') { - // invalid key, tack it back on encoded - $uri->path .= '%3B' . $type; - } elseif ($typecode === 'a' || $typecode === 'i' || $typecode === 'd') { - $type_ret = ";type=$typecode"; - } - } else { - $uri->path .= '%3B' . $type; - } - $uri->path = str_replace(';', '%3B', $uri->path); - $uri->path .= $type_ret; - } - - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIScheme/http.php b/extlib/HTMLPurifier/HTMLPurifier/URIScheme/http.php deleted file mode 100644 index b097a31d6..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIScheme/http.php +++ /dev/null @@ -1,20 +0,0 @@ -userinfo = null; - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIScheme/https.php b/extlib/HTMLPurifier/HTMLPurifier/URIScheme/https.php deleted file mode 100644 index 29e380919..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIScheme/https.php +++ /dev/null @@ -1,12 +0,0 @@ -userinfo = null; - $uri->host = null; - $uri->port = null; - // we need to validate path against RFC 2368's addr-spec - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIScheme/news.php b/extlib/HTMLPurifier/HTMLPurifier/URIScheme/news.php deleted file mode 100644 index f5f54f4f5..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIScheme/news.php +++ /dev/null @@ -1,22 +0,0 @@ -userinfo = null; - $uri->host = null; - $uri->port = null; - $uri->query = null; - // typecode check needed on path - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php b/extlib/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php deleted file mode 100644 index 5bf93ea78..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URIScheme/nntp.php +++ /dev/null @@ -1,20 +0,0 @@ -userinfo = null; - $uri->query = null; - return true; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php b/extlib/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php deleted file mode 100644 index 576bf7b6d..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/URISchemeRegistry.php +++ /dev/null @@ -1,68 +0,0 @@ -get('URI.AllowedSchemes'); - if (!$config->get('URI.OverrideAllowedSchemes') && - !isset($allowed_schemes[$scheme]) - ) { - return; - } - - if (isset($this->schemes[$scheme])) return $this->schemes[$scheme]; - if (!isset($allowed_schemes[$scheme])) return; - - $class = 'HTMLPurifier_URIScheme_' . $scheme; - if (!class_exists($class)) return; - $this->schemes[$scheme] = new $class(); - return $this->schemes[$scheme]; - } - - /** - * Registers a custom scheme to the cache, bypassing reflection. - * @param $scheme Scheme name - * @param $scheme_obj HTMLPurifier_URIScheme object - */ - public function register($scheme, $scheme_obj) { - $this->schemes[$scheme] = $scheme_obj; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/UnitConverter.php b/extlib/HTMLPurifier/HTMLPurifier/UnitConverter.php deleted file mode 100644 index 545d42622..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/UnitConverter.php +++ /dev/null @@ -1,254 +0,0 @@ - array( - 'px' => 3, // This is as per CSS 2.1 and Firefox. Your mileage may vary - 'pt' => 4, - 'pc' => 48, - 'in' => 288, - self::METRIC => array('pt', '0.352777778', 'mm'), - ), - self::METRIC => array( - 'mm' => 1, - 'cm' => 10, - self::ENGLISH => array('mm', '2.83464567', 'pt'), - ), - ); - - /** - * Minimum bcmath precision for output. - */ - protected $outputPrecision; - - /** - * Bcmath precision for internal calculations. - */ - protected $internalPrecision; - - /** - * Whether or not BCMath is available - */ - private $bcmath; - - public function __construct($output_precision = 4, $internal_precision = 10, $force_no_bcmath = false) { - $this->outputPrecision = $output_precision; - $this->internalPrecision = $internal_precision; - $this->bcmath = !$force_no_bcmath && function_exists('bcmul'); - } - - /** - * Converts a length object of one unit into another unit. - * @param HTMLPurifier_Length $length - * Instance of HTMLPurifier_Length to convert. You must validate() - * it before passing it here! - * @param string $to_unit - * Unit to convert to. - * @note - * About precision: This conversion function pays very special - * attention to the incoming precision of values and attempts - * to maintain a number of significant figure. Results are - * fairly accurate up to nine digits. Some caveats: - * - If a number is zero-padded as a result of this significant - * figure tracking, the zeroes will be eliminated. - * - If a number contains less than four sigfigs ($outputPrecision) - * and this causes some decimals to be excluded, those - * decimals will be added on. - */ - public function convert($length, $to_unit) { - - if (!$length->isValid()) return false; - - $n = $length->getN(); - $unit = $length->getUnit(); - - if ($n === '0' || $unit === false) { - return new HTMLPurifier_Length('0', false); - } - - $state = $dest_state = false; - foreach (self::$units as $k => $x) { - if (isset($x[$unit])) $state = $k; - if (isset($x[$to_unit])) $dest_state = $k; - } - if (!$state || !$dest_state) return false; - - // Some calculations about the initial precision of the number; - // this will be useful when we need to do final rounding. - $sigfigs = $this->getSigFigs($n); - if ($sigfigs < $this->outputPrecision) $sigfigs = $this->outputPrecision; - - // BCMath's internal precision deals only with decimals. Use - // our default if the initial number has no decimals, or increase - // it by how ever many decimals, thus, the number of guard digits - // will always be greater than or equal to internalPrecision. - $log = (int) floor(log(abs($n), 10)); - $cp = ($log < 0) ? $this->internalPrecision - $log : $this->internalPrecision; // internal precision - - for ($i = 0; $i < 2; $i++) { - - // Determine what unit IN THIS SYSTEM we need to convert to - if ($dest_state === $state) { - // Simple conversion - $dest_unit = $to_unit; - } else { - // Convert to the smallest unit, pending a system shift - $dest_unit = self::$units[$state][$dest_state][0]; - } - - // Do the conversion if necessary - if ($dest_unit !== $unit) { - $factor = $this->div(self::$units[$state][$unit], self::$units[$state][$dest_unit], $cp); - $n = $this->mul($n, $factor, $cp); - $unit = $dest_unit; - } - - // Output was zero, so bail out early. Shouldn't ever happen. - if ($n === '') { - $n = '0'; - $unit = $to_unit; - break; - } - - // It was a simple conversion, so bail out - if ($dest_state === $state) { - break; - } - - if ($i !== 0) { - // Conversion failed! Apparently, the system we forwarded - // to didn't have this unit. This should never happen! - return false; - } - - // Pre-condition: $i == 0 - - // Perform conversion to next system of units - $n = $this->mul($n, self::$units[$state][$dest_state][1], $cp); - $unit = self::$units[$state][$dest_state][2]; - $state = $dest_state; - - // One more loop around to convert the unit in the new system. - - } - - // Post-condition: $unit == $to_unit - if ($unit !== $to_unit) return false; - - // Useful for debugging: - //echo "
    n";
    -        //echo "$n\nsigfigs = $sigfigs\nnew_log = $new_log\nlog = $log\nrp = $rp\n
    \n"; - - $n = $this->round($n, $sigfigs); - if (strpos($n, '.') !== false) $n = rtrim($n, '0'); - $n = rtrim($n, '.'); - - return new HTMLPurifier_Length($n, $unit); - } - - /** - * Returns the number of significant figures in a string number. - * @param string $n Decimal number - * @return int number of sigfigs - */ - public function getSigFigs($n) { - $n = ltrim($n, '0+-'); - $dp = strpos($n, '.'); // decimal position - if ($dp === false) { - $sigfigs = strlen(rtrim($n, '0')); - } else { - $sigfigs = strlen(ltrim($n, '0.')); // eliminate extra decimal character - if ($dp !== 0) $sigfigs--; - } - return $sigfigs; - } - - /** - * Adds two numbers, using arbitrary precision when available. - */ - private function add($s1, $s2, $scale) { - if ($this->bcmath) return bcadd($s1, $s2, $scale); - else return $this->scale($s1 + $s2, $scale); - } - - /** - * Multiples two numbers, using arbitrary precision when available. - */ - private function mul($s1, $s2, $scale) { - if ($this->bcmath) return bcmul($s1, $s2, $scale); - else return $this->scale($s1 * $s2, $scale); - } - - /** - * Divides two numbers, using arbitrary precision when available. - */ - private function div($s1, $s2, $scale) { - if ($this->bcmath) return bcdiv($s1, $s2, $scale); - else return $this->scale($s1 / $s2, $scale); - } - - /** - * Rounds a number according to the number of sigfigs it should have, - * using arbitrary precision when available. - */ - private function round($n, $sigfigs) { - $new_log = (int) floor(log(abs($n), 10)); // Number of digits left of decimal - 1 - $rp = $sigfigs - $new_log - 1; // Number of decimal places needed - $neg = $n < 0 ? '-' : ''; // Negative sign - if ($this->bcmath) { - if ($rp >= 0) { - $n = bcadd($n, $neg . '0.' . str_repeat('0', $rp) . '5', $rp + 1); - $n = bcdiv($n, '1', $rp); - } else { - // This algorithm partially depends on the standardized - // form of numbers that comes out of bcmath. - $n = bcadd($n, $neg . '5' . str_repeat('0', $new_log - $sigfigs), 0); - $n = substr($n, 0, $sigfigs + strlen($neg)) . str_repeat('0', $new_log - $sigfigs + 1); - } - return $n; - } else { - return $this->scale(round($n, $sigfigs - $new_log - 1), $rp + 1); - } - } - - /** - * Scales a float to $scale digits right of decimal point, like BCMath. - */ - private function scale($r, $scale) { - if ($scale < 0) { - // The f sprintf type doesn't support negative numbers, so we - // need to cludge things manually. First get the string. - $r = sprintf('%.0f', (float) $r); - // Due to floating point precision loss, $r will more than likely - // look something like 4652999999999.9234. We grab one more digit - // than we need to precise from $r and then use that to round - // appropriately. - $precise = (string) round(substr($r, 0, strlen($r) + $scale), -1); - // Now we return it, truncating the zero that was rounded off. - return substr($precise, 0, -1) . str_repeat('0', -$scale + 1); - } - return sprintf('%.' . $scale . 'f', (float) $r); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/VarParser.php b/extlib/HTMLPurifier/HTMLPurifier/VarParser.php deleted file mode 100644 index 68e72ae86..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/VarParser.php +++ /dev/null @@ -1,154 +0,0 @@ - self::STRING, - 'istring' => self::ISTRING, - 'text' => self::TEXT, - 'itext' => self::ITEXT, - 'int' => self::INT, - 'float' => self::FLOAT, - 'bool' => self::BOOL, - 'lookup' => self::LOOKUP, - 'list' => self::ALIST, - 'hash' => self::HASH, - 'mixed' => self::MIXED - ); - - /** - * Lookup table of types that are string, and can have aliases or - * allowed value lists. - */ - static public $stringTypes = array( - self::STRING => true, - self::ISTRING => true, - self::TEXT => true, - self::ITEXT => true, - ); - - /** - * Validate a variable according to type. Throws - * HTMLPurifier_VarParserException if invalid. - * It may return NULL as a valid type if $allow_null is true. - * - * @param $var Variable to validate - * @param $type Type of variable, see HTMLPurifier_VarParser->types - * @param $allow_null Whether or not to permit null as a value - * @return Validated and type-coerced variable - */ - final public function parse($var, $type, $allow_null = false) { - if (is_string($type)) { - if (!isset(HTMLPurifier_VarParser::$types[$type])) { - throw new HTMLPurifier_VarParserException("Invalid type '$type'"); - } else { - $type = HTMLPurifier_VarParser::$types[$type]; - } - } - $var = $this->parseImplementation($var, $type, $allow_null); - if ($allow_null && $var === null) return null; - // These are basic checks, to make sure nothing horribly wrong - // happened in our implementations. - switch ($type) { - case (self::STRING): - case (self::ISTRING): - case (self::TEXT): - case (self::ITEXT): - if (!is_string($var)) break; - if ($type == self::ISTRING || $type == self::ITEXT) $var = strtolower($var); - return $var; - case (self::INT): - if (!is_int($var)) break; - return $var; - case (self::FLOAT): - if (!is_float($var)) break; - return $var; - case (self::BOOL): - if (!is_bool($var)) break; - return $var; - case (self::LOOKUP): - case (self::ALIST): - case (self::HASH): - if (!is_array($var)) break; - if ($type === self::LOOKUP) { - foreach ($var as $k) if ($k !== true) $this->error('Lookup table contains value other than true'); - } elseif ($type === self::ALIST) { - $keys = array_keys($var); - if (array_keys($keys) !== $keys) $this->error('Indices for list are not uniform'); - } - return $var; - case (self::MIXED): - return $var; - default: - $this->errorInconsistent(get_class($this), $type); - } - $this->errorGeneric($var, $type); - } - - /** - * Actually implements the parsing. Base implementation is to not - * do anything to $var. Subclasses should overload this! - */ - protected function parseImplementation($var, $type, $allow_null) { - return $var; - } - - /** - * Throws an exception. - */ - protected function error($msg) { - throw new HTMLPurifier_VarParserException($msg); - } - - /** - * Throws an inconsistency exception. - * @note This should not ever be called. It would be called if we - * extend the allowed values of HTMLPurifier_VarParser without - * updating subclasses. - */ - protected function errorInconsistent($class, $type) { - throw new HTMLPurifier_Exception("Inconsistency in $class: ".HTMLPurifier_VarParser::getTypeName($type)." not implemented"); - } - - /** - * Generic error for if a type didn't work. - */ - protected function errorGeneric($var, $type) { - $vtype = gettype($var); - $this->error("Expected type ".HTMLPurifier_VarParser::getTypeName($type).", got $vtype"); - } - - static public function getTypeName($type) { - static $lookup; - if (!$lookup) { - // Lazy load the alternative lookup table - $lookup = array_flip(HTMLPurifier_VarParser::$types); - } - if (!isset($lookup[$type])) return 'unknown'; - return $lookup[$type]; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php b/extlib/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php deleted file mode 100644 index c954250e9..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/VarParser/Flexible.php +++ /dev/null @@ -1,96 +0,0 @@ - $j) $var[$i] = trim($j); - if ($type === self::HASH) { - // key:value,key2:value2 - $nvar = array(); - foreach ($var as $keypair) { - $c = explode(':', $keypair, 2); - if (!isset($c[1])) continue; - $nvar[$c[0]] = $c[1]; - } - $var = $nvar; - } - } - if (!is_array($var)) break; - $keys = array_keys($var); - if ($keys === array_keys($keys)) { - if ($type == self::ALIST) return $var; - elseif ($type == self::LOOKUP) { - $new = array(); - foreach ($var as $key) { - $new[$key] = true; - } - return $new; - } else break; - } - if ($type === self::LOOKUP) { - foreach ($var as $key => $value) { - $var[$key] = true; - } - } - return $var; - default: - $this->errorInconsistent(__CLASS__, $type); - } - $this->errorGeneric($var, $type); - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/VarParser/Native.php b/extlib/HTMLPurifier/HTMLPurifier/VarParser/Native.php deleted file mode 100644 index b02a6de54..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/VarParser/Native.php +++ /dev/null @@ -1,26 +0,0 @@ -evalExpression($var); - } - - protected function evalExpression($expr) { - $var = null; - $result = eval("\$var = $expr;"); - if ($result === false) { - throw new HTMLPurifier_VarParserException("Fatal error in evaluated code"); - } - return $var; - } - -} - -// vim: et sw=4 sts=4 diff --git a/extlib/HTMLPurifier/HTMLPurifier/VarParserException.php b/extlib/HTMLPurifier/HTMLPurifier/VarParserException.php deleted file mode 100644 index 5df341495..000000000 --- a/extlib/HTMLPurifier/HTMLPurifier/VarParserException.php +++ /dev/null @@ -1,11 +0,0 @@ - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! - - vim: et sw=4 sts=4 diff --git a/plugins/OStatus/README b/plugins/OStatus/README index 09a59e349..3a98b7b25 100644 --- a/plugins/OStatus/README +++ b/plugins/OStatus/README @@ -12,10 +12,6 @@ $config['ostatus']['hub_retries'] (default 0) Number of times to retry a PuSH send to consumers if using internal hub -$config['ostatus']['purify_cache'] - (default cache disabled) - Set to a writable cache directory for HTMLPurifier's configuration settings, can speed up processing of remote messages (have not tested by how much) - For testing, shouldn't be used in production: diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 33b0ceb9e..a366c1c2c 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -668,28 +668,9 @@ class Ostatus_profile extends Memcached_DataObject */ protected function purify($html) { - require_once(INSTALLDIR.'/extlib/HTMLPurifier/HTMLPurifier.auto.php'); - - // By default Purifier wants to cache data to its own code directories, - // and spews error messages if they're not writable. - $config = HTMLPurifier_Config::createDefault(); - if (common_config('ostatus', 'purify_cache')) { - $config->set('Cache.SerializerPath', common_config('ostatus', 'purify_cache')); - } else { - // Although recommended in the documentation, this produces a notice: - // "Core.DefinitionCache is an alias, preferred directive name is Cache.DefinitionImpl" - // If I then follow *those* directions, I get a warning and it doesn't work: - // "Cannot set undefined directive Core.DefinitionImpl" - // So... lesser of two evils. Suppressing the notice from output, - // though it'll still be seen and logged by StatusNet's error handler. - $old = error_reporting(); - error_reporting($old & ~E_NOTICE); - $config->set('Core.DefinitionCache', null); - error_reporting($old); - } - - $purifier = new HTMLPurifier($config); - return $purifier->purify($html); + require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; + $config = array('safe' => 1); + return htmLawed($html, $config); } /** -- cgit v1.2.3-54-g00ecf From 543ff40ef62f2587cde084b03bcf2e956f52ce2f Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 24 Feb 2010 16:51:24 -0800 Subject: Populate more profile information when doing a remote subscribe --- lib/activity.php | 56 +++++++++++++++++------ plugins/OStatus/classes/Ostatus_profile.php | 71 +++++++++++++++++++++++++++-- tests/ActivityParseTests.php | 2 + 3 files changed, 113 insertions(+), 16 deletions(-) (limited to 'plugins/OStatus') diff --git a/lib/activity.php b/lib/activity.php index 33932ad0e..eace672a5 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -154,7 +154,15 @@ class PoCo PoCo::NS ); - array_push($urls, new PoCoURL($type, $value, $primary)); + $isPrimary = false; + + if (isset($primary) && $primary == 'true') { + $isPrimary = true; + } + + // @todo check to make sure a primary hasn't already been added + + array_push($urls, new PoCoURL($type, $value, $isPrimary)); } return $urls; } @@ -213,6 +221,15 @@ class PoCo return $poco; } + function getPrimaryURL() + { + foreach ($this->urls as $url) { + if ($url->primary) { + return $url; + } + } + } + function asString() { $xs = new XMLStringer(true); @@ -494,6 +511,12 @@ class ActivityObject $this->element = $element; + $this->geopoint = $this->_childContent( + $element, + ActivityContext::POINT, + ActivityContext::GEORSS + ); + if ($element->tagName == 'author') { $this->type = self::PERSON; // XXX: is this fair? @@ -759,22 +782,29 @@ class ActivityContext 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 self::locationFromPoint($point); } return null; } + + // XXX: Move to ActivityUtils or Location? + static function locationFromPoint($point) + { + $point = str_replace(',', ' ', $point); // per spec "treat commas as whitespace" + $point = preg_replace('/\s+/', ' ', $point); + $point = trim($point); + $coords = explode(' ', $point); + if (count($coords) == 2) { + list($lat, $lon) = $coords; + if (is_numeric($lat) && is_numeric($lon)) { + common_log(LOG_INFO, "Looking up location for $lat $lon from georss point"); + return Location::fromLatLon($lat, $lon); + } + } + common_log(LOG_ERR, "Ignoring bogus georss:point value $point"); + return null; + } } /** diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 5e38a523e..144fdfa8b 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1118,11 +1118,20 @@ class Ostatus_profile extends Memcached_DataObject $profile->profileurl = $hints['profileurl']; } - // @fixme bio + $profile->bio = self::getActivityObjectBio($object, $hints); + $profile->location = self::getActivityObjectLocation($object, $hints); + $profile->homepage = self::getActivityObjectHomepage($object, $hints); + + if (!empty($object->geopoint)) { + $location = ActivityContext::locationFromPoint($object->geopoint); + if (!empty($location)) { + $profile->lat = $location->lat; + $profile->lon = $location->lon; + } + } + // @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)); @@ -1154,6 +1163,62 @@ class Ostatus_profile extends Memcached_DataObject } } + protected static function getActivityObjectHomepage($object, $hints=array()) + { + $homepage = null; + $poco = $object->poco; + + if (!empty($poco)) { + $url = $poco->getPrimaryURL(); + if ($url->type == 'homepage') { + $homepage = $url->value; + } + } + + // @todo Try for a another PoCo URL? + + return $homepage; + } + + protected static function getActivityObjectLocation($object, $hints=array()) + { + $location = null; + + if (!empty($object->poco)) { + if (isset($object->poco->address->formatted)) { + $location = $object->poco->address->formatted; + if (mb_strlen($location) > 255) { + $location = mb_substr($note, 0, 255 - 3) . ' … '; + } + } + } + + // @todo Try to find location some othe way? Via goerss point? + + return $location; + } + + protected static function getActivityObjectBio($object, $hints=array()) + { + $bio = null; + + if (!empty($object->poco)) { + $note = $object->poco->note; + if (!empty($note)) { + if (mb_strlen($note) > Profile::maxBio()) { + // XXX: truncate ok? + $bio = mb_substr($note, 0, Profile::maxBio() - 3) . ' … '; + } else { + $bio = $note; + } + } + } + + // @todo Try to get bio info some other way? + + return $bio; + } + protected static function getActivityObjectNickname($object, $hints=array()) { if ($object->poco) { diff --git a/tests/ActivityParseTests.php b/tests/ActivityParseTests.php index 5de97d2e2..d1d871734 100644 --- a/tests/ActivityParseTests.php +++ b/tests/ActivityParseTests.php @@ -133,6 +133,8 @@ class ActivityParseTests extends PHPUnit_Framework_TestCase $this->assertEquals($poco->urls[0]->type, 'homepage'); $this->assertEquals($poco->urls[0]->value, 'http://example.com/blog.html'); $this->assertEquals($poco->urls[0]->primary, 'true'); + $this->assertEquals($act->actor->geopoint, '37.7749295 -122.4194155'); + } } -- cgit v1.2.3-54-g00ecf From b798faf9ea67c5e02ee515fb8e344132f8edd6be Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 25 Feb 2010 02:43:20 +0000 Subject: OStatus: abort processing of this PuSH in item if we got an exception, rather than letting it be re-run. --- plugins/OStatus/lib/pushinqueuehandler.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/pushinqueuehandler.php b/plugins/OStatus/lib/pushinqueuehandler.php index a90f52df2..1fd29ae30 100644 --- a/plugins/OStatus/lib/pushinqueuehandler.php +++ b/plugins/OStatus/lib/pushinqueuehandler.php @@ -40,7 +40,11 @@ class PushInQueueHandler extends QueueHandler $feedsub = FeedSub::staticGet('id', $feedsub_id); if ($feedsub) { - $feedsub->receive($post, $hmac); + try { + $feedsub->receive($post, $hmac); + } catch(Exception $e) { + common_log(LOG_ERR, "Exception during PuSH input processing for $feedsub->uri: " . $e->getMessage()); + } } else { common_log(LOG_ERR, "Discarding POST to unknown feed subscription id $feedsub_id"); } -- cgit v1.2.3-54-g00ecf From 58e232a10ad45808caeb1bbd72641aea535e00e8 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 25 Feb 2010 02:43:55 +0000 Subject: OStatus: when finding webfinger @-replies, override a local profile match if found at the same location (eg @someguy vs @someguy@example.org) Fixes inconsistent application of webfinger @-mentions in OStatus; once a local profile is set up the local name would often match first and ended up overriding in output. --- plugins/OStatus/OStatusPlugin.php | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 5feb53b26..7f75b7b2b 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -210,7 +210,7 @@ class OStatusPlugin extends Plugin * */ - function onStartFindMentions($sender, $text, &$mentions) + function onEndFindMentions($sender, $text, &$mentions) { preg_match_all('/(?:^|\s+)@((?:\w+\.)*\w+@(?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+)/', $text, @@ -233,11 +233,21 @@ class OStatusPlugin extends Plugin $this->log(LOG_INFO, "Ostatus_profile found for address '$webfinger'"); + if ($oprofile->isGroup()) { + continue; + } $profile = $oprofile->localProfile(); + $pos = $wmatch[1]; + foreach ($mentions as $i => $other) { + // If we share a common prefix with a local user, override it! + if ($other['position'] == $pos) { + unset($mentions[$i]); + } + } $mentions[] = array('mentioned' => array($profile), 'text' => $wmatch[0], - 'position' => $wmatch[1], + 'position' => $pos, 'url' => $profile->profileurl); } } -- cgit v1.2.3-54-g00ecf From 942521ef3058ee4416d737a144f7e48d9f0f342c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 24 Feb 2010 22:02:43 -0500 Subject: if OStatus post is too long, show the summary and save it as an HTML attachment --- plugins/OStatus/classes/Ostatus_profile.php | 60 +++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 4f73fd65b..10c2ff87c 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -607,6 +607,32 @@ class Ostatus_profile extends Memcached_DataObject $rendered = $this->purify($activity->object->content); $content = html_entity_decode(strip_tags($rendered)); + $shortened = content_shorten_links($content); + + // If it's too long, try using the summary, and make the + // HTML an attachment. + + $attachment = null; + + if (Notice::contentTooLong($shortened)) { + $attachment = $this->saveHTMLFile($activity->object->title, $rendered); + $summary = $activity->object->summary; + if (empty($summary)) { + $summary = $content; + } + $shortSummary = content_shorten_links($summary); + if (Notice::contentTooLong($shortSummary)) { + $url = common_shorten_url(common_local_url('attachment', + array('attachment' => $attachment->id))); + $shortSummary = substr($shortSummary, + 0, + Notice::maxContent() - (mb_strlen($url) + 2)); + $shortSummary .= '… ' . $url; + $content = $shortSummary; + $rendered = common_render_text($content); + } + } + $options = array('is_local' => Notice::REMOTE_OMB, 'url' => $sourceUrl, 'uri' => $sourceUri, @@ -654,6 +680,9 @@ class Ostatus_profile extends Memcached_DataObject $options); if ($saved) { Ostatus_source::saveNew($saved, $this, $method); + if (!empty($attachment)) { + File_to_post::processNew($attachment->id, $saved->id); + } } } catch (Exception $e) { common_log(LOG_ERR, "OStatus save of remote message $sourceUri failed: " . $e->getMessage()); @@ -1386,4 +1415,35 @@ class Ostatus_profile extends Memcached_DataObject return null; } + + function saveHTMLFile($title, $rendered) + { + $final = sprintf("\n%s". + '
    %s
    ', + htmlspecialchars($title), + $rendered); + + $filename = File::filename($this->localProfile(), + 'ostatus', // ignored? + 'text/html'); + + $filepath = File::path($filename); + + file_put_contents($filepath, $final); + + $file = new File; + + $file->filename = $filename; + $file->url = File::url($filename); + $file->size = filesize($filepath); + $file->date = time(); + $file->mimetype = 'text/html'; + + $file_id = $file->insert(); + + if ($file_id === false) { + common_log_db_error($file, "INSERT", __FILE__); + throw new ServerException(_('Could not store HTML content of long post as file.')); + } + } } -- cgit v1.2.3-54-g00ecf From b08a5271395b92e01a17f7298cad7bb203149a7b Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 24 Feb 2010 22:22:42 -0500 Subject: content_* to common_* --- plugins/OStatus/classes/Ostatus_profile.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 10c2ff87c..e9c77654d 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -607,7 +607,7 @@ class Ostatus_profile extends Memcached_DataObject $rendered = $this->purify($activity->object->content); $content = html_entity_decode(strip_tags($rendered)); - $shortened = content_shorten_links($content); + $shortened = common_shorten_links($content); // If it's too long, try using the summary, and make the // HTML an attachment. @@ -620,7 +620,7 @@ class Ostatus_profile extends Memcached_DataObject if (empty($summary)) { $summary = $content; } - $shortSummary = content_shorten_links($summary); + $shortSummary = common_shorten_links($summary); if (Notice::contentTooLong($shortSummary)) { $url = common_shorten_url(common_local_url('attachment', array('attachment' => $attachment->id))); -- cgit v1.2.3-54-g00ecf From 374c488cf136b378d4fb47c4a6add309694e9146 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 24 Feb 2010 22:26:40 -0500 Subject: return attachement from saveHTMLFile() --- plugins/OStatus/classes/Ostatus_profile.php | 2 ++ 1 file changed, 2 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index e9c77654d..300e38c05 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1445,5 +1445,7 @@ class Ostatus_profile extends Memcached_DataObject common_log_db_error($file, "INSERT", __FILE__); throw new ServerException(_('Could not store HTML content of long post as file.')); } + + return $file; } } -- cgit v1.2.3-54-g00ecf From 79c0d52daa92b60e8eed80fa9459367c26f97122 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 25 Feb 2010 11:26:33 -0800 Subject: OStatus: save categories from the Atom entry as hashtags. --- classes/Notice.php | 37 +++++++++++++++-- lib/activity.php | 61 ++++++++++++++++++++++++++++- lib/distribqueuehandler.php | 12 ------ plugins/OStatus/classes/Ostatus_profile.php | 14 ++++++- 4 files changed, 106 insertions(+), 18 deletions(-) (limited to 'plugins/OStatus') diff --git a/classes/Notice.php b/classes/Notice.php index e8d5c45cb..46c5ebb37 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -121,6 +121,9 @@ class Notice extends Memcached_DataObject $result = parent::delete(); } + /** + * Extract #hashtags from this notice's content and save them to the database. + */ function saveTags() { /* extract all #hastags */ @@ -129,14 +132,22 @@ class Notice extends Memcached_DataObject return true; } + /* Add them to the database */ + return $this->saveKnownTags($match[1]); + } + + /** + * Record the given set of hash tags in the db for this notice. + * Given tag strings will be normalized and checked for dupes. + */ + function saveKnownTags($hashtags) + { //turn each into their canonical tag //this is needed to remove dupes before saving e.g. #hash.tag = #hashtag - $hashtags = array(); - for($i=0; $isaveTag($hashtag); @@ -145,6 +156,10 @@ class Notice extends Memcached_DataObject return true; } + /** + * Record a single hash tag as associated with this notice. + * Tag format and uniqueness must be validated by caller. + */ function saveTag($hashtag) { $tag = new Notice_tag(); @@ -194,6 +209,8 @@ class Notice extends Memcached_DataObject * place of extracting @-replies from content. * array 'groups' list of group IDs to deliver to, in place of * extracting ! tags from content + * array 'tags' list of hashtag strings to save with the notice + * in place of extracting # tags from content * @fixme tag override * * @return Notice @@ -343,6 +360,8 @@ class Notice extends Memcached_DataObject $notice->blowOnInsert(); + // Save per-notice metadata... + if (isset($replies)) { $notice->saveKnownReplies($replies); } else { @@ -355,6 +374,16 @@ class Notice extends Memcached_DataObject $notice->saveGroups(); } + if (isset($tags)) { + $notice->saveKnownTags($tags); + } else { + $notice->saveTags(); + } + + // @fixme pass in data for URLs too? + $notice->saveUrls(); + + // Prepare inbox delivery, may be queued to background. $notice->distribute(); return $notice; diff --git a/lib/activity.php b/lib/activity.php index 3de5f62c7..e592aad6f 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -859,6 +859,7 @@ class Activity public $content; // HTML content of activity public $id; // ID of the activity public $title; // title of the activity + public $categories = array(); // list of AtomCategory objects /** * Turns a regular old Atom into a magical activity @@ -947,6 +948,14 @@ class Activity $this->summary = ActivityUtils::childContent($entry, 'summary'); $this->id = ActivityUtils::childContent($entry, 'id'); $this->content = ActivityUtils::getContent($entry); + + $catEls = $entry->getElementsByTagNameNS(self::ATOM, 'category'); + if ($catEls) { + for ($i = 0; $i < $catEls->length; $i++) { + $catEl = $catEls->item($i); + $this->categories[] = new AtomCategory($catEl); + } + } } /** @@ -1011,6 +1020,10 @@ class Activity $xs->raw($this->target->asString('activity:target')); } + foreach ($this->categories as $cat) { + $xs->raw($cat->asString()); + } + $xs->elementEnd('entry'); return $xs->getString(); @@ -1020,4 +1033,50 @@ class Activity { return ActivityUtils::child($element, $tag, $namespace); } -} \ No newline at end of file +} + +class AtomCategory +{ + public $term; + public $scheme; + public $label; + + function __construct($element=null) + { + if ($element && $element->attributes) { + $this->term = $this->extract($element, 'term'); + $this->scheme = $this->extract($element, 'scheme'); + $this->label = $this->extract($element, 'label'); + } + } + + protected function extract($element, $attrib) + { + $node = $element->attributes->getNamedItemNS(Activity::ATOM, $attrib); + if ($node) { + return trim($node->textContent); + } + $node = $element->attributes->getNamedItem($attrib); + if ($node) { + return trim($node->textContent); + } + return null; + } + + function asString() + { + $attribs = array(); + if ($this->term !== null) { + $attribs['term'] = $this->term; + } + if ($this->scheme !== null) { + $attribs['scheme'] = $this->scheme; + } + if ($this->label !== null) { + $attribs['label'] = $this->label; + } + $xs = new XMLStringer(); + $xs->element('category', $attribs); + return $xs->asString(); + } +} diff --git a/lib/distribqueuehandler.php b/lib/distribqueuehandler.php index dc183fb36..d2be7a92c 100644 --- a/lib/distribqueuehandler.php +++ b/lib/distribqueuehandler.php @@ -62,24 +62,12 @@ class DistribQueueHandler { // XXX: do we need to change this for remote users? - try { - $notice->saveTags(); - } catch (Exception $e) { - $this->logit($notice, $e); - } - try { $notice->addToInboxes(); } catch (Exception $e) { $this->logit($notice, $e); } - try { - $notice->saveUrls(); - } catch (Exception $e) { - $this->logit($notice, $e); - } - try { Event::handle('EndNoticeSave', array($notice)); // Enqueue for other handlers diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 300e38c05..d66939399 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -638,7 +638,9 @@ class Ostatus_profile extends Memcached_DataObject 'uri' => $sourceUri, 'rendered' => $rendered, 'replies' => array(), - 'groups' => array()); + 'groups' => array(), + 'tags' => array()); + // Check for optional attributes... @@ -673,6 +675,16 @@ class Ostatus_profile extends Memcached_DataObject } } + // Atom categories <-> hashtags + foreach ($activity->categories as $cat) { + if ($cat->term) { + $term = common_canonical_tag($cat->term); + if ($term) { + $options['tags'][] = $term; + } + } + } + try { $saved = Notice::saveNew($oprofile->profile_id, $content, -- cgit v1.2.3-54-g00ecf From b5b5184c885e74d9532409a5962f851c4baf41c4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 25 Feb 2010 13:02:08 -0800 Subject: OStatus: fix remote groups to work with new user_groups/local_groups split. - fix generation so we get the profile info (what's available so far) - use id instead of nickname for group join/leave forms so we can join/leave remote groups while the rest of the groups UI remains limited to local groups (plugins are responsible for making sure remote notifications and permission checks are done) - fix remote notification when joining group through OStatus's remote subscribe form --- actions/joingroup.php | 39 ++++++++++++++++------------- actions/leavegroup.php | 39 ++++++++++++++++------------- classes/User_group.php | 2 +- lib/activity.php | 7 ++++-- lib/joinform.php | 2 +- lib/leaveform.php | 2 +- lib/router.php | 3 +++ plugins/OStatus/actions/ostatussub.php | 14 ++++++++--- plugins/OStatus/classes/Ostatus_profile.php | 26 +++++++++++-------- 9 files changed, 79 insertions(+), 55 deletions(-) (limited to 'plugins/OStatus') diff --git a/actions/joingroup.php b/actions/joingroup.php index ba642f712..f87e5dae2 100644 --- a/actions/joingroup.php +++ b/actions/joingroup.php @@ -62,30 +62,33 @@ class JoingroupAction extends Action } $nickname_arg = $this->trimmed('nickname'); - $nickname = common_canonical_nickname($nickname_arg); - - // Permanent redirect on non-canonical nickname + $id = intval($this->arg('id')); + if ($id) { + $this->group = User_group::staticGet('id', $id); + } else if ($nickname_arg) { + $nickname = common_canonical_nickname($nickname_arg); + + // Permanent redirect on non-canonical nickname + + if ($nickname_arg != $nickname) { + $args = array('nickname' => $nickname); + common_redirect(common_local_url('leavegroup', $args), 301); + return false; + } - if ($nickname_arg != $nickname) { - $args = array('nickname' => $nickname); - common_redirect(common_local_url('joingroup', $args), 301); - return false; - } + $local = Local_group::staticGet('nickname', $nickname); - if (!$nickname) { - $this->clientError(_('No nickname.'), 404); - return false; - } - - $local = Local_group::staticGet('nickname', $nickname); + if (!$local) { + $this->clientError(_('No such group.'), 404); + return false; + } - if (!$local) { - $this->clientError(_('No such group.'), 404); + $this->group = User_group::staticGet('id', $local->group_id); + } else { + $this->clientError(_('No nickname or ID.'), 404); return false; } - $this->group = User_group::staticGet('id', $local->group_id); - if (!$this->group) { $this->clientError(_('No such group.'), 404); return false; diff --git a/actions/leavegroup.php b/actions/leavegroup.php index 222d4c1b4..329b5aafe 100644 --- a/actions/leavegroup.php +++ b/actions/leavegroup.php @@ -62,30 +62,33 @@ class LeavegroupAction extends Action } $nickname_arg = $this->trimmed('nickname'); - $nickname = common_canonical_nickname($nickname_arg); - - // Permanent redirect on non-canonical nickname + $id = intval($this->arg('id')); + if ($id) { + $this->group = User_group::staticGet('id', $id); + } else if ($nickname_arg) { + $nickname = common_canonical_nickname($nickname_arg); + + // Permanent redirect on non-canonical nickname + + if ($nickname_arg != $nickname) { + $args = array('nickname' => $nickname); + common_redirect(common_local_url('leavegroup', $args), 301); + return false; + } - if ($nickname_arg != $nickname) { - $args = array('nickname' => $nickname); - common_redirect(common_local_url('leavegroup', $args), 301); - return false; - } + $local = Local_group::staticGet('nickname', $nickname); - if (!$nickname) { - $this->clientError(_('No nickname.'), 404); - return false; - } - - $local = Local_group::staticGet('nickname', $nickname); + if (!$local) { + $this->clientError(_('No such group.'), 404); + return false; + } - if (!$local) { - $this->clientError(_('No such group.'), 404); + $this->group = User_group::staticGet('id', $local->group_id); + } else { + $this->clientError(_('No nickname or ID.'), 404); return false; } - $this->group = User_group::staticGet('id', $local->group_id); - if (!$this->group) { $this->clientError(_('No such group.'), 404); return false; diff --git a/classes/User_group.php b/classes/User_group.php index f24bef764..2a58d8895 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -404,7 +404,7 @@ class User_group extends Memcached_DataObject $xs = new XMLStringer(true); $xs->elementStart('activity:subject'); - $xs->element('activity:object', null, 'http://activitystrea.ms/schema/1.0/group'); + $xs->element('activity:object-type', null, 'http://activitystrea.ms/schema/1.0/group'); $xs->element('id', null, $this->permalink()); $xs->element('title', null, $this->getBestName()); $xs->element( diff --git a/lib/activity.php b/lib/activity.php index e592aad6f..4e7ff5336 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -610,7 +610,10 @@ class ActivityObject $object->id = $profile->getUri(); $object->title = $profile->getBestName(); $object->link = $profile->profileurl; - $object->avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + if ($avatar) { + $object->avatar = $avatar->displayUrl(); + } if (isset($profile->lat) && isset($profile->lon)) { $object->geopoint = (float)$profile->lat . ' ' . (float)$profile->lon; @@ -664,7 +667,7 @@ class ActivityObject 'rel' => 'avatar', 'href' => empty($this->avatar) ? Avatar::defaultImage(AVATAR_PROFILE_SIZE) - : $this->avatar->displayUrl() + : $this->avatar ), null ); diff --git a/lib/joinform.php b/lib/joinform.php index aefb553aa..aa8bc20e2 100644 --- a/lib/joinform.php +++ b/lib/joinform.php @@ -100,7 +100,7 @@ class JoinForm extends Form function action() { return common_local_url('joingroup', - array('nickname' => $this->group->nickname)); + array('id' => $this->group->id)); } /** diff --git a/lib/leaveform.php b/lib/leaveform.php index e63d96ee8..5469b5704 100644 --- a/lib/leaveform.php +++ b/lib/leaveform.php @@ -100,7 +100,7 @@ class LeaveForm extends Form function action() { return common_local_url('leavegroup', - array('nickname' => $this->group->nickname)); + array('id' => $this->group->id)); } /** diff --git a/lib/router.php b/lib/router.php index 987d0152e..0e15d83b9 100644 --- a/lib/router.php +++ b/lib/router.php @@ -247,6 +247,9 @@ class Router $m->connect('group/:nickname/'.$v, array('action' => $v.'group'), array('nickname' => '[a-zA-Z0-9]+')); + $m->connect('group/:id/id/'.$v, + array('action' => $v.'group'), + array('id' => '[0-9]+')); } foreach (array('members', 'logo', 'rss', 'designsettings') as $n) { diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 12832cdcf..aae22f868 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -333,10 +333,18 @@ class OStatusSubAction extends Action $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(); + return; + } + if (Event::handle('StartJoinGroup', array($group, $user))) { + $ok = Group_member::join($this->oprofile->group_id, $user->id); + if ($ok) { + Event::handle('EndJoinGroup', array($group, $user)); + $this->successGroup(); + } else { + $this->showForm(_m('Remote group join failed!')); + } } else { - $this->showForm(_m('Remote group join failed!')); + $this->showForm(_m('Remote group join aborted!')); } } else { $local = $this->oprofile->localProfile(); diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index d66939399..f23017077 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -162,7 +162,7 @@ class Ostatus_profile extends Memcached_DataObject 'jpg' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'gif' => 'image/gif'); - $extension = pathinfo(parse_url($avatarHref, PHP_URL_PATH), PATHINFO_EXTENSION); + $extension = pathinfo(parse_url($object->avatar, PHP_URL_PATH), PATHINFO_EXTENSION); if (isset($map[$extension])) { // @fixme this ain't used/saved yet $object->avatarType = $map[$extension]; @@ -332,6 +332,9 @@ class Ostatus_profile extends Memcached_DataObject */ public function unsubscribe() { $feedsub = FeedSub::staticGet('uri', $this->feeduri); + if (!$feedsub) { + return true; + } if ($feedsub->sub_state == 'active') { return $feedsub->unsubscribe(); } else if ($feedsub->sub_state == '' || $feedsub->sub_state == 'inactive' || $feedsub->sub_state == 'unsubscribe') { @@ -356,7 +359,7 @@ class Ostatus_profile extends Memcached_DataObject $count = $this->localProfile()->subscriberCount(); } if ($count == 0) { - common_log(LOG_INFO, "Unsubscribing from now-unused remote feed $oprofile->feeduri"); + common_log(LOG_INFO, "Unsubscribing from now-unused remote feed $this->feeduri"); $this->unsubscribe(); return true; } else { @@ -1095,8 +1098,8 @@ class Ostatus_profile extends Memcached_DataObject if ($object->type == ActivityObject::PERSON) { $profile = new Profile(); + $profile->created = common_sql_now(); self::updateProfile($profile, $object, $hints); - $profile->created = common_sql_now(); $oprofile->profile_id = $profile->insert(); if (!$oprofile->profile_id) { @@ -1104,6 +1107,7 @@ class Ostatus_profile extends Memcached_DataObject } } else { $group = new User_group(); + $group->uri = $homeuri; $group->created = common_sql_now(); self::updateGroup($group, $object, $hints); @@ -1183,19 +1187,19 @@ class Ostatus_profile extends Memcached_DataObject { $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; + if (!empty($object->link)) { + $group->mainpage = $object->link; + } else if (array_key_exists('profileurl', $hints)) { + $group->mainpage = $hints['profileurl']; + } - // @fixme homepage - // @fixme bio - // @fixme tags/categories - // @fixme location? // @todo tags from categories - // @todo lat/lon/location? + $group->description = self::getActivityObjectBio($object, $hints); + $group->location = self::getActivityObjectLocation($object, $hints); + $group->homepage = self::getActivityObjectHomepage($object, $hints); if ($group->id) { common_log(LOG_DEBUG, "Updating OStatus group $group->id from remote info $object->id: " . var_export($object, true) . var_export($hints, true)); -- cgit v1.2.3-54-g00ecf From e62e49ed3be08e30ab5ea6a5a46e1f90d4715182 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 25 Feb 2010 09:39:16 -0500 Subject: adding some exception handling for magicenv parsing --- plugins/OStatus/lib/magicenvelope.php | 2 +- plugins/OStatus/lib/salmon.php | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index 81f4609c5..4a9efe93d 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -59,7 +59,7 @@ class MagicEnvelope $signer_uri = $this->normalizeUser($signer_uri); if (!$this->checkAuthor($text, $signer_uri)) { - return false; + throw new Exception("Unable to determine entry author."); } $signature_alg = Magicsig::fromString($this->getKeyPair($signer_uri)); diff --git a/plugins/OStatus/lib/salmon.php b/plugins/OStatus/lib/salmon.php index b5f178cc6..9d4359f74 100644 --- a/plugins/OStatus/lib/salmon.php +++ b/plugins/OStatus/lib/salmon.php @@ -72,8 +72,12 @@ class Salmon // 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); - + try { + $env = $magic_env->signMessage($text, 'application/atom+xml', $signer_uri); + } catch (Exception $e) { + common_log(LOG_ERR, "Salmon signing failed: ". $e->getMessage()); + return $text; + } return $magic_env->unfold($env); } -- cgit v1.2.3-54-g00ecf From 5cb6e54bedd6aa7dda14bb43fd29d8c119fe6d4c Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 25 Feb 2010 14:59:15 -0500 Subject: call-time pass by reference --- plugins/OStatus/OStatusPlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 7f75b7b2b..9a543df3b 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -644,7 +644,7 @@ class OStatusPlugin extends Plugin function onStartUserGroupHomeUrl($group, &$url) { - return $this->onStartUserGroupPermalink($group, &$url); + return $this->onStartUserGroupPermalink($group, $url); } function onStartUserGroupPermalink($group, &$url) -- cgit v1.2.3-54-g00ecf From 3d0ba3efc84a78a24d4a3a60472e47aef92546dd Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 25 Feb 2010 17:08:50 -0500 Subject: adding a new, more generic "discovery" class that does LRDD disco (rather than webfinger specific) --- plugins/OStatus/lib/discovery.php | 303 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 303 insertions(+) create mode 100644 plugins/OStatus/lib/discovery.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/discovery.php b/plugins/OStatus/lib/discovery.php new file mode 100644 index 000000000..1159f2151 --- /dev/null +++ b/plugins/OStatus/lib/discovery.php @@ -0,0 +1,303 @@ +. + * + * @package StatusNet + * @author James Walker + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +/** + * This class implements LRDD-based service discovery based on the "Hammer Draft" + * (including webfinger) + * + * @see http://groups.google.com/group/webfinger/browse_thread/thread/9f3d93a479e91bbf + */ +class Discovery +{ + + const LRDD_REL = 'lrdd'; + const PROFILEPAGE = 'http://webfinger.net/rel/profile-page'; + const UPDATESFROM = 'http://schemas.google.com/g/2010#updates-from'; + + public $methods = array(); + + public function __construct() + { + $this->registerMethod('Discovery_LRDD_Host_Meta'); + $this->registerMethod('Discovery_LRDD_Link_Header'); + $this->registerMethod('Discovery_LRDD_Link_HTML'); + } + + + public function registerMethod($class) + { + $this->methods[] = $class; + } + + /** + * Given a "user id" make sure it's normalized to either a webfinger + * acct: uri or a profile HTTP URL. + */ + public static function normalize($user_id) + { + if (substr($user_id, 0, 5) == 'http:' || + substr($user_id, 0, 6) == 'https:' || + substr($user_id, 0, 5) == 'acct:') { + return $user_id; + } + + if (strpos($user_id, '@') !== FALSE) { + return 'acct:' . $user_id; + } + + return 'http://' . $user_id; + } + + public static function isWebfinger($user_id) + { + $uri = Discovery::normalize($user_id); + + return (substr($uri, 0, 5) == 'acct:'); + } + + /** + * This implements the actual lookup procedure + */ + public function lookup($id) + { + // Normalize the incoming $id to make sure we have a uri + $uri = $this->normalize($id); + + foreach ($this->methods as $class) { + $links = call_user_func(array($class, 'discover'), $uri); + + if ($link = Discovery::getService($links, Discovery::LRDD_REL)) { + // Load the LRDD XRD + if ($link['template']) { + $xrd_uri = Discovery::applyTemplate($link['template'], $uri); + } else { + $xrd_uri = $link['href']; + } + + $xrd = $this->fetchXrd($xrd_uri); + if ($xrd) { + return $xrd; + } + } + } + + throw new Exception('Unable to find services for '. $id); + } + + public static function getService($links, $service) { + foreach ($links as $link) { + if ($link['rel'] == $service) { + return $link; + } + } + } + + + public static function applyTemplate($template, $id) + { + $template = str_replace('{uri}', urlencode($id), $template); + + return $template; + } + + + public static function fetchXrd($url) + { + try { + $client = new HTTPClient(); + $response = $client->get($url); + } catch (HTTP_Request2_Exception $e) { + return false; + } + + if ($response->getStatus() != 200) { + return false; + } + + return XRD::parse($response->getBody()); + } +} + +interface Discovery_LRDD +{ + public function discovery($uri); +} + +class Discovery_LRDD_Host_Meta implements Discovery_LRDD +{ + function discover($uri) + { + if (Discovery::isWebfinger($uri)) { + // We have a webfinger acct: - start with host-meta + list($name, $domain) = explode('@', $id); + } else { + $domain = @parse_url($uri, PHP_URL_HOST); + } + + $url = 'http://'. $domain .'/.well-known/host-meta'; + + $xrd = Discovery::fetchXrd($url); + + if ($xrd) { + if ($xrd->host != $domain) { + return false; + } + + return $xrd->links; + } + } +} + +class Discovery_LRDD_Link_Header implements Discovery_LRDD +{ + public function discover($uri) + { + try { + $client = new HTTPClient(); + $response = $client->get($url); + } catch (HTTP_Request2_Exception $e) { + return false; + } + + if ($response->getStatus() != 200) { + return false; + } + + $link_header = $response->getHeader('Link'); + if (!$link_header) { + return false; + } + + return Discovery_LRDD_Link_Header::parseHeader($header); + } + + protected static function parseHeader($header) + { + preg_match('/^<[^>]+>/', $header, $uri_reference); + if (empty($uri_reference)) return; + + $link_uri = trim($uri_reference[0], '<>'); + $link_rel = array(); + $link_type = null; + + // remove uri-reference from header + $header = substr($header, strlen($uri_reference[0])); + + // parse link-params + $params = explode($header, ';'); + + foreach ($params as $param) { + if (empty($param)) continue; + list($param_name, $param_value) = explode('=', $param, 2); + $param_name = trim($param_name); + $param_value = preg_replace('(^"|"$)', '', trim($param_value)); + + // for now we only care about 'rel' and 'type' link params + // TODO do something with the other links-params + switch ($param_name) { + case 'rel': + $link_rel = trim($param_value); + break; + + case 'type': + $link_type = trim($param_value); + } + } + + return array( + 'href' => $link_uri, + 'rel' => $link_rel, + 'type' => $link_type); + } +} + +class Discovery_LRDD_Link_HTML implements Discovery_LRDD +{ + public function discover($uri) + { + try { + $client = new HTTPClient(); + $response = $client->get($url); + } catch (HTTP_Request2_Exception $e) { + return false; + } + + if ($response->getStatus() != 200) { + return false; + } + + return Discovery_LRDD_Link_HTML::parse($response->getBody()); + } + + + public function parse($html) + { + $links = array(); + + preg_match('/]*)?>(.*?)<\/head>/is', $html, $head_matches); + $head_html = $head_matches[2]; + + preg_match_all('/]*>/i', $head_html, $link_matches); + + foreach ($link_matches[0] as $link_html) { + $link_url = null; + $link_rel = null; + $link_type = null; + + preg_match('/\srel=(("|\')([^\\2]*?)\\2|[^"\'\s]+)/i', $link_html, $rel_matches); + if ( isset($rel_matches[3]) ) { + $link_rel = $rel_matches[3]; + } else if ( isset($rel_matches[1]) ) { + $link_rel = $rel_matches[1]; + } + + preg_match('/\shref=(("|\')([^\\2]*?)\\2|[^"\'\s]+)/i', $link_html, $href_matches); + if ( isset($href_matches[3]) ) { + $link_uri = $href_matches[3]; + } else if ( isset($href_matches[1]) ) { + $link_uri = $href_matches[1]; + } + + preg_match('/\stype=(("|\')([^\\2]*?)\\2|[^"\'\s]+)/i', $link_html, $type_matches); + if ( isset($type_matches[3]) ) { + $link_type = $type_matches[3]; + } else if ( isset($type_matches[1]) ) { + $link_type = $type_matches[1]; + } + + $links[] = array( + 'href' => $link_url, + 'rel' => $link_rel, + 'type' => $link_type, + ); + } + + return $links; + } +} -- cgit v1.2.3-54-g00ecf From b2dabe6a48392cc65ec691ab5a52696994233dd5 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 25 Feb 2010 17:12:46 -0500 Subject: removing the webfinger lib --- plugins/OStatus/lib/webfinger.php | 151 -------------------------------------- 1 file changed, 151 deletions(-) delete mode 100644 plugins/OStatus/lib/webfinger.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/webfinger.php b/plugins/OStatus/lib/webfinger.php deleted file mode 100644 index 8a5037629..000000000 --- a/plugins/OStatus/lib/webfinger.php +++ /dev/null @@ -1,151 +0,0 @@ -. - * - * @package StatusNet - * @author James Walker - * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ - */ - -define('WEBFINGER_SERVICE_REL_VALUE', 'lrdd'); - -/** - * Implement the webfinger protocol. - */ - -class Webfinger -{ - 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); - list($name, $domain) = explode('@', $id); - - $links = $this->getServiceLinks($domain); - if (!$links) { - return false; - } - - $services = array(); - foreach ($links as $link) { - if ($link['template']) { - return $this->getServiceDescription($link['template'], $id); - } - if ($link['href']) { - return $this->getServiceDescription($link['href'], $id); - } - } - } - - /** - * Normalize an account ID - */ - function normalize($id) - { - if (substr($id, 0, 7) == 'acct://') { - return substr($id, 7); - } else if (substr($id, 0, 5) == 'acct:') { - return substr($id, 5); - } - - return $id; - } - - function getServiceLinks($domain) - { - $url = 'http://'. $domain .'/.well-known/host-meta'; - $content = $this->fetchURL($url); - if (empty($content)) { - common_log(LOG_DEBUG, 'Error fetching host-meta'); - return false; - } - $result = XRD::parse($content); - - // Ensure that the host == domain (spec may include signing later) - if ($result->host != $domain) { - return false; - } - - $links = array(); - foreach ($result->links as $link) { - if ($link['rel'] == WEBFINGER_SERVICE_REL_VALUE) { - $links[] = $link; - } - - } - return $links; - } - - function getServiceDescription($template, $id) - { - $url = $this->applyTemplate($template, 'acct:' . $id); - - $content = $this->fetchURL($url); - - if (!$content) { - return false; - } - - return XRD::parse($content); - } - - function fetchURL($url) - { - try { - $client = new HTTPClient(); - $response = $client->get($url); - } catch (HTTP_Request2_Exception $e) { - return false; - } - - if ($response->getStatus() != 200) { - return false; - } - - return $response->getBody(); - } - - function applyTemplate($template, $id) - { - $template = str_replace('{uri}', urlencode($id), $template); - - return $template; - } - - function getHostMeta($domain, $template) { - $xrd = new XRD(); - $xrd->host = $domain; - $xrd->links[] = array('rel' => 'lrdd', - 'template' => $template, - 'title' => array('Resource Descriptor')); - - return $xrd->toXML(); - } -} - -- cgit v1.2.3-54-g00ecf From bd90ef9f66ce281c4ef9af724d574a5ead156310 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 25 Feb 2010 17:26:10 -0500 Subject: replace webfinger usage in hostmeta.php --- plugins/OStatus/actions/hostmeta.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/hostmeta.php b/plugins/OStatus/actions/hostmeta.php index 850b8a0fe..85715ecf4 100644 --- a/plugins/OStatus/actions/hostmeta.php +++ b/plugins/OStatus/actions/hostmeta.php @@ -31,12 +31,18 @@ class HostMetaAction extends Action { parent::handle(); - $w = new Webfinger(); - - $domain = common_config('site', 'server'); $url = common_local_url('webfinger'); $url.= '?uri={uri}'; - print $w->getHostMeta($domain, $url); + + $xrd = new XRD(); + + $xrd = new XRD(); + $xrd->host = $domain; + $xrd->links[] = array('rel' => Discovery::LRDD_REL, + 'template' => $url, + 'title' => array('Resource Descriptor')); + + print $xrd->toXML(); } } -- cgit v1.2.3-54-g00ecf From 5ae64a7adbe7631be918f25eeda383f77b42b758 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 25 Feb 2010 17:34:56 -0500 Subject: moving references to Webfinger to Discovery --- plugins/OStatus/actions/ostatusinit.php | 4 ++-- plugins/OStatus/actions/webfinger.php | 6 +++--- plugins/OStatus/classes/Ostatus_profile.php | 8 ++++---- 3 files changed, 9 insertions(+), 9 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatusinit.php b/plugins/OStatus/actions/ostatusinit.php index 3f2f6368f..5c8575595 100644 --- a/plugins/OStatus/actions/ostatusinit.php +++ b/plugins/OStatus/actions/ostatusinit.php @@ -131,9 +131,9 @@ class OStatusInitAction extends Action function connectWebfinger($acct) { - $w = new Webfinger; + $disco = new Discovery; - $result = $w->lookup($acct); + $result = $disco->lookup($acct); if (!$result) { $this->clientError(_m("Couldn't look up OStatus account profile.")); } diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php index 34336a903..fa41b2444 100644 --- a/plugins/OStatus/actions/webfinger.php +++ b/plugins/OStatus/actions/webfinger.php @@ -40,7 +40,7 @@ class WebfingerAction extends Action function handle() { - $acct = Webfinger::normalize($this->uri); + $acct = Discovery::normalize($this->uri); $xrd = new XRD(); @@ -55,11 +55,11 @@ class WebfingerAction extends Action $xrd->subject = $this->uri; $xrd->alias[] = common_profile_url($nick); - $xrd->links[] = array('rel' => Webfinger::PROFILEPAGE, + $xrd->links[] = array('rel' => Discovery::PROFILEPAGE, 'type' => 'text/html', 'href' => common_profile_url($nick)); - $xrd->links[] = array('rel' => Webfinger::UPDATESFROM, + $xrd->links[] = array('rel' => Discovery::UPDATESFROM, 'href' => common_local_url('ApiTimelineUser', array('id' => $this->user->id, 'format' => 'atom')), diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index f23017077..0fec8fc43 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1328,9 +1328,9 @@ class Ostatus_profile extends Memcached_DataObject // Now, try some discovery - $wf = new Webfinger(); + $disco = new Discovery(); - $result = $wf->lookup($addr); + $result = $disco->lookup($addr); if (!$result) { return null; @@ -1338,13 +1338,13 @@ class Ostatus_profile extends Memcached_DataObject foreach ($result->links as $link) { switch ($link['rel']) { - case Webfinger::PROFILEPAGE: + case Discovery::PROFILEPAGE: $profileUrl = $link['href']; break; case 'salmon': $salmonEndpoint = $link['href']; break; - case Webfinger::UPDATESFROM: + case Discovery::UPDATESFROM: $feedUrl = $link['href']; break; default: -- cgit v1.2.3-54-g00ecf From 93f4f07c122613c0afd2257bd9e898629124178a Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 25 Feb 2010 17:52:18 -0500 Subject: moving webfinger action to xrdaction --- plugins/OStatus/OStatusPlugin.php | 4 +- plugins/OStatus/actions/hostmeta.php | 2 +- plugins/OStatus/actions/webfinger.php | 109 ---------------------------------- plugins/OStatus/actions/xrd.php | 109 ++++++++++++++++++++++++++++++++++ 4 files changed, 112 insertions(+), 112 deletions(-) delete mode 100644 plugins/OStatus/actions/webfinger.php create mode 100644 plugins/OStatus/actions/xrd.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 9a543df3b..91d055498 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -43,8 +43,8 @@ class OStatusPlugin extends Plugin // Discovery actions $m->connect('.well-known/host-meta', array('action' => 'hostmeta')); - $m->connect('main/webfinger', - array('action' => 'webfinger')); + $m->connect('main/xrd', + array('action' => 'xrd')); $m->connect('main/ostatus', array('action' => 'ostatusinit')); $m->connect('main/ostatus?nickname=:nickname', diff --git a/plugins/OStatus/actions/hostmeta.php b/plugins/OStatus/actions/hostmeta.php index 85715ecf4..3d00b98ae 100644 --- a/plugins/OStatus/actions/hostmeta.php +++ b/plugins/OStatus/actions/hostmeta.php @@ -32,7 +32,7 @@ class HostMetaAction extends Action parent::handle(); $domain = common_config('site', 'server'); - $url = common_local_url('webfinger'); + $url = common_local_url('xrd'); $url.= '?uri={uri}'; $xrd = new XRD(); diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php deleted file mode 100644 index fa41b2444..000000000 --- a/plugins/OStatus/actions/webfinger.php +++ /dev/null @@ -1,109 +0,0 @@ -. - */ - -/** - * @package OStatusPlugin - * @maintainer James Walker - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } - -class WebfingerAction extends Action -{ - - public $uri; - - function prepare($args) - { - parent::prepare($args); - - $this->uri = $this->trimmed('uri'); - - return true; - } - - function handle() - { - $acct = Discovery::normalize($this->uri); - - $xrd = new XRD(); - - list($nick, $domain) = explode('@', urldecode($acct)); - $nick = common_canonical_nickname($nick); - - $this->user = User::staticGet('nickname', $nick); - if (!$this->user) { - $this->clientError(_('No such user.'), 404); - return false; - } - - $xrd->subject = $this->uri; - $xrd->alias[] = common_profile_url($nick); - $xrd->links[] = array('rel' => Discovery::PROFILEPAGE, - 'type' => 'text/html', - 'href' => common_profile_url($nick)); - - $xrd->links[] = array('rel' => Discovery::UPDATESFROM, - 'href' => common_local_url('ApiTimelineUser', - array('id' => $this->user->id, - 'format' => 'atom')), - 'type' => 'application/atom+xml'); - - // hCard - $xrd->links[] = array('rel' => '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') . '?profile={uri}'; - $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe', - 'template' => $url ); - - header('Content-type: text/xml'); - print $xrd->toXML(); - } - -} diff --git a/plugins/OStatus/actions/xrd.php b/plugins/OStatus/actions/xrd.php new file mode 100644 index 000000000..cc5c70b08 --- /dev/null +++ b/plugins/OStatus/actions/xrd.php @@ -0,0 +1,109 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer James Walker + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +class XrdAction extends Action +{ + + public $uri; + + function prepare($args) + { + parent::prepare($args); + + $this->uri = $this->trimmed('uri'); + + return true; + } + + function handle() + { + $acct = Discovery::normalize($this->uri); + + $xrd = new XRD(); + + list($nick, $domain) = explode('@', substr(urldecode($acct), 5)); + $nick = common_canonical_nickname($nick); + + $this->user = User::staticGet('nickname', $nick); + if (!$this->user) { + $this->clientError(_('No such user.'), 404); + return false; + } + + $xrd->subject = $this->uri; + $xrd->alias[] = common_profile_url($nick); + $xrd->links[] = array('rel' => Discovery::PROFILEPAGE, + 'type' => 'text/html', + 'href' => common_profile_url($nick)); + + $xrd->links[] = array('rel' => Discovery::UPDATESFROM, + 'href' => common_local_url('ApiTimelineUser', + array('id' => $this->user->id, + 'format' => 'atom')), + 'type' => 'application/atom+xml'); + + // hCard + $xrd->links[] = array('rel' => '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($this->user->id); + } + + $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') . '?profile={uri}'; + $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe', + 'template' => $url ); + + header('Content-type: text/xml'); + print $xrd->toXML(); + } + +} -- cgit v1.2.3-54-g00ecf From 08413428a7f4613649be3d80fd393a12e33ffbc8 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 25 Feb 2010 17:52:56 -0500 Subject: typo --- plugins/OStatus/lib/discovery.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/discovery.php b/plugins/OStatus/lib/discovery.php index 1159f2151..8aba31328 100644 --- a/plugins/OStatus/lib/discovery.php +++ b/plugins/OStatus/lib/discovery.php @@ -146,12 +146,12 @@ class Discovery interface Discovery_LRDD { - public function discovery($uri); + public function discover($uri); } class Discovery_LRDD_Host_Meta implements Discovery_LRDD { - function discover($uri) + public function discover($uri) { if (Discovery::isWebfinger($uri)) { // We have a webfinger acct: - start with host-meta -- cgit v1.2.3-54-g00ecf From 6578e0e1afed8e8738bbcb31d200927e10074f11 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 25 Feb 2010 18:45:08 -0500 Subject: use new dedicated hcard method for Webfinger profile --- plugins/OStatus/actions/webfinger.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php index 34336a903..d3671962b 100644 --- a/plugins/OStatus/actions/webfinger.php +++ b/plugins/OStatus/actions/webfinger.php @@ -68,7 +68,7 @@ class WebfingerAction extends Action // hCard $xrd->links[] = array('rel' => 'http://microformats.org/profile/hcard', 'type' => 'text/html', - 'href' => common_profile_url($nick)); + 'href' => common_local_url('hcard', array('nickname' => $nick))); // XFN $xrd->links[] = array('rel' => 'http://gmpg.org/xfn/11', @@ -78,8 +78,8 @@ class WebfingerAction extends Action $xrd->links[] = array('rel' => 'describedby', 'type' => 'application/rdf+xml', 'href' => common_local_url('foaf', - array('nickname' => $nick))); - + array('nickname' => $nick))); + $salmon_url = common_local_url('salmon', array('id' => $this->user->id)); @@ -93,10 +93,10 @@ class WebfingerAction extends Action $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') . '?profile={uri}'; $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe', -- cgit v1.2.3-54-g00ecf From 45435a7c033d9c5acf0352bc44408667c5690198 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 26 Feb 2010 00:01:22 +0000 Subject: OStatus: if no available and no profileurl hint passed in, use object id if it's an HTTP(S) URL. Fixes profile link for Google accounts. --- plugins/OStatus/classes/Ostatus_profile.php | 2 ++ 1 file changed, 2 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index f23017077..86a3c9354 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1160,6 +1160,8 @@ class Ostatus_profile extends Memcached_DataObject $profile->profileurl = $object->link; } else if (array_key_exists('profileurl', $hints)) { $profile->profileurl = $hints['profileurl']; + } else if (Validate::uri($object->id, array('allowed_schemes' => array('http', 'https')))) { + $profile->profileurl = $object->id; } $profile->bio = self::getActivityObjectBio($object, $hints); -- cgit v1.2.3-54-g00ecf From 7922edb5b6c4ad55a1b81fa16c93e5656b676b26 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 25 Feb 2010 16:06:49 -0800 Subject: Add lots of fun avatars to our Atom output --- classes/Notice.php | 1 + lib/activity.php | 146 ++++++++++++++++++++++------ lib/atomnoticefeed.php | 5 + plugins/OStatus/classes/Ostatus_profile.php | 3 +- 4 files changed, 124 insertions(+), 31 deletions(-) (limited to 'plugins/OStatus') diff --git a/classes/Notice.php b/classes/Notice.php index 46c5ebb37..ac4640534 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1096,6 +1096,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:media' => 'http://purl.org/syndication/atommedia', 'xmlns:poco' => 'http://portablecontacts.net/spec/1.0', 'xmlns:ostatus' => 'http://ostatus.org/schema/1.0'); } else { diff --git a/lib/activity.php b/lib/activity.php index 30cdc5a56..0f30e8bf5 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -465,6 +465,57 @@ class ActivityUtils } } +// XXX: Arg! This wouldn't be necessary if we used Avatars conistently +class AvatarLink +{ + public $url; + public $type; + public $size; + public $width; + + static function fromAvatar($avatar) + { + if (empty($avatar)) { + return null; + } + $alink = new AvatarLink(); + $alink->type = $avatar->mediatype; + $alink->height = $avatar->mediatype; + $alink->width = $avatar->width; + $alink->url = $avatar->displayUrl(); + return $alink; + } + + static function fromFilename($filename, $size) + { + $alink = new AvatarLink(); + $alink->url = $filename; + $alink->height = $size; + if (!empty($filename)) { + $alink->width = $size; + $alink->type = self::mediatype($filename); + } else { + $alink->url = User_group::defaultLogo($size); + $alink->type = 'image/png'; + } + return $alink; + } + + // yuck! + static function mediatype($filename) { + $ext = strtolower(end(explode('.', $filename))); + if ($ext == 'jpeg') { + $ext = 'jpg'; + } + // hope we don't support any others + $types = array('png', 'gif', 'jpg', 'jpeg'); + if (in_array($ext, $types)) { + return 'image/' . $ext; + } + return null; + } +} + /** * A noun-ish thing in the activity universe * @@ -521,7 +572,7 @@ class ActivityObject public $content; public $link; public $source; - public $avatar; + public $avatarLinks = array(); public $geopoint; public $poco; public $displayName; @@ -641,13 +692,40 @@ class ActivityObject $object->id = $profile->getUri(); $object->title = $profile->getBestName(); $object->link = $profile->profileurl; - $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); - if ($avatar) { - $object->avatar = $avatar->displayUrl(); + + $orig = $profile->getOriginalAvatar(); + + if (!empty($orig)) { + $object->avatarLinks[] = AvatarLink::fromAvatar($orig); + } + + $sizes = array( + AVATAR_PROFILE_SIZE, + AVATAR_STREAM_SIZE, + AVATAR_MINI_SIZE + ); + + foreach ($sizes as $size) { + + $alink = null; + $avatar = $profile->getAvatar($size); + + if (!empty($avatar)) { + $alink = AvatarLink::fromAvatar($avatar); + } else { + $alink = new AvatarLink(); + $alink->type = 'image/png'; + $alink->height = $size; + $alink->width = $size; + $alink->url = Avatar::defaultImage($size); + } + + $object->avatarLinks[] = $alink; } if (isset($profile->lat) && isset($profile->lon)) { - $object->geopoint = (float)$profile->lat . ' ' . (float)$profile->lon; + $object->geopoint = (float)$profile->lat + . ' ' . (float)$profile->lon; } $object->poco = PoCo::fromProfile($profile); @@ -663,13 +741,28 @@ class ActivityObject $object->id = $group->getUri(); $object->title = $group->getBestName(); $object->link = $group->getUri(); - $object->avatar = $group->getAvatar(); + + $object->avatarLinks[] = AvatarLink::fromFilename( + $group->homepage_logo, + AVATAR_PROFILE_SIZE + ); + + $object->avatarLinks[] = AvatarLink::fromFilename( + $group->stream_logo, + AVATAR_STREAM_SIZE + ); + + $object->avatarLinks[] = AvatarLink::fromFilename( + $group->mini_logo, + AVATAR_MINI_SIZE + ); $object->poco = PoCo::fromGroup($group); return $object; } + function asString($tag='activity:object') { $xs = new XMLStringer(true); @@ -705,29 +798,21 @@ class ActivityObject ); } - if ($this->type == ActivityObject::PERSON) { - $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 - ), - null - ); - } - - // XXX: Gotta figure out mime-type! Gar. - - if ($this->type == ActivityObject::GROUP) { - $xs->element( - 'link', array( - 'rel' => 'avatar', - 'href' => $this->avatar - ), - null - ); + if ($this->type == ActivityObject::PERSON + || $this->type == ActivityObject::GROUP) { + + foreach ($this->avatarLinks as $avatar) { + $xs->element( + 'link', array( + 'rel' => 'avatar', + 'type' => $avatar->type, + 'media:width' => $avatar->width, + 'media:height' => $avatar->height, + 'href' => $avatar->url + ), + null + ); + } } if (!empty($this->geopoint)) { @@ -1038,7 +1123,8 @@ class Activity 'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/', 'xmlns:georss' => 'http://www.georss.org/georss', 'xmlns:ostatus' => 'http://ostatus.org/schema/1.0', - 'xmlns:poco' => 'http://portablecontacts.net/spec/1.0'); + 'xmlns:poco' => 'http://portablecontacts.net/spec/1.0', + 'xmlns:media' => 'http://purl.org/syndication/atommedia'); } else { $attrs = array(); } diff --git a/lib/atomnoticefeed.php b/lib/atomnoticefeed.php index d2bf2a416..3c3556cb9 100644 --- a/lib/atomnoticefeed.php +++ b/lib/atomnoticefeed.php @@ -64,6 +64,11 @@ class AtomNoticeFeed extends Atom10Feed 'http://activitystrea.ms/spec/1.0/' ); + $this->addNamespace( + 'media', + 'http://purl.org/syndication/atommedia' + ); + $this->addNamespace( 'poco', 'http://portablecontacts.net/spec/1.0' diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index f23017077..7026d82f2 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -401,7 +401,8 @@ class Ostatus_profile extends Memcached_DataObject 'xmlns:thr' => 'http://purl.org/syndication/thread/1.0', 'xmlns:georss' => 'http://www.georss.org/georss', 'xmlns:ostatus' => 'http://ostatus.org/schema/1.0', - 'xmlns:poco' => 'http://portablecontacts.net/spec/1.0'); + 'xmlns:poco' => 'http://portablecontacts.net/spec/1.0', + 'xmlns:media' => 'http://purl.org/syndication/atommedia'); $entry = new XMLStringer(); $entry->elementStart('entry', $attributes); -- cgit v1.2.3-54-g00ecf From 36f02f459b27a81e7017e3bb60b201677fd15a30 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 25 Feb 2010 19:11:39 -0500 Subject: add hkit for hCard parsing --- plugins/OStatus/extlib/hkit/hcard.profile.php | 105 ++++++ plugins/OStatus/extlib/hkit/hkit.class.php | 475 ++++++++++++++++++++++++++ 2 files changed, 580 insertions(+) create mode 100644 plugins/OStatus/extlib/hkit/hcard.profile.php create mode 100644 plugins/OStatus/extlib/hkit/hkit.class.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/extlib/hkit/hcard.profile.php b/plugins/OStatus/extlib/hkit/hcard.profile.php new file mode 100644 index 000000000..6ec0dc890 --- /dev/null +++ b/plugins/OStatus/extlib/hkit/hcard.profile.php @@ -0,0 +1,105 @@ +root_class = 'vcard'; + + $this->classes = array( + 'fn', array('honorific-prefix', 'given-name', 'additional-name', 'family-name', 'honorific-suffix'), + 'n', array('honorific-prefix', 'given-name', 'additional-name', 'family-name', 'honorific-suffix'), + 'adr', array('post-office-box', 'extended-address', 'street-address', 'postal-code', 'country-name', 'type', 'region', 'locality'), + 'label', 'bday', 'agent', 'nickname', 'photo', 'class', + 'email', array('type', 'value'), + 'category', 'key', 'logo', 'mailer', 'note', + 'org', array('organization-name', 'organization-unit'), + 'tel', array('type', 'value'), + 'geo', array('latitude', 'longitude'), + 'tz', 'uid', 'url', 'rev', 'role', 'sort-string', 'sound', 'title' + ); + + // classes that must only appear once per card + $this->singles = array( + 'fn' + ); + + // classes that are required (not strictly enforced - give at least one!) + $this->required = array( + 'fn' + ); + + $this->att_map = array( + 'fn' => array('IMG|alt'), + 'url' => array('A|href', 'IMG|src', 'AREA|href'), + 'photo' => array('IMG|src'), + 'bday' => array('ABBR|title'), + 'logo' => array('IMG|src'), + 'email' => array('A|href'), + 'geo' => array('ABBR|title') + ); + + + $this->callbacks = array( + 'url' => array($this, 'resolvePath'), + 'photo' => array($this, 'resolvePath'), + 'logo' => array($this, 'resolvePath'), + 'email' => array($this, 'resolveEmail') + ); + + + + function hKit_hcard_post($a) + { + + foreach ($a as &$vcard){ + + hKit_implied_n_optimization($vcard); + hKit_implied_n_from_fn($vcard); + + } + + return $a; + + } + + + function hKit_implied_n_optimization(&$vcard) + { + if (array_key_exists('fn', $vcard) && !is_array($vcard['fn']) && + !array_key_exists('n', $vcard) && (!array_key_exists('org', $vcard) || $vcard['fn'] != $vcard['org'])){ + + if (sizeof(explode(' ', $vcard['fn'])) == 2){ + $patterns = array(); + $patterns[] = array('/^(\S+),\s*(\S{1})$/', 2, 1); // Lastname, Initial + $patterns[] = array('/^(\S+)\s*(\S{1})\.*$/', 2, 1); // Lastname Initial(.) + $patterns[] = array('/^(\S+),\s*(\S+)$/', 2, 1); // Lastname, Firstname + $patterns[] = array('/^(\S+)\s*(\S+)$/', 1, 2); // Firstname Lastname + + foreach ($patterns as $pattern){ + if (preg_match($pattern[0], $vcard['fn'], $matches) === 1){ + $n = array(); + $n['given-name'] = $matches[$pattern[1]]; + $n['family-name'] = $matches[$pattern[2]]; + $vcard['n'] = $n; + + + break; + } + } + } + } + } + + + function hKit_implied_n_from_fn(&$vcard) + { + if (array_key_exists('fn', $vcard) && is_array($vcard['fn']) + && !array_key_exists('n', $vcard) && (!array_key_exists('org', $vcard) || $vcard['fn'] != $vcard['org'])){ + + $vcard['n'] = $vcard['fn']; + } + + if (array_key_exists('fn', $vcard) && is_array($vcard['fn'])){ + $vcard['fn'] = $vcard['fn']['text']; + } + } + +?> \ No newline at end of file diff --git a/plugins/OStatus/extlib/hkit/hkit.class.php b/plugins/OStatus/extlib/hkit/hkit.class.php new file mode 100644 index 000000000..c3a54cff6 --- /dev/null +++ b/plugins/OStatus/extlib/hkit/hkit.class.php @@ -0,0 +1,475 @@ +' . implode(', ', $missing) . ''); + + } + + + public function getByURL($profile='', $url='') + { + + if ($profile=='' || $url == '') return false; + + $this->loadProfile($profile); + + $source = $this->loadURL($url); + + if ($source){ + $tidy_xhtml = $this->tidyThis($source); + + $fragment = false; + + if (strrchr($url, '#')) + $fragment = array_pop(explode('#', $url)); + + $doc = $this->loadDoc($tidy_xhtml, $fragment); + $s = $this->processNodes($doc, $this->classes); + $s = $this->postProcess($profile, $s); + + return $s; + }else{ + return false; + } + } + + public function getByString($profile='', $input_xml='') + { + if ($profile=='' || $input_xml == '') return false; + + $this->loadProfile($profile); + + $doc = $this->loadDoc($input_xml); + $s = $this->processNodes($doc, $this->classes); + $s = $this->postProcess($profile, $s); + + return $s; + + } + + private function processNodes($items, $classes, $allow_includes=true){ + + $out = array(); + + foreach($items as $item){ + $data = array(); + + for ($i=0; $ixpath($xpath); + + if ($results){ + foreach ($results as $result){ + if (isset($classes[$i+1]) && is_array($classes[$i+1])){ + $nodes = $this->processNodes($results, $classes[$i+1]); + if (sizeof($nodes) > 0){ + $nodes = array_merge(array('text'=>$this->getNodeValue($result, $classes[$i])), $nodes); + $data[$classes[$i]] = $nodes; + }else{ + $data[$classes[$i]] = $this->getNodeValue($result, $classes[$i]); + } + + }else{ + if (isset($data[$classes[$i]])){ + if (is_array($data[$classes[$i]])){ + // is already an array - append + $data[$classes[$i]][] = $this->getNodeValue($result, $classes[$i]); + + }else{ + // make it an array + if ($classes[$i] == 'value'){ // unless it's the 'value' of a type/value pattern + $data[$classes[$i]] .= $this->getNodeValue($result, $classes[$i]); + }else{ + $old_val = $data[$classes[$i]]; + $data[$classes[$i]] = array($old_val, $this->getNodeValue($result, $classes[$i])); + $old_val = false; + } + } + }else{ + // set as normal value + $data[$classes[$i]] = $this->getNodeValue($result, $classes[$i]); + + } + } + + // td@headers pattern + if (strtoupper(dom_import_simplexml($result)->tagName)== "TD" && $result['headers']){ + $include_ids = explode(' ', $result['headers']); + $doc = $this->doc; + foreach ($include_ids as $id){ + $xpath = "//*[@id='$id']/.."; + $includes = $doc->xpath($xpath); + foreach ($includes as $include){ + $tmp = $this->processNodes($include, $this->classes); + if (is_array($tmp)) $data = array_merge($data, $tmp); + } + } + } + } + } + } + $result = false; + } + + // include-pattern + if ($allow_includes){ + $xpath = ".//*[contains(concat(' ',normalize-space(@class),' '),' include ')]"; + $results = $item->xpath($xpath); + + if ($results){ + foreach ($results as $result){ + $tagName = strtoupper(dom_import_simplexml($result)->tagName); + if ((($tagName == "OBJECT" && $result['data']) || ($tagName == "A" && $result['href'])) + && preg_match('/\binclude\b/', $result['class'])){ + $att = ($tagName == "OBJECT" ? 'data' : 'href'); + $id = str_replace('#', '', $result[$att]); + $doc = $this->doc; + $xpath = "//*[@id='$id']"; + $includes = $doc->xpath($xpath); + foreach ($includes as $include){ + $include = simplexml_load_string(''.$include->asXML().''); // don't ask. + $tmp = $this->processNodes($include, $this->classes, false); + if (is_array($tmp)) $data = array_merge($data, $tmp); + } + } + } + } + } + $out[] = $data; + } + + if (sizeof($out) > 1){ + return $out; + }else if (isset($data)){ + return $data; + }else{ + return array(); + } + } + + + private function getNodeValue($node, $className) + { + + $tag_name = strtoupper(dom_import_simplexml($node)->tagName); + $s = false; + + // ignore DEL tags + if ($tag_name == 'DEL') return $s; + + // look up att map values + if (array_key_exists($className, $this->att_map)){ + + foreach ($this->att_map[$className] as $map){ + if (preg_match("/$tag_name\|/", $map)){ + $s = ''.$node[array_pop($foo = explode('|', $map))]; + } + } + } + + // if nothing and OBJ, try data. + if (!$s && $tag_name=='OBJECT' && $node['data']) $s = ''.$node['data']; + + // if nothing and IMG, try alt. + if (!$s && $tag_name=='IMG' && $node['alt']) $s = ''.$node['alt']; + + // if nothing and AREA, try alt. + if (!$s && $tag_name=='AREA' && $node['alt']) $s = ''.$node['alt']; + + //if nothing and not A, try title. + if (!$s && $tag_name!='A' && $node['title']) $s = ''.$node['title']; + + + // if nothing found, go with node text + $s = ($s ? $s : implode(array_filter($node->xpath('child::node()'), array(&$this, "filterBlankValues")), ' ')); + + // callbacks + if (array_key_exists($className, $this->callbacks)){ + $s = preg_replace_callback('/.*/', $this->callbacks[$className], $s, 1); + } + + // trim and remove line breaks + if ($tag_name != 'PRE'){ + $s = trim(preg_replace('/[\r\n\t]+/', '', $s)); + $s = trim(preg_replace('/(\s{2})+/', ' ', $s)); + } + + return $s; + } + + private function filterBlankValues($s){ + return preg_match("/\w+/", $s); + } + + + private function tidyThis($source) + { + switch ( $this->tidy_mode ) + { + case 'exec': + $tmp_file = $this->tmp_dir.md5($source).'.txt'; + file_put_contents($tmp_file, $source); + exec("tidy -utf8 -indent -asxhtml -numeric -bare -quiet $tmp_file", $tidy); + unlink($tmp_file); + return implode("\n", $tidy); + break; + + case 'php': + $tidy = tidy_parse_string($source); + return tidy_clean_repair($tidy); + break; + + default: + return $source; + break; + } + + } + + + private function loadProfile($profile) + { + require_once("$profile.profile.php"); + } + + + private function loadDoc($input_xml, $fragment=false) + { + $xml = simplexml_load_string($input_xml); + + $this->doc = $xml; + + if ($fragment){ + $doc = $xml->xpath("//*[@id='$fragment']"); + $xml = simplexml_load_string($doc[0]->asXML()); + $doc = null; + } + + // base tag + if ($xml->head->base['href']) $this->base = $xml->head->base['href']; + + // xml:base attribute - PITA with SimpleXML + preg_match('/xml:base="(.*)"/', $xml->asXML(), $matches); + if (is_array($matches) && sizeof($matches)>1) $this->base = $matches[1]; + + return $xml->xpath("//*[contains(concat(' ',normalize-space(@class),' '),' $this->root_class ')]"); + + } + + + private function loadURL($url) + { + $this->url = $url; + + if ($this->tidy_mode == 'proxy' && $this->tidy_proxy != ''){ + $url = $this->tidy_proxy . $url; + } + + return @file_get_contents($url); + + } + + + private function postProcess($profile, $s) + { + $required = $this->required; + + if (is_array($s) && array_key_exists($required[0], $s)){ + $s = array($s); + } + + $s = $this->dedupeSingles($s); + + if (function_exists('hKit_'.$profile.'_post')){ + $s = call_user_func('hKit_'.$profile.'_post', $s); + } + + $s = $this->removeTextVals($s); + + return $s; + } + + + private function resolvePath($filepath) + { // ugly code ahoy: needs a serious tidy up + + $filepath = $filepath[0]; + + $base = $this->base; + $url = $this->url; + + if ($base != '' && strpos($base, '://') !== false) + $url = $base; + + $r = parse_url($url); + $domain = $r['scheme'] . '://' . $r['host']; + + if (!isset($r['path'])) $r['path'] = '/'; + $path = explode('/', $r['path']); + $file = explode('/', $filepath); + $new = array(''); + + if (strpos($filepath, '://') !== false || strpos($filepath, 'data:') !== false){ + return $filepath; + } + + if ($file[0] == ''){ + // absolute path + return ''.$domain . implode('/', $file); + }else{ + // relative path + if ($path[sizeof($path)-1] == '') array_pop($path); + if (strpos($path[sizeof($path)-1], '.') !== false) array_pop($path); + + foreach ($file as $segment){ + if ($segment == '..'){ + array_pop($path); + }else{ + $new[] = $segment; + } + } + return ''.$domain . implode('/', $path) . implode('/', $new); + } + } + + private function resolveEmail($v) + { + $parts = parse_url($v[0]); + return ($parts['path']); + } + + + private function dedupeSingles($s) + { + $singles = $this->singles; + + foreach ($s as &$item){ + foreach ($singles as $classname){ + if (array_key_exists($classname, $item) && is_array($item[$classname])){ + if (isset($item[$classname][0])) $item[$classname] = $item[$classname][0]; + } + } + } + + return $s; + } + + private function removeTextVals($s) + { + foreach ($s as $key => &$val){ + if ($key){ + $k = $key; + }else{ + $k = ''; + } + + if (is_array($val)){ + $val = $this->removeTextVals($val); + }else{ + if ($k == 'text'){ + $val = ''; + } + } + } + + return array_filter($s); + } + + } + + +?> \ No newline at end of file -- cgit v1.2.3-54-g00ecf From cc0670791ef07826055b461e10e64d65ec9e6547 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 25 Feb 2010 19:58:18 -0500 Subject: use new hcard method for webfinger --- plugins/OStatus/actions/webfinger.php | 2 +- plugins/OStatus/lib/webfinger.php | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php index d3671962b..e292ccec9 100644 --- a/plugins/OStatus/actions/webfinger.php +++ b/plugins/OStatus/actions/webfinger.php @@ -66,7 +66,7 @@ class WebfingerAction extends Action 'type' => 'application/atom+xml'); // hCard - $xrd->links[] = array('rel' => 'http://microformats.org/profile/hcard', + $xrd->links[] = array('rel' => Webfinger::HCARD, 'type' => 'text/html', 'href' => common_local_url('hcard', array('nickname' => $nick))); diff --git a/plugins/OStatus/lib/webfinger.php b/plugins/OStatus/lib/webfinger.php index 8a5037629..8d7040310 100644 --- a/plugins/OStatus/lib/webfinger.php +++ b/plugins/OStatus/lib/webfinger.php @@ -37,6 +37,7 @@ class Webfinger { const PROFILEPAGE = 'http://webfinger.net/rel/profile-page'; const UPDATESFROM = 'http://schemas.google.com/g/2010#updates-from'; + const HCARD = 'http://microformats.org/profile/hcard'; /** * Perform a webfinger lookup given an account. -- cgit v1.2.3-54-g00ecf From 894b221e8aec57768d6804ee3bf53c85196e09bf Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 25 Feb 2010 19:58:51 -0500 Subject: Parse an hcard for hints, if available --- plugins/OStatus/classes/Ostatus_profile.php | 119 ++++++++++++++++++++++++---- 1 file changed, 104 insertions(+), 15 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index f23017077..2d517ed22 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -644,7 +644,6 @@ class Ostatus_profile extends Memcached_DataObject 'groups' => array(), 'tags' => array()); - // Check for optional attributes... if (!empty($activity->time)) { @@ -1155,7 +1154,13 @@ class Ostatus_profile extends Memcached_DataObject $orig = clone($profile); $profile->nickname = self::getActivityObjectNickname($object, $hints); - $profile->fullname = $object->title; + + if (!empty($object->title)) { + $profile->fullname = $object->title; + } else if (array_key_exists('fullname', $hints)) { + $profile->fullname = $hints['fullname']; + } + if (!empty($object->link)) { $profile->profileurl = $object->link; } else if (array_key_exists('profileurl', $hints)) { @@ -1228,12 +1233,16 @@ class Ostatus_profile extends Memcached_DataObject { $location = null; - if (!empty($object->poco)) { - if (isset($object->poco->address->formatted)) { - $location = $object->poco->address->formatted; - if (mb_strlen($location) > 255) { - $location = mb_substr($note, 0, 255 - 3) . ' … '; - } + if (!empty($object->poco) && + isset($object->poco->address->formatted)) { + $location = $object->poco->address->formatted; + } else if (array_key_exists('location', $hints)) { + $location = $hints['location']; + } + + if (!empty($location)) { + if (mb_strlen($location) > 255) { + $location = mb_substr($note, 0, 255 - 3) . ' … '; } } @@ -1248,13 +1257,16 @@ class Ostatus_profile extends Memcached_DataObject if (!empty($object->poco)) { $note = $object->poco->note; - if (!empty($note)) { - if (mb_strlen($note) > Profile::maxBio()) { - // XXX: truncate ok? - $bio = mb_substr($note, 0, Profile::maxBio() - 3) . ' … '; - } else { - $bio = $note; - } + } else if (array_key_exists('bio', $hints)) { + $note = $hints['bio']; + } + + if (!empty($note)) { + if (Profile::bioTooLong($note)) { + // XXX: truncate ok? + $bio = mb_substr($note, 0, Profile::maxBio() - 3) . ' … '; + } else { + $bio = $note; } } @@ -1270,10 +1282,15 @@ class Ostatus_profile extends Memcached_DataObject return common_nicknamize($object->poco->preferredUsername); } } + if (!empty($object->nickname)) { return common_nicknamize($object->nickname); } + if (array_key_exists('nickname', $hints)) { + return $hints['nickname']; + } + // Try the definitive ID $nickname = self::nicknameFromURI($object->id); @@ -1347,6 +1364,9 @@ class Ostatus_profile extends Memcached_DataObject case Webfinger::UPDATESFROM: $feedUrl = $link['href']; break; + case Webfinger::HCARD: + $hcardUrl = $link['href']; + break; default: common_log(LOG_NOTICE, "Don't know what to do with rel = '{$link['rel']}'"); break; @@ -1358,6 +1378,12 @@ class Ostatus_profile extends Memcached_DataObject 'feedurl' => $feedUrl, 'salmon' => $salmonEndpoint); + if (isset($hcardUrl)) { + $hcardHints = self::slurpHcard($hcardUrl); + // Note: Webfinger > hcard + $hints = array_merge($hcardHints, $hints); + } + // If we got a feed URL, try that if (isset($feedUrl)) { @@ -1464,4 +1490,67 @@ class Ostatus_profile extends Memcached_DataObject return $file; } + + protected static function slurpHcard($url) + { + set_include_path(get_include_path() . PATH_SEPARATOR . INSTALLDIR . '/plugins/OStatus/extlib/hkit/'); + require_once('hkit.class.php'); + + $h = new hKit; + + // Google Buzz hcards need to be tidied. Probably others too. + + $h->tidy_mode = 'proxy'; // 'proxy', 'exec', 'php' or 'none' + + // Get by URL + $hcards = $h->getByURL('hcard', $url); + + if (empty($hcards)) { + return array(); + } + + // @fixme more intelligent guess on multi-hcard pages + $hcard = $hcards[0]; + + $hints = array(); + + $hints['profileurl'] = $url; + + if (array_key_exists('nickname', $hcard)) { + $hints['nickname'] = $hcard['nickname']; + } + + if (array_key_exists('fn', $hcard)) { + $hints['fullname'] = $hcard['fn']; + } else if (array_key_exists('n', $hcard)) { + $hints['fullname'] = implode(' ', $hcard['n']); + } + + if (array_key_exists('photo', $hcard)) { + $hints['avatar'] = $hcard['photo']; + } + + if (array_key_exists('note', $hcard)) { + $hints['bio'] = $hcard['note']; + } + + if (array_key_exists('adr', $hcard)) { + if (is_string($hcard['adr'])) { + $hints['location'] = $hcard['adr']; + } else if (is_array($hcard['adr'])) { + $hints['location'] = implode(' ', $hcard['adr']); + } + } + + if (array_key_exists('url', $hcard)) { + if (is_string($hcard['url'])) { + $hints['homepage'] = $hcard['url']; + } else if (is_array($hcard['adr'])) { + // HACK get the last one; that's how our hcards look + $hints['homepage'] = $hcard['url'][count($hcard['url'])-1]; + } + } + + return $hints; + } } -- cgit v1.2.3-54-g00ecf From c693365ae7a27f82afef1765610c41a4bff33726 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 25 Feb 2010 20:29:52 -0500 Subject: cache results of webfinger lookups --- plugins/OStatus/classes/Ostatus_profile.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 8ca28432b..ad9170f5b 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1338,11 +1338,26 @@ class Ostatus_profile extends Memcached_DataObject public static function ensureWebfinger($addr) { + // First, try the cache + + $uri = self::cacheGet(sprintf('ostatus_profile:webfinger:%s', $addr)); + + if ($uri !== false) { + if (is_null($uri)) { + return null; + } + $oprofile = Ostatus_profile::staticGet('uri', $uri); + if (!empty($oprofile)) { + return $oprofile; + } + } + // First, look it up $oprofile = Ostatus_profile::staticGet('uri', 'acct:'.$addr); if (!empty($oprofile)) { + self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); return $oprofile; } @@ -1353,6 +1368,7 @@ class Ostatus_profile extends Memcached_DataObject $result = $wf->lookup($addr); if (!$result) { + self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), null); return null; } @@ -1392,6 +1408,7 @@ class Ostatus_profile extends Memcached_DataObject if (isset($feedUrl)) { try { $oprofile = self::ensureProfile($feedUrl, $hints); + self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); return $oprofile; } catch (Exception $e) { common_log(LOG_WARNING, "Failed creating profile from feed URL '$feedUrl': " . $e->getMessage()); @@ -1404,6 +1421,7 @@ class Ostatus_profile extends Memcached_DataObject if (isset($profileUrl)) { try { $oprofile = self::ensureProfile($profileUrl, $hints); + self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); return $oprofile; } catch (Exception $e) { common_log(LOG_WARNING, "Failed creating profile from profile URL '$profileUrl': " . $e->getMessage()); @@ -1455,6 +1473,7 @@ class Ostatus_profile extends Memcached_DataObject throw new Exception("Couldn't save ostatus_profile for '$addr'"); } + self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); return $oprofile; } -- cgit v1.2.3-54-g00ecf From a43598c31ecee2ca77d8c686382c29ee5a0d42b1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 25 Feb 2010 21:07:24 -0500 Subject: cache Web responses in Webfinger library --- plugins/OStatus/lib/webfinger.php | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/webfinger.php b/plugins/OStatus/lib/webfinger.php index 8d7040310..4b777c9a0 100644 --- a/plugins/OStatus/lib/webfinger.php +++ b/plugins/OStatus/lib/webfinger.php @@ -81,11 +81,14 @@ class Webfinger function getServiceLinks($domain) { $url = 'http://'. $domain .'/.well-known/host-meta'; + $content = $this->fetchURL($url); + if (empty($content)) { common_log(LOG_DEBUG, 'Error fetching host-meta'); return false; } + $result = XRD::parse($content); // Ensure that the host == domain (spec may include signing later) @@ -119,6 +122,11 @@ class Webfinger function fetchURL($url) { try { + $c = Cache::instance(); + $content = $c->get('webfinger:url:'.$url); + if ($content !== false) { + return $content; + } $client = new HTTPClient(); $response = $client->get($url); } catch (HTTP_Request2_Exception $e) { @@ -129,7 +137,11 @@ class Webfinger return false; } - return $response->getBody(); + $body = $response->getBody(); + + $c->set('webfinger:url:'.$url, $body); + + return $body; } function applyTemplate($template, $id) -- cgit v1.2.3-54-g00ecf From e197208a4a2ab742df481968e30cd99678be96ad Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 25 Feb 2010 21:07:52 -0500 Subject: info about discovery in Ostatus_profile::ensureWebfinger() --- plugins/OStatus/classes/Ostatus_profile.php | 2 ++ 1 file changed, 2 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index ad9170f5b..26d776d52 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1407,6 +1407,7 @@ class Ostatus_profile extends Memcached_DataObject if (isset($feedUrl)) { try { + common_log(LOG_INFO, "Discovery on acct:$addr with feed URL $feedUrl"); $oprofile = self::ensureProfile($feedUrl, $hints); self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); return $oprofile; @@ -1420,6 +1421,7 @@ class Ostatus_profile extends Memcached_DataObject if (isset($profileUrl)) { try { + common_log(LOG_INFO, "Discovery on acct:$addr with profile URL $profileUrl"); $oprofile = self::ensureProfile($profileUrl, $hints); self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri); return $oprofile; -- cgit v1.2.3-54-g00ecf From 2feb09f4346e54805f68a9f677f5a94340875d8e Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 25 Feb 2010 18:51:44 -0800 Subject: OStatus: pull best-sized avatar image (96x96 if found, otherwise largest, otherwise if none labeled takes the first) --- lib/activity.php | 43 +++++++++++++++++++++++++++-- plugins/OStatus/classes/Ostatus_profile.php | 16 +++++++++-- 2 files changed, 55 insertions(+), 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/lib/activity.php b/lib/activity.php index 0f30e8bf5..b64a82f0a 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -360,6 +360,25 @@ class ActivityUtils return null; } + static function getLinks(DOMNode $element, $rel, $type=null) + { + $links = $element->getElementsByTagnameNS(self::ATOM, self::LINK); + $out = array(); + + foreach ($links as $link) { + + $linkRel = $link->getAttribute(self::REL); + $linkType = $link->getAttribute(self::TYPE); + + if ($linkRel == $rel && + (is_null($type) || $linkType == $type)) { + $out[] = $link; + } + } + + return $out; + } + /** * Gets the first child element with the given tag * @@ -472,6 +491,24 @@ class AvatarLink public $type; public $size; public $width; + public $height; + + function __construct($element=null) + { + if ($element) { + // @fixme use correct namespaces + $this->url = $element->getAttribute('href'); + $this->type = $element->getAttribute('type'); + $width = $element->getAttribute('media:width'); + if ($width != null) { + $this->width = intval($width); + } + $height = $element->getAttribute('media:height'); + if ($height != null) { + $this->height = intval($height); + } + } + } static function fromAvatar($avatar) { @@ -640,8 +677,10 @@ class ActivityObject 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'); + $avatars = ActivityUtils::getLinks($element, 'avatar'); + foreach ($avatars as $link) { + $this->avatarLinks[] = new AvatarLink($link); + } $this->poco = new PoCo($element); } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index ad9170f5b..9b7be4e9a 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -912,8 +912,20 @@ class Ostatus_profile extends Memcached_DataObject protected static function getActivityObjectAvatar($object, $hints=array()) { - if ($object->avatar) { - return $object->avatar; + if ($object->avatarLinks) { + $best = false; + // Take the exact-size avatar, or the largest avatar, or the first avatar if all sizeless + foreach ($object->avatarLinks as $avatar) { + if ($avatar->width == AVATAR_PROFILE_SIZE && $avatar->height = AVATAR_PROFILE_SIZE) { + // Exact match! + $best = $avatar; + break; + } + if (!$best || $avatar->width > $best->width) { + $best = $avatar; + } + } + return $best->url; } else if (array_key_exists('avatar', $hints)) { return $hints['avatar']; } -- cgit v1.2.3-54-g00ecf From d8d8d59a03ef3fa12a0ea668b4a2f383f80486dc Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 25 Feb 2010 18:55:11 -0800 Subject: - Updates to use new activity object factories - Prune obsolete feed creation method --- plugins/OStatus/classes/Ostatus_profile.php | 104 ++-------------------------- 1 file changed, 5 insertions(+), 99 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index ad9170f5b..c3ea042ff 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -150,27 +150,7 @@ class Ostatus_profile extends Memcached_DataObject function asActivityObject() { if ($this->isGroup()) { - $object = new ActivityObject(); - $object->type = 'http://activitystrea.ms/schema/1.0/group'; - $object->id = $this->uri; - $self = $this->localGroup(); - - // @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($object->avatar, PHP_URL_PATH), PATHINFO_EXTENSION); - if (isset($map[$extension])) { - // @fixme this ain't used/saved yet - $object->avatarType = $map[$extension]; - } - } - - $object->link = $this->uri; // @fixme accurate? - return $object; + return ActivityObject::fromGroup($this->localGroup()); } else { return ActivityObject::fromProfile($this->localProfile()); } @@ -189,57 +169,13 @@ class Ostatus_profile extends Memcached_DataObject */ function asActivityNoun($element) { - $xs = new XMLStringer(true); - $avatarHref = Avatar::defaultImage(AVATAR_PROFILE_SIZE); - $avatarType = 'image/png'; if ($this->isGroup()) { - $type = 'http://activitystrea.ms/schema/1.0/group'; - $self = $this->localGroup(); - - // @fixme put a standard getAvatar() interface on groups too - if ($self->homepage_logo) { - $avatarHref = $self->homepage_logo; - $map = array('png' => 'image/png', - 'jpg' => 'image/jpeg', - 'jpeg' => 'image/jpeg', - 'gif' => 'image/gif'); - $extension = pathinfo(parse_url($avatarHref, PHP_URL_PATH), PATHINFO_EXTENSION); - if (isset($map[$extension])) { - $avatarType = $map[$extension]; - } - } + $noun = ActivityObject::fromGroup($this->localGroup()); + return $noun->asString('activity:' . $element); } else { - $type = 'http://activitystrea.ms/schema/1.0/person'; - $self = $this->localProfile(); - $avatar = $self->getAvatar(AVATAR_PROFILE_SIZE); - if ($avatar) { - $avatarHref = $avatar->url; - $avatarType = $avatar->mediatype; - } + $noun = ActivityObject::fromProfile($this->localProfile()); + return $noun->asString('activity:' . $element); } - $xs->elementStart('activity:' . $element); - $xs->element( - 'activity:object-type', - null, - $type - ); - $xs->element( - 'id', - null, - $this->uri); // ? - $xs->element('title', null, $self->getBestName()); - - $xs->element( - 'link', array( - 'type' => $avatarType, - 'href' => $avatarHref - ), - '' - ); - - $xs->elementEnd('activity:' . $element); - - return $xs->getString(); } /** @@ -486,36 +422,6 @@ class Ostatus_profile extends Memcached_DataObject } } - function atomFeed($actor) - { - $feed = new Atom10Feed(); - // @fixme should these be set up somewhere else? - $feed->addNamespace('activity', 'http://activitystrea.ms/spec/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'); - - $taguribase = common_config('integration', 'taguri'); - $feed->setId("tag:{$taguribase}:UserTimeline:{$actor->id}"); // ??? - - $feed->setTitle($actor->getBestName() . ' timeline'); // @fixme - $feed->setUpdated(time()); - $feed->setPublished(time()); - - $feed->addLink(common_local_url('ApiTimelineUser', - array('id' => $actor->id, - 'type' => 'atom')), - array('rel' => 'self', - 'type' => 'application/atom+xml')); - - $feed->addLink(common_local_url('userbyid', - array('id' => $actor->id)), - array('rel' => 'alternate', - 'type' => 'text/html')); - - return $feed; - } - /** * Read and post notices for updates from the feed. * Currently assumes that all items in the feed are new, -- cgit v1.2.3-54-g00ecf From 2528bb452b4ed27cc8685f5c8d900fe0742ef229 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 25 Feb 2010 19:48:28 -0800 Subject: OStatus: clean up known-URL hinting during profile setup, saves some extra HTTP hits we were getting when mentioning Buzz feeds. --- plugins/OStatus/classes/Ostatus_profile.php | 82 +++++++++++++++-------------- 1 file changed, 43 insertions(+), 39 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 75b4bef41..c462fead6 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -791,11 +791,18 @@ class Ostatus_profile extends Memcached_DataObject { // Get the canonical feed URI and check it $discover = new FeedDiscovery(); - $feeduri = $discover->discoverFromURL($profile_uri); + if ($hints['feedurl']) { + $feeduri = $hints['feedurl']; + $feeduri = $discover->discoverFromFeedURL($feeduri); + } else { + $feeduri = $discover->discoverFromURL($profile_uri); + $hints['feedurl'] = $feeduri; + } - //$feedsub = FeedSub::ensureFeed($feeduri, $discover->feed); $huburi = $discover->getAtomLink('hub'); + $hints['hub'] = $huburi; $salmonuri = $discover->getAtomLink('salmon'); + $hints['salmon'] = $salmonuri; if (!$huburi) { // We can only deal with folks with a PuSH hub @@ -810,7 +817,7 @@ class Ostatus_profile extends Memcached_DataObject if (!empty($subject)) { $subjObject = new ActivityObject($subject); - return self::ensureActivityObjectProfile($subjObject, $feeduri, $salmonuri, $hints); + return self::ensureActivityObjectProfile($subjObject, $hints); } // Otherwise, try the feed author @@ -819,7 +826,7 @@ class Ostatus_profile extends Memcached_DataObject if (!empty($author)) { $authorObject = new ActivityObject($author); - return self::ensureActivityObjectProfile($authorObject, $feeduri, $salmonuri, $hints); + return self::ensureActivityObjectProfile($authorObject, $hints); } // Sheesh. Not a very nice feed! Let's try fingerpoken in the @@ -835,7 +842,7 @@ class Ostatus_profile extends Memcached_DataObject if (!empty($actor)) { $actorObject = new ActivityObject($actor); - return self::ensureActivityObjectProfile($actorObject, $feeduri, $salmonuri, $hints); + return self::ensureActivityObjectProfile($actorObject, $hints); } @@ -843,7 +850,7 @@ class Ostatus_profile extends Memcached_DataObject if (!empty($author)) { $authorObject = new ActivityObject($author); - return self::ensureActivityObjectProfile($authorObject, $feeduri, $salmonuri, $hints); + return self::ensureActivityObjectProfile($authorObject, $hints); } } @@ -988,18 +995,18 @@ class Ostatus_profile extends Memcached_DataObject * @return Ostatus_profile */ - public static function ensureActorProfile($activity, $feeduri=null, $salmonuri=null) + public static function ensureActorProfile($activity, $hints=array()) { - return self::ensureActivityObjectProfile($activity->actor, $feeduri, $salmonuri); + return self::ensureActivityObjectProfile($activity->actor, $hints); } - public static function ensureActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array()) + public static function ensureActivityObjectProfile($object, $hints=array()) { $profile = self::getActivityObjectProfile($object); if ($profile) { $profile->updateFromActivityObject($object, $hints); } else { - $profile = self::createActivityObjectProfile($object, $feeduri, $salmonuri, $hints); + $profile = self::createActivityObjectProfile($object, $hints); } return $profile; } @@ -1045,58 +1052,55 @@ class Ostatus_profile extends Memcached_DataObject * @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()) + protected static function createActivityObjectProfile($object, $hints=array()) { - $homeuri = $object->id; + $homeuri = $object->id; + $discover = false; 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 (array_key_exists('feedurl', $hints)) { + $feeduri = $hints['feedurl']; + } else { + $discover = new FeedDiscovery(); + $feeduri = $discover->discoverFromURL($homeuri); } - if (empty($salmonuri)) { - if (array_key_exists('salmon', $hints)) { - $salmonuri = $hints['salmon']; + if (array_key_exists('salmon', $hints)) { + $salmonuri = $hints['salmon']; + } else { + if (!$discover) { + $discover = new FeedDiscovery(); + $discover->discoverFromFeedURL($hints['feedurl']); } + $salmonuri = $discover->getAtomLink('salmon'); } - if (!$feeduri || !$salmonuri) { - // Get the canonical feed URI and check it - $discover = new FeedDiscovery(); - $feeduri = $discover->discoverFromURL($homeuri); - + if (array_key_exists('hub', $hints)) { + $huburi = $hints['hub']; + } else { + if (!$discover) { + $discover = new FeedDiscovery(); + $discover->discoverFromFeedURL($hints['feedurl']); + } $huburi = $discover->getAtomLink('hub'); - $salmonuri = $discover->getAtomLink('salmon'); + } - if (!$huburi) { - // We can only deal with folks with a PuSH hub - throw new FeedSubNoHubException(); - } + if (!$huburi) { + // We can only deal with folks with a PuSH hub + throw new FeedSubNoHubException(); } $oprofile = new Ostatus_profile(); -- cgit v1.2.3-54-g00ecf From 0afb09ad64bec9ea7f9569c73899b2c3fbc1e5a5 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 25 Feb 2010 23:37:59 -0500 Subject: er. right. --- plugins/OStatus/classes/Magicsig.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index 681aec184..02882d19b 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -90,7 +90,7 @@ class Magicsig extends Memcached_DataObject return parent::insert(); } - public function generate($key_length = 512) + public function generate($user_id, $key_length = 512) { PEAR::pushErrorHandling(PEAR_ERROR_RETURN); @@ -101,6 +101,7 @@ class Magicsig extends Memcached_DataObject $this->_rsa = new Crypt_RSA($params); PEAR::popErrorHandling(); + $this->user_id = $user_id; $this->insert(); } -- cgit v1.2.3-54-g00ecf From 855692141d531287b179841b8816e90023b6ba7b Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 25 Feb 2010 23:38:25 -0500 Subject: use a real keypair from discovery --- plugins/OStatus/lib/magicenvelope.php | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index 4a9efe93d..4f8f88155 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -50,7 +50,16 @@ class MagicEnvelope public function getKeyPair($signer_uri) { - return 'RSA.79_L2gq-TD72Nsb5yGS0r9stLLpJZF5AHXyxzWmQmlqKl276LEJEs8CppcerLcR90MbYQUwt-SX9slx40Yq3vA==.AQAB.AR-jo5KMfSISmDAT2iMs2_vNFgWRjl5rbJVvA0SpGIEWyPdCGxlPtCbTexp8-0ZEIe8a4SyjatBECH5hxgMTpw=='; + $disco = new Discovery(); + + $links = $disco->lookup($signer_uri); + if ($link = Discovery::getService($links, 'magic-public-key')) { + list($type, $keypair) = explode(';', $link['href']); + return $keypair; + } + + throw new Exception('Unable to locate signer public key'); + //return 'RSA.79_L2gq-TD72Nsb5yGS0r9stLLpJZF5AHXyxzWmQmlqKl276LEJEs8CppcerLcR90MbYQUwt-SX9slx40Yq3vA==.AQAB.AR-jo5KMfSISmDAT2iMs2_vNFgWRjl5rbJVvA0SpGIEWyPdCGxlPtCbTexp8-0ZEIe8a4SyjatBECH5hxgMTpw=='; } -- cgit v1.2.3-54-g00ecf From 84d0c865c4c2dd597e249c76fa1429175f5461a1 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 03:25:51 -0500 Subject: salmon actually fetching remote keypairs --- plugins/OStatus/OStatusPlugin.php | 14 ++++++++++++++ plugins/OStatus/actions/ostatusinit.php | 2 +- plugins/OStatus/lib/discovery.php | 34 +++++++++++++++++---------------- plugins/OStatus/lib/magicenvelope.php | 5 ++--- 4 files changed, 35 insertions(+), 20 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 91d055498..46f986682 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -102,6 +102,20 @@ class OStatusPlugin extends Plugin return true; } + /** + * Add a link header for LRDD Discovery + */ + function onStartShowHTML($action) + { + if ($action instanceof ShowstreamAction) { + $acct = 'acct:'. $action->profile->nickname .'@'. common_config('site', 'server'); + $url = common_local_url('xrd'); + $url.= '?uri='. $acct; + + header('Link: <'.$url.'>; rel="'. Discovery::LRDD_REL.'"; type="application/xrd+xml"'); + } + } + /** * Set up a PuSH hub link to our internal link for canonical timeline * Atom feeds for users and groups. diff --git a/plugins/OStatus/actions/ostatusinit.php b/plugins/OStatus/actions/ostatusinit.php index 5c8575595..8ba8dcdcc 100644 --- a/plugins/OStatus/actions/ostatusinit.php +++ b/plugins/OStatus/actions/ostatusinit.php @@ -144,7 +144,7 @@ class OStatusInitAction extends Action $user = User::staticGet('nickname', $this->nickname); $target_profile = common_local_url('userbyid', array('id' => $user->id)); - $url = $w->applyTemplate($link['template'], $target_profile); + $url = Discovery::applyTemplate($link['template'], $target_profile); common_log(LOG_INFO, "Sending remote subscriber $acct to $url"); common_redirect($url, 303); } diff --git a/plugins/OStatus/lib/discovery.php b/plugins/OStatus/lib/discovery.php index 8aba31328..c268ad05c 100644 --- a/plugins/OStatus/lib/discovery.php +++ b/plugins/OStatus/lib/discovery.php @@ -91,7 +91,6 @@ class Discovery foreach ($this->methods as $class) { $links = call_user_func(array($class, 'discover'), $uri); - if ($link = Discovery::getService($links, Discovery::LRDD_REL)) { // Load the LRDD XRD if ($link['template']) { @@ -141,7 +140,7 @@ class Discovery } return XRD::parse($response->getBody()); - } + } } interface Discovery_LRDD @@ -153,13 +152,12 @@ class Discovery_LRDD_Host_Meta implements Discovery_LRDD { public function discover($uri) { - if (Discovery::isWebfinger($uri)) { - // We have a webfinger acct: - start with host-meta - list($name, $domain) = explode('@', $id); - } else { - $domain = @parse_url($uri, PHP_URL_HOST); + if (!Discovery::isWebfinger($uri)) { + return false; } + // We have a webfinger acct: - start with host-meta + list($name, $domain) = explode('@', $uri); $url = 'http://'. $domain .'/.well-known/host-meta'; $xrd = Discovery::fetchXrd($url); @@ -180,27 +178,29 @@ class Discovery_LRDD_Link_Header implements Discovery_LRDD { try { $client = new HTTPClient(); - $response = $client->get($url); + $response = $client->get($uri); } catch (HTTP_Request2_Exception $e) { return false; } - + if ($response->getStatus() != 200) { return false; } $link_header = $response->getHeader('Link'); if (!$link_header) { - return false; + // return false; } - return Discovery_LRDD_Link_Header::parseHeader($header); + return Discovery_LRDD_Link_Header::parseHeader($link_header); } protected static function parseHeader($header) { preg_match('/^<[^>]+>/', $header, $uri_reference); - if (empty($uri_reference)) return; + //if (empty($uri_reference)) return; + + $links = array(); $link_uri = trim($uri_reference[0], '<>'); $link_rel = array(); @@ -210,7 +210,7 @@ class Discovery_LRDD_Link_Header implements Discovery_LRDD $header = substr($header, strlen($uri_reference[0])); // parse link-params - $params = explode($header, ';'); + $params = explode(';', $header); foreach ($params as $param) { if (empty($param)) continue; @@ -229,11 +229,13 @@ class Discovery_LRDD_Link_Header implements Discovery_LRDD $link_type = trim($param_value); } } - - return array( + + $links[] = array( 'href' => $link_uri, 'rel' => $link_rel, 'type' => $link_type); + + return $links; } } @@ -243,7 +245,7 @@ class Discovery_LRDD_Link_HTML implements Discovery_LRDD { try { $client = new HTTPClient(); - $response = $client->get($url); + $response = $client->get($uri); } catch (HTTP_Request2_Exception $e) { return false; } diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index 4f8f88155..c642af548 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -52,14 +52,13 @@ class MagicEnvelope { $disco = new Discovery(); - $links = $disco->lookup($signer_uri); - if ($link = Discovery::getService($links, 'magic-public-key')) { + $xrd = $disco->lookup($signer_uri); + if ($link = Discovery::getService($xrd->links, Magicsig::PUBLICKEYREL)) { list($type, $keypair) = explode(';', $link['href']); return $keypair; } throw new Exception('Unable to locate signer public key'); - //return 'RSA.79_L2gq-TD72Nsb5yGS0r9stLLpJZF5AHXyxzWmQmlqKl276LEJEs8CppcerLcR90MbYQUwt-SX9slx40Yq3vA==.AQAB.AR-jo5KMfSISmDAT2iMs2_vNFgWRjl5rbJVvA0SpGIEWyPdCGxlPtCbTexp8-0ZEIe8a4SyjatBECH5hxgMTpw=='; } -- cgit v1.2.3-54-g00ecf From 22062b665e6d883f5ddfe590af1b9b22833094b0 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 03:28:29 -0500 Subject: remove webfinger.php --- plugins/OStatus/lib/webfinger.php | 164 -------------------------------------- 1 file changed, 164 deletions(-) delete mode 100644 plugins/OStatus/lib/webfinger.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/webfinger.php b/plugins/OStatus/lib/webfinger.php deleted file mode 100644 index 4b777c9a0..000000000 --- a/plugins/OStatus/lib/webfinger.php +++ /dev/null @@ -1,164 +0,0 @@ -. - * - * @package StatusNet - * @author James Walker - * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 - * @link http://status.net/ - */ - -define('WEBFINGER_SERVICE_REL_VALUE', 'lrdd'); - -/** - * Implement the webfinger protocol. - */ - -class Webfinger -{ - const PROFILEPAGE = 'http://webfinger.net/rel/profile-page'; - const UPDATESFROM = 'http://schemas.google.com/g/2010#updates-from'; - const HCARD = 'http://microformats.org/profile/hcard'; - - /** - * Perform a webfinger lookup given an account. - */ - - public function lookup($id) - { - $id = $this->normalize($id); - list($name, $domain) = explode('@', $id); - - $links = $this->getServiceLinks($domain); - if (!$links) { - return false; - } - - $services = array(); - foreach ($links as $link) { - if ($link['template']) { - return $this->getServiceDescription($link['template'], $id); - } - if ($link['href']) { - return $this->getServiceDescription($link['href'], $id); - } - } - } - - /** - * Normalize an account ID - */ - function normalize($id) - { - if (substr($id, 0, 7) == 'acct://') { - return substr($id, 7); - } else if (substr($id, 0, 5) == 'acct:') { - return substr($id, 5); - } - - return $id; - } - - function getServiceLinks($domain) - { - $url = 'http://'. $domain .'/.well-known/host-meta'; - - $content = $this->fetchURL($url); - - if (empty($content)) { - common_log(LOG_DEBUG, 'Error fetching host-meta'); - return false; - } - - $result = XRD::parse($content); - - // Ensure that the host == domain (spec may include signing later) - if ($result->host != $domain) { - return false; - } - - $links = array(); - foreach ($result->links as $link) { - if ($link['rel'] == WEBFINGER_SERVICE_REL_VALUE) { - $links[] = $link; - } - - } - return $links; - } - - function getServiceDescription($template, $id) - { - $url = $this->applyTemplate($template, 'acct:' . $id); - - $content = $this->fetchURL($url); - - if (!$content) { - return false; - } - - return XRD::parse($content); - } - - function fetchURL($url) - { - try { - $c = Cache::instance(); - $content = $c->get('webfinger:url:'.$url); - if ($content !== false) { - return $content; - } - $client = new HTTPClient(); - $response = $client->get($url); - } catch (HTTP_Request2_Exception $e) { - return false; - } - - if ($response->getStatus() != 200) { - return false; - } - - $body = $response->getBody(); - - $c->set('webfinger:url:'.$url, $body); - - return $body; - } - - function applyTemplate($template, $id) - { - $template = str_replace('{uri}', urlencode($id), $template); - - return $template; - } - - function getHostMeta($domain, $template) { - $xrd = new XRD(); - $xrd->host = $domain; - $xrd->links[] = array('rel' => 'lrdd', - 'template' => $template, - 'title' => array('Resource Descriptor')); - - return $xrd->toXML(); - } -} - -- cgit v1.2.3-54-g00ecf From d1256b547f5f4f02ddc51a5fe2146dbde52aac53 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 03:43:35 -0500 Subject: bad merge.. cleaning up missing webfinger bits --- plugins/OStatus/actions/xrd.php | 2 +- plugins/OStatus/lib/discovery.php | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/xrd.php b/plugins/OStatus/actions/xrd.php index 2a754dcfe..e6b694d61 100644 --- a/plugins/OStatus/actions/xrd.php +++ b/plugins/OStatus/actions/xrd.php @@ -66,7 +66,7 @@ class XrdAction extends Action 'type' => 'application/atom+xml'); // hCard - $xrd->links[] = array('rel' => Webfinger::HCARD, + $xrd->links[] = array('rel' => Discovery::HCARD, 'type' => 'text/html', 'href' => common_local_url('hcard', array('nickname' => $nick))); diff --git a/plugins/OStatus/lib/discovery.php b/plugins/OStatus/lib/discovery.php index c268ad05c..1ab6e51bd 100644 --- a/plugins/OStatus/lib/discovery.php +++ b/plugins/OStatus/lib/discovery.php @@ -39,7 +39,8 @@ class Discovery const LRDD_REL = 'lrdd'; const PROFILEPAGE = 'http://webfinger.net/rel/profile-page'; const UPDATESFROM = 'http://schemas.google.com/g/2010#updates-from'; - + const HCARD = 'http://microformats.org/profile/hcard'; + public $methods = array(); public function __construct() -- cgit v1.2.3-54-g00ecf From ab8bb4d79e5f267323440b8cee01458b393ce2d1 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 04:07:58 -0500 Subject: more cleanup --- plugins/OStatus/classes/Ostatus_profile.php | 2 +- plugins/OStatus/lib/discovery.php | 4 ++++ plugins/OStatus/lib/magicenvelope.php | 21 +++++++++++++++------ 3 files changed, 20 insertions(+), 7 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 4a9aafce1..091056c54 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1305,7 +1305,7 @@ class Ostatus_profile extends Memcached_DataObject case Discovery::UPDATESFROM: $feedUrl = $link['href']; break; - case Webfinger::HCARD: + case Discovery::HCARD: $hcardUrl = $link['href']; break; default: diff --git a/plugins/OStatus/lib/discovery.php b/plugins/OStatus/lib/discovery.php index 1ab6e51bd..388df0a28 100644 --- a/plugins/OStatus/lib/discovery.php +++ b/plugins/OStatus/lib/discovery.php @@ -111,6 +111,10 @@ class Discovery } public static function getService($links, $service) { + if (!is_array($links)) { + return false; + } + foreach ($links as $link) { if ($link['rel'] == $service) { return $link; diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index c642af548..457c0fba2 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -52,12 +52,17 @@ class MagicEnvelope { $disco = new Discovery(); - $xrd = $disco->lookup($signer_uri); - if ($link = Discovery::getService($xrd->links, Magicsig::PUBLICKEYREL)) { - list($type, $keypair) = explode(';', $link['href']); - return $keypair; + try { + $xrd = $disco->lookup($signer_uri); + } catch (Exception $e) { + return false; + } + if ($xrd->links) { + if ($link = Discovery::getService($xrd->links, Magicsig::PUBLICKEYREL)) { + list($type, $keypair) = explode(';', $link['href']); + return $keypair; + } } - throw new Exception('Unable to locate signer public key'); } @@ -70,7 +75,11 @@ class MagicEnvelope throw new Exception("Unable to determine entry author."); } - $signature_alg = Magicsig::fromString($this->getKeyPair($signer_uri)); + $keypair = $this->getKeyPair($signer_uri); + if (!$keypair) { + throw new Exception("Unable to retrive keypair for ". $signer_uri); + } + $signature_alg = Magicsig::fromString($keypair); $armored_text = base64_encode($text); return array( -- cgit v1.2.3-54-g00ecf From bbb0a7d5bc2c8815a2057eb0a6588d8d60ff4416 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 13:17:24 -0500 Subject: updating to use latest salmon NS definitions --- plugins/OStatus/OStatusPlugin.php | 3 ++- plugins/OStatus/actions/xrd.php | 8 ++++++-- plugins/OStatus/classes/Ostatus_profile.php | 6 +++--- plugins/OStatus/lib/salmon.php | 5 +++++ 4 files changed, 16 insertions(+), 6 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 46f986682..89fa45f91 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -149,7 +149,8 @@ class OStatusPlugin extends Plugin // Also, we'll add in the salmon link $salmon = common_local_url($salmonAction, array('id' => $id)); - $feed->addLink($salmon, array('rel' => 'salmon')); + $feed->addLink($salmon, array('rel' => Salmon::NS_REPLIES)); + $feed->addLink($salmon, array('rel' => Salmon::NS_MENTIONS)); } return true; diff --git a/plugins/OStatus/actions/xrd.php b/plugins/OStatus/actions/xrd.php index e6b694d61..4350ad025 100644 --- a/plugins/OStatus/actions/xrd.php +++ b/plugins/OStatus/actions/xrd.php @@ -80,10 +80,14 @@ class XrdAction extends Action 'href' => common_local_url('foaf', array('nickname' => $nick))); - $salmon_url = common_local_url('salmon', + // Salmon + $salmon_url = common_local_url('usersalmon', array('id' => $this->user->id)); - $xrd->links[] = array('rel' => 'salmon', + $xrd->links[] = array('rel' => Salmon::NS_REPLIES, + 'href' => $salmon_url); + + $xrd->links[] = array('rel' => Salmon::NS_MENTIONS, 'href' => $salmon_url); // Get this user's keypair diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 091056c54..c6f7378c4 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -707,7 +707,7 @@ class Ostatus_profile extends Memcached_DataObject $huburi = $discover->getAtomLink('hub'); $hints['hub'] = $huburi; - $salmonuri = $discover->getAtomLink('salmon'); + $salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES); $hints['salmon'] = $salmonuri; if (!$huburi) { @@ -991,7 +991,7 @@ class Ostatus_profile extends Memcached_DataObject $discover = new FeedDiscovery(); $discover->discoverFromFeedURL($hints['feedurl']); } - $salmonuri = $discover->getAtomLink('salmon'); + $salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES); } if (array_key_exists('hub', $hints)) { @@ -1299,7 +1299,7 @@ class Ostatus_profile extends Memcached_DataObject case Discovery::PROFILEPAGE: $profileUrl = $link['href']; break; - case 'salmon': + case Salmon::NS_REPLIES: $salmonEndpoint = $link['href']; break; case Discovery::UPDATESFROM: diff --git a/plugins/OStatus/lib/salmon.php b/plugins/OStatus/lib/salmon.php index 9d4359f74..c59de2a14 100644 --- a/plugins/OStatus/lib/salmon.php +++ b/plugins/OStatus/lib/salmon.php @@ -28,6 +28,11 @@ */ class Salmon { + + const NS_REPLIES = "http://salmon-protocol.org/ns/salmon-replies"; + + const NS_MENTIONS = "http://salmon-protocol.org/ns/salmon-mention"; + /** * Sign and post the given Atom entry as a Salmon message. * -- cgit v1.2.3-54-g00ecf From 3a7eef1074a80150fd428c73d49bcd4fc1b66e89 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 13:40:33 -0500 Subject: only put public keys in XRD --- plugins/OStatus/actions/xrd.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/xrd.php b/plugins/OStatus/actions/xrd.php index 4350ad025..f574b60ee 100644 --- a/plugins/OStatus/actions/xrd.php +++ b/plugins/OStatus/actions/xrd.php @@ -99,7 +99,7 @@ class XrdAction extends Action } $xrd->links[] = array('rel' => Magicsig::PUBLICKEYREL, - 'href' => 'data:application/magic-public-key;'. $magickey->keypair); + 'href' => 'data:application/magic-public-key;'. $magickey->toString(false)); // TODO - finalize where the redirect should go on the publisher $url = common_local_url('ostatussub') . '?profile={uri}'; -- cgit v1.2.3-54-g00ecf From 223ebc765c454e030a49df7e2e1b9cdc2b005fe6 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 14:21:21 -0500 Subject: move signing to take a local actor profile and use local keys --- plugins/OStatus/OStatusPlugin.php | 14 +++++++------- plugins/OStatus/classes/Magicsig.php | 3 ++- plugins/OStatus/classes/Ostatus_profile.php | 11 ++++++----- plugins/OStatus/lib/magicenvelope.php | 12 +----------- plugins/OStatus/lib/ostatusqueuehandler.php | 2 +- plugins/OStatus/lib/salmon.php | 24 ++++++++++++++++++------ plugins/OStatus/lib/salmonqueuehandler.php | 4 +++- 7 files changed, 38 insertions(+), 32 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 89fa45f91..720dedd0a 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -415,7 +415,7 @@ class OStatusPlugin extends Plugin $act->actor = ActivityObject::fromProfile($subscriber); $act->object = ActivityObject::fromProfile($other); - $oprofile->notifyActivity($act); + $oprofile->notifyActivity($act, $subscriber); return true; } @@ -463,7 +463,7 @@ class OStatusPlugin extends Plugin $act->actor = ActivityObject::fromProfile($profile); $act->object = ActivityObject::fromProfile($other); - $oprofile->notifyActivity($act); + $oprofile->notifyActivity($act, $profile); return true; } @@ -505,7 +505,7 @@ class OStatusPlugin extends Plugin $member->getBestName(), $oprofile->getBestName()); - if ($oprofile->notifyActivity($act)) { + if ($oprofile->notifyActivity($act, $member)) { return true; } else { $oprofile->garbageCollect(); @@ -555,7 +555,7 @@ class OStatusPlugin extends Plugin $member->getBestName(), $oprofile->getBestName()); - $oprofile->notifyActivity($act); + $oprofile->notifyActivity($act, $member); } } @@ -598,7 +598,7 @@ class OStatusPlugin extends Plugin $act->actor = ActivityObject::fromProfile($profile); $act->object = ActivityObject::fromNotice($notice); - $oprofile->notifyActivity($act); + $oprofile->notifyActivity($act, $profile); return true; } @@ -642,7 +642,7 @@ class OStatusPlugin extends Plugin $act->actor = ActivityObject::fromProfile($profile); $act->object = ActivityObject::fromNotice($notice); - $oprofile->notifyActivity($act); + $oprofile->notifyActivity($act, $profile); return true; } @@ -731,7 +731,7 @@ class OStatusPlugin extends Plugin $act->object = $act->actor; while ($oprofile->fetch()) { - $oprofile->notifyDeferred($act); + $oprofile->notifyDeferred($act, $profile); } return true; diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index 02882d19b..751527c81 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -49,7 +49,8 @@ class Magicsig extends Memcached_DataObject public /*static*/ function staticGet($k, $v=null) { - return parent::staticGet(__CLASS__, $k, $v); + $obj = parent::staticGet(__CLASS__, $k, $v); + return Magicsig::fromString($obj->keypair); } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index c6f7378c4..35539bff7 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -357,7 +357,7 @@ class Ostatus_profile extends Memcached_DataObject common_log(LOG_INFO, "Posting to Salmon endpoint $this->salmonuri: $xml"); $salmon = new Salmon(); // ? - return $salmon->post($this->salmonuri, $xml); + return $salmon->post($this->salmonuri, $xml, $actor); } return false; } @@ -369,11 +369,11 @@ class Ostatus_profile extends Memcached_DataObject * @param mixed $entry XML string, Notice, or Activity * @return boolean success */ - public function notifyActivity($entry) + public function notifyActivity($entry, $actor) { if ($this->salmonuri) { $salmon = new Salmon(); - return $salmon->post($this->salmonuri, $this->notifyPrepXml($entry)); + return $salmon->post($this->salmonuri, $this->notifyPrepXml($entry), $actor); } return false; @@ -386,11 +386,12 @@ class Ostatus_profile extends Memcached_DataObject * @param mixed $entry XML string, Notice, or Activity * @return boolean success */ - public function notifyDeferred($entry) + public function notifyDeferred($entry, $actor) { if ($this->salmonuri) { $data = array('salmonuri' => $this->salmonuri, - 'entry' => $this->notifyPrepXml($entry)); + 'entry' => $this->notifyPrepXml($entry), + 'actor' => $actor->id); $qm = QueueManager::get(); return $qm->enqueue($data, 'salmon'); diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index 457c0fba2..f33119b8f 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -67,18 +67,8 @@ class MagicEnvelope } - public function signMessage($text, $mimetype, $signer_uri) + public function signMessage($text, $mimetype, $keypair) { - $signer_uri = $this->normalizeUser($signer_uri); - - if (!$this->checkAuthor($text, $signer_uri)) { - throw new Exception("Unable to determine entry author."); - } - - $keypair = $this->getKeyPair($signer_uri); - if (!$keypair) { - throw new Exception("Unable to retrive keypair for ". $signer_uri); - } $signature_alg = Magicsig::fromString($keypair); $armored_text = base64_encode($text); diff --git a/plugins/OStatus/lib/ostatusqueuehandler.php b/plugins/OStatus/lib/ostatusqueuehandler.php index 0da85600f..6ca31c485 100644 --- a/plugins/OStatus/lib/ostatusqueuehandler.php +++ b/plugins/OStatus/lib/ostatusqueuehandler.php @@ -87,7 +87,7 @@ class OStatusQueueHandler extends QueueHandler // 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); + $oprofile->notifyDeferred($this->notice, $this->user); } } diff --git a/plugins/OStatus/lib/salmon.php b/plugins/OStatus/lib/salmon.php index c59de2a14..6e2459544 100644 --- a/plugins/OStatus/lib/salmon.php +++ b/plugins/OStatus/lib/salmon.php @@ -42,14 +42,14 @@ class Salmon * @param string $xml * @return boolean success */ - public function post($endpoint_uri, $xml) + public function post($endpoint_uri, $xml, $actor) { if (empty($endpoint_uri)) { return false; } if (!common_config('ostatus', 'skip_signatures')) { - $xml = $this->createMagicEnv($xml); + $xml = $this->createMagicEnv($xml, $actor); } $headers = array('Content-Type: application/atom+xml'); @@ -70,15 +70,27 @@ class Salmon return true; } - public function createMagicEnv($text) + public function createMagicEnv($text, $actor) { + common_log(LOG_DEBUG, "Got actor as : ". print_r($actor, true)); $magic_env = new MagicEnvelope(); - // TODO: Should probably be getting the signer uri as an argument? - $signer_uri = $magic_env->getAuthor($text); + $user = User::staticGet('id', $actor->id); + if ($user->id) { + // Use local key + $magickey = Magicsig::staticGet('user_id', $user->id); + if (!$magickey) { + // No keypair yet, let's generate one. + $magickey = new Magicsig(); + $magickey->generate($user->id); + } + common_log(LOG_DEBUG, "Salmon: Loaded key for ". $user->id); + } else { + throw new Exception("Salmon invalid actor for signing"); + } try { - $env = $magic_env->signMessage($text, 'application/atom+xml', $signer_uri); + $env = $magic_env->signMessage($text, 'application/atom+xml', $magickey->toString()); } catch (Exception $e) { common_log(LOG_ERR, "Salmon signing failed: ". $e->getMessage()); return $text; diff --git a/plugins/OStatus/lib/salmonqueuehandler.php b/plugins/OStatus/lib/salmonqueuehandler.php index aa97018dc..7eeb5f8e9 100644 --- a/plugins/OStatus/lib/salmonqueuehandler.php +++ b/plugins/OStatus/lib/salmonqueuehandler.php @@ -35,8 +35,10 @@ class SalmonQueueHandler extends QueueHandler assert(is_string($data['salmonuri'])); assert(is_string($data['entry'])); + $actor = Profile::staticGet($data['actor']); + $salmon = new Salmon(); - $salmon->post($data['salmonuri'], $data['entry']); + $salmon->post($data['salmonuri'], $data['entry'], $actor); // @fixme detect failure and attempt to resend return true; -- cgit v1.2.3-54-g00ecf From f23a877cd8ad8d583b74c312c7e9baa842b5a86a Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 15:38:48 -0500 Subject: Discovery::lookup now throws an exception --- plugins/OStatus/classes/Ostatus_profile.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 35539bff7..7b1aec76b 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1288,9 +1288,9 @@ class Ostatus_profile extends Memcached_DataObject $disco = new Discovery(); - $result = $disco->lookup($addr); - - if (!$result) { + try { + $result = $disco->lookup($addr); + } catch (Exception $e) { self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), null); return null; } -- cgit v1.2.3-54-g00ecf From e4c462570f8010f751caf214f329617c08bf7105 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 15:39:30 -0500 Subject: move salmon posting to send application/magic-envelope+xml per http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html#RPF --- plugins/OStatus/lib/magicenvelope.php | 22 ++++++++++++++++++++++ plugins/OStatus/lib/salmon.php | 18 +++++++++++------- plugins/OStatus/lib/salmonaction.php | 26 ++++++++++++++------------ 3 files changed, 47 insertions(+), 19 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index f33119b8f..230d81ba1 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -83,6 +83,28 @@ class MagicEnvelope } + public function toXML($env) { + $dom = new DOMDocument(); + + $envelope = $dom->createElementNS(MagicEnvelope::NS, 'me:env'); + $envelope->setAttribute('xmlns:me', MagicEnvelope::NS); + $data = $dom->createElementNS(MagicEnvelope::NS, 'me:data', $env['data']); + $data->setAttribute('type', $env['data_type']); + $envelope->appendChild($data); + $enc = $dom->createElementNS(MagicEnvelope::NS, 'me:encoding', $env['encoding']); + $envelope->appendChild($enc); + $alg = $dom->createElementNS(MagicEnvelope::NS, 'me:alg', $env['alg']); + $envelope->appendChild($alg); + $sig = $dom->createElementNS(MagicEnvelope::NS, 'me:sig', $env['sig']); + $envelope->appendChild($sig); + + $dom->appendChild($envelope); + + + return $dom->saveXML(); + } + + public function unfold($env) { $dom = new DOMDocument(); diff --git a/plugins/OStatus/lib/salmon.php b/plugins/OStatus/lib/salmon.php index 6e2459544..68883a410 100644 --- a/plugins/OStatus/lib/salmon.php +++ b/plugins/OStatus/lib/salmon.php @@ -48,12 +48,17 @@ class Salmon return false; } - if (!common_config('ostatus', 'skip_signatures')) { + try { $xml = $this->createMagicEnv($xml, $actor); + } catch (Exception $e) { + common_log(LOG_ERR, "Salmon unable to sign: " . $e->getMessage()); + return false; } - $headers = array('Content-Type: application/atom+xml'); + $headers = array('Content-Type: application/magic-envelope+xml'); + common_log(LOG_DEBUG, "Salmon: going to post " . $xml); + try { $client = new HTTPClient(); $client->setBody($xml); @@ -72,7 +77,6 @@ class Salmon public function createMagicEnv($text, $actor) { - common_log(LOG_DEBUG, "Got actor as : ". print_r($actor, true)); $magic_env = new MagicEnvelope(); $user = User::staticGet('id', $actor->id); @@ -84,7 +88,6 @@ class Salmon $magickey = new Magicsig(); $magickey->generate($user->id); } - common_log(LOG_DEBUG, "Salmon: Loaded key for ". $user->id); } else { throw new Exception("Salmon invalid actor for signing"); } @@ -95,15 +98,16 @@ class Salmon common_log(LOG_ERR, "Salmon signing failed: ". $e->getMessage()); return $text; } - return $magic_env->unfold($env); + return $magic_env->toXML($env); } - public function verifyMagicEnv($dom) + public function verifyMagicEnv($text) { + common_log(LOG_DEBUG, "Going to verify ". $text); $magic_env = new MagicEnvelope(); - $env = $magic_env->fromDom($dom); + $env = $magic_env->parse($text); return $magic_env->verify($env); } diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index a03169101..9ca350e67 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -41,29 +41,31 @@ class SalmonAction extends Action $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')); + if (empty($_SERVER['CONTENT_TYPE']) || $_SERVER['CONTENT_TYPE'] != 'application/magic-envelope+xml') { + $this->clientError(_m('Salmon requires application/magic-envelope+xml')); } $xml = file_get_contents('php://input'); - $dom = DOMDocument::loadXML($xml); + // Check the signature + $salmon = new Salmon; + if (!$salmon->verifyMagicEnv($xml)) { + common_log(LOG_DEBUG, "Salmon signature verification failed."); + $this->clientError(_m('Salmon signature verification failed.')); + } else { + $env = MagicEnvelope::parse($xml); + $xml = MagicEnvelope::unfold($env); + } + + + $dom = DOMDocument::loadXML($xml); if ($dom->documentElement->namespaceURI != Activity::ATOM || $dom->documentElement->localName != 'entry') { common_log(LOG_DEBUG, "Got invalid Salmon post: $xml"); $this->clientError(_m('Salmon post must be an Atom entry.')); } - // 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; } -- cgit v1.2.3-54-g00ecf From c82cee18769763d105304f09de9b6b4079e48aae Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 16:25:47 -0500 Subject: removing some extraneous debug logging --- plugins/OStatus/lib/salmon.php | 4 ---- 1 file changed, 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/salmon.php b/plugins/OStatus/lib/salmon.php index 68883a410..3d3341bc6 100644 --- a/plugins/OStatus/lib/salmon.php +++ b/plugins/OStatus/lib/salmon.php @@ -57,8 +57,6 @@ class Salmon $headers = array('Content-Type: application/magic-envelope+xml'); - common_log(LOG_DEBUG, "Salmon: going to post " . $xml); - try { $client = new HTTPClient(); $client->setBody($xml); @@ -95,7 +93,6 @@ class Salmon try { $env = $magic_env->signMessage($text, 'application/atom+xml', $magickey->toString()); } catch (Exception $e) { - common_log(LOG_ERR, "Salmon signing failed: ". $e->getMessage()); return $text; } return $magic_env->toXML($env); @@ -104,7 +101,6 @@ class Salmon public function verifyMagicEnv($text) { - common_log(LOG_DEBUG, "Going to verify ". $text); $magic_env = new MagicEnvelope(); $env = $magic_env->parse($text); -- cgit v1.2.3-54-g00ecf From 0ecf435dc5df3d6424fc7bd0438d2856aa07c1da Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 16:50:00 -0500 Subject: adding sequenceKeys() to magicsig --- plugins/OStatus/classes/Magicsig.php | 4 ++++ 1 file changed, 4 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index 751527c81..dee193cd5 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -84,6 +84,10 @@ class Magicsig extends Memcached_DataObject return array('user_id' => 'K'); } + function sequenceKeys() { + return array(false, false, false); + } + function insert() { $this->keypair = $this->toString(); -- cgit v1.2.3-54-g00ecf From 6ee7660a585faf290dc1650a714d280b40ac3a2d Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 16:51:50 -0500 Subject: should be sequenceKey (singular) --- plugins/OStatus/classes/HubSub.php | 2 +- plugins/OStatus/classes/Magicsig.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index 1ac181fee..e599d83a9 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -99,7 +99,7 @@ class HubSub extends Memcached_DataObject return array_keys($this->keyTypes()); } - function sequenceKeys() + function sequenceKey() { return array(false, false, false); } diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index dee193cd5..d47dcf143 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -84,7 +84,7 @@ class Magicsig extends Memcached_DataObject return array('user_id' => 'K'); } - function sequenceKeys() { + function sequenceKey() { return array(false, false, false); } -- cgit v1.2.3-54-g00ecf From 1cf08c7ad7704cd92d59f319573e831d1115e996 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 17:09:50 -0500 Subject: MagicEnvelope::parse shouldn't be called statically --- plugins/OStatus/lib/salmonaction.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/salmonaction.php b/plugins/OStatus/lib/salmonaction.php index 9ca350e67..fa9dc3b1d 100644 --- a/plugins/OStatus/lib/salmonaction.php +++ b/plugins/OStatus/lib/salmonaction.php @@ -54,8 +54,9 @@ class SalmonAction extends Action common_log(LOG_DEBUG, "Salmon signature verification failed."); $this->clientError(_m('Salmon signature verification failed.')); } else { - $env = MagicEnvelope::parse($xml); - $xml = MagicEnvelope::unfold($env); + $magic_env = new MagicEnvelope(); + $env = $magic_env->parse($xml); + $xml = $magic_env->unfold($env); } -- cgit v1.2.3-54-g00ecf From ee7603b09f162188caaf1d319a70e7fd5d6aa385 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 17:52:12 -0500 Subject: better return check in Magicsig::staticGet() --- plugins/OStatus/classes/Magicsig.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index d47dcf143..30da63c36 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -50,7 +50,11 @@ class Magicsig extends Memcached_DataObject public /*static*/ function staticGet($k, $v=null) { $obj = parent::staticGet(__CLASS__, $k, $v); - return Magicsig::fromString($obj->keypair); + if (!empty($obj)) { + return Magicsig::fromString($obj->keypair); + } + + return $obj; } -- cgit v1.2.3-54-g00ecf From 831eb0d2b6e35073992106a792f2878bb98e6aa4 Mon Sep 17 00:00:00 2001 From: James Walker Date: Fri, 26 Feb 2010 18:22:08 -0500 Subject: renaming sha256 to prevent conflict --- plugins/OStatus/classes/Magicsig.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index 30da63c36..96900d876 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -181,14 +181,15 @@ class Magicsig extends Memcached_DataObject switch ($this->alg) { case 'RSA-SHA256': - return 'sha256'; + return 'magicsig_sha256'; } } public function sign($bytes) { - $sig = $this->_rsa->createSign($bytes, null, 'sha256'); + $hash = $this->getHash(); + $sig = $this->_rsa->createSign($bytes, null, $hash); if ($this->_rsa->isError()) { $error = $this->_rsa->getLastError(); common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); @@ -200,7 +201,8 @@ class Magicsig extends Memcached_DataObject public function verify($signed_bytes, $signature) { - $result = $this->_rsa->validateSign($signed_bytes, $signature, null, 'sha256'); + $hash = $this->getHash(); + $result = $this->_rsa->validateSign($signed_bytes, $signature, null, $hash); if ($this->_rsa->isError()) { $error = $this->keypair->getLastError(); common_log(LOG_DEBUG, 'RSA Error: '. $error->getMessage()); @@ -213,7 +215,7 @@ class Magicsig extends Memcached_DataObject // Define a sha256 function for hashing // (Crypt_RSA should really be updated to use hash() ) -function sha256($bytes) +function magicsig_sha256($bytes) { return hash('sha256', $bytes); } -- cgit v1.2.3-54-g00ecf From 00f724d0e6380f8177bcee0ff2631783f514508a Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 1 Mar 2010 14:10:13 -0800 Subject: Localization tweak: include doc comments marked as 'TRANS' in .po file output; these should now get automatically pulled through to the TranslateWiki interface as translator help hints. --- plugins/OStatus/actions/ostatussub.php | 6 + plugins/OStatus/locale/OStatus.po | 280 ++++++++++++++++++++++++++++----- scripts/update_po_templates.php | 7 +- 3 files changed, 256 insertions(+), 37 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index aae22f868..f45e6a8d1 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -332,6 +332,7 @@ class OStatusSubAction extends Action if ($this->oprofile->isGroup()) { $group = $this->oprofile->localGroup(); if ($user->isMember($group)) { + // TRANS: OStatus remote group subscription dialog error. $this->showForm(_m('Already a member!')); return; } @@ -341,18 +342,22 @@ class OStatusSubAction extends Action Event::handle('EndJoinGroup', array($group, $user)); $this->successGroup(); } else { + // TRANS: OStatus remote group subscription dialog error. $this->showForm(_m('Remote group join failed!')); } } else { + // TRANS: OStatus remote group subscription dialog error. $this->showForm(_m('Remote group join aborted!')); } } else { $local = $this->oprofile->localProfile(); if ($user->isSubscribed($local)) { + // TRANS: OStatus remote subscription dialog error. $this->showForm(_m('Already subscribed!')); } elseif ($this->oprofile->subscribeLocalToRemote($user)) { $this->successUser(); } else { + // TRANS: OStatus remote subscription dialog error. $this->showForm(_m('Remote subscription failed!')); } } @@ -450,6 +455,7 @@ class OStatusSubAction extends Action function title() { + // TRANS: Page title for OStatus remote subscription form return _m('Authorize subscription'); } diff --git a/plugins/OStatus/locale/OStatus.po b/plugins/OStatus/locale/OStatus.po index dedc018e3..ee19cf3db 100644 --- a/plugins/OStatus/locale/OStatus.po +++ b/plugins/OStatus/locale/OStatus.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-07 20:38-0800\n" +"POT-Creation-Date: 2010-03-01 14:08-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,89 +16,297 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: tests/gettext-speedtest.php:57 FeedSubPlugin.php:76 -msgid "Feeds" +#: actions/groupsalmon.php:51 +msgid "Can't accept remote posts for a remote group." +msgstr "" + +#: actions/groupsalmon.php:123 +msgid "Can't read profile to set up group membership." msgstr "" -#: FeedSubPlugin.php:77 -msgid "Feed subscription options" +#: actions/groupsalmon.php:126 actions/groupsalmon.php:169 +msgid "Groups can't join groups." msgstr "" -#: feedmunger.php:215 +#: actions/groupsalmon.php:153 #, php-format -msgid "New post: \"%1$s\" %2$s" +msgid "Could not join remote user %1$s to group %2$s." msgstr "" -#: actions/feedsubsettings.php:41 -msgid "Feed subscriptions" +#: actions/groupsalmon.php:166 +msgid "Can't read profile to cancel group membership." msgstr "" -#: actions/feedsubsettings.php:52 -msgid "" -"You can subscribe to feeds from other sites; updates will appear in your " -"personal timeline." +#: actions/groupsalmon.php:182 +#, php-format +msgid "Could not remove remote user %1$s from group %2$s." +msgstr "" + +#: actions/ostatusinit.php:40 +msgid "You can use the local subscription!" +msgstr "" + +#: actions/ostatusinit.php:61 +msgid "There was a problem with your session token. Try again, please." +msgstr "" + +#: actions/ostatusinit.php:79 actions/ostatussub.php:439 +msgid "Subscribe to user" +msgstr "" + +#: actions/ostatusinit.php:97 +#, php-format +msgid "Subscribe to %s" msgstr "" -#: actions/feedsubsettings.php:96 +#: actions/ostatusinit.php:102 +msgid "User nickname" +msgstr "" + +#: actions/ostatusinit.php:103 +msgid "Nickname of the user you want to follow" +msgstr "" + +#: actions/ostatusinit.php:106 +msgid "Profile Account" +msgstr "" + +#: actions/ostatusinit.php:107 +msgid "Your account id (i.e. user@identi.ca)" +msgstr "" + +#: actions/ostatusinit.php:110 actions/ostatussub.php:115 +#: OStatusPlugin.php:205 msgid "Subscribe" msgstr "" -#: actions/feedsubsettings.php:98 +#: actions/ostatusinit.php:128 +msgid "Must provide a remote profile." +msgstr "" + +#: actions/ostatusinit.php:138 +msgid "Couldn't look up OStatus account profile." +msgstr "" + +#: actions/ostatusinit.php:153 +msgid "Couldn't confirm remote profile address." +msgstr "" + +#: actions/ostatusinit.php:171 +msgid "OStatus Connect" +msgstr "" + +#: actions/ostatussub.php:68 +msgid "Address or profile URL" +msgstr "" + +#: actions/ostatussub.php:70 +msgid "Enter the profile URL of a PubSubHubbub-enabled feed" +msgstr "" + +#: actions/ostatussub.php:74 msgid "Continue" msgstr "" -#: actions/feedsubsettings.php:151 -msgid "Empty feed URL!" +#: actions/ostatussub.php:112 OStatusPlugin.php:503 +msgid "Join" +msgstr "" + +#: actions/ostatussub.php:113 +msgid "Join this group" +msgstr "" + +#: actions/ostatussub.php:116 +msgid "Subscribe to this user" +msgstr "" + +#: actions/ostatussub.php:137 +msgid "You are already subscribed to this user." +msgstr "" + +#: actions/ostatussub.php:165 +msgid "You are already a member of this group." msgstr "" -#: actions/feedsubsettings.php:161 +#: actions/ostatussub.php:286 +msgid "Empty remote profile URL!" +msgstr "" + +#: actions/ostatussub.php:297 +msgid "Invalid address format." +msgstr "" + +#: actions/ostatussub.php:302 msgid "Invalid URL or could not reach server." msgstr "" -#: actions/feedsubsettings.php:164 +#: actions/ostatussub.php:304 msgid "Cannot read feed; server returned error." msgstr "" -#: actions/feedsubsettings.php:167 +#: actions/ostatussub.php:306 msgid "Cannot read feed; server returned an empty page." msgstr "" -#: actions/feedsubsettings.php:170 +#: actions/ostatussub.php:308 msgid "Bad HTML, could not find feed link." msgstr "" -#: actions/feedsubsettings.php:173 +#: actions/ostatussub.php:310 msgid "Could not find a feed linked from this URL." msgstr "" -#: actions/feedsubsettings.php:176 +#: actions/ostatussub.php:312 msgid "Not a recognized feed type." msgstr "" -#: actions/feedsubsettings.php:180 -msgid "Bad feed URL." +#: actions/ostatussub.php:315 +#, php-format +msgid "Bad feed URL: %s %s" +msgstr "" + +#. TRANS: OStatus remote group subscription dialog error. +#: actions/ostatussub.php:336 +msgid "Already a member!" msgstr "" -#: actions/feedsubsettings.php:188 -msgid "Feed is not PuSH-enabled; cannot subscribe." +#. TRANS: OStatus remote group subscription dialog error. +#: actions/ostatussub.php:346 +msgid "Remote group join failed!" msgstr "" -#: actions/feedsubsettings.php:208 -msgid "Feed subscription failed! Bad response from hub." +#. TRANS: OStatus remote group subscription dialog error. +#: actions/ostatussub.php:350 +msgid "Remote group join aborted!" msgstr "" -#: actions/feedsubsettings.php:218 +#. TRANS: OStatus remote subscription dialog error. +#: actions/ostatussub.php:356 msgid "Already subscribed!" msgstr "" -#: actions/feedsubsettings.php:220 -msgid "Feed subscribed!" +#. TRANS: OStatus remote subscription dialog error. +#: actions/ostatussub.php:361 +msgid "Remote subscription failed!" msgstr "" -#: actions/feedsubsettings.php:222 -msgid "Feed subscription failed!" +#. TRANS: Page title for OStatus remote subscription form +#: actions/ostatussub.php:459 +msgid "Authorize subscription" +msgstr "" + +#: actions/ostatussub.php:470 +msgid "" +"You can subscribe to users from other supported sites. Paste their address " +"or profile URI below:" +msgstr "" + +#: classes/Ostatus_profile.php:789 +#, php-format +msgid "Tried to update avatar for unsaved remote profile %s" msgstr "" -#: actions/feedsubsettings.php:231 -msgid "Previewing feed:" +#: classes/Ostatus_profile.php:797 +#, php-format +msgid "Unable to fetch avatar from %s" +msgstr "" + +#: lib/salmonaction.php:41 +msgid "This method requires a POST." +msgstr "" + +#: lib/salmonaction.php:45 +msgid "Salmon requires application/magic-envelope+xml" +msgstr "" + +#: lib/salmonaction.php:55 +msgid "Salmon signature verification failed." +msgstr "" + +#: lib/salmonaction.php:66 +msgid "Salmon post must be an Atom entry." +msgstr "" + +#: lib/salmonaction.php:114 +msgid "Unrecognized activity type." +msgstr "" + +#: lib/salmonaction.php:122 +msgid "This target doesn't understand posts." +msgstr "" + +#: lib/salmonaction.php:127 +msgid "This target doesn't understand follows." +msgstr "" + +#: lib/salmonaction.php:132 +msgid "This target doesn't understand unfollows." +msgstr "" + +#: lib/salmonaction.php:137 +msgid "This target doesn't understand favorites." +msgstr "" + +#: lib/salmonaction.php:142 +msgid "This target doesn't understand unfavorites." +msgstr "" + +#: lib/salmonaction.php:147 +msgid "This target doesn't understand share events." +msgstr "" + +#: lib/salmonaction.php:152 +msgid "This target doesn't understand joins." +msgstr "" + +#: lib/salmonaction.php:157 +msgid "This target doesn't understand leave events." +msgstr "" + +#: OStatusPlugin.php:319 +#, php-format +msgid "Sent from %s via OStatus" +msgstr "" + +#: OStatusPlugin.php:371 +msgid "Could not set up remote subscription." +msgstr "" + +#: OStatusPlugin.php:487 +msgid "Could not set up remote group membership." +msgstr "" + +#: OStatusPlugin.php:504 +#, php-format +msgid "%s has joined group %s." +msgstr "" + +#: OStatusPlugin.php:512 +msgid "Failed joining remote group." +msgstr "" + +#: OStatusPlugin.php:553 +msgid "Leave" +msgstr "" + +#: OStatusPlugin.php:554 +#, php-format +msgid "%s has left group %s." +msgstr "" + +#: OStatusPlugin.php:685 +msgid "Subscribe to remote user" +msgstr "" + +#: OStatusPlugin.php:726 +msgid "Profile update" +msgstr "" + +#: OStatusPlugin.php:727 +#, php-format +msgid "%s has updated their profile page." +msgstr "" + +#: tests/gettext-speedtest.php:57 +msgid "Feeds" msgstr "" diff --git a/scripts/update_po_templates.php b/scripts/update_po_templates.php index 61a6ac783..0bfa62a22 100755 --- a/scripts/update_po_templates.php +++ b/scripts/update_po_templates.php @@ -36,7 +36,11 @@ xgettext \ --default-domain=$domain \ --output=locale/$domain.po \ --language=PHP \ - --keyword="_m:1" \ + --add-comments=TRANS \ + --keyword="_m:1,1t" \ + --keyword="_m:1c,2,2t" \ + --keyword="_m:1,2,3t" \ + --keyword="_m:1c,2,3,4t" \ --keyword="pgettext:1c,2" \ --keyword="npgettext:1c,2,3" \ actions/*.php \ @@ -62,6 +66,7 @@ xgettext \ --default-domain=$domain \ --output=locale/$domain.po \ --language=PHP \ + --add-comments=TRANS \ --keyword='' \ --keyword="_m:1,1t" \ --keyword="_m:1c,2,2t" \ -- cgit v1.2.3-54-g00ecf From 3ff3abb247062ed61486930ed1203c286b1378b2 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 1 Mar 2010 12:55:51 -0500 Subject: Script to convert OMB subscriptions to OStatus subscriptions --- plugins/OStatus/scripts/updateostatus.php | 102 ++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 plugins/OStatus/scripts/updateostatus.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/scripts/updateostatus.php b/plugins/OStatus/scripts/updateostatus.php new file mode 100644 index 000000000..8b1081704 --- /dev/null +++ b/plugins/OStatus/scripts/updateostatus.php @@ -0,0 +1,102 @@ +#!/usr/bin/env php +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/../..')); + +$shortoptions = 'i:n:a'; +$longoptions = array('id=', 'nickname=', 'all'); + +$helptext = <<find()) { + while ($user->fetch()) { + updateOStatus($user); + } + } + } else { + show_help(); + exit(1); + } +} catch (Exception $e) { + print $e->getMessage()."\n"; + exit(1); +} + +function updateOStatus($user) +{ + $up = $user->getProfile(); + + $sp = $user->getSubscriptions(); + + $rps = array(); + + while ($sp->fetch()) { + $remote = Remote_profile::staticGet('id', $sp->id); + + if (!empty($remote)) { + $rps[] = clone($sp); + } + } + + foreach ($rps as $rp) { + try { + $op = Ostatus_profile::ensureProfile($rp->profileurl); + + if (!empty($op)) { + Subscription::cancel($up, $rp); + Subscription::start($up, $op->localProfile()); + } + + } catch (Exception $e) { + common_log(LOG_WARNING, "Couldn't convert OMB subscription (" . $up->nickname . ", " . $rp->nickname . + ") to OStatus: " . $e->getMessage()); + continue; + } + } +} -- cgit v1.2.3-54-g00ecf From d77248343f173d5a25e674abfc4bffe59d55300c Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 1 Mar 2010 13:13:51 -0500 Subject: fix path for updateostatus.php --- plugins/OStatus/scripts/updateostatus.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/scripts/updateostatus.php b/plugins/OStatus/scripts/updateostatus.php index 8b1081704..1414f81e9 100644 --- a/plugins/OStatus/scripts/updateostatus.php +++ b/plugins/OStatus/scripts/updateostatus.php @@ -18,7 +18,7 @@ * along with this program. If not, see . */ -define('INSTALLDIR', realpath(dirname(__FILE__) . '/../..')); +define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..')); $shortoptions = 'i:n:a'; $longoptions = array('id=', 'nickname=', 'all'); -- cgit v1.2.3-54-g00ecf From 0512151eabf64e88b4648869b3d029800d30668a Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 1 Mar 2010 18:19:20 -0500 Subject: more output in updateostatus.php --- plugins/OStatus/scripts/updateostatus.php | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/scripts/updateostatus.php b/plugins/OStatus/scripts/updateostatus.php index 1414f81e9..d553a7d62 100644 --- a/plugins/OStatus/scripts/updateostatus.php +++ b/plugins/OStatus/scripts/updateostatus.php @@ -24,7 +24,7 @@ $shortoptions = 'i:n:a'; $longoptions = array('id=', 'nickname=', 'all'); $helptext = <<nickname}..."; + } + $up = $user->getProfile(); $sp = $user->getSubscriptions(); @@ -84,16 +88,37 @@ function updateOStatus($user) } } + if (!have_option('q', 'quiet')) { + echo count($rps) . "\n"; + } + foreach ($rps as $rp) { try { + if (!have_option('q', 'quiet')) { + echo "Checking {$rp->nickname}..."; + } + $op = Ostatus_profile::ensureProfile($rp->profileurl); - if (!empty($op)) { + if (empty($op)) { + echo "can't convert.\n"; + continue; + } else { + if (!have_option('q', 'quiet')) { + echo "Converting..."; + } Subscription::cancel($up, $rp); Subscription::start($up, $op->localProfile()); + if (!have_option('q', 'quiet')) { + echo "done.\n"; + } } } catch (Exception $e) { + if (!have_option('q', 'quiet')) { + echo "fail.\n"; + } + continue; common_log(LOG_WARNING, "Couldn't convert OMB subscription (" . $up->nickname . ", " . $rp->nickname . ") to OStatus: " . $e->getMessage()); continue; -- cgit v1.2.3-54-g00ecf From 45e8819c1b9cc618e9b2d6678b0ff14c653a09d3 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 1 Mar 2010 16:35:36 -0800 Subject: Fix a bunch of notice & warning-level messages that were breaking my inter-instance communications --- plugins/OStatus/classes/Magicsig.php | 4 +++- plugins/OStatus/classes/Ostatus_profile.php | 2 +- plugins/OStatus/lib/discovery.php | 2 +- plugins/OStatus/lib/xrd.php | 11 ++++++++--- 4 files changed, 13 insertions(+), 6 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Magicsig.php b/plugins/OStatus/classes/Magicsig.php index 96900d876..5a46aeeb6 100644 --- a/plugins/OStatus/classes/Magicsig.php +++ b/plugins/OStatus/classes/Magicsig.php @@ -146,8 +146,10 @@ class Magicsig extends Memcached_DataObject $mod = base64_url_decode($matches[1]); $exp = base64_url_decode($matches[2]); - if ($matches[4]) { + if (!empty($matches[4])) { $private_exp = base64_url_decode($matches[4]); + } else { + $private_exp = false; } $params['public_key'] = new Crypt_RSA_KEY($mod, $exp, 'public'); diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 7b1aec76b..93e8934c9 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1145,7 +1145,7 @@ class Ostatus_profile extends Memcached_DataObject if (!empty($poco)) { $url = $poco->getPrimaryURL(); - if ($url->type == 'homepage') { + if ($url && $url->type == 'homepage') { $homepage = $url->value; } } diff --git a/plugins/OStatus/lib/discovery.php b/plugins/OStatus/lib/discovery.php index 388df0a28..f8449b309 100644 --- a/plugins/OStatus/lib/discovery.php +++ b/plugins/OStatus/lib/discovery.php @@ -94,7 +94,7 @@ class Discovery $links = call_user_func(array($class, 'discover'), $uri); if ($link = Discovery::getService($links, Discovery::LRDD_REL)) { // Load the LRDD XRD - if ($link['template']) { + if (!empty($link['template'])) { $xrd_uri = Discovery::applyTemplate($link['template'], $uri); } else { $xrd_uri = $link['href']; diff --git a/plugins/OStatus/lib/xrd.php b/plugins/OStatus/lib/xrd.php index 16d27f8eb..1de065db9 100644 --- a/plugins/OStatus/lib/xrd.php +++ b/plugins/OStatus/lib/xrd.php @@ -53,17 +53,22 @@ class XRD $xrd = new XRD(); $dom = new DOMDocument(); - $dom->loadXML($xml); + if (!$dom->loadXML($xml)) { + throw new Exception("Invalid XML"); + } $xrd_element = $dom->getElementsByTagName('XRD')->item(0); // Check for host-meta host - $host = $xrd_element->getElementsByTagName('Host')->item(0)->nodeValue; + $host = $xrd_element->getElementsByTagName('Host')->item(0); if ($host) { - $xrd->host = $host; + $xrd->host = $host->nodeValue; } // Loop through other elements foreach ($xrd_element->childNodes as $node) { + if (!($node instanceof DOMElement)) { + continue; + } switch ($node->tagName) { case 'Expires': $xrd->expires = $node->nodeValue; -- cgit v1.2.3-54-g00ecf From 493b5479c15f0e135054fd6b961e50e690077eda Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 1 Mar 2010 16:36:33 -0800 Subject: OStatus: support @example.com/path/to/profile mentions as well as @profile@example.com (latter requires webfinger, former doesn't) Plus misc warnings/notices cleanup in the submission path. --- actions/newnotice.php | 3 ++ plugins/OStatus/OStatusPlugin.php | 57 ++++++++++++++++++++++------- plugins/OStatus/classes/Ostatus_profile.php | 2 +- plugins/OStatus/lib/discovery.php | 2 +- plugins/OStatus/lib/xrd.php | 10 ++--- 5 files changed, 54 insertions(+), 20 deletions(-) (limited to 'plugins/OStatus') diff --git a/actions/newnotice.php b/actions/newnotice.php index 78480abab..ed0fa1b2b 100644 --- a/actions/newnotice.php +++ b/actions/newnotice.php @@ -294,6 +294,9 @@ class NewnoticeAction extends Action if ($profile) { $content = '@' . $profile->nickname . ' '; } + } else { + // @fixme most of these bits above aren't being passed on above + $inreplyto = null; } $notice_form = new NoticeForm($this, '', $content, null, $inreplyto); diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 720dedd0a..4ffbba45b 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -222,31 +222,62 @@ class OStatusPlugin extends Plugin } /** - * + * Find any explicit remote mentions. Accepted forms: + * Webfinger: @user@example.com + * Profile link: @example.com/mublog/user + * @param Profile $sender (os user?) + * @param string $text input markup text + * @param array &$mention in/out param: set of found mentions + * @return boolean hook return value */ function onEndFindMentions($sender, $text, &$mentions) { - preg_match_all('/(?:^|\s+)@((?:\w+\.)*\w+@(?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+)/', + preg_match_all('!(?:^|\s+) + @( # Webfinger: + (?:\w+\.)*\w+ # user + @ # @ + (?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+ # domain + | # Profile: + (?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+ # domain + (?:/\w+)+ # /path1(/path2...) + )!x', $text, $wmatches, PREG_OFFSET_CAPTURE); foreach ($wmatches[1] as $wmatch) { - - $webfinger = $wmatch[0]; - - $this->log(LOG_INFO, "Checking Webfinger for address '$webfinger'"); - - $oprofile = Ostatus_profile::ensureWebfinger($webfinger); + $target = $wmatch[0]; + $oprofile = null; + + if (strpos($target, '/') === false) { + $this->log(LOG_INFO, "Checking Webfinger for address '$target'"); + try { + $oprofile = Ostatus_profile::ensureWebfinger($target); + } catch (Exception $e) { + $this->log(LOG_ERR, "Webfinger check failed: " . $e->getMessage()); + } + } else { + $schemes = array('https', 'http'); + foreach ($schemes as $scheme) { + $url = "$scheme://$target"; + $this->log(LOG_INFO, "Checking profile address '$url'"); + try { + $oprofile = Ostatus_profile::ensureProfile($url); + if ($oprofile) { + continue; + } + } catch (Exception $e) { + $this->log(LOG_ERR, "Profile check failed: " . $e->getMessage()); + } + } + } if (empty($oprofile)) { - - $this->log(LOG_INFO, "No Ostatus_profile found for address '$webfinger'"); - + $this->log(LOG_INFO, "No Ostatus_profile found for address '$target'"); } else { - $this->log(LOG_INFO, "Ostatus_profile found for address '$webfinger'"); + $this->log(LOG_INFO, "Ostatus_profile found for address '$target'"); if ($oprofile->isGroup()) { continue; @@ -261,7 +292,7 @@ class OStatusPlugin extends Plugin } } $mentions[] = array('mentioned' => array($profile), - 'text' => $wmatch[0], + 'text' => $target, 'position' => $pos, 'url' => $profile->profileurl); } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 7b1aec76b..668a31df4 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -698,7 +698,7 @@ class Ostatus_profile extends Memcached_DataObject { // Get the canonical feed URI and check it $discover = new FeedDiscovery(); - if ($hints['feedurl']) { + if (isset($hints['feedurl'])) { $feeduri = $hints['feedurl']; $feeduri = $discover->discoverFromFeedURL($feeduri); } else { diff --git a/plugins/OStatus/lib/discovery.php b/plugins/OStatus/lib/discovery.php index 388df0a28..f8449b309 100644 --- a/plugins/OStatus/lib/discovery.php +++ b/plugins/OStatus/lib/discovery.php @@ -94,7 +94,7 @@ class Discovery $links = call_user_func(array($class, 'discover'), $uri); if ($link = Discovery::getService($links, Discovery::LRDD_REL)) { // Load the LRDD XRD - if ($link['template']) { + if (!empty($link['template'])) { $xrd_uri = Discovery::applyTemplate($link['template'], $uri); } else { $xrd_uri = $link['href']; diff --git a/plugins/OStatus/lib/xrd.php b/plugins/OStatus/lib/xrd.php index 16d27f8eb..48c1c88e1 100644 --- a/plugins/OStatus/lib/xrd.php +++ b/plugins/OStatus/lib/xrd.php @@ -156,20 +156,20 @@ class XRD function saveLink($doc, $link) { $link_element = $doc->createElement('Link'); - if ($link['rel']) { + if (!empty($link['rel'])) { $link_element->setAttribute('rel', $link['rel']); } - if ($link['type']) { + if (!empty($link['type'])) { $link_element->setAttribute('type', $link['type']); } - if ($link['href']) { + if (!empty($link['href'])) { $link_element->setAttribute('href', $link['href']); } - if ($link['template']) { + if (!empty($link['template'])) { $link_element->setAttribute('template', $link['template']); } - if (is_array($link['title'])) { + if (!empty($link['title']) && is_array($link['title'])) { foreach($link['title'] as $title) { $title = $doc->createElement('Title', $title); $link_element->appendChild($title); -- cgit v1.2.3-54-g00ecf From 680ace19665f064404ddb4723d9b41ab69c6e1bd Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 1 Mar 2010 18:46:34 -0800 Subject: High-priority OStatus fixes: * PuSHing out to multiple client services could fail; only first callback got reached * Correction for re-sub request to a known sub --- plugins/OStatus/actions/pushhub.php | 2 +- plugins/OStatus/classes/HubSub.php | 8 +++++++- 2 files changed, 8 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/pushhub.php b/plugins/OStatus/actions/pushhub.php index f33690bc4..842d65e7d 100644 --- a/plugins/OStatus/actions/pushhub.php +++ b/plugins/OStatus/actions/pushhub.php @@ -104,7 +104,7 @@ class PushHubAction extends Action throw new ClientException("Invalid hub.secret $secret; must be under 200 bytes."); } - $sub = HubSub::staticGet($sub->topic, $sub->callback); + $sub = HubSub::staticGet($topic, $callback); if (!$sub) { // Creating a new one! $sub = new HubSub(); diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index e599d83a9..3120a70f9 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -260,9 +260,15 @@ class HubSub extends Memcached_DataObject $retries = intval(common_config('ostatus', 'hub_retries')); } - $data = array('sub' => clone($this), + // We dare not clone() as when the clone is discarded it'll + // destroy the result data for the parent query. + // @fixme use clone() again when it's safe to copy an + // individual item from a multi-item query again. + $sub = HubSub::staticGet($this->topic, $this->callback); + $data = array('sub' => $sub, 'atom' => $atom, 'retries' => $retries); + common_log(LOG_INFO, "Queuing PuSH: $this->topic to $this->callback"); $qm = QueueManager::get(); $qm->enqueue($data, 'hubout'); } -- cgit v1.2.3-54-g00ecf From 623faf9f2d83b8fd6134e77ad6f5dd1cedc7a5c1 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 2 Mar 2010 09:57:28 -0500 Subject: Just a label change. Since the user already went ahead with subscribing, in this step we are just confirming the profile. --- plugins/OStatus/actions/ostatussub.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index f45e6a8d1..e318701a2 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -112,7 +112,7 @@ class OStatusSubAction extends Action $this->submit('submit', _m('Join'), 'submit', null, _m('Join this group')); } else { - $this->submit('submit', _m('Subscribe'), 'submit', null, + $this->submit('submit', _m('Confirm'), 'submit', null, _m('Subscribe to this user')); } $this->elementEnd('fieldset'); -- cgit v1.2.3-54-g00ecf From 5abff9104130ca6b49de6ab19f0359e888e1a085 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 2 Mar 2010 12:34:35 -0500 Subject: Generalized style for entity remote subscription action --- plugins/OStatus/theme/base/css/ostatus.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/theme/base/css/ostatus.css b/plugins/OStatus/theme/base/css/ostatus.css index feeeb47d3..e370810af 100644 --- a/plugins/OStatus/theme/base/css/ostatus.css +++ b/plugins/OStatus/theme/base/css/ostatus.css @@ -38,11 +38,11 @@ display:none; min-width:96px; } -#subscriptions #entity_remote_subscribe { +#entity_remote_subscribe { padding:0; float:right; } -#subscriptions .entity_remote_subscribe { +.entity_remote_subscribe { float:right; } -- cgit v1.2.3-54-g00ecf From 88c33bbb57433b3f10407f590b49d11ec4d5d530 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 2 Mar 2010 12:35:27 -0500 Subject: Showing remote subscription button on the personal timeline --- plugins/OStatus/OStatusPlugin.php | 18 ++++++++++++++++++ plugins/OStatus/theme/base/css/ostatus.css | 4 ++++ 2 files changed, 22 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 4ffbba45b..64504547f 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -721,6 +721,24 @@ class OStatusPlugin extends Plugin return true; } + function onStartShowAllContent($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. diff --git a/plugins/OStatus/theme/base/css/ostatus.css b/plugins/OStatus/theme/base/css/ostatus.css index e370810af..68470f4e4 100644 --- a/plugins/OStatus/theme/base/css/ostatus.css +++ b/plugins/OStatus/theme/base/css/ostatus.css @@ -46,3 +46,7 @@ float:right; .entity_remote_subscribe { float:right; } + +#all #entity_remote_subscribe { +margin-top:-52px; +} -- cgit v1.2.3-54-g00ecf From e3c2b8e0b50d750ad35cb313726fd2706684c09b Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 2 Mar 2010 12:41:18 -0500 Subject: Refactored remote subscribe action in OStatus --- plugins/OStatus/OStatusPlugin.php | 22 ++++++++-------------- 1 file changed, 8 insertions(+), 14 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 64504547f..7b6d22acf 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -706,22 +706,19 @@ class OStatusPlugin extends Plugin 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'); - } + $this->showEntityRemoteSubscribe($action); return true; } function onStartShowAllContent($action) + { + $this->showEntityRemoteSubscribe($action); + + return true; + } + + function showEntityRemoteSubscribe($action) { $user = common_current_user(); if ($user && ($user->id == $action->profile->id)) { @@ -734,11 +731,8 @@ class OStatusPlugin extends Plugin $action->elementEnd('p'); $action->elementEnd('div'); } - - return true; } - /** * Ping remote profiles with updates to this profile. * Salmon pings are queued for background processing. -- cgit v1.2.3-54-g00ecf From 1550d1004d44c8223b2280a35ca2f64ed61178ef Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Tue, 2 Mar 2010 15:24:07 -0500 Subject: Don't need to float the anchor --- plugins/OStatus/theme/base/css/ostatus.css | 4 ---- 1 file changed, 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/theme/base/css/ostatus.css b/plugins/OStatus/theme/base/css/ostatus.css index 68470f4e4..13e30ef5d 100644 --- a/plugins/OStatus/theme/base/css/ostatus.css +++ b/plugins/OStatus/theme/base/css/ostatus.css @@ -43,10 +43,6 @@ padding:0; float:right; } -.entity_remote_subscribe { -float:right; -} - #all #entity_remote_subscribe { margin-top:-52px; } -- cgit v1.2.3-54-g00ecf From 79ffebb51b1141791d5ee7478e3a7beaa9fe8faa Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 2 Mar 2010 16:30:09 -0800 Subject: OStatus: save file records for enclosures Also stripping id from foreign HTML messages (could interfere with UI) and disabled failing attachment popup for a.attachment links that don't have a proper id, so you can click through instead of getting an error. Issues: * any other links aren't marked and saved * inconsistent behavior between local and remote attachments (local displays in lightbox, remote doesn't) * if the enclosure'd object isn't referenced in the content, you won't be offered a link to it in our UI --- classes/File.php | 7 +++++++ classes/Notice.php | 28 ++++++++++++++++++++++++++-- js/util.js | 7 +++++-- lib/activity.php | 5 +++++ plugins/OStatus/classes/Ostatus_profile.php | 12 ++++++++++-- 5 files changed, 53 insertions(+), 6 deletions(-) (limited to 'plugins/OStatus') diff --git a/classes/File.php b/classes/File.php index 189e04ce0..1b8ef1b3e 100644 --- a/classes/File.php +++ b/classes/File.php @@ -286,5 +286,12 @@ class File extends Memcached_DataObject } return $enclosure; } + + // quick back-compat hack, since there's still code using this + function isEnclosure() + { + $enclosure = $this->getEnclosure(); + return !empty($enclosure); + } } diff --git a/classes/Notice.php b/classes/Notice.php index 63dc96897..c1263c782 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -211,6 +211,8 @@ class Notice extends Memcached_DataObject * extracting ! tags from content * array 'tags' list of hashtag strings to save with the notice * in place of extracting # tags from content + * array 'urls' list of attached/referred URLs to save with the + * notice in place of extracting links from content * @fixme tag override * * @return Notice @@ -380,8 +382,11 @@ class Notice extends Memcached_DataObject $notice->saveTags(); } - // @fixme pass in data for URLs too? - $notice->saveUrls(); + if (isset($urls)) { + $notice->saveKnownUrls($urls); + } else { + $notice->saveUrls(); + } // Prepare inbox delivery, may be queued to background. $notice->distribute(); @@ -427,6 +432,25 @@ class Notice extends Memcached_DataObject common_replace_urls_callback($this->content, array($this, 'saveUrl'), $this->id); } + /** + * Save the given URLs as related links/attachments to the db + * + * follow redirects and save all available file information + * (mimetype, date, size, oembed, etc.) + * + * @return void + */ + function saveKnownUrls($urls) + { + // @fixme validation? + foreach ($urls as $url) { + File::processNew($url, $this->id); + } + } + + /** + * @private callback + */ function saveUrl($data) { list($url, $notice_id) = $data; File::processNew($url, $notice_id); diff --git a/js/util.js b/js/util.js index d08c46fe6..3efda0d7b 100644 --- a/js/util.js +++ b/js/util.js @@ -423,8 +423,11 @@ var SN = { // StatusNet }; notice.find('a.attachment').click(function() { - $().jOverlay({url: $('address .url')[0].href+'attachment/' + ($(this).attr('id').substring('attachment'.length + 1)) + '/ajax'}); - return false; + var attachId = ($(this).attr('id').substring('attachment'.length + 1)); + if (attachId) { + $().jOverlay({url: $('address .url')[0].href+'attachment/' + attachId + '/ajax'}); + return false; + } }); if ($('#shownotice').length == 0) { diff --git a/lib/activity.php b/lib/activity.php index b20153213..ce14fa254 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -1044,6 +1044,7 @@ class Activity public $id; // ID of the activity public $title; // title of the activity public $categories = array(); // list of AtomCategory objects + public $enclosures = array(); // list of enclosure URL references /** * Turns a regular old Atom into a magical activity @@ -1140,6 +1141,10 @@ class Activity $this->categories[] = new AtomCategory($catEl); } } + + foreach (ActivityUtils::getLinks($entry, 'enclosure') as $link) { + $this->enclosures[] = $link->getAttribute('href'); + } } /** diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index a33e95d93..059c19e7c 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -550,7 +550,8 @@ class Ostatus_profile extends Memcached_DataObject 'rendered' => $rendered, 'replies' => array(), 'groups' => array(), - 'tags' => array()); + 'tags' => array(), + 'urls' => array()); // Check for optional attributes... @@ -595,6 +596,12 @@ class Ostatus_profile extends Memcached_DataObject } } + // Atom enclosures -> attachment URLs + foreach ($activity->enclosures as $href) { + // @fixme save these locally or....? + $options['urls'][] = $href; + } + try { $saved = Notice::saveNew($oprofile->profile_id, $content, @@ -620,7 +627,8 @@ class Ostatus_profile extends Memcached_DataObject protected function purify($html) { require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php'; - $config = array('safe' => 1); + $config = array('safe' => 1, + 'deny_attribute' => 'id,style,on*'); return htmLawed($html, $config); } -- cgit v1.2.3-54-g00ecf From 1a4652b1ade6ea4de842835a7d2a011845a1cd62 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 10:32:54 -0500 Subject: Changed label text for remote subscription to something similar. Given that this button will be used within context of subscriptions, 'New' works along with the '+' icon. --- plugins/OStatus/OStatusPlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 7b6d22acf..b5e6867c8 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -727,7 +727,7 @@ class OStatusPlugin extends Plugin 'class' => 'entity_subscribe')); $action->element('a', array('href' => common_local_url('ostatussub'), 'class' => 'entity_remote_subscribe') - , _m('Subscribe to remote user')); + , _m('New')); $action->elementEnd('p'); $action->elementEnd('div'); } -- cgit v1.2.3-54-g00ecf From ea10805e3f68f5781321e7c93144242478081a1f Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 11:22:21 -0500 Subject: Moved the remote subscription button to subscription mini list --- plugins/OStatus/OStatusPlugin.php | 2 +- plugins/OStatus/theme/base/css/ostatus.css | 18 ++++++++++++++++-- 2 files changed, 17 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index b5e6867c8..eb777c6b2 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -711,7 +711,7 @@ class OStatusPlugin extends Plugin return true; } - function onStartShowAllContent($action) + function onEndShowSubscriptionsMiniList($action) { $this->showEntityRemoteSubscribe($action); diff --git a/plugins/OStatus/theme/base/css/ostatus.css b/plugins/OStatus/theme/base/css/ostatus.css index 13e30ef5d..40cdfcef1 100644 --- a/plugins/OStatus/theme/base/css/ostatus.css +++ b/plugins/OStatus/theme/base/css/ostatus.css @@ -41,8 +41,22 @@ min-width:96px; #entity_remote_subscribe { padding:0; float:right; +position:relative; } -#all #entity_remote_subscribe { -margin-top:-52px; +.section .entity_actions { +margin-bottom:0; +} + +.section #entity_remote_subscribe .entity_remote_subscribe { +border-color:#AAAAAA; +} + +.section #entity_remote_subscribe .dialogbox { +width:405px; +} + + +.aside #entity_subscriptions .more { +float:left; } -- cgit v1.2.3-54-g00ecf From 11750e832f994013b2fbce860bd24d24f49a14db Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 12:02:10 -0500 Subject: Added remote join action for group profile --- plugins/OStatus/OStatusPlugin.php | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index eb777c6b2..014fb0b38 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -210,6 +210,26 @@ class OStatusPlugin extends Plugin return false; } + function onStartGroupSubscribe($output, $group) + { + $cur = common_current_user(); + + if (empty($cur)) { + // Add an OStatus subscribe + $output->elementStart('li', 'entity_subscribe'); + $url = common_local_url('ostatusinit', + array('nickname' => $group->nickname)); + $output->element('a', array('href' => $url, + 'class' => 'entity_remote_subscribe'), + _m('Join')); + + $output->elementEnd('li'); + } + + return false; + } + + /** * Check if we've got remote replies to send via Salmon. * -- cgit v1.2.3-54-g00ecf From ffa1931c9dafea385e8f30c53ea079e2425a0786 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 3 Mar 2010 09:31:14 -0800 Subject: Avoid warning/notice spew in XRD parser. Not all DOM nodes are elements. --- plugins/OStatus/lib/xrd.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/xrd.php b/plugins/OStatus/lib/xrd.php index 85df26c54..f00e1f809 100644 --- a/plugins/OStatus/lib/xrd.php +++ b/plugins/OStatus/lib/xrd.php @@ -149,9 +149,11 @@ class XRD $link['href'] = $element->getAttribute('href'); $link['template'] = $element->getAttribute('template'); foreach ($element->childNodes as $node) { - switch($node->tagName) { - case 'Title': - $link['title'][] = $node->nodeValue; + if ($node instanceof DOMElement) { + switch($node->tagName) { + case 'Title': + $link['title'][] = $node->nodeValue; + } } } -- cgit v1.2.3-54-g00ecf From 1e63fda6695c8ab06f2cd8181de26f03f7f7a5d4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 3 Mar 2010 09:32:25 -0800 Subject: Clean up OStatus mentions finding; separate regexes keeps the code paths a bit clearer. Also switched to hitting HTTP profile first; as the common case it'll be faster. --- plugins/OStatus/OStatusPlugin.php | 86 +++++++++++++++++++-------------------- 1 file changed, 43 insertions(+), 43 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 7b6d22acf..f435d6283 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -233,70 +233,70 @@ class OStatusPlugin extends Plugin function onEndFindMentions($sender, $text, &$mentions) { - preg_match_all('!(?:^|\s+) - @( # Webfinger: - (?:\w+\.)*\w+ # user - @ # @ - (?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+ # domain - | # Profile: - (?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+ # domain - (?:/\w+)+ # /path1(/path2...) - )!x', + $matches = array(); + + // Webfinger matches: @user@example.com + if (preg_match_all('!(?:^|\s+)@((?:\w+\.)*\w+@(?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+)!', $text, $wmatches, - PREG_OFFSET_CAPTURE); - - foreach ($wmatches[1] as $wmatch) { - $target = $wmatch[0]; - $oprofile = null; - - if (strpos($target, '/') === false) { - $this->log(LOG_INFO, "Checking Webfinger for address '$target'"); + PREG_OFFSET_CAPTURE)) { + foreach ($wmatches[1] as $wmatch) { + list($target, $pos) = $wmatch; + $this->log(LOG_INFO, "Checking webfinger '$target'"); try { $oprofile = Ostatus_profile::ensureWebfinger($target); + if ($oprofile && !$oprofile->isGroup()) { + $profile = $oprofile->localProfile(); + $matches[$pos] = array('mentioned' => array($profile), + 'text' => $target, + 'position' => $pos, + 'url' => $profile->profileurl); + } } catch (Exception $e) { $this->log(LOG_ERR, "Webfinger check failed: " . $e->getMessage()); } - } else { - $schemes = array('https', 'http'); + } + } + + // Profile matches: @example.com/mublog/user + if (preg_match_all('!(?:^|\s+)@((?:\w+\.)*\w+(?:\w+\-\w+)*\.\w+(?:/\w+)+)!', + $text, + $wmatches, + PREG_OFFSET_CAPTURE)) { + foreach ($wmatches[1] as $wmatch) { + list($target, $pos) = $wmatch; + $schemes = array('http', 'https'); foreach ($schemes as $scheme) { $url = "$scheme://$target"; $this->log(LOG_INFO, "Checking profile address '$url'"); try { $oprofile = Ostatus_profile::ensureProfile($url); - if ($oprofile) { - continue; + if ($oprofile && !$oprofile->isGroup()) { + $profile = $oprofile->localProfile(); + $matches[$pos] = array('mentioned' => array($profile), + 'text' => $target, + 'position' => $pos, + 'url' => $profile->profileurl); + break; } } catch (Exception $e) { $this->log(LOG_ERR, "Profile check failed: " . $e->getMessage()); } } } + } - if (empty($oprofile)) { - $this->log(LOG_INFO, "No Ostatus_profile found for address '$target'"); - } else { - - $this->log(LOG_INFO, "Ostatus_profile found for address '$target'"); - - if ($oprofile->isGroup()) { - continue; - } - $profile = $oprofile->localProfile(); - - $pos = $wmatch[1]; - foreach ($mentions as $i => $other) { - // If we share a common prefix with a local user, override it! - if ($other['position'] == $pos) { - unset($mentions[$i]); - } - } - $mentions[] = array('mentioned' => array($profile), - 'text' => $target, - 'position' => $pos, - 'url' => $profile->profileurl); + foreach ($mentions as $i => $other) { + // If we share a common prefix with a local user, override it! + $pos = $other['position']; + if (isset($matches[$pos])) { + $mentions[$i] = $matches[$pos]; + unset($matches[$pos]); } } + foreach ($matches as $mention) { + $mentions[] = $mention; + } return true; } -- cgit v1.2.3-54-g00ecf From f3cea2430497e751bc7776fe3abf0603e2b55f8b Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 3 Mar 2010 09:36:26 -0800 Subject: Fix for hcard parsing: typo caused notice spew accessing unset array index --- plugins/OStatus/classes/Ostatus_profile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 059c19e7c..7ab031aa5 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1500,7 +1500,7 @@ class Ostatus_profile extends Memcached_DataObject if (array_key_exists('url', $hcard)) { if (is_string($hcard['url'])) { $hints['homepage'] = $hcard['url']; - } else if (is_array($hcard['adr'])) { + } else if (is_array($hcard['url'])) { // HACK get the last one; that's how our hcards look $hints['homepage'] = $hcard['url'][count($hcard['url'])-1]; } -- cgit v1.2.3-54-g00ecf From c8bdf3cacbff1e5ce92b4553480e44d9f0053158 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 12:56:19 -0500 Subject: Added group subscription button to groups mini list --- plugins/OStatus/OStatusPlugin.php | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 014fb0b38..38f5e8d41 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -738,6 +738,13 @@ class OStatusPlugin extends Plugin return true; } + function onEndShowGroupsMiniList($action) + { + $this->showEntityRemoteSubscribe($action); + + return true; + } + function showEntityRemoteSubscribe($action) { $user = common_current_user(); -- cgit v1.2.3-54-g00ecf From 7d7847295afb6b801b1a904c257a7ac5531b806e Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 13:17:00 -0500 Subject: Using position relative only for the remote subscription in section --- plugins/OStatus/theme/base/css/ostatus.css | 3 +++ 1 file changed, 3 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/theme/base/css/ostatus.css b/plugins/OStatus/theme/base/css/ostatus.css index 40cdfcef1..d1c60cc0d 100644 --- a/plugins/OStatus/theme/base/css/ostatus.css +++ b/plugins/OStatus/theme/base/css/ostatus.css @@ -41,6 +41,9 @@ min-width:96px; #entity_remote_subscribe { padding:0; float:right; +} + +.section #entity_remote_subscribe { position:relative; } -- cgit v1.2.3-54-g00ecf From 023b9bb00f096a532218b6689c1f035051653c8e Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 13:30:14 -0500 Subject: Renamed subscribe button from New to Remote since it only does remote subscriptions at the moment. --- plugins/OStatus/OStatusPlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 9d5613b20..e371f72f9 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -754,7 +754,7 @@ class OStatusPlugin extends Plugin 'class' => 'entity_subscribe')); $action->element('a', array('href' => common_local_url('ostatussub'), 'class' => 'entity_remote_subscribe') - , _m('New')); + , _m('Remote')); $action->elementEnd('p'); $action->elementEnd('div'); } -- cgit v1.2.3-54-g00ecf From ccd0db1e0a928fe914c894966ecf2260964a68f0 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 3 Mar 2010 14:32:03 -0500 Subject: add remote subscribe button for not-logged-in users looking a profile list with local users in it --- plugins/OStatus/OStatusPlugin.php | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index e371f72f9..da7ca2fe2 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -111,11 +111,11 @@ class OStatusPlugin extends Plugin $acct = 'acct:'. $action->profile->nickname .'@'. common_config('site', 'server'); $url = common_local_url('xrd'); $url.= '?uri='. $acct; - + header('Link: <'.$url.'>; rel="'. Discovery::LRDD_REL.'"; type="application/xrd+xml"'); } } - + /** * Set up a PuSH hub link to our internal link for canonical timeline * Atom feeds for users and groups. @@ -229,7 +229,6 @@ class OStatusPlugin extends Plugin return false; } - /** * Check if we've got remote replies to send via Salmon. * @@ -587,7 +586,6 @@ class OStatusPlugin extends Plugin // Drop the PuSH subscription if there are no other subscribers. $oprofile->garbageCollect(); - $member = Profile::staticGet($user->id); $act = new Activity(); @@ -806,4 +804,28 @@ class OStatusPlugin extends Plugin return true; } + + function onStartProfileListItemActionElements($item) + { + if (!common_logged_in()) { + + $profileUser = User::staticGet('id', $item->profile->id); + + if (!empty($profileUser)) { + + $output = $item->out; + + // Add an OStatus subscribe + $output->elementStart('li', 'entity_subscribe'); + $url = common_local_url('ostatusinit', + array('nickname' => $profileUser->nickname)); + $output->element('a', array('href' => $url, + 'class' => 'entity_remote_subscribe'), + _m('Subscribe')); + $output->elementEnd('li'); + } + } + + return true; + } } -- cgit v1.2.3-54-g00ecf From 3c55edde39086918eea8c1adba5d01a026e230a3 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 15:30:43 -0500 Subject: Showing the remote subscribe button on the user groups page --- plugins/OStatus/OStatusPlugin.php | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index da7ca2fe2..dc502e52c 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -729,6 +729,13 @@ class OStatusPlugin extends Plugin return true; } + function onStartShowUserGroupsContent($action) + { + $this->showEntityRemoteSubscribe($action); + + return true; + } + function onEndShowSubscriptionsMiniList($action) { $this->showEntityRemoteSubscribe($action); -- cgit v1.2.3-54-g00ecf From d3c1888256e32495cb0db9065ff7a03e105299a3 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 15:31:16 -0500 Subject: Generalized style for remote subscription button --- plugins/OStatus/theme/base/css/ostatus.css | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/theme/base/css/ostatus.css b/plugins/OStatus/theme/base/css/ostatus.css index d1c60cc0d..3b8928a3a 100644 --- a/plugins/OStatus/theme/base/css/ostatus.css +++ b/plugins/OStatus/theme/base/css/ostatus.css @@ -41,9 +41,6 @@ min-width:96px; #entity_remote_subscribe { padding:0; float:right; -} - -.section #entity_remote_subscribe { position:relative; } @@ -55,11 +52,10 @@ margin-bottom:0; border-color:#AAAAAA; } -.section #entity_remote_subscribe .dialogbox { +#entity_remote_subscribe .dialogbox { width:405px; } - .aside #entity_subscriptions .more { float:left; } -- cgit v1.2.3-54-g00ecf From 219e15ac64b0ceefcd714af27b9bbb53123dbe71 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 16:26:02 -0500 Subject: Returning true instead for group remote subscription. If not logged in, it gives the chance to use the logged in join/leave instead. --- plugins/OStatus/OStatusPlugin.php | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index dc502e52c..d28260a4a 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -216,17 +216,14 @@ class OStatusPlugin extends Plugin if (empty($cur)) { // Add an OStatus subscribe - $output->elementStart('li', 'entity_subscribe'); $url = common_local_url('ostatusinit', array('nickname' => $group->nickname)); $output->element('a', array('href' => $url, 'class' => 'entity_remote_subscribe'), _m('Join')); - - $output->elementEnd('li'); } - return false; + return true; } /** -- cgit v1.2.3-54-g00ecf From a42d1116db06539f2da4eb5332bbdbef5beda3fe Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 3 Mar 2010 13:40:26 -0800 Subject: Separate the UI paths for ostatussub and ostatusgroup. They'll redirect to each other transparently if they find you've put a remote entity of the other type. --- plugins/OStatus/OStatusPlugin.php | 12 +- plugins/OStatus/actions/ostatusgroup.php | 181 +++++++++++++++++++++++++++++++ plugins/OStatus/actions/ostatussub.php | 134 +++++++---------------- 3 files changed, 224 insertions(+), 103 deletions(-) create mode 100644 plugins/OStatus/actions/ostatusgroup.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index dc502e52c..b4b446a7f 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -51,8 +51,8 @@ class OStatusPlugin extends Plugin array('action' => 'ostatusinit'), array('nickname' => '[A-Za-z0-9_-]+')); $m->connect('main/ostatussub', array('action' => 'ostatussub')); - $m->connect('main/ostatussub', - array('action' => 'ostatussub'), array('feed' => '[A-Za-z0-9\.\/\:]+')); + $m->connect('main/ostatusgroup', + array('action' => 'ostatusgroup')); // PuSH actions $m->connect('main/push/hub', array('action' => 'pushhub')); @@ -731,7 +731,7 @@ class OStatusPlugin extends Plugin function onStartShowUserGroupsContent($action) { - $this->showEntityRemoteSubscribe($action); + $this->showEntityRemoteSubscribe($action, 'ostatusgroup'); return true; } @@ -745,19 +745,19 @@ class OStatusPlugin extends Plugin function onEndShowGroupsMiniList($action) { - $this->showEntityRemoteSubscribe($action); + $this->showEntityRemoteSubscribe($action, 'ostatusgroup'); return true; } - function showEntityRemoteSubscribe($action) + function showEntityRemoteSubscribe($action, $target='ostatussub') { $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'), + $action->element('a', array('href' => common_local_url($target), 'class' => 'entity_remote_subscribe') , _m('Remote')); $action->elementEnd('p'); diff --git a/plugins/OStatus/actions/ostatusgroup.php b/plugins/OStatus/actions/ostatusgroup.php new file mode 100644 index 000000000..4fcd0eb39 --- /dev/null +++ b/plugins/OStatus/actions/ostatusgroup.php @@ -0,0 +1,181 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer Brion Vibber + */ + +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 + * preview() - display profile for a remote group + * + * success() - redirects to groups page on join + */ +class OStatusGroupAction extends OStatusSubAction +{ + protected $profile_uri; // provided acct: or URI of remote entity + protected $oprofile; // Ostatus_profile of remote entity, if valid + + + function validateRemoteProfile() + { + if (!$this->oprofile->isGroup()) { + // Send us to the user subscription form for conf + $target = common_local_url('ostatussub', array(), array('profile' => $this->profile_uri)); + common_redirect($target, 303); + } + } + + /** + * Show the initial form, when we haven't yet been given a valid + * remote profile. + */ + function showInputForm() + { + $user = common_current_user(); + + $profile = $user->getProfile(); + + $this->elementStart('form', array('method' => 'post', + 'id' => 'form_ostatus_sub', + 'class' => 'form_settings', + 'action' => $this->selfLink())); + + $this->hidden('token', common_session_token()); + + $this->elementStart('fieldset', array('id' => 'settings_feeds')); + + $this->elementStart('ul', 'form_data'); + $this->elementStart('li'); + $this->input('profile', + _m('Group profile URL'), + $this->profile_uri, + _m('Enter the profile URL of a group on another StatusNet site')); + $this->elementEnd('li'); + $this->elementEnd('ul'); + + $this->submit('validate', _m('Continue')); + + $this->elementEnd('fieldset'); + + $this->elementEnd('form'); + } + + /** + * Show a preview for a remote group's profile + * @return boolean true if we're ok to try joining + */ + function preview() + { + $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; + } + + /** + * Redirect on successful remote group join + */ + function success() + { + $cur = common_current_user(); + $url = common_local_url('usergroups', array('nickname' => $cur->nickname)); + common_redirect($url, 303); + } + + /** + * Attempt to finalize subscription. + * validateFeed must have been run first. + * + * Calls showForm on failure or success on success. + */ + function saveFeed() + { + $user = common_current_user(); + $group = $this->oprofile->localGroup(); + if ($user->isMember($group)) { + // TRANS: OStatus remote group subscription dialog error. + $this->showForm(_m('Already a member!')); + return; + } + + if (Event::handle('StartJoinGroup', array($group, $user))) { + $ok = Group_member::join($this->oprofile->group_id, $user->id); + if ($ok) { + Event::handle('EndJoinGroup', array($group, $user)); + $this->success(); + } else { + // TRANS: OStatus remote group subscription dialog error. + $this->showForm(_m('Remote group join failed!')); + } + } else { + // TRANS: OStatus remote group subscription dialog error. + $this->showForm(_m('Remote group join aborted!')); + } + } + + /** + * Title of the page + * + * @return string Title of the page + */ + + function title() + { + // TRANS: Page title for OStatus remote group join form + return _m('Confirm joining remote group'); + } + + /** + * Instructions for use + * + * @return instructions for use + */ + + function getInstructions() + { + return _m('You can subscribe to groups from other supported sites. Paste the group\'s profile URI below:'); + } + + function selfLink() + { + return common_local_url('ostatusgroup'); + } +} diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index e318701a2..542f7e20c 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -1,7 +1,7 @@ elementStart('form', array('method' => 'post', 'id' => 'form_ostatus_sub', 'class' => 'form_settings', - 'action' => - common_local_url('ostatussub'))); + 'action' => $this->selfLink())); $this->hidden('token', common_session_token()); @@ -87,11 +84,7 @@ class OStatusSubAction extends Action */ function showPreviewForm() { - if ($this->oprofile->isGroup()) { - $ok = $this->previewGroup(); - } else { - $ok = $this->previewUser(); - } + $ok = $this->preview(); if (!$ok) { // @fixme maybe provide a cancel button or link back? return; @@ -104,7 +97,7 @@ class OStatusSubAction extends Action 'id' => 'form_ostatus_sub', 'class' => 'form_remote_authorize', 'action' => - common_local_url('ostatussub'))); + $this->selfLink())); $this->elementStart('fieldset'); $this->hidden('token', common_session_token()); $this->hidden('profile', $this->profile_uri); @@ -126,7 +119,7 @@ class OStatusSubAction extends Action * Show a preview for a remote user's profile * @return boolean true if we're ok to try subscribing */ - function previewUser() + function preview() { $oprofile = $this->oprofile; $profile = $oprofile->localProfile(); @@ -150,32 +143,6 @@ class OStatusSubAction extends Action return $ok; } - /** - * Show a preview for a remote group's profile - * @return boolean true if we're ok to try joining - */ - function previewGroup() - { - $oprofile = $this->oprofile; - $group = $oprofile->localGroup(); - - $cur = common_current_user(); - if ($cur->isMember($group)) { - $this->element('div', array('class' => 'error'), - _m("You are already a member of this group.")); - $ok = false; - } else { - $ok = true; - } - - $this->showEntity($group, - $group->getProfileUrl(), - $group->homepage_logo, - $group->description); - return $ok; - } - - function showEntity($entity, $profile, $avatar, $note) { $nickname = $entity->nickname; @@ -254,23 +221,13 @@ class OStatusSubAction extends Action /** * Redirect on successful remote user subscription */ - function successUser() + function success() { $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 @@ -278,16 +235,9 @@ class OStatusSubAction extends Action * * @return boolean */ - function validateFeed() + function pullRemoteProfile() { - $profile_uri = trim($this->arg('profile')); - - if ($profile_uri == '') { - $this->showForm(_m('Empty remote profile URL!')); - return; - } - $this->profile_uri = $profile_uri; - + $this->profile_uri = $this->trimmed('profile'); try { if (Validate::email($this->profile_uri)) { $this->oprofile = Ostatus_profile::ensureWebfinger($this->profile_uri); @@ -318,48 +268,34 @@ class OStatusSubAction extends Action return false; } + function validateRemoteProfile() + { + if ($this->oprofile->isGroup()) { + // Send us to the group subscription form for conf + $target = common_local_url('ostatusgroup', array(), array('profile' => $this->profile_uri)); + common_redirect($target, 303); + } + } + /** * Attempt to finalize subscription. * validateFeed must have been run first. * - * Calls showForm on failure or successUser/successGroup on success. + * Calls showForm on failure or success on success. */ function saveFeed() { // And subscribe the current user to the local profile $user = common_current_user(); - - if ($this->oprofile->isGroup()) { - $group = $this->oprofile->localGroup(); - if ($user->isMember($group)) { - // TRANS: OStatus remote group subscription dialog error. - $this->showForm(_m('Already a member!')); - return; - } - if (Event::handle('StartJoinGroup', array($group, $user))) { - $ok = Group_member::join($this->oprofile->group_id, $user->id); - if ($ok) { - Event::handle('EndJoinGroup', array($group, $user)); - $this->successGroup(); - } else { - // TRANS: OStatus remote group subscription dialog error. - $this->showForm(_m('Remote group join failed!')); - } - } else { - // TRANS: OStatus remote group subscription dialog error. - $this->showForm(_m('Remote group join aborted!')); - } + $local = $this->oprofile->localProfile(); + if ($user->isSubscribed($local)) { + // TRANS: OStatus remote subscription dialog error. + $this->showForm(_m('Already subscribed!')); + } elseif ($this->oprofile->subscribeLocalToRemote($user)) { + $this->success(); } else { - $local = $this->oprofile->localProfile(); - if ($user->isSubscribed($local)) { - // TRANS: OStatus remote subscription dialog error. - $this->showForm(_m('Already subscribed!')); - } elseif ($this->oprofile->subscribeLocalToRemote($user)) { - $this->successUser(); - } else { - // TRANS: OStatus remote subscription dialog error. - $this->showForm(_m('Remote subscription failed!')); - } + // TRANS: OStatus remote subscription dialog error. + $this->showForm(_m('Remote subscription failed!')); } } @@ -376,7 +312,9 @@ class OStatusSubAction extends Action return false; } - $this->profile_uri = $this->arg('profile'); + if ($this->pullRemoteProfile()) { + $this->validateRemoteProfile(); + } return true; } @@ -390,9 +328,6 @@ class OStatusSubAction extends Action if ($_SERVER['REQUEST_METHOD'] == 'POST') { $this->handlePost(); } else { - if ($this->arg('profile')) { - $this->validateFeed(); - } $this->showForm(); } } @@ -414,7 +349,7 @@ class OStatusSubAction extends Action return; } - if ($this->validateFeed()) { + if ($this->oprofile) { if ($this->arg('submit')) { $this->saveFeed(); return; @@ -500,4 +435,9 @@ class OStatusSubAction extends Action parent::showScripts(); $this->autofocus('feedurl'); } + + function selfLink() + { + return common_local_url('ostatussub'); + } } -- cgit v1.2.3-54-g00ecf From 628338265c1607000eaffc42418c63092b019720 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 3 Mar 2010 14:06:05 -0800 Subject: OStatus: fix up remote join button on group profiles --- plugins/OStatus/OStatusPlugin.php | 4 ++- plugins/OStatus/actions/ostatusinit.php | 51 ++++++++++++++++++++++++++------- 2 files changed, 44 insertions(+), 11 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index ca6786a26..cc7e75976 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -49,6 +49,8 @@ class OStatusPlugin extends Plugin array('action' => 'ostatusinit')); $m->connect('main/ostatus?nickname=:nickname', array('action' => 'ostatusinit'), array('nickname' => '[A-Za-z0-9_-]+')); + $m->connect('main/ostatus?group=:group', + array('action' => 'ostatusinit'), array('group' => '[A-Za-z0-9_-]+')); $m->connect('main/ostatussub', array('action' => 'ostatussub')); $m->connect('main/ostatusgroup', @@ -217,7 +219,7 @@ class OStatusPlugin extends Plugin if (empty($cur)) { // Add an OStatus subscribe $url = common_local_url('ostatusinit', - array('nickname' => $group->nickname)); + array('group' => $group->nickname)); $output->element('a', array('href' => $url, 'class' => 'entity_remote_subscribe'), _m('Join')); diff --git a/plugins/OStatus/actions/ostatusinit.php b/plugins/OStatus/actions/ostatusinit.php index 8ba8dcdcc..1e45025b0 100644 --- a/plugins/OStatus/actions/ostatusinit.php +++ b/plugins/OStatus/actions/ostatusinit.php @@ -29,6 +29,7 @@ class OStatusInitAction extends Action { var $nickname; + var $group; var $profile; var $err; @@ -41,8 +42,9 @@ class OStatusInitAction extends Action return false; } - // Local user the remote wants to subscribe to + // Local user or group the remote wants to subscribe to $this->nickname = $this->trimmed('nickname'); + $this->group = $this->trimmed('group'); // Webfinger or profile URL of the remote user $this->profile = $this->trimmed('profile'); @@ -89,25 +91,33 @@ class OStatusInitAction extends Action function showContent() { + if ($this->group) { + $header = sprintf(_m('Join group %s'), $this->group); + $submit = _m('Join'); + } else { + $header = sprintf(_m('Subscribe to %s'), $this->nickname); + $submit = _m('Subscribe'); + } $this->elementStart('form', array('id' => 'form_ostatus_connect', 'method' => 'post', 'class' => 'form_settings', 'action' => common_local_url('ostatusinit'))); $this->elementStart('fieldset'); - $this->element('legend', null, sprintf(_m('Subscribe to %s'), $this->nickname)); + $this->element('legend', null, $header); $this->hidden('token', common_session_token()); $this->elementStart('ul', 'form_data'); $this->elementStart('li', array('id' => 'ostatus_nickname')); $this->input('nickname', _m('User nickname'), $this->nickname, _m('Nickname of the user you want to follow')); + $this->hidden('group', $this->group); // pass-through for magic links $this->elementEnd('li'); $this->elementStart('li', array('id' => 'ostatus_profile')); $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', _m('Subscribe')); + $this->submit('submit', $submit); $this->elementEnd('fieldset'); $this->elementEnd('form'); } @@ -131,19 +141,17 @@ class OStatusInitAction extends Action function connectWebfinger($acct) { - $disco = new Discovery; + $target_profile = $this->targetProfile(); + $disco = new Discovery; $result = $disco->lookup($acct); if (!$result) { $this->clientError(_m("Couldn't look up OStatus account profile.")); } + foreach ($result->links as $link) { if ($link['rel'] == 'http://ostatus.org/schema/1.0/subscribe') { // We found a URL - let's redirect! - - $user = User::staticGet('nickname', $this->nickname); - $target_profile = common_local_url('userbyid', array('id' => $user->id)); - $url = Discovery::applyTemplate($link['template'], $target_profile); common_log(LOG_INFO, "Sending remote subscriber $acct to $url"); common_redirect($url, 303); @@ -155,8 +163,7 @@ class OStatusInitAction extends Action function connectProfile($subscriber_profile) { - $user = User::staticGet('nickname', $this->nickname); - $target_profile = common_local_url('userbyid', array('id' => $user->id)); + $target_profile = $this->targetProfile(); // @fixme hack hack! We should look up the remote sub URL from XRDS $suburl = preg_replace('!^(.*)/(.*?)$!', '$1/main/ostatussub', $subscriber_profile); @@ -166,6 +173,30 @@ class OStatusInitAction extends Action common_redirect($suburl, 303); } + /** + * Build the canonical profile URI+URL of the requested user or group + */ + function targetProfile() + { + if ($this->nickname) { + $user = User::staticGet('nickname', $this->nickname); + if ($user) { + return common_local_url('userbyid', array('id' => $user->id)); + } else { + $this->clientError("No such user."); + } + } else if ($this->group) { + $group = Local_group::staticGet('id', $this->group); + if ($group) { + return common_local_url('groupbyid', array('id' => $group->group_id)); + } else { + $this->clientError("No such group."); + } + } else { + $this->clientError("No local user or group nickname provided."); + } + } + function title() { return _m('OStatus Connect'); -- cgit v1.2.3-54-g00ecf From b3969be85ae37b2b3e8abfce2c545866dd910af7 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 17:48:00 -0500 Subject: Updated remote subscribe button style in aside --- plugins/OStatus/theme/base/css/ostatus.css | 20 ++++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/theme/base/css/ostatus.css b/plugins/OStatus/theme/base/css/ostatus.css index 3b8928a3a..ac668623d 100644 --- a/plugins/OStatus/theme/base/css/ostatus.css +++ b/plugins/OStatus/theme/base/css/ostatus.css @@ -48,10 +48,6 @@ position:relative; margin-bottom:0; } -.section #entity_remote_subscribe .entity_remote_subscribe { -border-color:#AAAAAA; -} - #entity_remote_subscribe .dialogbox { width:405px; } @@ -59,3 +55,19 @@ width:405px; .aside #entity_subscriptions .more { float:left; } + +.section #entity_remote_subscribe { +border:0; +} + +.section .entity_remote_subscribe { +color:#002FA7; +box-shadow:none; +-moz-box-shadow:none; +-webkit-box-shadow:none; +background-color:transparent; +background-position:0 -1183px; +padding:0 0 0 23px; +border:0; + +} -- cgit v1.2.3-54-g00ecf From 9fadf8da1164d620284917b829329e195aa2a226 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 3 Mar 2010 12:51:23 -0800 Subject: Put all required field setup into AtomUserNoticeFeed and AtomGroupNoticeFeed, consolidating some code. (RSS feeds pulling title, logo etc from the Atom data structure so we don't dupe it.) OStatus now calling the feed classes directly instead of faking a call into the API, should be less flakey. --- actions/apitimelinegroup.php | 45 ++++++------------------- actions/apitimelineuser.php | 51 ++++++----------------------- lib/atom10feed.php | 20 +++++++++-- lib/atomgroupnoticefeed.php | 32 ++++++++++++++++-- lib/atomusernoticefeed.php | 41 +++++++++++++++++++++-- plugins/OStatus/lib/ostatusqueuehandler.php | 45 ++++++------------------- 6 files changed, 116 insertions(+), 118 deletions(-) (limited to 'plugins/OStatus') diff --git a/actions/apitimelinegroup.php b/actions/apitimelinegroup.php index e30a08fb5..8f971392b 100644 --- a/actions/apitimelinegroup.php +++ b/actions/apitimelinegroup.php @@ -104,30 +104,21 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction function showTimeline() { - $sitename = common_config('site', 'name'); - $avatar = $this->group->homepage_logo; - $title = sprintf(_("%s timeline"), $this->group->nickname); - - $subtitle = sprintf( - _('Updates from %1$s on %2$s!'), - $this->group->nickname, - $sitename - ); - - $logo = ($avatar) ? $avatar : User_group::defaultLogo(AVATAR_PROFILE_SIZE); + // We'll pull common formatting out of this for other formats + $atom = new AtomGroupNoticeFeed($this->group); switch($this->format) { case 'xml': $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline( + $this->showRssTimeline( $this->notices, - $title, + $atom->title, $this->group->homeUrl(), - $subtitle, + $atom->subtitle, null, - $logo + $atom->logo ); break; case 'atom': @@ -136,38 +127,22 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction try { - $atom = new AtomGroupNoticeFeed($this->group); - - // @todo set all this Atom junk up inside the feed class - - #$atom->setId($id); - $atom->setTitle($title); - $atom->setSubtitle($subtitle); - $atom->setLogo($logo); - $atom->setUpdated('now'); - $atom->addAuthorRaw($this->group->asAtomAuthor()); $atom->setActivitySubject($this->group->asActivitySubject()); - $atom->addLink($this->group->homeUrl()); - $id = $this->arg('id'); $aargs = array('format' => 'atom'); if (!empty($id)) { $aargs['id'] = $id; } + $self = $this->getSelfUri('ApiTimelineGroup', $aargs); - $atom->setId($this->getSelfUri('ApiTimelineGroup', $aargs)); - - $atom->addLink( - $this->getSelfUri('ApiTimelineGroup', $aargs), - array('rel' => 'self', 'type' => 'application/atom+xml') - ); + $atom->setId($self); + $atom->setSelfLink($self); $atom->addEntryFromNotices($this->notices); - //$this->raw($atom->getString()); - print $atom->getString(); // temp hack until PuSH feeds are redone cleanly + $this->raw($atom->getString()); } catch (Atom10FeedException $e) { $this->serverError( diff --git a/actions/apitimelineuser.php b/actions/apitimelineuser.php index 94491946c..2d0047c04 100644 --- a/actions/apitimelineuser.php +++ b/actions/apitimelineuser.php @@ -112,19 +112,17 @@ class ApiTimelineUserAction extends ApiBareAuthAction function showTimeline() { $profile = $this->user->getProfile(); - $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); - $sitename = common_config('site', 'name'); - $title = sprintf(_("%s timeline"), $this->user->nickname); + // We'll use the shared params from the Atom stub + // for other feed types. + $atom = new AtomUserNoticeFeed($this->user); + $title = $atom->title; $link = common_local_url( 'showstream', array('nickname' => $this->user->nickname) ); - $subtitle = sprintf( - _('Updates from %1$s on %2$s!'), - $this->user->nickname, $sitename - ); - $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); + $subtitle = $atom->subtitle; + $logo = $atom->logo; // FriendFeed's SUP protocol // Also added RSS and Atom feeds @@ -146,47 +144,18 @@ class ApiTimelineUserAction extends ApiBareAuthAction header('Content-Type: application/atom+xml; charset=utf-8'); - // @todo set all this Atom junk up inside the feed class - - $atom = new AtomUserNoticeFeed($this->user); - - $atom->setTitle($title); - $atom->setSubtitle($subtitle); - $atom->setLogo($logo); - $atom->setUpdated('now'); - - $atom->addLink( - common_local_url( - 'showstream', - array('nickname' => $this->user->nickname) - ) - ); - $id = $this->arg('id'); $aargs = array('format' => 'atom'); if (!empty($id)) { $aargs['id'] = $id; } - - $atom->setId($this->getSelfUri('ApiTimelineUser', $aargs)); - - $atom->addLink( - $this->getSelfUri('ApiTimelineUser', $aargs), - array('rel' => 'self', 'type' => 'application/atom+xml') - ); - - $atom->addLink( - $suplink, - array( - 'rel' => 'http://api.friendfeed.com/2008/03#sup', - 'type' => 'application/json' - ) - ); + $self = $this->getSelfUri('ApiTimelineUser', $aargs); + $atom->setId($self); + $atom->setSelfLink($self); $atom->addEntryFromNotices($this->notices); - #$this->raw($atom->getString()); - print $atom->getString(); // temporary for output buffering + $this->raw($atom->getString()); break; case 'json': diff --git a/lib/atom10feed.php b/lib/atom10feed.php index 8842840d5..c1fdeaae9 100644 --- a/lib/atom10feed.php +++ b/lib/atom10feed.php @@ -49,6 +49,8 @@ class Atom10FeedException extends Exception class Atom10Feed extends XMLStringer { public $xw; + + // @fixme most of these should probably be read-only properties private $namespaces; private $authors; private $subject; @@ -57,10 +59,12 @@ class Atom10Feed extends XMLStringer private $generator; private $icon; private $links; - private $logo; + private $selfLink; + private $selfLinkType; + public $logo; private $rights; - private $subtitle; - private $title; + public $subtitle; + public $title; private $published; private $updated; private $entries; @@ -184,6 +188,10 @@ class Atom10Feed extends XMLStringer $this->renderAuthors(); + if ($this->selfLink) { + $this->addLink($this->selfLink, array('rel' => 'self', + 'type' => $this->selfLinkType)); + } $this->renderLinks(); } @@ -253,6 +261,12 @@ class Atom10Feed extends XMLStringer $this->id = $id; } + function setSelfLink($url, $type='application/atom+xml') + { + $this->selfLink = $url; + $this->selfLinkType = $type; + } + function setTitle($title) { $this->title = $title; diff --git a/lib/atomgroupnoticefeed.php b/lib/atomgroupnoticefeed.php index 52ee4c7d6..08c1c707c 100644 --- a/lib/atomgroupnoticefeed.php +++ b/lib/atomgroupnoticefeed.php @@ -49,14 +49,42 @@ class AtomGroupNoticeFeed extends AtomNoticeFeed /** * Constructor * - * @param Group $group the group for the feed (optional) + * @param Group $group the group for the feed * @param boolean $indent flag to turn indenting on or off * * @return void */ - function __construct($group = null, $indent = true) { + function __construct($group, $indent = true) { parent::__construct($indent); $this->group = $group; + + $title = sprintf(_("%s timeline"), $group->nickname); + $this->setTitle($title); + + $sitename = common_config('site', 'name'); + $subtitle = sprintf( + _('Updates from %1$s on %2$s!'), + $group->nickname, + $sitename + ); + $this->setSubtitle($subtitle); + + $avatar = $group->homepage_logo; + $logo = ($avatar) ? $avatar : User_group::defaultLogo(AVATAR_PROFILE_SIZE); + $this->setLogo($logo); + + $this->setUpdated('now'); + + $self = common_local_url('ApiTimelineGroup', + array('id' => $group->id, + 'format' => 'atom')); + $this->setId($self); + $this->setSelfLink($self); + + $this->addAuthorRaw($group->asAtomAuthor()); + $this->setActivitySubject($group->asActivitySubject()); + + $this->addLink($group->homeUrl()); } function getGroup() diff --git a/lib/atomusernoticefeed.php b/lib/atomusernoticefeed.php index 2ad8de455..55cebef6d 100644 --- a/lib/atomusernoticefeed.php +++ b/lib/atomusernoticefeed.php @@ -49,19 +49,56 @@ class AtomUserNoticeFeed extends AtomNoticeFeed /** * Constructor * - * @param User $user the user for the feed (optional) + * @param User $user the user for the feed * @param boolean $indent flag to turn indenting on or off * * @return void */ - function __construct($user = null, $indent = true) { + function __construct($user, $indent = true) { parent::__construct($indent); $this->user = $user; if (!empty($user)) { $profile = $user->getProfile(); $this->addAuthor($profile->nickname, $user->uri); } + + $title = sprintf(_("%s timeline"), $user->nickname); + $this->setTitle($title); + + $sitename = common_config('site', 'name'); + $subtitle = sprintf( + _('Updates from %1$s on %2$s!'), + $user->nickname, $sitename + ); + $this->setSubtitle($subtitle); + + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); + $this->setLogo($logo); + + $this->setUpdated('now'); + + $this->addLink( + common_local_url( + 'showstream', + array('nickname' => $user->nickname) + ) + ); + + $self = common_local_url('ApiTimelineUser', + array('id' => $user->id, + 'format' => 'atom')); + $this->setId($self); + $this->setSelfLink($self); + + $this->addLink( + common_local_url('sup', null, null, $user->id), + array( + 'rel' => 'http://api.friendfeed.com/2008/03#sup', + 'type' => 'application/json' + ) + ); } function getUser() diff --git a/plugins/OStatus/lib/ostatusqueuehandler.php b/plugins/OStatus/lib/ostatusqueuehandler.php index 6ca31c485..d1e58f1d6 100644 --- a/plugins/OStatus/lib/ostatusqueuehandler.php +++ b/plugins/OStatus/lib/ostatusqueuehandler.php @@ -164,46 +164,21 @@ class OStatusQueueHandler extends QueueHandler */ 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); + $atom = new AtomUserNoticeFeed($this->user); + $atom->addEntryFromNotice($this->notice); + $feed = $atom->getString(); + 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); + $group = User_group::staticGet('id', $group_id); + + $atom = new AtomGroupNoticeFeed($group); + $atom->addEntryFromNotice($this->notice); + $feed = $atom->getString(); + return $feed; } -- cgit v1.2.3-54-g00ecf From 6a5a629afac881fdc8369dfef2924f7f62949fab Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 20:08:55 -0500 Subject: Updated label and note text for user and group remote subscribe forms --- plugins/OStatus/actions/ostatusgroup.php | 4 ++-- plugins/OStatus/actions/ostatussub.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatusgroup.php b/plugins/OStatus/actions/ostatusgroup.php index 4fcd0eb39..f325ba053 100644 --- a/plugins/OStatus/actions/ostatusgroup.php +++ b/plugins/OStatus/actions/ostatusgroup.php @@ -72,9 +72,9 @@ class OStatusGroupAction extends OStatusSubAction $this->elementStart('ul', 'form_data'); $this->elementStart('li'); $this->input('profile', - _m('Group profile URL'), + _m('Join group'), $this->profile_uri, - _m('Enter the profile URL of a group on another StatusNet site')); + _m("OStatus group's address, like http://example.net/group/nickname")); $this->elementEnd('li'); $this->elementEnd('ul'); diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 542f7e20c..7ca8a7869 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -62,9 +62,9 @@ class OStatusSubAction extends Action $this->elementStart('ul', 'form_data'); $this->elementStart('li'); $this->input('profile', - _m('Address or profile URL'), + _m('Subscribe to'), $this->profile_uri, - _m('Enter the profile URL of a PubSubHubbub-enabled feed')); + _m("OStatus user's address, like nickname@example.com or http://example.net/user/nickname")); $this->elementEnd('li'); $this->elementEnd('ul'); -- cgit v1.2.3-54-g00ecf From a4d9171306a06983094fdc90dbf040335c4f803f Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 3 Mar 2010 18:23:28 -0800 Subject: Fix up catching of webfinger setup fails --- plugins/OStatus/actions/ostatussub.php | 3 +-- plugins/OStatus/classes/Ostatus_profile.php | 13 ++++++++++--- 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index 7ca8a7869..e8a2c78ae 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -260,7 +260,7 @@ class OStatusSubAction extends Action $this->error = _m('Could not find a feed linked from this URL.'); } catch (FeedSubUnrecognizedTypeException $e) { $this->error = _m('Not a recognized feed type.'); - } catch (FeedSubException $e) { + } catch (Exception $e) { // Any new ones we forgot about $this->error = sprintf(_m('Bad feed URL: %s %s'), get_class($e), $e->getMessage()); } @@ -315,7 +315,6 @@ class OStatusSubAction extends Action if ($this->pullRemoteProfile()) { $this->validateRemoteProfile(); } - return true; } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 7ab031aa5..b3b4336b5 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1267,6 +1267,11 @@ class Ostatus_profile extends Memcached_DataObject } } + /** + * @param string $addr webfinger address + * @return Ostatus_profile + * @throws Exception on error conditions + */ public static function ensureWebfinger($addr) { // First, try the cache @@ -1275,7 +1280,8 @@ class Ostatus_profile extends Memcached_DataObject if ($uri !== false) { if (is_null($uri)) { - return null; + // Negative cache entry + throw new Exception('Not a valid webfinger address.'); } $oprofile = Ostatus_profile::staticGet('uri', $uri); if (!empty($oprofile)) { @@ -1299,8 +1305,9 @@ class Ostatus_profile extends Memcached_DataObject try { $result = $disco->lookup($addr); } catch (Exception $e) { + // Save negative cache entry so we don't waste time looking it up again. self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), null); - return null; + throw new Exception('Not a valid webfinger address.'); } foreach ($result->links as $link) { @@ -1410,7 +1417,7 @@ class Ostatus_profile extends Memcached_DataObject return $oprofile; } - return null; + throw new Exception("Couldn't find a valid profile for '$addr'"); } function saveHTMLFile($title, $rendered) -- cgit v1.2.3-54-g00ecf From 14065ca350cae576461f1a2db33694e38cebf751 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 3 Mar 2010 18:28:39 -0800 Subject: OStatus: code cleanup on webfinger fallback path --- plugins/OStatus/classes/Ostatus_profile.php | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index b3b4336b5..fcca1a252 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -1306,20 +1306,23 @@ class Ostatus_profile extends Memcached_DataObject $result = $disco->lookup($addr); } catch (Exception $e) { // Save negative cache entry so we don't waste time looking it up again. + // @fixme distinguish temporary failures? self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), null); throw new Exception('Not a valid webfinger address.'); } + $hints = array('webfinger' => $addr); + foreach ($result->links as $link) { switch ($link['rel']) { case Discovery::PROFILEPAGE: - $profileUrl = $link['href']; + $hints['profileurl'] = $profileUrl = $link['href']; break; case Salmon::NS_REPLIES: - $salmonEndpoint = $link['href']; + $hints['salmon'] = $salmonEndpoint = $link['href']; break; case Discovery::UPDATESFROM: - $feedUrl = $link['href']; + $hints['feedurl'] = $feedUrl = $link['href']; break; case Discovery::HCARD: $hcardUrl = $link['href']; @@ -1330,11 +1333,6 @@ class Ostatus_profile extends Memcached_DataObject } } - $hints = array('webfinger' => $addr, - 'profileurl' => $profileUrl, - 'feedurl' => $feedUrl, - 'salmon' => $salmonEndpoint); - if (isset($hcardUrl)) { $hcardHints = self::slurpHcard($hcardUrl); // Note: Webfinger > hcard -- cgit v1.2.3-54-g00ecf From 24835c1164251e48037f6ddee14e4b696fe57320 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 3 Mar 2010 18:31:35 -0800 Subject: OStatus: catchable exception instead of fatal when parsing valid XML that isn't a valid XRD doc --- plugins/OStatus/lib/xrd.php | 3 +++ 1 file changed, 3 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/xrd.php b/plugins/OStatus/lib/xrd.php index f00e1f809..aa13ef024 100644 --- a/plugins/OStatus/lib/xrd.php +++ b/plugins/OStatus/lib/xrd.php @@ -57,6 +57,9 @@ class XRD throw new Exception("Invalid XML"); } $xrd_element = $dom->getElementsByTagName('XRD')->item(0); + if (!$xrd_element) { + throw new Exception("Invalid XML, missing XRD root"); + } // Check for host-meta host $host = $xrd_element->getElementsByTagName('Host')->item(0); -- cgit v1.2.3-54-g00ecf From de687d00c0ebe8bf5d185b7037df7f1edfd368a3 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 22:56:50 -0500 Subject: Updated OStatus subscription error messages to be more user friendly. Hopefully. --- plugins/OStatus/actions/ostatussub.php | 26 +++++++++++++++++--------- 1 file changed, 17 insertions(+), 9 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index e8a2c78ae..bee48a8ae 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -64,7 +64,7 @@ class OStatusSubAction extends Action $this->input('profile', _m('Subscribe to'), $this->profile_uri, - _m("OStatus user's address, like nickname@example.com or http://example.net/user/nickname")); + _m("OStatus user's address, like nickname@example.com or http://example.net/nickname")); $this->elementEnd('li'); $this->elementEnd('ul'); @@ -244,25 +244,33 @@ class OStatusSubAction extends Action } else if (Validate::uri($this->profile_uri)) { $this->oprofile = Ostatus_profile::ensureProfile($this->profile_uri); } else { - $this->error = _m("Invalid address format."); + $this->error = _m("Sorry, we could not reach that address. Please make sure that the OStatus address is like nickname@example.com or http://example.net/nickname"); + common_debug('Invalid address format.', __FILE__); return false; } return true; } catch (FeedSubBadURLException $e) { - $this->error = _m('Invalid URL or could not reach server.'); + $this->error = _m("Sorry, we could not reach that address. Please make sure that the OStatus address is like nickname@example.com or http://example.net/nickname"); + common_debug('Invalid URL or could not reach server.', __FILE__); } catch (FeedSubBadResponseException $e) { - $this->error = _m('Cannot read feed; server returned error.'); + $this->error = _m("Sorry, we could not reach that feed. Please try that OStatus address again later."); + common_debug('Cannot read feed; server returned error.', __FILE__); } catch (FeedSubEmptyException $e) { - $this->error = _m('Cannot read feed; server returned an empty page.'); + $this->error = _m("Sorry, we could not reach that feed. Please try that OStatus address again later."); + common_debug('Cannot read feed; server returned an empty page.', __FILE__); } catch (FeedSubBadHTMLException $e) { - $this->error = _m('Bad HTML, could not find feed link.'); + $this->error = _m("Sorry, we could not reach that feed. Please try that OStatus address again later."); + common_debug('Bad HTML, could not find feed link.', __FILE__); } catch (FeedSubNoFeedException $e) { - $this->error = _m('Could not find a feed linked from this URL.'); + $this->error = _m("Sorry, we could not reach that feed. Please try that OStatus address again later."); + common_debug('Could not find a feed linked from this URL.', __FILE__); } catch (FeedSubUnrecognizedTypeException $e) { - $this->error = _m('Not a recognized feed type.'); + $this->error = _m("Sorry, we could not reach that feed. Please try that OStatus address again later."); + common_debug('Not a recognized feed type.', __FILE__); } catch (Exception $e) { // Any new ones we forgot about - $this->error = sprintf(_m('Bad feed URL: %s %s'), get_class($e), $e->getMessage()); + $this->error = _m("Sorry, we could not reach that address. Please make sure that the OStatus address is like nickname@example.com or http://example.net/nickname"); + common_debug(sprintf('Bad feed URL: %s %s', get_class($e), $e->getMessage()), __FILE__); } return false; -- cgit v1.2.3-54-g00ecf From 1c8399fde123fa2bc7b4ebf21fb323d215a9e7b4 Mon Sep 17 00:00:00 2001 From: James Walker Date: Wed, 3 Mar 2010 23:20:04 -0500 Subject: refactor xrd to allow for ownerxrd - xrd document for the site owner. introduced $config['webfinger']['owner'] for a custom xrd subject --- plugins/OStatus/OStatusPlugin.php | 4 +- plugins/OStatus/actions/ownerxrd.php | 56 +++++++++++++++++ plugins/OStatus/actions/userxrd.php | 48 +++++++++++++++ plugins/OStatus/actions/xrd.php | 113 ----------------------------------- plugins/OStatus/lib/xrdaction.php | 105 ++++++++++++++++++++++++++++++++ 5 files changed, 212 insertions(+), 114 deletions(-) create mode 100644 plugins/OStatus/actions/ownerxrd.php create mode 100644 plugins/OStatus/actions/userxrd.php delete mode 100644 plugins/OStatus/actions/xrd.php create mode 100644 plugins/OStatus/lib/xrdaction.php (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index cc7e75976..8baa857d8 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -44,7 +44,9 @@ class OStatusPlugin extends Plugin $m->connect('.well-known/host-meta', array('action' => 'hostmeta')); $m->connect('main/xrd', - array('action' => 'xrd')); + array('action' => 'userxrd')); + $m->connect('main/ownerxrd', + array('action' => 'ownerxrd')); $m->connect('main/ostatus', array('action' => 'ostatusinit')); $m->connect('main/ostatus?nickname=:nickname', diff --git a/plugins/OStatus/actions/ownerxrd.php b/plugins/OStatus/actions/ownerxrd.php new file mode 100644 index 000000000..9c141d8c7 --- /dev/null +++ b/plugins/OStatus/actions/ownerxrd.php @@ -0,0 +1,56 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer James Walker + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +class OwnerxrdAction extends XrdAction +{ + + public $uri; + + function prepare($args) + { + $this->user = User::siteOwner(); + + if (!$this->user) { + $this->clientError(_('No such user.'), 404); + return false; + } + + $nick = common_canonical_nickname($this->user->nickname); + $acct = 'acct:' . $nick . '@' . common_config('site', 'server'); + + $this->xrd = new XRD(); + + // Check to see if a $config['webfinger']['owner'] has been set + if ($owner = common_config('webfinger', 'owner')) { + $this->xrd->subject = Discovery::normalize($owner); + $this->xrd->alias[] = $acct; + } else { + $this->xrd->subject = $acct; + } + + return true; + } +} diff --git a/plugins/OStatus/actions/userxrd.php b/plugins/OStatus/actions/userxrd.php new file mode 100644 index 000000000..414de9364 --- /dev/null +++ b/plugins/OStatus/actions/userxrd.php @@ -0,0 +1,48 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer James Walker + */ + +if (!defined('STATUSNET')) { exit(1); } + +class UserxrdAction extends XrdAction +{ + + function prepare($args) + { + parent::prepare($args); + + $this->uri = $this->trimmed('uri'); + $acct = Discovery::normalize($this->uri); + + list($nick, $domain) = explode('@', substr(urldecode($acct), 5)); + $nick = common_canonical_nickname($nick); + + $this->user = User::staticGet('nickname', $nick); + if (!$this->user) { + $this->clientError(_('No such user.'), 404); + return false; + } + + return true; + } +} diff --git a/plugins/OStatus/actions/xrd.php b/plugins/OStatus/actions/xrd.php deleted file mode 100644 index f574b60ee..000000000 --- a/plugins/OStatus/actions/xrd.php +++ /dev/null @@ -1,113 +0,0 @@ -. - */ - -/** - * @package OStatusPlugin - * @maintainer James Walker - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } - -class XrdAction extends Action -{ - - public $uri; - - function prepare($args) - { - parent::prepare($args); - - $this->uri = $this->trimmed('uri'); - - return true; - } - - function handle() - { - $acct = Discovery::normalize($this->uri); - - $xrd = new XRD(); - - list($nick, $domain) = explode('@', substr(urldecode($acct), 5)); - $nick = common_canonical_nickname($nick); - - $this->user = User::staticGet('nickname', $nick); - if (!$this->user) { - $this->clientError(_('No such user.'), 404); - return false; - } - - $xrd->subject = $this->uri; - $xrd->alias[] = common_profile_url($nick); - $xrd->links[] = array('rel' => Discovery::PROFILEPAGE, - 'type' => 'text/html', - 'href' => common_profile_url($nick)); - - $xrd->links[] = array('rel' => Discovery::UPDATESFROM, - 'href' => common_local_url('ApiTimelineUser', - array('id' => $this->user->id, - 'format' => 'atom')), - 'type' => 'application/atom+xml'); - - // hCard - $xrd->links[] = array('rel' => Discovery::HCARD, - 'type' => 'text/html', - 'href' => common_local_url('hcard', array('nickname' => $nick))); - - // XFN - $xrd->links[] = array('rel' => 'http://gmpg.org/xfn/11', - 'type' => 'text/html', - 'href' => common_profile_url($nick)); - // FOAF - $xrd->links[] = array('rel' => 'describedby', - 'type' => 'application/rdf+xml', - 'href' => common_local_url('foaf', - array('nickname' => $nick))); - - // Salmon - $salmon_url = common_local_url('usersalmon', - array('id' => $this->user->id)); - - $xrd->links[] = array('rel' => Salmon::NS_REPLIES, - 'href' => $salmon_url); - - $xrd->links[] = array('rel' => Salmon::NS_MENTIONS, - 'href' => $salmon_url); - - // Get this user's keypair - $magickey = Magicsig::staticGet('user_id', $this->user->id); - if (!$magickey) { - // No keypair yet, let's generate one. - $magickey = new Magicsig(); - $magickey->generate($this->user->id); - } - - $xrd->links[] = array('rel' => Magicsig::PUBLICKEYREL, - 'href' => 'data:application/magic-public-key;'. $magickey->toString(false)); - - // TODO - finalize where the redirect should go on the publisher - $url = common_local_url('ostatussub') . '?profile={uri}'; - $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe', - 'template' => $url ); - - header('Content-type: text/xml'); - print $xrd->toXML(); - } - -} diff --git a/plugins/OStatus/lib/xrdaction.php b/plugins/OStatus/lib/xrdaction.php new file mode 100644 index 000000000..6881292ad --- /dev/null +++ b/plugins/OStatus/lib/xrdaction.php @@ -0,0 +1,105 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer James Walker + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +class XrdAction extends Action +{ + + public $uri; + + public $user; + + public $xrd; + + function handle() + { + $nick = $this->user->nickname; + + if (empty($this->xrd)) { + $xrd = new XRD(); + } else { + $xrd = $this->xrd; + } + + if (empty($xrd->subject)) { + $xrd->subject = Discovery::normalize($this->uri); + } + $xrd->alias[] = common_profile_url($nick); + $xrd->links[] = array('rel' => Discovery::PROFILEPAGE, + 'type' => 'text/html', + 'href' => common_profile_url($nick)); + + $xrd->links[] = array('rel' => Discovery::UPDATESFROM, + 'href' => common_local_url('ApiTimelineUser', + array('id' => $this->user->id, + 'format' => 'atom')), + 'type' => 'application/atom+xml'); + + // hCard + $xrd->links[] = array('rel' => Discovery::HCARD, + 'type' => 'text/html', + 'href' => common_local_url('hcard', array('nickname' => $nick))); + + // XFN + $xrd->links[] = array('rel' => 'http://gmpg.org/xfn/11', + 'type' => 'text/html', + 'href' => common_profile_url($nick)); + // FOAF + $xrd->links[] = array('rel' => 'describedby', + 'type' => 'application/rdf+xml', + 'href' => common_local_url('foaf', + array('nickname' => $nick))); + + // Salmon + $salmon_url = common_local_url('usersalmon', + array('id' => $this->user->id)); + + $xrd->links[] = array('rel' => Salmon::NS_REPLIES, + 'href' => $salmon_url); + + $xrd->links[] = array('rel' => Salmon::NS_MENTIONS, + 'href' => $salmon_url); + + // Get this user's keypair + $magickey = Magicsig::staticGet('user_id', $this->user->id); + if (!$magickey) { + // No keypair yet, let's generate one. + $magickey = new Magicsig(); + $magickey->generate($this->user->id); + } + + $xrd->links[] = array('rel' => Magicsig::PUBLICKEYREL, + 'href' => 'data:application/magic-public-key;'. $magickey->toString(false)); + + // TODO - finalize where the redirect should go on the publisher + $url = common_local_url('ostatussub') . '?profile={uri}'; + $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe', + 'template' => $url ); + + header('Content-type: text/xml'); + print $xrd->toXML(); + } + +} -- cgit v1.2.3-54-g00ecf From 38503096d905fbb4db8552eeb59afc12d4b5e903 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 23:34:48 -0500 Subject: Puts All groups and Remote sub button in the mini list on the same line --- plugins/OStatus/theme/base/css/ostatus.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/theme/base/css/ostatus.css b/plugins/OStatus/theme/base/css/ostatus.css index ac668623d..f7d9853cf 100644 --- a/plugins/OStatus/theme/base/css/ostatus.css +++ b/plugins/OStatus/theme/base/css/ostatus.css @@ -52,7 +52,8 @@ margin-bottom:0; width:405px; } -.aside #entity_subscriptions .more { +.aside #entity_subscriptions .more, +.aside #entity_groups .more { float:left; } -- cgit v1.2.3-54-g00ecf From b97ac60209fdec3f2d521f7c9d54acca6d00d274 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Mar 2010 23:47:27 -0500 Subject: Changed text for authorizing/confirming remote profile --- plugins/OStatus/actions/ostatussub.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index bee48a8ae..65dee2392 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -398,7 +398,7 @@ class OStatusSubAction extends Action function title() { // TRANS: Page title for OStatus remote subscription form - return _m('Authorize subscription'); + return _m('Confirm'); } /** -- cgit v1.2.3-54-g00ecf From 849f5783c445934da370769310b3b0382bc5d303 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 4 Mar 2010 01:30:15 -0500 Subject: update xrd -> userxrd --- plugins/OStatus/OStatusPlugin.php | 2 +- plugins/OStatus/actions/hostmeta.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 8baa857d8..ad4f61389 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -113,7 +113,7 @@ class OStatusPlugin extends Plugin { if ($action instanceof ShowstreamAction) { $acct = 'acct:'. $action->profile->nickname .'@'. common_config('site', 'server'); - $url = common_local_url('xrd'); + $url = common_local_url('userxrd'); $url.= '?uri='. $acct; header('Link: <'.$url.'>; rel="'. Discovery::LRDD_REL.'"; type="application/xrd+xml"'); diff --git a/plugins/OStatus/actions/hostmeta.php b/plugins/OStatus/actions/hostmeta.php index 3d00b98ae..6d35ada6c 100644 --- a/plugins/OStatus/actions/hostmeta.php +++ b/plugins/OStatus/actions/hostmeta.php @@ -32,7 +32,7 @@ class HostMetaAction extends Action parent::handle(); $domain = common_config('site', 'server'); - $url = common_local_url('xrd'); + $url = common_local_url('userxrd'); $url.= '?uri={uri}'; $xrd = new XRD(); -- cgit v1.2.3-54-g00ecf From ddc4a7d2ffde5a925c2cfe7b57e51cd0b2cf0153 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 4 Mar 2010 01:46:34 -0500 Subject: Catch a previously uncaught exception and add some additional debug logs for signature verification --- plugins/OStatus/lib/magicenvelope.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index 230d81ba1..fb8c57c71 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -156,18 +156,32 @@ class MagicEnvelope public function verify($env) { if ($env['alg'] != 'RSA-SHA256') { + common_log(LOG_DEBUG, "Salmon error: bad algorithm"); return false; } if ($env['encoding'] != MagicEnvelope::ENCODING) { + common_log(LOG_DEBUG, "Salmon error: bad encoding"); return false; } $text = base64_decode($env['data']); $signer_uri = $this->getAuthor($text); - $verifier = Magicsig::fromString($this->getKeyPair($signer_uri)); + try { + $keypair = $this->getKeyPair($signer_uri); + } catch (Exception $e) { + common_log(LOG_DEBUG, "Salmon error: ".$e->getMessage()); + return false; + } + + $verifier = Magicsig::fromString($keypair); + if (!$verifier) { + common_log(LOG_DEBUG, "Salmon error: unable to parse keypair"); + return false; + } + return $verifier->verify($env['data'], $env['sig']); } -- cgit v1.2.3-54-g00ecf From 45f11d9637c90c0bc7348c6bc5707516ea457d6c Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 4 Mar 2010 12:02:01 -0500 Subject: adding plugin version to OStatus --- plugins/OStatus/OStatusPlugin.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index ad4f61389..bdcaae366 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -836,4 +836,17 @@ class OStatusPlugin extends Plugin return true; } + + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'OStatus', + 'version' => STATUSNET_VERSION, + 'author' => 'Evan Prodromou, James Walker, Brion Vibber, Zach Copley', + 'homepage' => 'http://status.net/wiki/Plugin:OStatus', + 'rawdescription' => + _m('Follow people across social networks that implement '. + 'OStatus.')); + + return true; + } } -- cgit v1.2.3-54-g00ecf From 8f1762cb9580c3f444ff5fd53bcefcbab6b54980 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 4 Mar 2010 09:24:47 -0800 Subject: OStatus: fix for remote group join via non-logged-in 'join' button. Bad lookup was sending us to the first group instead of the selected group. --- plugins/OStatus/actions/ostatusinit.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/actions/ostatusinit.php b/plugins/OStatus/actions/ostatusinit.php index 1e45025b0..22aea9f70 100644 --- a/plugins/OStatus/actions/ostatusinit.php +++ b/plugins/OStatus/actions/ostatusinit.php @@ -186,7 +186,7 @@ class OStatusInitAction extends Action $this->clientError("No such user."); } } else if ($this->group) { - $group = Local_group::staticGet('id', $this->group); + $group = Local_group::staticGet('nickname', $this->group); if ($group) { return common_local_url('groupbyid', array('id' => $group->group_id)); } else { -- cgit v1.2.3-54-g00ecf From 7bd0b8e17ebee9f1b582ac7dd5032562216f9ad0 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 4 Mar 2010 10:20:10 -0800 Subject: Pull latest .po files from 0.9.x to testing --- locale/ar/LC_MESSAGES/statusnet.po | 955 ++++++++----- locale/arz/LC_MESSAGES/statusnet.po | 871 +++++++----- locale/bg/LC_MESSAGES/statusnet.po | 867 +++++++----- locale/ca/LC_MESSAGES/statusnet.po | 884 +++++++----- locale/cs/LC_MESSAGES/statusnet.po | 855 ++++++----- locale/de/LC_MESSAGES/statusnet.po | 909 +++++++----- locale/el/LC_MESSAGES/statusnet.po | 854 ++++++----- locale/en_GB/LC_MESSAGES/statusnet.po | 1484 ++++++++++---------- locale/es/LC_MESSAGES/statusnet.po | 874 +++++++----- locale/fa/LC_MESSAGES/statusnet.po | 868 +++++++----- locale/fi/LC_MESSAGES/statusnet.po | 866 +++++++----- locale/fr/LC_MESSAGES/statusnet.po | 886 +++++++----- locale/ga/LC_MESSAGES/statusnet.po | 857 ++++++----- locale/he/LC_MESSAGES/statusnet.po | 856 ++++++----- locale/hsb/LC_MESSAGES/statusnet.po | 880 +++++++----- locale/ia/LC_MESSAGES/statusnet.po | 871 +++++++----- locale/is/LC_MESSAGES/statusnet.po | 865 +++++++----- locale/it/LC_MESSAGES/statusnet.po | 887 +++++++----- locale/ja/LC_MESSAGES/statusnet.po | 869 +++++++----- locale/ko/LC_MESSAGES/statusnet.po | 865 +++++++----- locale/mk/LC_MESSAGES/statusnet.po | 884 +++++++----- locale/nb/LC_MESSAGES/statusnet.po | 966 ++++++++----- locale/nl/LC_MESSAGES/statusnet.po | 886 +++++++----- locale/nn/LC_MESSAGES/statusnet.po | 865 +++++++----- locale/pl/LC_MESSAGES/statusnet.po | 894 +++++++----- locale/pt/LC_MESSAGES/statusnet.po | 869 +++++++----- locale/pt_BR/LC_MESSAGES/statusnet.po | 869 +++++++----- locale/ru/LC_MESSAGES/statusnet.po | 888 +++++++----- locale/statusnet.po | 554 +++++--- locale/sv/LC_MESSAGES/statusnet.po | 884 +++++++----- locale/te/LC_MESSAGES/statusnet.po | 888 +++++++----- locale/tr/LC_MESSAGES/statusnet.po | 854 ++++++----- locale/uk/LC_MESSAGES/statusnet.po | 885 +++++++----- locale/vi/LC_MESSAGES/statusnet.po | 855 ++++++----- locale/zh_CN/LC_MESSAGES/statusnet.po | 860 +++++++----- locale/zh_TW/LC_MESSAGES/statusnet.po | 853 ++++++----- plugins/Facebook/locale/Facebook.po | 231 +-- plugins/Gravatar/locale/Gravatar.po | 8 +- plugins/Mapstraction/locale/Mapstraction.po | 22 +- plugins/OStatus/locale/OStatus.po | 22 +- plugins/OpenID/locale/OpenID.po | 320 ++--- .../locale/PoweredByStatusNet.po | 8 +- plugins/Sample/locale/Sample.po | 2 +- plugins/TwitterBridge/locale/TwitterBridge.po | 114 +- 44 files changed, 19755 insertions(+), 12849 deletions(-) (limited to 'plugins/OStatus') diff --git a/locale/ar/LC_MESSAGES/statusnet.po b/locale/ar/LC_MESSAGES/statusnet.po index 26f956329..578f0d250 100644 --- a/locale/ar/LC_MESSAGES/statusnet.po +++ b/locale/ar/LC_MESSAGES/statusnet.po @@ -9,76 +9,83 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:01+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:06+0000\n" "Language-Team: Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ar\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=6; plural= n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "نفاذ" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "إعدادات الوصول إلى الموقع" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "تسجيل" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "خاص" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "أأمنع المستخدمين المجهولين (غير الوالجين) من عرض الموقع؟" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "بالدعوة فقط" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "خاص" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "مُغلق" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "بالدعوة فقط" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "عطّل التسجيل الجديد." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "أرسل" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "مُغلق" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "حفظ إعدادت الوصول" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "أرسل" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "لا صفحة كهذه" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -92,72 +99,82 @@ msgstr "لا صفحة كهذه" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "لا مستخدم كهذا." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s والأصدقاء, الصفحة %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s والأصدقاء" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "أنت والأصدقاء" @@ -175,20 +192,20 @@ msgstr "" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "لم يتم العثور على وسيلة API." @@ -220,8 +237,9 @@ msgstr "تعذّر تحديث المستخدم." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "ليس للمستخدم ملف شخصي." @@ -245,7 +263,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -355,68 +373,68 @@ msgstr "تعذّر تحديد المستخدم المصدر." msgid "Could not find target user." msgstr "تعذّر إيجاد المستخدم الهدف." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "" -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "الاسم المستعار مستخدم بالفعل. جرّب اسمًا آخرًا." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "ليس اسمًا مستعارًا صحيحًا." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "الصفحة الرئيسية ليست عنونًا صالحًا." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "الاسم الكامل طويل جدا (الأقصى 255 حرفًا)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "" -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "كنيات كيرة! العدد الأقصى هو %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "كنية غير صالحة: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "" -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -427,15 +445,15 @@ msgstr "" msgid "Group not found!" msgstr "لم توجد المجموعة!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "لم يمكن ضم المستخدم %1$s إلى المجموعة %2$s." @@ -444,7 +462,7 @@ msgstr "لم يمكن ضم المستخدم %1$s إلى المجموعة %2$s." msgid "You are not a member of this group." msgstr "لست عضوًا في هذه المجموعة" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "لم يمكن إزالة المستخدم %1$s من المجموعة %2$s." @@ -476,7 +494,7 @@ msgstr "حجم غير صالح." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -519,7 +537,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -542,13 +560,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "الحساب" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -630,12 +648,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "مسار %s الزمني" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -671,7 +689,7 @@ msgstr "كرر إلى %s" msgid "Repeats of %s" msgstr "تكرارات %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "الإشعارات الموسومة ب%s" @@ -692,8 +710,7 @@ msgstr "لا مرفق كهذا." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "لا اسم مستعار." @@ -705,7 +722,7 @@ msgstr "لا حجم." msgid "Invalid size." msgstr "حجم غير صالح." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "أفتار" @@ -713,7 +730,7 @@ msgstr "أفتار" #: actions/avatarsettings.php:78 #, php-format msgid "You can upload your personal avatar. The maximum file size is %s." -msgstr "" +msgstr "بإمكانك رفع أفتارك الشخصي. أقصى حجم للملف هو %s." #: actions/avatarsettings.php:106 actions/avatarsettings.php:185 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72 @@ -722,30 +739,30 @@ msgid "User without matching profile" msgstr "" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "إعدادات الأفتار" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" -msgstr "الأصلي" +msgstr "الأصل" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" -msgstr "عاين" +msgstr "معاينة" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "احذف" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "ارفع" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "" @@ -753,7 +770,7 @@ msgstr "" msgid "Pick a square area of the image to be your avatar" msgstr "" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -785,22 +802,22 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "لا" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "لا تمنع هذا المستخدم" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "نعم" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "امنع هذا المستخدم" @@ -808,39 +825,43 @@ msgstr "امنع هذا المستخدم" msgid "Failed to save block information." msgstr "فشل حفظ معلومات المنع." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "لا مجموعة كهذه." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s ملفات ممنوعة, الصفحة %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "ألغ منع المستخدم من المجموعة" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "ألغِ المنع" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "ألغِ منع هذا المستخدم" @@ -917,14 +938,13 @@ msgstr "أنت لست مالك هذا التطبيق." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" #: actions/deleteapplication.php:123 actions/deleteapplication.php:147 -#, fuzzy msgid "Delete application" -msgstr "عدّل التطبيق" +msgstr "احذف هذا التطبيق" #: actions/deleteapplication.php:149 msgid "" @@ -934,21 +954,20 @@ msgid "" msgstr "" #: actions/deleteapplication.php:156 -#, fuzzy msgid "Do not delete this application" -msgstr "لا تحذف هذا الإشعار" +msgstr "لا تحذف هذا التطبيق" #: actions/deleteapplication.php:160 -#, fuzzy msgid "Delete this application" -msgstr "احذف هذا الإشعار" +msgstr "احذف هذا التطبيق" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "لست والجًا." @@ -975,7 +994,7 @@ msgstr "أمتأكد من أنك تريد حذف هذا الإشعار؟" msgid "Do not delete this notice" msgstr "لا تحذف هذا الإشعار" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "احذف هذا الإشعار" @@ -991,18 +1010,18 @@ msgstr "يمكنك حذف المستخدمين المحليين فقط." msgid "Delete user" msgstr "احذف المستخدم" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "احذف هذا المستخدم" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "التصميم" @@ -1053,7 +1072,7 @@ msgstr "الخلفية" msgid "" "You can upload a background image for the site. The maximum file size is %1" "$s." -msgstr "" +msgstr "بإمكانك رفع صورة خلفية للموقع. أقصى حجم للملف هو %1$s." #: actions/designadminpanel.php:457 lib/designsettings.php:139 msgid "On" @@ -1103,6 +1122,17 @@ msgstr "استعد التصميمات المبدئية" msgid "Reset back to default" msgstr "ارجع إلى المبدئي" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "أرسل" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "احفظ التصميم" @@ -1116,12 +1146,11 @@ msgid "Add to favorites" msgstr "أضف إلى المفضلات" #: actions/doc.php:158 -#, fuzzy, php-format +#, php-format msgid "No such document \"%s\"" -msgstr "لا مستند كهذا." +msgstr "لا مستند باسم \"%s\"" #: actions/editapplication.php:54 -#, fuzzy msgid "Edit Application" msgstr "عدّل التطبيق" @@ -1195,29 +1224,29 @@ msgstr "عدّل مجموعة %s" msgid "You must be logged in to create a group." msgstr "يجب أن تكون والجًا لتنشئ مجموعة." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "يجب أن تكون إداريا لتعدل المجموعة." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "استخدم هذا النموذج لتعديل المجموعة." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "تعذر تحديث المجموعة." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "تعذّر إنشاء الكنى." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "حُفظت الخيارات." @@ -1301,15 +1330,15 @@ msgstr "أرسل لي بريدًا إلكرتونيًا عندما يضيف أح #: actions/emailsettings.php:169 msgid "Send me email when someone sends me a private message." -msgstr "" +msgstr "أرسل لي بريدًا إلكترونيًا عندما يرسل لي أحد رسالة خاصة." #: actions/emailsettings.php:174 msgid "Send me email when someone sends me an \"@-reply\"." -msgstr "أرسل لي بريدًا إلكترونيًا عندما يرسل لي أحدهم \"@-رد\"." +msgstr "أرسل لي بريدًا إلكترونيًا عندما يرسل لي أحد \"@-رد\"." #: actions/emailsettings.php:179 msgid "Allow friends to nudge me and send me an email." -msgstr "" +msgstr "اسمح لأصدقائي بتنبيهي ومراسلتي عبر البريد الإلكتروني." #: actions/emailsettings.php:185 msgid "I want to post notices by email." @@ -1317,7 +1346,7 @@ msgstr "أريد أن أرسل الملاحظات عبر البريد الإلك #: actions/emailsettings.php:191 msgid "Publish a MicroID for my email address." -msgstr "" +msgstr "انشر هوية مصغّرة لعنوان بريدي الإلكتروني." #: actions/emailsettings.php:302 actions/imsettings.php:264 #: actions/othersettings.php:180 actions/smssettings.php:284 @@ -1386,7 +1415,7 @@ msgstr "لا عنوان بريد إلكتروني وارد." #: actions/emailsettings.php:456 actions/emailsettings.php:478 #: actions/smssettings.php:528 actions/smssettings.php:552 msgid "Couldn't update user record." -msgstr "" +msgstr "تعذّر تحديث سجل المستخدم." #: actions/emailsettings.php:459 actions/smssettings.php:531 msgid "Incoming email address removed." @@ -1546,7 +1575,7 @@ msgstr "" msgid "User is not a member of group." msgstr "المستخدم ليس عضوًا في المجموعة." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "امنع المستخدم من المجموعة" @@ -1578,86 +1607,86 @@ msgstr "لا هوية." msgid "You must be logged in to edit a group." msgstr "يجب أن تلج لتُعدّل المجموعات." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "تصميم المجموعة" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "تعذّر تحديث تصميمك." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "" -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "شعار المجموعة" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." -msgstr "" +msgstr "بإمكانك رفع صورة شعار مجموعتك. أقصى حجم للملف هو %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "المستخدم بدون ملف مطابق." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "حُدّث الشعار." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "فشل رفع الشعار." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "أعضاء مجموعة %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "%1$s أعضاء المجموعة, الصفحة %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "قائمة بمستخدمي هذه المجموعة." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "إداري" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "امنع" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "اجعل هذا المستخدم إداريًا" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "" @@ -1815,16 +1844,16 @@ msgstr "هذه ليست هويتك في جابر." #: actions/inbox.php:59 #, php-format msgid "Inbox for %1$s - page %2$d" -msgstr "" +msgstr "صندوق %1$s الوارد - صفحة %2$d" #: actions/inbox.php:62 #, php-format msgid "Inbox for %s" -msgstr "" +msgstr "صندوق %s الوارد" #: actions/inbox.php:115 msgid "This is your inbox, which lists your incoming private messages." -msgstr "" +msgstr "هذا صندوق بريدك الوارد، والذي يسرد رسائلك الخاصة الواردة." #: actions/invite.php:39 msgid "Invites have been disabled." @@ -1875,7 +1904,7 @@ msgstr "" #: actions/invite.php:162 msgid "" "Use this form to invite your friends and colleagues to use this service." -msgstr "" +msgstr "استخدم هذا النموذج لدعوة أصدقائك وزملائك لاستخدام هذه الخدمة." #: actions/invite.php:187 msgid "Email addresses" @@ -1893,16 +1922,19 @@ msgstr "رسالة شخصية" msgid "Optionally add a personal message to the invitation." msgstr "" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "أرسل" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -1937,7 +1969,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "يجب أن تلج لتنضم إلى مجموعة." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "لا اسم مستعار." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s انضم للمجموعة %2$s" @@ -1946,11 +1983,11 @@ msgstr "%1$s انضم للمجموعة %2$s" msgid "You must be logged in to leave a group." msgstr "يجب أن تلج لتغادر مجموعة." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "لست عضوا في تلك المجموعة." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s ترك المجموعة %2$s" @@ -1967,8 +2004,7 @@ msgstr "اسم المستخدم أو كلمة السر غير صحيحان." msgid "Error setting user. You are probably not authorized." msgstr "خطأ أثناء ضبط المستخدم. لست مُصرحًا على الأرجح." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "لُج" @@ -1982,7 +2018,7 @@ msgstr "تذكّرني" #: actions/login.php:237 actions/register.php:480 msgid "Automatically login in the future; not for shared computers!" -msgstr "" +msgstr "لُج تلقائيًا في المستقبل؛ هذا الخيار ليس مُعدًا للحواسيب المشتركة!" #: actions/login.php:247 msgid "Lost or forgotten password?" @@ -1993,6 +2029,7 @@ msgid "" "For security reasons, please re-enter your user name and password before " "changing your settings." msgstr "" +"لأسباب أمنية، من فضلك أعد إدخال اسم مستخدمك وكلمة سرك قبل تغيير إعداداتك." #: actions/login.php:270 #, php-format @@ -2025,7 +2062,6 @@ msgid "No current status" msgstr "لا حالة حالية" #: actions/newapplication.php:52 -#, fuzzy msgid "New Application" msgstr "تطبيق جديد" @@ -2210,8 +2246,8 @@ msgstr "نوع المحتوى " msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "ليس نسق بيانات مدعوم." @@ -2278,20 +2314,20 @@ msgstr "توكن الدخول انتهى." #: actions/outbox.php:58 #, php-format msgid "Outbox for %1$s - page %2$d" -msgstr "" +msgstr "صندوق %1$s الصادر - صفحة %2$d" #: actions/outbox.php:61 #, php-format msgid "Outbox for %s" -msgstr "" +msgstr "صندوق %s الصادر" #: actions/outbox.php:116 msgid "This is your outbox, which lists private messages you have sent." -msgstr "" +msgstr "هذا صندوق بريدك الصادر، والذي يسرد الرسائل الخاصة التي أرسلتها." #: actions/passwordsettings.php:58 msgid "Change password" -msgstr "غيّر كلمة السر" +msgstr "تغيير كلمة السر" #: actions/passwordsettings.php:69 msgid "Change your password." @@ -2311,7 +2347,7 @@ msgstr "كلمة سر جديدة" #: actions/passwordsettings.php:109 msgid "6 or more characters" -msgstr "" +msgstr "6 أحرف أو أكثر" #: actions/passwordsettings.php:112 actions/recoverpassword.php:239 #: actions/register.php:433 actions/smssettings.php:134 @@ -2350,7 +2386,7 @@ msgstr "تعذّر حفظ كلمة السر الجديدة." msgid "Password saved." msgstr "حُفظت كلمة السر." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "المسارات" @@ -2383,7 +2419,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "الموقع" @@ -2548,10 +2583,10 @@ msgstr "معلومات الملف الشخصي" #: actions/profilesettings.php:108 lib/groupeditform.php:154 msgid "1-64 lowercase letters or numbers, no punctuation or spaces" -msgstr "" +msgstr "1-64 حرفًا إنجليزيًا أو رقمًا بدون نقاط أو مسافات" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "الاسم الكامل" @@ -2579,7 +2614,7 @@ msgid "Bio" msgstr "السيرة" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2660,7 +2695,8 @@ msgstr "تعذّر حفظ الملف الشخصي." msgid "Couldn't save tags." msgstr "تعذّر حفظ الوسوم." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "حُفظت الإعدادات." @@ -2673,45 +2709,45 @@ msgstr "وراء حد الصفحة (%s)" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "المسار الزمني العام، صفحة %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "المسار الزمني العام" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "كن أول من يُرسل!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2724,7 +2760,7 @@ msgstr "" "الآن](%%action.register%%) لتشارك اشعاراتك مع أصدقائك وعائلتك وزملائك! " "([اقرأ المزيد](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2895,8 +2931,7 @@ msgstr "عذرا، رمز دعوة غير صالح." msgid "Registration successful" msgstr "نجح التسجيل" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "سجّل" @@ -3055,7 +3090,7 @@ msgstr "لا يمكنك تكرار ملاحظتك الشخصية." msgid "You already repeated that notice." msgstr "أنت كررت هذه الملاحظة بالفعل." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "مكرر" @@ -3063,47 +3098,47 @@ msgstr "مكرر" msgid "Repeated!" msgstr "مكرر!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "الردود على %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "الردود على %s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3128,7 +3163,6 @@ msgid "User is already sandboxed." msgstr "" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "الجلسات" @@ -3154,7 +3188,7 @@ msgid "Turn on debugging output for sessions." msgstr "مكّن تنقيح مُخرجات الجلسة." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "اذف إعدادت الموقع" @@ -3184,7 +3218,7 @@ msgstr "المنظمة" msgid "Description" msgstr "الوصف" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "إحصاءات" @@ -3246,28 +3280,28 @@ msgstr "إشعارات %s المُفضلة" msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3276,7 +3310,7 @@ msgstr "" "%s لم يضف أي إشعارات إلى مفضلته إلى الآن. أرسل شيئًا شيقًا ليضيفه إلى " "مفضلته. :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3286,7 +3320,7 @@ msgstr "" "%s لم يضف أي إشعارات إلى مفضلته إلى الآن. لمّ لا [تسجل حسابًا](%%%%action." "register%%%%) وترسل شيئًا شيقًا ليضيفه إلى مفضلته. :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "إنها إحدى وسائل مشاركة ما تحب." @@ -3300,67 +3334,67 @@ msgstr "مجموعة %s" msgid "%1$s group, page %2$d" msgstr "%1$s أعضاء المجموعة, الصفحة %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "ملف المجموعة الشخصي" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "مسار" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "ملاحظة" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "الكنى" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "الأعضاء" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(لا شيء)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "جميع الأعضاء" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "أنشئ" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3370,7 +3404,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3379,7 +3413,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "الإداريون" @@ -3696,7 +3730,7 @@ msgstr "" #: actions/smssettings.php:374 msgid "That is the wrong confirmation number." -msgstr "" +msgstr "إن رقم التأكيد هذا خاطئ." #: actions/smssettings.php:405 msgid "That is not your phone number." @@ -3719,7 +3753,7 @@ msgstr "" #: actions/smssettings.php:498 msgid "No code entered" -msgstr "" +msgstr "لم تدخل رمزًا" #: actions/subedit.php:70 msgid "You are not subscribed to that profile." @@ -3732,10 +3766,9 @@ msgstr "تعذّر حفظ الاشتراك." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." -msgstr "" +msgstr "هذا الإجراء يقبل طلبات POST فقط." #: actions/subscribe.php:107 -#, fuzzy msgid "No such profile." msgstr "لا ملف كهذا." @@ -3826,22 +3859,22 @@ msgstr "جابر" msgid "SMS" msgstr "رسائل قصيرة" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "الإشعارات الموسومة ب%s" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "" @@ -3891,7 +3924,7 @@ msgstr "" msgid "No such tag." msgstr "لا وسم كهذا." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "" @@ -3921,70 +3954,72 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "المستخدم" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "رسالة ترحيب غير صالحة. أقصى طول هو 255 حرف." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "الملف الشخصي" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "حد السيرة" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "مستخدمون جدد" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "ترحيب المستخدمين الجدد" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "نص الترحيب بالمستخدمين الجدد (255 حرفًا كحد أقصى)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "الاشتراك المبدئي" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "أشرك المستخدمين الجدد بهذا المستخدم تلقائيًا." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "الدعوات" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "الدعوات مُفعلة" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4089,7 +4124,7 @@ msgstr "تصميم الملف الشخصي" msgid "" "Customize the way your profile looks with a background image and a colour " "palette of your choice." -msgstr "" +msgstr "خصّص أسلوب عرض ملفك بصورة خلفية ومخطط ألوان من اختيارك." #: actions/userdesignsettings.php:282 msgid "Enjoy your hotdog!" @@ -4107,7 +4142,7 @@ msgstr "ابحث عن المزيد من المجموعات" #: actions/usergroups.php:153 #, php-format msgid "%s is not a member of any group." -msgstr "" +msgstr "%s ليس عضوًا في أي مجموعة." #: actions/usergroups.php:158 #, php-format @@ -4125,10 +4160,12 @@ msgid "" "This site is powered by %1$s version %2$s, Copyright 2008-2010 StatusNet, " "Inc. and contributors." msgstr "" +"هذا الموقع يشغله %1$s النسخة %2$s، حقوق النشر 2008-2010 StatusNet, Inc " +"ومساهموها." #: actions/version.php:161 msgid "Contributors" -msgstr "" +msgstr "المساهمون" #: actions/version.php:168 msgid "" @@ -4155,9 +4192,9 @@ msgstr "" #: actions/version.php:189 msgid "Plugins" -msgstr "ملحقات" +msgstr "الملحقات" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "النسخة" @@ -4194,6 +4231,10 @@ msgstr "ليس جزءا من المجموعة." msgid "Group leave failed." msgstr "ترك المجموعة فشل." +#: classes/Local_group.php:41 +msgid "Could not update local group." +msgstr "تعذر تحديث المجموعة المحلية." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4211,44 +4252,44 @@ msgstr "تعذّر إدراج الرسالة." msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "مشكلة في حفظ الإشعار. طويل جدًا." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "مشكلة في حفظ الإشعار. مستخدم غير معروف." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "مشكلة أثناء حفظ الإشعار." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "مشكلة أثناء حفظ الإشعار." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "آر تي @%1$s %2$s" @@ -4277,19 +4318,29 @@ msgstr "لم يمكن حذف اشتراك ذاتي." msgid "Couldn't delete subscription." msgstr "تعذّر حذف الاشتراك." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "أهلا بكم في %1$s يا @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "تعذّر إنشاء المجموعة." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "تعذّر ضبط عضوية المجموعة." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "تعذّر ضبط عضوية المجموعة." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "تعذّر حفظ الاشتراك." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "غيّر إعدادات ملفك الشخصي" @@ -4331,120 +4382,190 @@ msgstr "صفحة غير مُعنونة" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "الرئيسية" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "الملف الشخصي ومسار الأصدقاء الزمني" -#: lib/action.php:441 -msgid "Change your email, avatar, password, profile" -msgstr "" +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "شخصية" +#. TRANS: Tooltip for main menu option "Account" #: lib/action.php:444 -msgid "Connect" -msgstr "اتصل" +#, fuzzy +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "غير كلمة سرّك" -#: lib/action.php:444 +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "الحساب" + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" -msgstr "" +msgstr "اتصالات" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "اتصل" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "غيّر ضبط الموقع" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "ادعُ" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "إداري" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" -msgstr "" +msgstr "استخدم هذا النموذج لدعوة أصدقائك وزملائك لاستخدام هذه الخدمة." -#: lib/action.php:458 -msgid "Logout" -msgstr "اخرج" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "ادعُ" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "اخرج من الموقع" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "اخرج" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "أنشئ حسابًا" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "سجّل" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "لُج إلى الموقع" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "مساعدة" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "لُج" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "ساعدني!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "ابحث" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "مساعدة" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "ابحث عن أشخاص أو نص" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "ابحث" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "إشعار الموقع" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "المشاهدات المحلية" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "إشعار الصفحة" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "مساعدة" + +#: lib/action.php:765 msgid "About" msgstr "عن" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "الأسئلة المكررة" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "الشروط" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "خصوصية" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "المصدر" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "اتصل" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" -msgstr "" +msgstr "الجسر" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "رخصة برنامج StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4453,12 +4574,12 @@ msgstr "" "**%%site.name%%** خدمة تدوين مصغر يقدمها لك [%%site.broughtby%%](%%site." "broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "" -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4469,108 +4590,159 @@ msgstr "" "المتوفر تحت [رخصة غنو أفيرو العمومية](http://www.fsf.org/licensing/licenses/" "agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "رخصة محتوى الموقع" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "الرخصة." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "بعد" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "قبل" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "التغييرات لهذه اللوحة غير مسموح بها." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "تعذّر حذف إعدادات التصميم." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "ضبط الموقع الأساسي" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "الموقع" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "ضبط التصميم" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "التصميم" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "ضبط المسارات" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 #, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "المستخدم" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" -msgstr "ضبط التصميم" +msgstr "ضبط الحساب" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "نفاذ" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "ضبط المسارات" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 #, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "المسارات" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" -msgstr "ضبط التصميم" +msgstr "ضبط الجلسات" + +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "الجلسات" -#: lib/apiauth.php:95 +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4660,11 +4832,11 @@ msgstr "" msgid "Tags for this attachment" msgstr "وسوم هذا المرفق" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "تغيير كلمة السر فشل" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "تغيير كلمة السر غير مسموح به" @@ -4952,19 +5124,19 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "" -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "اذهب إلى المُثبّت." @@ -5150,23 +5322,23 @@ msgstr "" msgid "Not an image or corrupt file." msgstr "" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "" -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "" -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "نوع ملف غير معروف" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "ميجابايت" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "كيلوبايت" @@ -5469,6 +5641,12 @@ msgstr "إلى" msgid "Available characters" msgstr "المحارف المتوفرة" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "أرسل" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "أرسل إشعارًا" @@ -5525,23 +5703,23 @@ msgstr "غ" msgid "at" msgstr "في" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "في السياق" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "مكرر بواسطة" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "رُد على هذا الإشعار" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "رُد" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "الإشعار مكرر" @@ -5589,6 +5767,10 @@ msgstr "الردود" msgid "Favorites" msgstr "المفضلات" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "المستخدم" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "صندوق الوارد" @@ -5612,7 +5794,7 @@ msgstr "وسوم في إشعارات %s" #: lib/plugin.php:114 msgid "Unknown" -msgstr "غير معروف" +msgstr "غير معروفة" #: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82 msgid "Subscriptions" @@ -5678,7 +5860,7 @@ msgstr "أأكرّر هذا الإشعار؟ّ" msgid "Repeat this notice" msgstr "كرّر هذا الإشعار" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5698,6 +5880,10 @@ msgstr "ابحث في الموقع" msgid "Keyword(s)" msgstr "الكلمات المفتاحية" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "ابحث" + #: lib/searchaction.php:162 msgid "Search help" msgstr "ابحث في المساعدة" @@ -5749,6 +5935,15 @@ msgstr "الأشخاص المشتركون ب%s" msgid "Groups %s is a member of" msgstr "المجموعات التي %s عضو فيها" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "ادعُ" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -5819,47 +6014,47 @@ msgstr "رسالة" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "قبل لحظات قليلة" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "قبل دقيقة تقريبًا" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "قبل ساعة تقريبًا" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "قبل يوم تقريبا" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "قبل شهر تقريبًا" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "قبل سنة تقريبًا" diff --git a/locale/arz/LC_MESSAGES/statusnet.po b/locale/arz/LC_MESSAGES/statusnet.po index cd8640753..3ce1fbc4e 100644 --- a/locale/arz/LC_MESSAGES/statusnet.po +++ b/locale/arz/LC_MESSAGES/statusnet.po @@ -10,79 +10,86 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:08+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:09+0000\n" "Language-Team: Egyptian Spoken Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: arz\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=6; plural= n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "نفاذ" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "اذف إعدادت الموقع" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "سجّل" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "خاص" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "أأمنع المستخدمين المجهولين (غير الوالجين) من عرض الموقع؟" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "بالدعوه فقط" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "خاص" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "مُغلق" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "بالدعوه فقط" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "عطّل التسجيل الجديد." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "أرسل" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "مُغلق" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "اذف إعدادت الموقع" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "أرسل" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "لا صفحه كهذه" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -96,72 +103,82 @@ msgstr "لا صفحه كهذه" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "لا مستخدم كهذا." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s و الصحاب, صفحه %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s والأصدقاء" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "أنت والأصدقاء" @@ -179,20 +196,20 @@ msgstr "" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "الـ API method مش موجوده." @@ -224,8 +241,9 @@ msgstr "تعذّر تحديث المستخدم." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "ليس للمستخدم ملف شخصى." @@ -249,7 +267,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -359,68 +377,68 @@ msgstr "" msgid "Could not find target user." msgstr "تعذّر إيجاد المستخدم الهدف." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "" -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "" -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "ليس اسمًا مستعارًا صحيحًا." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "الصفحه الرئيسيه ليست عنونًا صالحًا." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "الاسم الكامل طويل جدا (الأقصى 255 حرفًا)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "" -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "كنيه غير صالحة: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "" -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -431,15 +449,15 @@ msgstr "" msgid "Group not found!" msgstr "لم توجد المجموعة!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "ما نفعش يضم %1$s للجروپ %2$s." @@ -448,7 +466,7 @@ msgstr "ما نفعش يضم %1$s للجروپ %2$s." msgid "You are not a member of this group." msgstr "" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "ما نفعش يتشال اليوزر %1$s من الجروپ %2$s." @@ -480,7 +498,7 @@ msgstr "حجم غير صالح." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -523,7 +541,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -546,13 +564,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "الحساب" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -634,12 +652,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "مسار %s الزمني" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -675,7 +693,7 @@ msgstr "كرر إلى %s" msgid "Repeats of %s" msgstr "تكرارات %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "الإشعارات الموسومه ب%s" @@ -696,8 +714,7 @@ msgstr "لا مرفق كهذا." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "لا اسم مستعار." @@ -709,7 +726,7 @@ msgstr "لا حجم." msgid "Invalid size." msgstr "حجم غير صالح." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "أفتار" @@ -726,30 +743,30 @@ msgid "User without matching profile" msgstr "" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "إعدادات الأفتار" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "الأصلي" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "عاين" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "احذف" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "ارفع" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "" @@ -757,7 +774,7 @@ msgstr "" msgid "Pick a square area of the image to be your avatar" msgstr "" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -789,22 +806,22 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "لا" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "لا تمنع هذا المستخدم" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "نعم" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "امنع هذا المستخدم" @@ -812,39 +829,43 @@ msgstr "امنع هذا المستخدم" msgid "Failed to save block information." msgstr "فشل حفظ معلومات المنع." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "لا مجموعه كهذه." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s فايلات معمول ليها بلوك, الصفحه %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "ألغ منع المستخدم من المجموعة" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "ألغِ المنع" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "ألغِ منع هذا المستخدم" @@ -921,7 +942,7 @@ msgstr "انت مش بتملك الapplication دى." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -947,12 +968,13 @@ msgstr "لا تحذف هذا الإشعار" msgid "Delete this application" msgstr "احذف هذا الإشعار" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "لست والجًا." @@ -979,7 +1001,7 @@ msgstr "أمتأكد من أنك تريد حذف هذا الإشعار؟" msgid "Do not delete this notice" msgstr "لا تحذف هذا الإشعار" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "احذف هذا الإشعار" @@ -995,18 +1017,18 @@ msgstr "يمكنك حذف المستخدمين المحليين فقط." msgid "Delete user" msgstr "احذف المستخدم" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "احذف هذا المستخدم" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "التصميم" @@ -1107,6 +1129,17 @@ msgstr "استعد التصميمات المبدئية" msgid "Reset back to default" msgstr "ارجع إلى المبدئي" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "أرسل" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "احفظ التصميم" @@ -1199,29 +1232,29 @@ msgstr "عدّل مجموعه %s" msgid "You must be logged in to create a group." msgstr "يجب أن تكون والجًا لتنشئ مجموعه." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "لازم تكون ادارى علشان تعدّل الجروپ." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "استخدم هذا النموذج لتعديل المجموعه." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "تعذر تحديث المجموعه." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "تعذّر إنشاء الكنى." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "حُفظت الخيارات." @@ -1550,7 +1583,7 @@ msgstr "" msgid "User is not a member of group." msgstr "المستخدم ليس عضوًا فى المجموعه." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "امنع المستخدم من المجموعة" @@ -1582,86 +1615,86 @@ msgstr "لا هويه." msgid "You must be logged in to edit a group." msgstr "يجب أن تلج لتُعدّل المجموعات." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "تصميم المجموعة" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "تعذّر تحديث تصميمك." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "" -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "شعار المجموعة" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "يوزر من-غير پروفايل زيّه." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "حُدّث الشعار." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "فشل رفع الشعار." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "أعضاء مجموعه %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "%1$s اعضاء الجروپ, صفحه %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "قائمه بمستخدمى هذه المجموعه." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "إداري" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "امنع" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "اجعل هذا المستخدم إداريًا" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "" @@ -1897,16 +1930,19 @@ msgstr "رساله شخصية" msgid "Optionally add a personal message to the invitation." msgstr "" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "أرسل" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -1941,7 +1977,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "" -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "لا اسم مستعار." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s دخل جروپ %2$s" @@ -1950,11 +1991,11 @@ msgstr "%1$s دخل جروپ %2$s" msgid "You must be logged in to leave a group." msgstr "" -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "لست عضوا فى تلك المجموعه." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s ساب جروپ %2$s" @@ -1971,8 +2012,7 @@ msgstr "اسم المستخدم أو كلمه السر غير صحيحان." msgid "Error setting user. You are probably not authorized." msgstr "خطأ أثناء ضبط المستخدم. لست مُصرحًا على الأرجح." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "لُج" @@ -2212,8 +2252,8 @@ msgstr "نوع المحتوى " msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr " مش نظام بيانات مدعوم." @@ -2352,7 +2392,7 @@ msgstr "تعذّر حفظ كلمه السر الجديده." msgid "Password saved." msgstr "حُفظت كلمه السر." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "المسارات" @@ -2385,7 +2425,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "الموقع" @@ -2553,7 +2592,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "الاسم الكامل" @@ -2581,7 +2620,7 @@ msgid "Bio" msgstr "السيرة" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2661,7 +2700,8 @@ msgstr "تعذّر حفظ الملف الشخصى." msgid "Couldn't save tags." msgstr "تعذّر حفظ الوسوم." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "حُفظت الإعدادات." @@ -2674,45 +2714,45 @@ msgstr "وراء حد الصفحه (%s)" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "المسار الزمنى العام، صفحه %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "المسار الزمنى العام" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "كن أول من يُرسل!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2725,7 +2765,7 @@ msgstr "" "الآن](%%action.register%%) لتشارك اشعاراتك مع أصدقائك وعائلتك وزملائك! " "([اقرأ المزيد](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2896,8 +2936,7 @@ msgstr "عذرا، رمز دعوه غير صالح." msgid "Registration successful" msgstr "نجح التسجيل" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "سجّل" @@ -3056,7 +3095,7 @@ msgstr "ما ينفعش تكرر الملاحظه بتاعتك." msgid "You already repeated that notice." msgstr "انت عيدت الملاحظه دى فعلا." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "مكرر" @@ -3064,47 +3103,47 @@ msgstr "مكرر" msgid "Repeated!" msgstr "مكرر!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "الردود على %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "الردود على %s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3129,7 +3168,6 @@ msgid "User is already sandboxed." msgstr "" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "الجلسات" @@ -3155,7 +3193,7 @@ msgid "Turn on debugging output for sessions." msgstr "مكّن تنقيح مُخرجات الجلسه." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "اذف إعدادت الموقع" @@ -3185,7 +3223,7 @@ msgstr "المنظمه" msgid "Description" msgstr "الوصف" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "إحصاءات" @@ -3247,28 +3285,28 @@ msgstr "إشعارات %s المُفضلة" msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3277,7 +3315,7 @@ msgstr "" "%s لم يضف أى إشعارات إلى مفضلته إلى الآن. أرسل شيئًا شيقًا ليضيفه إلى " "مفضلته. :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3287,7 +3325,7 @@ msgstr "" "%s لم يضف أى إشعارات إلى مفضلته إلى الآن. لمّ لا [تسجل حسابًا](%%%%action." "register%%%%) وترسل شيئًا شيقًا ليضيفه إلى مفضلته. :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "إنها إحدى وسائل مشاركه ما تحب." @@ -3301,67 +3339,67 @@ msgstr "مجموعه %s" msgid "%1$s group, page %2$d" msgstr "%1$s أعضاء المجموعة, الصفحه %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "ملف المجموعه الشخصي" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "مسار" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "ملاحظة" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "الكنى" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "الأعضاء" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(لا شيء)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "جميع الأعضاء" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "أنشئ" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3371,7 +3409,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3380,7 +3418,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "الإداريون" @@ -3827,22 +3865,22 @@ msgstr "جابر" msgid "SMS" msgstr "رسائل قصيرة" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "الإشعارات الموسومه ب%s" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "" @@ -3892,7 +3930,7 @@ msgstr "" msgid "No such tag." msgstr "لا وسم كهذا." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "" @@ -3922,70 +3960,72 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "المستخدم" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "رساله ترحيب غير صالحه. أقصى طول هو 255 حرف." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "الملف الشخصي" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "حد السيرة" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "مستخدمون جدد" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "ترحيب المستخدمين الجدد" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "نص الترحيب بالمستخدمين الجدد (255 حرفًا كحد أقصى)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "الاشتراك المبدئي" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "أشرك المستخدمين الجدد بهذا المستخدم تلقائيًا." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "الدعوات" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "الدعوات مُفعلة" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4158,7 +4198,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "النسخه" @@ -4195,6 +4235,11 @@ msgstr "مش جزء من الجروپ." msgid "Group leave failed." msgstr "الخروج من الجروپ فشل." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "تعذر تحديث المجموعه." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4212,44 +4257,44 @@ msgstr "تعذّر إدراج الرساله." msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "مشكله فى حفظ الإشعار. طويل جدًا." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "مشكله فى حفظ الإشعار. مستخدم غير معروف." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "مشكله أثناء حفظ الإشعار." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "مشكله أثناء حفظ الإشعار." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "آر تى @%1$s %2$s" @@ -4278,19 +4323,29 @@ msgstr "ما نفعش يمسح الاشتراك الشخصى." msgid "Couldn't delete subscription." msgstr "تعذّر حذف الاشتراك." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "أهلا بكم فى %1$s يا @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "تعذّر إنشاء المجموعه." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "تعذّر ضبط عضويه المجموعه." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "تعذّر ضبط عضويه المجموعه." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "تعذّر حفظ الاشتراك." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "غيّر إعدادات ملفك الشخصي" @@ -4332,120 +4387,190 @@ msgstr "صفحه غير مُعنونة" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "الرئيسية" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "الملف الشخصى ومسار الأصدقاء الزمني" -#: lib/action.php:441 -msgid "Change your email, avatar, password, profile" -msgstr "" +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "شخصية" +#. TRANS: Tooltip for main menu option "Account" #: lib/action.php:444 -msgid "Connect" -msgstr "اتصل" +#, fuzzy +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "غير كلمه سرّك" -#: lib/action.php:444 +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "الحساب" + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" -msgstr "" +msgstr "كونيكشونات (Connections)" + +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "اتصل" -#: lib/action.php:448 +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "غيّر ضبط الموقع" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "ادعُ" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "إداري" -#: lib/action.php:453 lib/subgroupnav.php:106 +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 #, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "" -#: lib/action.php:458 -msgid "Logout" -msgstr "اخرج" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "ادعُ" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "اخرج من الموقع" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "اخرج" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "أنشئ حسابًا" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "سجّل" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "لُج إلى الموقع" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "مساعدة" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "لُج" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "ساعدني!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "ابحث" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "مساعدة" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "ابحث عن أشخاص أو نص" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "ابحث" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "إشعار الموقع" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "المشاهدات المحلية" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "إشعار الصفحة" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "مساعدة" + +#: lib/action.php:765 msgid "About" msgstr "عن" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "الأسئله المكررة" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "الشروط" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "خصوصية" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "المصدر" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "اتصل" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4454,12 +4579,12 @@ msgstr "" "**%%site.name%%** خدمه تدوين مصغر يقدمها لك [%%site.broughtby%%](%%site." "broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "" -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4470,108 +4595,161 @@ msgstr "" "المتوفر تحت [رخصه غنو أفيرو العمومية](http://www.fsf.org/licensing/licenses/" "agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "رخصه محتوى الموقع" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "الرخصه." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "بعد" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "قبل" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "التغييرات مش مسموحه للـ لوحه دى." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "تعذّر حذف إعدادات التصميم." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "ضبط الموقع الأساسي" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "الموقع" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "ضبط التصميم" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "التصميم" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "ضبط المسارات" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "المستخدم" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "ضبط التصميم" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "نفاذ" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "ضبط المسارات" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "المسارات" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "ضبط التصميم" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "الجلسات" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4661,11 +4839,11 @@ msgstr "" msgid "Tags for this attachment" msgstr "وسوم هذا المرفق" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "تغيير الپاسوورد فشل" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "تغيير الپاسوورد مش مسموح" @@ -4953,19 +5131,19 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "" -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "اذهب إلى المُثبّت." @@ -5151,23 +5329,23 @@ msgstr "" msgid "Not an image or corrupt file." msgstr "" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "" -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "" -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "نوع ملف غير معروف" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "ميجابايت" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "كيلوبايت" @@ -5460,6 +5638,12 @@ msgstr "إلى" msgid "Available characters" msgstr "المحارف المتوفرة" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "أرسل" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "أرسل إشعارًا" @@ -5516,23 +5700,23 @@ msgstr "غ" msgid "at" msgstr "في" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "فى السياق" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "متكرر من" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "رُد على هذا الإشعار" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "رُد" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "الإشعار مكرر" @@ -5580,6 +5764,10 @@ msgstr "الردود" msgid "Favorites" msgstr "المفضلات" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "المستخدم" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "صندوق الوارد" @@ -5669,7 +5857,7 @@ msgstr "كرر هذا الإشعار؟" msgid "Repeat this notice" msgstr "كرر هذا الإشعار" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5689,6 +5877,10 @@ msgstr "ابحث فى الموقع" msgid "Keyword(s)" msgstr "الكلمات المفتاحية" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "ابحث" + #: lib/searchaction.php:162 msgid "Search help" msgstr "ابحث فى المساعدة" @@ -5740,6 +5932,15 @@ msgstr "الأشخاص المشتركون ب%s" msgid "Groups %s is a member of" msgstr "المجموعات التى %s عضو فيها" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "ادعُ" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -5810,47 +6011,47 @@ msgstr "رسالة" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "قبل لحظات قليلة" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "قبل دقيقه تقريبًا" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "قبل ساعه تقريبًا" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "قبل يوم تقريبا" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "قبل شهر تقريبًا" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "قبل سنه تقريبًا" diff --git a/locale/bg/LC_MESSAGES/statusnet.po b/locale/bg/LC_MESSAGES/statusnet.po index 3cb121628..abf1998d8 100644 --- a/locale/bg/LC_MESSAGES/statusnet.po +++ b/locale/bg/LC_MESSAGES/statusnet.po @@ -9,75 +9,82 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:11+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:12+0000\n" "Language-Team: Bulgarian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: bg\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Достъп" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Настройки за достъп до сайта" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Регистриране" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Частен" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Само с покани" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Частен" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Новите регистрации да са само с покани." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Затворен" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Само с покани" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Изключване на новите регистрации." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Запазване" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Затворен" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Запазване настройките за достъп" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Запазване" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Няма такака страница." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -91,72 +98,82 @@ msgstr "Няма такака страница." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Няма такъв потребител" -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s и приятели, страница %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s и приятели" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Емисия с приятелите на %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Емисия с приятелите на %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Емисия с приятелите на %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Вие и приятелите" @@ -174,20 +191,20 @@ msgstr "Бележки от %1$s и приятели в %2$s." #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "Не е открит методът в API." @@ -219,8 +236,9 @@ msgstr "Грешка при обновяване на потребителя." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Потребителят няма профил." @@ -244,7 +262,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 #, fuzzy @@ -362,7 +380,7 @@ msgstr "Грешка при изтегляне на общия поток" msgid "Could not find target user." msgstr "Целевият потребител не беше открит." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -370,62 +388,62 @@ msgstr "" "Псевдонимът може да съдържа само малки букви, числа и никакво разстояние " "между тях." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Опитайте друг псевдоним, този вече е зает." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Неправилен псевдоним." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Адресът на личната страница не е правилен URL." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Пълното име е твърде дълго (макс. 255 знака)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Описанието е твърде дълго (до %d символа)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Името на местоположението е твърде дълго (макс. 255 знака)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Неправилен псевдоним: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Псевдонимът \"%s\" вече е зает. Опитайте друг." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -436,15 +454,15 @@ msgstr "" msgid "Group not found!" msgstr "Групата не е открита." -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Вече членувате в тази група." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Грешка при проследяване — потребителят не е намерен." @@ -453,7 +471,7 @@ msgstr "Грешка при проследяване — потребителя msgid "You are not a member of this group." msgstr "Не членувате в тази група." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Грешка при проследяване — потребителят не е намерен." @@ -485,7 +503,7 @@ msgstr "Неправилен размер." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -529,7 +547,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -552,13 +570,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Сметка" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -641,12 +659,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s бележки отбелязани като любими от %s / %s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Поток на %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -682,7 +700,7 @@ msgstr "Повторено за %s" msgid "Repeats of %s" msgstr "Повторения на %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Бележки с етикет %s" @@ -704,8 +722,7 @@ msgstr "Няма такъв документ." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Няма псевдоним." @@ -717,7 +734,7 @@ msgstr "Няма размер." msgid "Invalid size." msgstr "Неправилен размер." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Аватар" @@ -735,30 +752,30 @@ msgid "User without matching profile" msgstr "Потребител без съответстващ профил" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Настройки за аватар" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Оригинал" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Преглед" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Изтриване" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Качване" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Изрязване" @@ -766,7 +783,7 @@ msgstr "Изрязване" msgid "Pick a square area of the image to be your avatar" msgstr "Изберете квадратна област от изображението за аватар" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -798,22 +815,22 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Не" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Да не се блокира този потребител" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Да" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Блокиране на потребителя" @@ -821,40 +838,44 @@ msgstr "Блокиране на потребителя" msgid "Failed to save block information." msgstr "Грешка при записване данните за блокирането." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Няма такава група" -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "Блокирани за %s" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "Блокирани за %s, страница %d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 #, fuzzy msgid "A list of the users blocked from joining this group." msgstr "Списък с потребителите в тази група." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Разблокиране на потребителя от групата" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Разблокиране" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Разблокиране на този потребител" @@ -933,7 +954,7 @@ msgstr "Не членувате в тази група." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Имаше проблем със сесията ви в сайта." @@ -959,12 +980,13 @@ msgstr "Да не се изтрива бележката" msgid "Delete this application" msgstr "Изтриване на бележката" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Не сте влезли в системата." @@ -991,7 +1013,7 @@ msgstr "Наистина ли искате да изтриете тази бел msgid "Do not delete this notice" msgstr "Да не се изтрива бележката" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Изтриване на бележката" @@ -1007,18 +1029,18 @@ msgstr "Може да изтривате само локални потреби msgid "Delete user" msgstr "Изтриване на потребител" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Изтриване на този потребител" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1124,6 +1146,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Запазване" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1226,31 +1259,31 @@ msgstr "Редактиране на групата %s" msgid "You must be logged in to create a group." msgstr "За да създавате група, трябва да сте влезли." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "За да редактирате групата, трябва да сте й администратор." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "Описанието е твърде дълго (до %d символа)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Грешка при обновяване на групата." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "Грешка при отбелязване като любима." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Настройките са запазени." @@ -1591,7 +1624,7 @@ msgstr "Потребителят вече е блокиран за групат msgid "User is not a member of group." msgstr "Потребителят не членува в групата." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 #, fuzzy msgid "Block user from group" msgstr "Блокиране на потребителя" @@ -1626,92 +1659,92 @@ msgstr "Липсва ID." msgid "You must be logged in to edit a group." msgstr "За да редактирате група, трябва да сте влезли." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 #, fuzzy msgid "Group design" msgstr "Групи" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "Грешка при обновяване на потребителя." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "Настройките са запазени." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Лого на групата" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, fuzzy, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "Може да качите лого за групата ви." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Потребител без съответстващ профил" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 #, fuzzy msgid "Pick a square area of the image to be the logo." msgstr "Изберете квадратна област от изображението за аватар" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Лотого е обновено." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Неуспешно обновяване на логото." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Членове на групата %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" msgstr "Членове на групата %s, страница %d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Списък с потребителите в тази група." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Настройки" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Блокиране" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 #, fuzzy msgid "Make user an admin of the group" msgstr "За да редактирате групата, трябва да сте й администратор." -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Бележки от %1$s в %2$s." @@ -1966,16 +1999,19 @@ msgstr "Лично съобщение" msgid "Optionally add a personal message to the invitation." msgstr "Може да добавите и лично съобщение към поканата." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Прати" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s ви кани да ползвате заедно %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2036,7 +2072,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "За да се присъедините към група, трябва да сте влезли." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Няма псевдоним." + +#: actions/joingroup.php:141 #, fuzzy, php-format msgid "%1$s joined group %2$s" msgstr "%s се присъедини към групата %s" @@ -2045,11 +2086,11 @@ msgstr "%s се присъедини към групата %s" msgid "You must be logged in to leave a group." msgstr "За напуснете група, трябва да сте влезли." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Не членувате в тази група." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s напусна групата %2$s" @@ -2067,8 +2108,7 @@ msgstr "Грешно име или парола." msgid "Error setting user. You are probably not authorized." msgstr "Забранено." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Вход" @@ -2322,8 +2362,8 @@ msgstr "вид съдържание " msgid "Only " msgstr "Само " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Неподдържан формат на данните" @@ -2469,7 +2509,7 @@ msgstr "Грешка при запазване на новата парола." msgid "Password saved." msgstr "Паролата е записана." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Пътища" @@ -2502,7 +2542,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Сайт" @@ -2672,7 +2711,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "От 1 до 64 малки букви или цифри, без пунктоация и интервали" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Пълно име" @@ -2700,7 +2739,7 @@ msgid "Bio" msgstr "За мен" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2783,7 +2822,8 @@ msgstr "Грешка при запазване на профила." msgid "Couldn't save tags." msgstr "Грешка при запазване етикетите." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Настройките са запазени." @@ -2796,45 +2836,45 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "Грешка при изтегляне на общия поток" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Общ поток, страница %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Общ поток" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Емисия на общия поток (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Емисия на общия поток (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Емисия на общия поток (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2843,7 +2883,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3016,8 +3056,7 @@ msgstr "Грешка в кода за потвърждение." msgid "Registration successful" msgstr "Записването е успешно." -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Регистриране" @@ -3201,7 +3240,7 @@ msgstr "Не можете да повтаряте собствена бележ msgid "You already repeated that notice." msgstr "Вече сте повторили тази бележка." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Повторено" @@ -3209,47 +3248,47 @@ msgstr "Повторено" msgid "Repeated!" msgstr "Повторено!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Отговори на %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "Отговори до %1$s в %2$s!" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Емисия с отговори на %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Емисия с отговори на %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Емисия с отговори на %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3276,7 +3315,6 @@ msgid "User is already sandboxed." msgstr "Потребителят ви е блокирал." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Сесии" @@ -3302,7 +3340,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Запазване настройките на сайта" @@ -3334,7 +3372,7 @@ msgstr "Организация" msgid "Description" msgstr "Описание" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Статистики" @@ -3397,35 +3435,35 @@ msgstr "Любими бележки на %1$s, страница %2$d" msgid "Could not retrieve favorite notices." msgstr "Грешка при изтегляне на любимите бележки" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Емисия с приятелите на %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Емисия с приятелите на %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Емисия с приятелите на %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3433,7 +3471,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Така можете да споделите какво харесвате." @@ -3447,67 +3485,67 @@ msgstr "Група %s" msgid "%1$s group, page %2$d" msgstr "Членове на групата %s, страница %d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Профил на групата" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Бележка" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Псевдоними" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Емисия с бележки на %s" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Емисия с бележки на %s" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "Емисия с бележки на %s" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "Изходяща кутия за %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Членове" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Всички членове" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Създадена на" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3517,7 +3555,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3526,7 +3564,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Администратори" @@ -3987,22 +4025,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Бележки с етикет %s, страница %d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Емисия с бележки на %s" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Емисия с бележки на %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Емисия с бележки на %s" @@ -4054,7 +4092,7 @@ msgstr "" msgid "No such tag." msgstr "Няма такъв етикет." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Методът в API все още се разработва." @@ -4087,74 +4125,76 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Потребител" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Профил" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Нови потребители" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "Всички абонаменти" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "" "Автоматично абониране за всеки, който се абонира за мен (подходящо за " "ботове)." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Покани" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Поканите са включени" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4338,7 +4378,7 @@ msgstr "" msgid "Plugins" msgstr "Приставки" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Версия" @@ -4378,6 +4418,11 @@ msgstr "Грешка при обновяване на групата." msgid "Group leave failed." msgstr "Профил на групата" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Грешка при обновяване на групата." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4396,28 +4441,28 @@ msgstr "Грешка при вмъкване на съобщението." msgid "Could not update message with new URI." msgstr "Грешка при обновяване на бележката с нов URL-адрес." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "Проблем при записване на бележката." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Грешка при записване на бележката. Непознат потребител." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Твърде много бележки за кратко време. Спрете, поемете дъх и публикувайте " "отново след няколко минути." -#: classes/Notice.php:237 +#: classes/Notice.php:254 #, fuzzy msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " @@ -4426,20 +4471,20 @@ msgstr "" "Твърде много бележки за кратко време. Спрете, поемете дъх и публикувайте " "отново след няколко минути." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Забранено ви е да публикувате бележки в този сайт." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Проблем при записване на бележката." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Проблем при записване на бележката." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4471,20 +4516,30 @@ msgstr "Грешка при изтриване на абонамента." msgid "Couldn't delete subscription." msgstr "Грешка при изтриване на абонамента." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Добре дошли в %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Грешка при създаване на групата." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Грешка при създаване на нов абонамент." + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "Грешка при създаване на нов абонамент." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Грешка при създаване на нов абонамент." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Промяна настройките на профила" @@ -4527,124 +4582,192 @@ msgstr "Неозаглавена страница" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Начало" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Лично" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Промяна на поща, аватар, парола, профил" -#: lib/action.php:444 -msgid "Connect" -msgstr "Свързване" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Сметка" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Свързване към услуги" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Свързване" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Промяна настройките на сайта" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Покани" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Настройки" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Поканете приятели и колеги да се присъединят към вас в %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Изход" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Покани" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Излизане от сайта" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Изход" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Създаване на нова сметка" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Регистриране" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Влизане в сайта" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Помощ" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Вход" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 #, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Помощ" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Търсене" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Помощ" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Търсене за хора или бележки" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Търсене" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 #, fuzzy msgid "Site notice" msgstr "Нова бележка" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 #, fuzzy msgid "Page notice" msgstr "Нова бележка" -#: lib/action.php:727 +#: lib/action.php:758 #, fuzzy msgid "Secondary site navigation" msgstr "Абонаменти" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Помощ" + +#: lib/action.php:765 msgid "About" msgstr "Относно" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "Въпроси" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "Условия" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Поверителност" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Изходен код" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Контакт" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Табелка" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Лиценз на програмата StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4653,12 +4776,12 @@ msgstr "" "**%%site.name%%** е услуга за микроблогване, предоставена ви от [%%site." "broughtby%%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** е услуга за микроблогване. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4669,112 +4792,165 @@ msgstr "" "достъпна под [GNU Affero General Public License](http://www.fsf.org/" "licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Лиценз на съдържанието" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Всички " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "лиценз." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Страниране" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "След" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Преди" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Не можете да променяте този сайт." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "Записването не е позволено." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 #, fuzzy msgid "showForm() not implemented." msgstr "Командата все още не се поддържа." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 #, fuzzy msgid "saveSettings() not implemented." msgstr "Командата все още не се поддържа." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 #, fuzzy msgid "Unable to delete design setting." msgstr "Грешка при записване настройките за Twitter" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Основна настройка на сайта" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Сайт" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Настройка на оформлението" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Версия" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "Настройка на пътищата" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Потребител" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "Настройка на оформлението" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Достъп" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Настройка на пътищата" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Пътища" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "Настройка на оформлението" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Сесии" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4869,12 +5045,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Паролата е записана." -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Паролата е записана." @@ -5153,19 +5329,19 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Не е открит файл с настройки. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 #, fuzzy msgid "Go to the installer." msgstr "Влизане в сайта" @@ -5357,24 +5533,24 @@ msgstr "Системна грешка при качване на файл." msgid "Not an image or corrupt file." msgstr "Файлът не е изображение или е повреден." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Форматът на файла с изображението не се поддържа." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "Няма такава бележка." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Неподдържан вид файл" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "kB" @@ -5678,6 +5854,12 @@ msgstr "До" msgid "Available characters" msgstr "Налични знаци" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Прати" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Изпращане на бележка" @@ -5736,23 +5918,23 @@ msgstr "З" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "в контекст" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Повторено от" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Отговаряне на тази бележка" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Отговор" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Бележката е повторена." @@ -5801,6 +5983,10 @@ msgstr "Отговори" msgid "Favorites" msgstr "Любими" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Потребител" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Входящи" @@ -5893,7 +6079,7 @@ msgstr "Повтаряне на тази бележка" msgid "Repeat this notice" msgstr "Повтаряне на тази бележка" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5916,6 +6102,10 @@ msgstr "Търсене" msgid "Keyword(s)" msgstr "Ключови думи" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Търсене" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -5968,6 +6158,15 @@ msgstr "Абонирани за %s" msgid "Groups %s is a member of" msgstr "Групи, в които участва %s" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Покани" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Поканете приятели и колеги да се присъединят към вас в %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6040,47 +6239,47 @@ msgstr "Съобщение" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "преди няколко секунди" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "преди около минута" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "преди около %d минути" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "преди около час" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "преди около %d часа" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "преди около ден" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "преди около %d дни" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "преди около месец" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "преди около %d месеца" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "преди около година" diff --git a/locale/ca/LC_MESSAGES/statusnet.po b/locale/ca/LC_MESSAGES/statusnet.po index d94ad8431..8b12f44a9 100644 --- a/locale/ca/LC_MESSAGES/statusnet.po +++ b/locale/ca/LC_MESSAGES/statusnet.po @@ -10,80 +10,87 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:15+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:15+0000\n" "Language-Team: Catalan\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ca\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Accés" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Desa els paràmetres del lloc" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Registre" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Privat" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" "Voleu prohibir als usuaris anònims (que no han iniciat cap sessió) " "visualitzar el lloc?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Només invitació" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Privat" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Fes que el registre sigui només amb invitacions." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Tancat" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Només invitació" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Inhabilita els nous registres." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Guardar" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Tancat" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Desa els paràmetres del lloc" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Guardar" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "No existeix la pàgina." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -97,45 +104,53 @@ msgstr "No existeix la pàgina." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "No existeix aquest usuari." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s perfils blocats, pàgina %d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s i amics" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Canal dels amics de %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Canal dels amics de %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Canal dels amics de %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." @@ -143,28 +158,30 @@ msgstr "" "Aquesta és la línia temporal de %s i amics, però ningú hi ha enviat res " "encara." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Un mateix i amics" @@ -182,20 +199,20 @@ msgstr "Actualitzacions de %1$s i amics a %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "No s'ha trobat el mètode API!" @@ -229,8 +246,9 @@ msgstr "No s'ha pogut actualitzar l'usuari." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "L'usuari no té perfil." @@ -255,7 +273,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 #, fuzzy @@ -376,7 +394,7 @@ msgstr "No s'ha pogut determinar l'usuari d'origen." msgid "Could not find target user." msgstr "No es pot trobar cap estatus." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -384,62 +402,62 @@ msgstr "" "El sobrenom ha de tenir només lletres minúscules i números i no pot tenir " "espais." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Aquest sobrenom ja existeix. Prova un altre. " -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Sobrenom no vàlid." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "La pàgina personal no és un URL vàlid." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "El teu nom és massa llarg (màx. 255 caràcters)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "La descripció és massa llarga (màx. %d caràcters)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "La ubicació és massa llarga (màx. 255 caràcters)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Hi ha massa àlies! Màxim %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "L'àlies no és vàlid «%s»" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "L'àlies «%s» ja està en ús. Proveu-ne un altre." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "L'àlies no pot ser el mateix que el sobrenom." @@ -450,15 +468,15 @@ msgstr "L'àlies no pot ser el mateix que el sobrenom." msgid "Group not found!" msgstr "No s'ha trobat el grup!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Ja sou membre del grup." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "L'administrador us ha blocat del grup." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "No s'ha pogut afegir l'usuari %s al grup %s." @@ -467,7 +485,7 @@ msgstr "No s'ha pogut afegir l'usuari %s al grup %s." msgid "You are not a member of this group." msgstr "No sou un membre del grup." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "No s'ha pogut suprimir l'usuari %s del grup %s." @@ -499,7 +517,7 @@ msgstr "Mida invàlida." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -545,7 +563,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -568,13 +586,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Compte" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -660,12 +678,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s actualitzacions favorites per %s / %s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s línia temporal" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -701,7 +719,7 @@ msgstr "Respostes a %s" msgid "Repeats of %s" msgstr "Repeticions de %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Aviso etiquetats amb %s" @@ -722,8 +740,7 @@ msgstr "No existeix l'adjunció." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Cap sobrenom." @@ -735,7 +752,7 @@ msgstr "Cap mida." msgid "Invalid size." msgstr "Mida invàlida." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -753,30 +770,30 @@ msgid "User without matching profile" msgstr "Usuari sense perfil coincident" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Configuració de l'avatar" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Original" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Vista prèvia" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Suprimeix" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Puja" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Retalla" @@ -786,7 +803,7 @@ msgstr "" "Selecciona un quadrat de l'àrea de la imatge que vols que sigui el teu " "avatar." -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "S'ha perdut el nostre fitxer de dades." @@ -818,22 +835,22 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "No" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "No bloquis l'usuari" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Sí" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Bloquejar aquest usuari" @@ -841,40 +858,44 @@ msgstr "Bloquejar aquest usuari" msgid "Failed to save block information." msgstr "Error al guardar la informació del block." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "No s'ha trobat el grup." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s perfils blocats" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s perfils blocats, pàgina %d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 #, fuzzy msgid "A list of the users blocked from joining this group." msgstr "La llista dels usuaris d'aquest grup." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Desbloca l'usuari del grup" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Desbloca" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Desbloca l'usuari" @@ -953,7 +974,7 @@ msgstr "No sou un membre del grup." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Ha ocorregut algun problema amb la teva sessió." @@ -979,12 +1000,13 @@ msgstr "No es pot esborrar la notificació." msgid "Delete this application" msgstr "Eliminar aquesta nota" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "No heu iniciat una sessió." @@ -1015,7 +1037,7 @@ msgstr "N'estàs segur que vols eliminar aquesta notificació?" msgid "Do not delete this notice" msgstr "No es pot esborrar la notificació." -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Eliminar aquesta nota" @@ -1032,18 +1054,18 @@ msgstr "No pots eliminar l'estatus d'un altre usuari." msgid "Delete user" msgstr "Suprimeix l'usuari" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Suprimeix l'usuari" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Disseny" @@ -1144,6 +1166,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Guardar" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Desa el disseny" @@ -1246,30 +1279,30 @@ msgstr "Editar el grup %s" msgid "You must be logged in to create a group." msgstr "Has d'haver entrat per crear un grup." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "Has de ser admin per editar aquest grup" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Utilitza aquest formulari per editar el grup." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "la descripció és massa llarga (màx. %d caràcters)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "No s'ha pogut actualitzar el grup." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "No s'han pogut crear els àlies." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Configuració guardada." @@ -1613,7 +1646,7 @@ msgstr "Un usuari t'ha bloquejat." msgid "User is not a member of group." msgstr "L'usuari no és membre del grup." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Bloca l'usuari del grup" @@ -1648,11 +1681,11 @@ msgstr "No ID" msgid "You must be logged in to edit a group." msgstr "Heu d'iniciar una sessió per editar un grup." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Disseny de grup" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1660,77 +1693,77 @@ msgstr "" "Personalitzeu l'aspecte del vostre grup amb una imatge de fons i una paleta " "de colors de la vostra elecció." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "No s'ha pogut actualitzar el vostre disseny." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "S'han desat les preferències de disseny." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Logo del grup" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, fuzzy, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "Pots pujar una imatge de logo per al grup." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Usuari sense perfil coincident" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Trieu una àrea quadrada de la imatge perquè en sigui el logotip." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo actualitzat." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Error en actualitzar logo." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "%s membre/s en el grup" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" msgstr "%s membre/s en el grup, pàgina %d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "La llista dels usuaris d'aquest grup." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Admin" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Bloca" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Fes l'usuari un administrador del grup" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Fes-lo administrador" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Fes l'usuari administrador" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Actualitzacions dels membres de %1$s el %2$s!" @@ -1989,16 +2022,19 @@ msgstr "Missatge personal" msgid "Optionally add a personal message to the invitation." msgstr "Opcionalment pots afegir un missatge a la invitació." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Envia" -#: actions/invite.php:226 +#: actions/invite.php:227 #, fuzzy, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s t'ha convidat us ha convidat a unir-te al grup %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2059,7 +2095,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Has d'haver entrat per participar en un grup." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Cap sobrenom." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s s'ha unit al grup %2$s" @@ -2068,11 +2109,11 @@ msgstr "%1$s s'ha unit al grup %2$s" msgid "You must be logged in to leave a group." msgstr "Has d'haver entrat per a poder marxar d'un grup." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "No ets membre d'aquest grup." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%s ha abandonat el grup %s" @@ -2090,8 +2131,7 @@ msgstr "Nom d'usuari o contrasenya incorrectes." msgid "Error setting user. You are probably not authorized." msgstr "No autoritzat." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Inici de sessió" @@ -2213,9 +2253,9 @@ msgid "Message sent" msgstr "S'ha enviat el missatge" #: actions/newmessage.php:185 -#, fuzzy, php-format +#, php-format msgid "Direct message to %s sent." -msgstr "Missatge directe per a %s enviat" +msgstr "S'ha enviat un missatge directe a %s." #: actions/newmessage.php:210 actions/newnotice.php:245 lib/channel.php:170 msgid "Ajax Error" @@ -2293,9 +2333,8 @@ msgid "You must be logged in to list your applications." msgstr "Heu d'iniciar una sessió per editar un grup." #: actions/oauthappssettings.php:74 -#, fuzzy msgid "OAuth applications" -msgstr "Altres opcions" +msgstr "Aplicacions OAuth" #: actions/oauthappssettings.php:85 msgid "Applications you have registered" @@ -2315,9 +2354,8 @@ msgid "You have allowed the following applications to access you account." msgstr "" #: actions/oauthconnectionssettings.php:175 -#, fuzzy msgid "You are not a user of that application." -msgstr "No ets membre d'aquest grup." +msgstr "No sou usuari de l'aplicació." #: actions/oauthconnectionssettings.php:186 msgid "Unable to revoke access for app: " @@ -2349,8 +2387,8 @@ msgstr "tipus de contingut " msgid "Only " msgstr "Només " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Format de data no suportat." @@ -2363,9 +2401,8 @@ msgid "Notice Search" msgstr "Cerca de notificacions" #: actions/othersettings.php:60 -#, fuzzy msgid "Other settings" -msgstr "Altres configuracions" +msgstr "Altres paràmetres" #: actions/othersettings.php:71 msgid "Manage various other options." @@ -2397,9 +2434,8 @@ msgstr "" "El servei d'auto-escurçament d'URL és massa llarga (màx. 50 caràcters)." #: actions/otp.php:69 -#, fuzzy msgid "No user ID specified." -msgstr "No s'ha especificat cap grup." +msgstr "No s'ha especificat cap ID d'usuari." #: actions/otp.php:83 #, fuzzy @@ -2498,7 +2534,7 @@ msgstr "No es pot guardar la nova contrasenya." msgid "Password saved." msgstr "Contrasenya guardada." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Camins" @@ -2531,7 +2567,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Lloc" @@ -2706,7 +2741,7 @@ msgstr "" "1-64 lletres en minúscula o números, sense signes de puntuació o espais" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Nom complet" @@ -2735,7 +2770,7 @@ msgid "Bio" msgstr "Biografia" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2819,7 +2854,8 @@ msgstr "No s'ha pogut guardar el perfil." msgid "Couldn't save tags." msgstr "No s'han pogut guardar les etiquetes." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Configuració guardada." @@ -2832,28 +2868,28 @@ msgstr "Més enllà del límit de la pàgina (%s)" msgid "Could not retrieve public stream." msgstr "No s'ha pogut recuperar la conversa pública." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Línia temporal pública, pàgina %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Línia temporal pública" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Flux de canal públic (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Flux de canal públic (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Flux de canal públic (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2862,11 +2898,11 @@ msgstr "" "Aquesta és la línia temporal pública de %%site.name%%, però ningú no hi ha " "enviat res encara." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Sigueu el primer en escriure-hi!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2874,7 +2910,7 @@ msgstr "" "Per què no [registreu un compte](%%action.register%%) i sou el primer en " "escriure-hi!" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2883,7 +2919,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, fuzzy, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3060,8 +3096,7 @@ msgstr "El codi d'invitació no és vàlid." msgid "Registration successful" msgstr "Registre satisfactori" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Registre" @@ -3252,7 +3287,7 @@ msgstr "No pots registrar-te si no estàs d'acord amb la llicència." msgid "You already repeated that notice." msgstr "Ja heu blocat l'usuari." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Repetit" @@ -3260,33 +3295,33 @@ msgstr "Repetit" msgid "Repeated!" msgstr "Repetit!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Respostes a %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "Respostes a %1$s el %2$s!" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Feed d'avisos de %s" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Feed d'avisos de %s" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Feed d'avisos de %s" -#: actions/replies.php:198 +#: actions/replies.php:199 #, fuzzy, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3295,14 +3330,14 @@ msgstr "" "Aquesta és la línia temporal de %s i amics, però ningú hi ha enviat res " "encara." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3330,7 +3365,6 @@ msgid "User is already sandboxed." msgstr "Un usuari t'ha bloquejat." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Sessions" @@ -3356,7 +3390,7 @@ msgid "Turn on debugging output for sessions." msgstr "Activa la sortida de depuració per a les sessions." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Desa els paràmetres del lloc" @@ -3389,7 +3423,7 @@ msgstr "Paginació" msgid "Description" msgstr "Descripció" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Estadístiques" @@ -3452,35 +3486,35 @@ msgstr "%s's notes favorites" msgid "Could not retrieve favorite notices." msgstr "No s'han pogut recuperar els avisos preferits." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Feed per a amics de %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Feed per a amics de %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Feed per a amics de %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3488,7 +3522,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "És una forma de compartir allò que us agrada." @@ -3502,67 +3536,67 @@ msgstr "%s grup" msgid "%1$s group, page %2$d" msgstr "%s membre/s en el grup, pàgina %d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Perfil del grup" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Avisos" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Àlies" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Accions del grup" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Feed d'avisos del grup %s" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Feed d'avisos del grup %s" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "Feed d'avisos del grup %s" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "Safata de sortida per %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Membres" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Cap)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Tots els membres" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "S'ha creat" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3572,7 +3606,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, fuzzy, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3583,7 +3617,7 @@ msgstr "" "**%s** és un grup d'usuaris a %%%%site.name%%%%, un servei de [microblogging]" "(http://ca.wikipedia.org/wiki/Microblogging)" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Administradors" @@ -4054,22 +4088,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Usuaris que s'han etiquetat %s - pàgina %d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Feed d'avisos de %s" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Feed d'avisos de %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Feed d'avisos de %s" @@ -4126,7 +4160,7 @@ msgstr "" msgid "No such tag." msgstr "No existeix aquesta etiqueta." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Mètode API en construcció." @@ -4157,70 +4191,72 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Usuari" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Perfil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Límit de la biografia" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Límit màxim de la biografia d'un perfil (en caràcters)." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Usuaris nous" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Benvinguda als usuaris nous" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Subscripció per defecte" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Subscriviu automàticament els usuaris nous a aquest usuari." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Invitacions" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "S'han habilitat les invitacions" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4406,7 +4442,7 @@ msgstr "" msgid "Plugins" msgstr "Connectors" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Sessions" @@ -4448,6 +4484,11 @@ msgstr "No s'ha pogut actualitzar el grup." msgid "Group leave failed." msgstr "Perfil del grup" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "No s'ha pogut actualitzar el grup." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4465,28 +4506,28 @@ msgstr "No s'ha pogut inserir el missatge." msgid "Could not update message with new URI." msgstr "No s'ha pogut inserir el missatge amb la nova URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Hashtag de l'error de la base de dades:%s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "Problema en guardar l'avís." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Problema al guardar la notificació. Usuari desconegut." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Masses notificacions massa ràpid; pren un respir i publica de nou en uns " "minuts." -#: classes/Notice.php:237 +#: classes/Notice.php:254 #, fuzzy msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " @@ -4495,20 +4536,20 @@ msgstr "" "Masses notificacions massa ràpid; pren un respir i publica de nou en uns " "minuts." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Ha estat bandejat de publicar notificacions en aquest lloc." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problema en guardar l'avís." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Problema en guardar l'avís." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -4539,19 +4580,29 @@ msgstr "No s'ha pogut eliminar la subscripció." msgid "Couldn't delete subscription." msgstr "No s'ha pogut eliminar la subscripció." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Us donem la benvinguda a %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "No s'ha pogut crear el grup." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "No s'ha pogut establir la pertinença d'aquest grup." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "No s'ha pogut establir la pertinença d'aquest grup." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "No s'ha pogut guardar la subscripció." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Canvieu els paràmetres del vostre perfil" @@ -4594,121 +4645,190 @@ msgstr "Pàgina sense titol" msgid "Primary site navigation" msgstr "Navegació primària del lloc" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Inici" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Perfil personal i línia temporal dels amics" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Personal" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Canviar correu electrònic, avatar, contrasenya, perfil" -#: lib/action.php:444 -msgid "Connect" -msgstr "Connexió" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Compte" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "No s'ha pogut redirigir al servidor: %s" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Connexió" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Canvia la configuració del lloc" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Convida" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Admin" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Convidar amics i companys perquè participin a %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Finalitza la sessió" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Convida" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Finalitza la sessió del lloc" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Finalitza la sessió" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Crea un compte" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registre" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Inicia una sessió al lloc" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Ajuda" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Inici de sessió" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Ajuda'm" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Cerca" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Ajuda" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Cerca gent o text" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Cerca" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Avís del lloc" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Vistes locals" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Notificació pàgina" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Navegació del lloc secundària" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Ajuda" + +#: lib/action.php:765 msgid "About" msgstr "Quant a" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "Preguntes més freqüents" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Privadesa" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Font" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Contacte" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Insígnia" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Llicència del programari StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4717,12 +4837,12 @@ msgstr "" "**%%site.name%%** és un servei de microblogging de [%%site.broughtby%%**](%%" "site.broughtbyurl%%)." -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** és un servei de microblogging." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4733,112 +4853,165 @@ msgstr "" "%s, disponible sota la [GNU Affero General Public License](http://www.fsf." "org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Llicència de contingut del lloc" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Tot " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "llicència." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Paginació" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Posteriors" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Anteriors" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "No podeu fer canvis al lloc." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "Registre no permès." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 #, fuzzy msgid "showForm() not implemented." msgstr "Comanda encara no implementada." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 #, fuzzy msgid "saveSettings() not implemented." msgstr "Comanda encara no implementada." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 #, fuzzy msgid "Unable to delete design setting." msgstr "No s'ha pogut guardar la teva configuració de Twitter!" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Configuració bàsica del lloc" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Lloc" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Configuració del disseny" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Disseny" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "Configuració dels camins" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Usuari" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "Configuració del disseny" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Accés" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Configuració dels camins" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Camins" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "Configuració del disseny" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Sessions" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4933,11 +5106,11 @@ msgstr "" msgid "Tags for this attachment" msgstr "Etiquetes de l'adjunció" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "El canvi de contrasenya ha fallat" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Contrasenya canviada." @@ -5217,19 +5390,19 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "No s'ha trobat cap fitxer de configuració. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "Podeu voler executar l'instal·lador per a corregir-ho." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Vés a l'instal·lador." @@ -5417,23 +5590,23 @@ msgstr "Error del sistema en pujar el fitxer." msgid "Not an image or corrupt file." msgstr "No és una imatge o és un fitxer corrupte." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Format d'imatge no suportat." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Hem perdut el nostre arxiu." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Tipus de fitxer desconegut" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "kB" @@ -5743,6 +5916,12 @@ msgstr "A" msgid "Available characters" msgstr "Caràcters disponibles" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Envia" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Enviar notificació" @@ -5802,23 +5981,23 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "en context" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Repetit per" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "respondre a aquesta nota" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Respon" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Notificació publicada" @@ -5868,6 +6047,10 @@ msgstr "Respostes" msgid "Favorites" msgstr "Preferits" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Usuari" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Safata d'entrada" @@ -5960,7 +6143,7 @@ msgstr "Repeteix l'avís" msgid "Repeat this notice" msgstr "Repeteix l'avís" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5982,6 +6165,10 @@ msgstr "Cerca al lloc" msgid "Keyword(s)" msgstr "Paraules clau" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Cerca" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Ajuda de la cerca" @@ -6033,6 +6220,15 @@ msgstr "Persones subscrites a %s" msgid "Groups %s is a member of" msgstr "%s grups són membres de" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Convida" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Convidar amics i companys perquè participin a %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6104,47 +6300,47 @@ msgstr "Missatge" msgid "Moderate" msgstr "Modera" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "fa pocs segons" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "fa un minut" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "fa %d minuts" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "fa una hora" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "fa %d hores" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "fa un dia" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "fa %d dies" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "fa un mes" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "fa %d mesos" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "fa un any" diff --git a/locale/cs/LC_MESSAGES/statusnet.po b/locale/cs/LC_MESSAGES/statusnet.po index dd51424e6..9137d3708 100644 --- a/locale/cs/LC_MESSAGES/statusnet.po +++ b/locale/cs/LC_MESSAGES/statusnet.po @@ -9,82 +9,88 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:18+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:27+0000\n" "Language-Team: Czech\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: cs\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n< =4) ? 1 : 2 ;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "Přijmout" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Nastavení" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Registrovat" -#: actions/accessadminpanel.php:161 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 #, fuzzy +msgctxt "LABEL" msgid "Private" msgstr "Soukromí" -#: actions/accessadminpanel.php:163 -msgid "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:167 +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 msgid "Invite only" msgstr "" -#: actions/accessadminpanel.php:169 -msgid "Make registration invitation only." +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:173 +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 #, fuzzy msgid "Closed" msgstr "Žádný takový uživatel." -#: actions/accessadminpanel.php:175 -msgid "Disable new registrations." -msgstr "" - -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Uložit" - -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Nastavení" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Uložit" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page" msgstr "Žádné takové oznámení." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -98,72 +104,82 @@ msgstr "Žádné takové oznámení." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Žádný takový uživatel." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s a přátelé" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s a přátelé" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Feed přítel uživatele: %s" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Feed přítel uživatele: %s" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, fuzzy, php-format msgid "Feed for friends of %s (Atom)" msgstr "Feed přítel uživatele: %s" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 #, fuzzy msgid "You and friends" msgstr "%s a přátelé" @@ -182,20 +198,20 @@ msgstr "" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Potvrzující kód nebyl nalezen" @@ -229,8 +245,9 @@ msgstr "Nelze aktualizovat uživatele" #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Uživatel nemá profil." @@ -255,7 +272,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -372,68 +389,68 @@ msgstr "Nelze aktualizovat uživatele" msgid "Could not find target user." msgstr "Nelze aktualizovat uživatele" -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Přezdívka může obsahovat pouze malá písmena a čísla bez mezer" -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Přezdívku již někdo používá. Zkuste jinou" -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Není platnou přezdívkou." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Stránka není platnou URL." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Jméno je moc dlouhé (maximální délka je 255 znaků)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." msgstr "Text je příliš dlouhý (maximální délka je 140 zanků)" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Umístění příliš dlouhé (maximálně 255 znaků)" -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, fuzzy, php-format msgid "Invalid alias: \"%s\"" msgstr "Neplatná adresa '%s'" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Přezdívku již někdo používá. Zkuste jinou" -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -445,16 +462,16 @@ msgstr "" msgid "Group not found!" msgstr "Žádný požadavek nebyl nalezen!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 #, fuzzy msgid "You are already a member of that group." msgstr "Již jste přihlášen" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Nelze přesměrovat na server: %s" @@ -464,7 +481,7 @@ msgstr "Nelze přesměrovat na server: %s" msgid "You are not a member of this group." msgstr "Neodeslal jste nám profil" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Nelze vytvořit OpenID z: %s" @@ -496,7 +513,7 @@ msgstr "Neplatná velikost" #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -540,7 +557,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -563,14 +580,14 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 #, fuzzy msgid "Account" msgstr "O nás" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -657,12 +674,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "Mikroblog od %s" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -698,7 +715,7 @@ msgstr "Odpovědi na %s" msgid "Repeats of %s" msgstr "Odpovědi na %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "" @@ -721,8 +738,7 @@ msgstr "Žádný takový dokument." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Žádná přezdívka." @@ -734,7 +750,7 @@ msgstr "Žádná velikost" msgid "Invalid size." msgstr "Neplatná velikost" -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Obrázek" @@ -751,31 +767,31 @@ msgid "User without matching profile" msgstr "" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 #, fuzzy msgid "Avatar settings" msgstr "Nastavení" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Odstranit" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Upload" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "" @@ -783,7 +799,7 @@ msgstr "" msgid "Pick a square area of the image to be your avatar" msgstr "" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -817,23 +833,23 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Ne" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "Žádný takový uživatel." #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Ano" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Zablokovat tohoto uživatele" @@ -841,41 +857,45 @@ msgstr "Zablokovat tohoto uživatele" msgid "Failed to save block information." msgstr "" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 #, fuzzy msgid "No such group." msgstr "Žádné takové oznámení." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "Uživatel nemá profil." -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s a přátelé" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 #, fuzzy msgid "Unblock user from group" msgstr "Žádný takový uživatel." -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 #, fuzzy msgid "Unblock this user" msgstr "Žádný takový uživatel." @@ -956,7 +976,7 @@ msgstr "Neodeslal jste nám profil" #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -982,12 +1002,13 @@ msgstr "Žádné takové oznámení." msgid "Delete this application" msgstr "Odstranit toto oznámení" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Nepřihlášen" @@ -1015,7 +1036,7 @@ msgstr "" msgid "Do not delete this notice" msgstr "Žádné takové oznámení." -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Odstranit toto oznámení" @@ -1033,18 +1054,18 @@ msgstr "Můžete použít místní odebírání." msgid "Delete user" msgstr "" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Odstranit tohoto uživatele" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Vzhled" @@ -1151,6 +1172,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Uložit" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1250,31 +1282,31 @@ msgstr "Upravit %s skupinu" msgid "You must be logged in to create a group." msgstr "" -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." msgstr "Text je příliš dlouhý (maximální délka je 140 zanků)" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 #, fuzzy msgid "Could not update group." msgstr "Nelze aktualizovat uživatele" -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "Nelze uložin informace o obrázku" -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Nastavení uloženo." @@ -1618,7 +1650,7 @@ msgstr "Uživatel nemá profil." msgid "User is not a member of group." msgstr "Neodeslal jste nám profil" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 #, fuzzy msgid "Block user from group" msgstr "Žádný takový uživatel." @@ -1654,91 +1686,91 @@ msgstr "Žádné id" msgid "You must be logged in to edit a group." msgstr "" -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "Nelze aktualizovat uživatele" -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "Nastavení uloženo" -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Logo skupiny" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Uživatel nemá profil." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 #, fuzzy msgid "Logo updated." msgstr "Obrázek nahrán" -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 #, fuzzy msgid "Failed updating logo." msgstr "Nahrávání obrázku selhalo." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Mikroblog od %s" @@ -1992,16 +2024,19 @@ msgstr "" msgid "Optionally add a personal message to the invitation." msgstr "" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Odeslat" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2036,7 +2071,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "" -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Žádná přezdívka." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "" @@ -2045,12 +2085,12 @@ msgstr "" msgid "You must be logged in to leave a group." msgstr "" -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 #, fuzzy msgid "You are not a member of that group." msgstr "Neodeslal jste nám profil" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%1 statusů na %2" @@ -2068,8 +2108,7 @@ msgstr "Neplatné jméno nebo heslo" msgid "Error setting user. You are probably not authorized." msgstr "Neautorizován." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Přihlásit" @@ -2318,8 +2357,8 @@ msgstr "Připojit" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "" @@ -2467,7 +2506,7 @@ msgstr "Nelze uložit nové heslo" msgid "Password saved." msgstr "Heslo uloženo" -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2500,7 +2539,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "" @@ -2683,7 +2721,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 znaků nebo čísel, bez teček, čárek a mezer" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Celé jméno" @@ -2711,7 +2749,7 @@ msgid "Bio" msgstr "O mě" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2793,7 +2831,8 @@ msgstr "Nelze uložit profil" msgid "Couldn't save tags." msgstr "Nelze uložit profil" -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Nastavení uloženo" @@ -2806,48 +2845,48 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, fuzzy, php-format msgid "Public timeline, page %d" msgstr "Veřejné zprávy" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Veřejné zprávy" -#: actions/public.php:159 +#: actions/public.php:160 #, fuzzy msgid "Public Stream Feed (RSS 1.0)" msgstr "Veřejný Stream Feed" -#: actions/public.php:163 +#: actions/public.php:164 #, fuzzy msgid "Public Stream Feed (RSS 2.0)" msgstr "Veřejný Stream Feed" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "Veřejný Stream Feed" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2856,7 +2895,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3029,8 +3068,7 @@ msgstr "Chyba v ověřovacím kódu" msgid "Registration successful" msgstr "Registrace úspěšná" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Registrovat" @@ -3201,7 +3239,7 @@ msgstr "Nemůžete se registrovat, pokud nesouhlasíte s licencí." msgid "You already repeated that notice." msgstr "Již jste přihlášen" -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "Vytvořit" @@ -3211,47 +3249,47 @@ msgstr "Vytvořit" msgid "Repeated!" msgstr "Vytvořit" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Odpovědi na %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "Odpovědi na %s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Feed sdělení pro %s" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Feed sdělení pro %s" -#: actions/replies.php:158 +#: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" msgstr "Feed sdělení pro %s" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3279,7 +3317,6 @@ msgid "User is already sandboxed." msgstr "Uživatel nemá profil." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3304,7 +3341,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "Nastavení" @@ -3339,7 +3376,7 @@ msgstr "Umístění" msgid "Description" msgstr "Odběry" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statistiky" @@ -3400,35 +3437,35 @@ msgstr "%s a přátelé" msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Feed přítel uživatele: %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Feed přítel uživatele: %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, fuzzy, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Feed přítel uživatele: %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3436,7 +3473,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3450,70 +3487,70 @@ msgstr "" msgid "%1$s group, page %2$d" msgstr "Všechny odběry" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 #, fuzzy msgid "Group profile" msgstr "Žádné takové oznámení." -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Poznámka" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Feed sdělení pro %s" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Feed sdělení pro %s" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "Feed sdělení pro %s" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, fuzzy, php-format msgid "FOAF for %s group" msgstr "Feed sdělení pro %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 #, fuzzy msgid "Members" msgstr "Členem od" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 #, fuzzy msgid "Created" msgstr "Vytvořit" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3523,7 +3560,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3532,7 +3569,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "" @@ -3994,22 +4031,22 @@ msgstr "Žádné Jabber ID." msgid "SMS" msgstr "" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Mikroblog od %s" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Feed sdělení pro %s" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Feed sdělení pro %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Feed sdělení pro %s" @@ -4063,7 +4100,7 @@ msgstr "" msgid "No such tag." msgstr "Žádné takové oznámení." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "" @@ -4098,73 +4135,74 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +msgctxt "TITLE" msgid "User" msgstr "" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "Všechny odběry" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "Odběr autorizován" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "Umístění" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4351,7 +4389,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Osobní" @@ -4392,6 +4430,11 @@ msgstr "Nelze aktualizovat uživatele" msgid "Group leave failed." msgstr "Žádné takové oznámení." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Nelze aktualizovat uživatele" + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4409,46 +4452,46 @@ msgstr "" msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "Problém při ukládání sdělení" -#: classes/Notice.php:226 +#: classes/Notice.php:243 #, fuzzy msgid "Problem saving notice. Unknown user." msgstr "Problém při ukládání sdělení" -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problém při ukládání sdělení" -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Problém při ukládání sdělení" -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4480,21 +4523,31 @@ msgstr "Nelze smazat odebírání" msgid "Couldn't delete subscription." msgstr "Nelze smazat odebírání" -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "" -#: classes/User_group.php:423 +#: classes/User_group.php:462 #, fuzzy msgid "Could not create group." msgstr "Nelze uložin informace o obrázku" -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Nelze vytvořit odebírat" + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "Nelze vytvořit odebírat" +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Nelze vytvořit odebírat" + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "" @@ -4538,126 +4591,188 @@ msgstr "" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Domů" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 -msgid "Change your email, avatar, password, profile" -msgstr "" +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Osobní" +#. TRANS: Tooltip for main menu option "Account" #: lib/action.php:444 -msgid "Connect" -msgstr "Připojit" +#, fuzzy +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "Změnit heslo" -#: lib/action.php:444 +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "O nás" + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Nelze přesměrovat na server: %s" -#: lib/action.php:448 +#: lib/action.php:453 #, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Připojit" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Odběry" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" +#: lib/action.php:460 +msgctxt "MENU" +msgid "Admin" msgstr "" -#: lib/action.php:453 lib/subgroupnav.php:106 +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 #, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "" -#: lib/action.php:458 -msgid "Logout" -msgstr "Odhlásit" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Neplatná velikost" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Odhlásit" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 #, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Vytvořit nový účet" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registrovat" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Nápověda" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Přihlásit" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Pomoci mi!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Hledat" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Nápověda" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Hledat" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 #, fuzzy msgid "Site notice" msgstr "Nové sdělení" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 #, fuzzy msgid "Page notice" msgstr "Nové sdělení" -#: lib/action.php:727 +#: lib/action.php:758 #, fuzzy msgid "Secondary site navigation" msgstr "Odběry" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Nápověda" + +#: lib/action.php:765 msgid "About" msgstr "O nás" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Soukromí" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Zdroj" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Kontakt" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4666,12 +4781,12 @@ msgstr "" "**%%site.name%%** je služba microblogů, kterou pro vás poskytuje [%%site." "broughtby%%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** je služba mikroblogů." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4682,114 +4797,165 @@ msgstr "" "dostupná pod [GNU Affero General Public License](http://www.fsf.org/" "licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "Nové sdělení" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 #, fuzzy msgid "After" msgstr "« Novější" -#: lib/action.php:1149 +#: lib/action.php:1180 #, fuzzy msgid "Before" msgstr "Starší »" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "Potvrzení emailové adresy" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Nové sdělení" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "Potvrzení emailové adresy" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Vzhled" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "Potvrzení emailové adresy" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +msgctxt "MENU" +msgid "User" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "Potvrzení emailové adresy" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Přijmout" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "Potvrzení emailové adresy" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "Potvrzení emailové adresy" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Osobní" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4884,12 +5050,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Heslo uloženo" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Heslo uloženo" @@ -5176,20 +5342,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "Žádný potvrzující kód." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5383,24 +5549,24 @@ msgstr "Chyba systému při nahrávání souboru" msgid "Not an image or corrupt file." msgstr "Není obrázkem, nebo jde o poškozený soubor." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Nepodporovaný formát obrázku." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "Žádné takové oznámení." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5705,6 +5871,12 @@ msgstr "" msgid "Available characters" msgstr "6 a více znaků" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Odeslat" + #: lib/noticeform.php:160 #, fuzzy msgid "Send a notice" @@ -5764,26 +5936,26 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 #, fuzzy msgid "in context" msgstr "Žádný obsah!" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "Vytvořit" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 #, fuzzy msgid "Reply" msgstr "odpověď" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Sdělení" @@ -5833,6 +6005,10 @@ msgstr "Odpovědi" msgid "Favorites" msgstr "Oblíbené" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "" @@ -5926,7 +6102,7 @@ msgstr "Odstranit toto oznámení" msgid "Repeat this notice" msgstr "Odstranit toto oznámení" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5948,6 +6124,10 @@ msgstr "Hledat" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Hledat" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -6002,6 +6182,15 @@ msgstr "Vzdálený odběr" msgid "Groups %s is a member of" msgstr "" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6075,47 +6264,47 @@ msgstr "Zpráva" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "před pár sekundami" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "asi před minutou" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "asi před %d minutami" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "asi před hodinou" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "asi před %d hodinami" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "asi přede dnem" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "před %d dny" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "asi před měsícem" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "asi před %d mesíci" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "asi před rokem" diff --git a/locale/de/LC_MESSAGES/statusnet.po b/locale/de/LC_MESSAGES/statusnet.po index 053187a86..a00ec2611 100644 --- a/locale/de/LC_MESSAGES/statusnet.po +++ b/locale/de/LC_MESSAGES/statusnet.po @@ -4,6 +4,7 @@ # Author@translatewiki.net: Lutzgh # Author@translatewiki.net: March # Author@translatewiki.net: McDutchie +# Author@translatewiki.net: Michi # Author@translatewiki.net: Pill # Author@translatewiki.net: Umherirrender # -- @@ -13,76 +14,83 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:21+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:31+0000\n" "Language-Team: German\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: de\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Zugang" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Zugangseinstellungen speichern" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Registrieren" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Privat" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" "Anonymen (nicht eingeloggten) Nutzern das Betrachten der Seite verbieten?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Nur auf Einladung" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Privat" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Registrierung nur bei vorheriger Einladung erlauben." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Geschlossen" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Nur auf Einladung" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "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: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 -msgid "Save" -msgstr "Speichern" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Geschlossen" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Zugangs-Einstellungen speichern" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Speichern" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Seite nicht vorhanden" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -96,45 +104,53 @@ msgstr "Seite nicht vorhanden" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Unbekannter Benutzer." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s und Freunde, Seite% 2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s und Freunde" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Feed der Freunde von %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Feed der Freunde von %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Feed der Freunde von %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." @@ -142,7 +158,7 @@ msgstr "" "Dies ist die Zeitleiste für %s und Freunde aber bisher hat niemand etwas " "gepostet." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -151,7 +167,8 @@ msgstr "" "Abonniere doch mehr Leute, [tritt einer Gruppe bei](%%action.groups%%) oder " "poste selber etwas." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, fuzzy, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -161,7 +178,7 @@ msgstr "" "posten](%%%%action.newnotice%%%%?status_textarea=%s) um seine Aufmerksamkeit " "zu erregen." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -171,7 +188,8 @@ msgstr "" "gibst %s dann einen Stups oder postest ihm etwas, um seine Aufmerksamkeit zu " "erregen?" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Du und Freunde" @@ -189,20 +207,20 @@ msgstr "Aktualisierungen von %1$s und Freunden auf %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "API-Methode nicht gefunden." @@ -234,8 +252,9 @@ msgstr "Konnte Benutzerdaten nicht aktualisieren." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Benutzer hat kein Profil." @@ -259,7 +278,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -372,7 +391,7 @@ msgstr "Konnte öffentlichen Stream nicht abrufen." msgid "Could not find target user." msgstr "Konnte keine Statusmeldungen finden." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -380,63 +399,63 @@ msgstr "" "Der Nutzername darf nur aus Kleinbuchstaben und Ziffern bestehen. " "Leerzeichen sind nicht erlaubt." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Nutzername wird bereits verwendet. Suche dir einen anderen aus." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Ungültiger Nutzername." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "" "Homepage ist keine gültige URL. URL’s müssen ein Präfix wie http enthalten." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Der vollständige Name ist zu lang (maximal 255 Zeichen)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Die Beschreibung ist zu lang (max. %d Zeichen)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Der eingegebene Aufenthaltsort ist zu lang (maximal 255 Zeichen)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Zu viele Pseudonyme! Maximale Anzahl ist %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Ungültiger Tag: „%s“" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Nutzername „%s“ wird bereits verwendet. Suche dir einen anderen aus." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Alias kann nicht das gleiche wie der Spitznamen sein." @@ -447,15 +466,15 @@ msgstr "Alias kann nicht das gleiche wie der Spitznamen sein." msgid "Group not found!" msgstr "Gruppe nicht gefunden!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Du bist bereits Mitglied dieser Gruppe" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Der Admin dieser Gruppe hat dich gesperrt." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Konnte Benutzer %s nicht der Gruppe %s hinzufügen." @@ -464,7 +483,7 @@ msgstr "Konnte Benutzer %s nicht der Gruppe %s hinzufügen." msgid "You are not a member of this group." msgstr "Du bist kein Mitglied dieser Gruppe." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Konnte Benutzer %1$s nicht aus der Gruppe %2$s entfernen." @@ -496,7 +515,7 @@ msgstr "Ungültige Größe." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -539,7 +558,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -562,13 +581,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Konto" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -654,12 +673,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s Aktualisierung in den Favoriten von %s / %s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s Zeitleiste" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -695,7 +714,7 @@ msgstr "Antworten an %s" msgid "Repeats of %s" msgstr "Antworten an %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Nachrichten, die mit %s getagt sind" @@ -716,8 +735,7 @@ msgstr "Kein solcher Anhang." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Kein Nutzername." @@ -729,7 +747,7 @@ msgstr "Keine Größe." msgid "Invalid size." msgstr "Ungültige Größe." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -747,30 +765,30 @@ msgid "User without matching profile" msgstr "Benutzer ohne passendes Profil" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Avatar-Einstellungen" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Original" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Vorschau" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Löschen" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Hochladen" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Zuschneiden" @@ -779,7 +797,7 @@ msgid "Pick a square area of the image to be your avatar" msgstr "" "Wähle eine quadratische Fläche aus dem Bild, um dein Avatar zu speichern" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Daten verloren." @@ -811,22 +829,22 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Nein" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Diesen Benutzer freigeben" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Ja" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Diesen Benutzer blockieren" @@ -834,39 +852,43 @@ msgstr "Diesen Benutzer blockieren" msgid "Failed to save block information." msgstr "Konnte Blockierungsdaten nicht speichern." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Keine derartige Gruppe." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s blockierte Benutzerprofile" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s blockierte Benutzerprofile, Seite %d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Liste der blockierten Benutzer in dieser Gruppe." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Sperrung des Nutzers für die Gruppe aufheben." -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Freigeben" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Diesen Benutzer freigeben" @@ -945,7 +967,7 @@ msgstr "Du bist kein Mitglied dieser Gruppe." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Es gab ein Problem mit deinem Sessiontoken." @@ -971,12 +993,13 @@ msgstr "Diese Nachricht nicht löschen" msgid "Delete this application" msgstr "Nachricht löschen" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Nicht angemeldet." @@ -1005,7 +1028,7 @@ msgstr "Bist du sicher, dass du diese Nachricht löschen möchtest?" msgid "Do not delete this notice" msgstr "Diese Nachricht nicht löschen" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Nachricht löschen" @@ -1021,18 +1044,18 @@ msgstr "Du kannst nur lokale Benutzer löschen." msgid "Delete user" msgstr "Benutzer löschen" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Diesen Benutzer löschen" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1135,6 +1158,17 @@ msgstr "Standard-Design wiederherstellen" msgid "Reset back to default" msgstr "Standard wiederherstellen" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Speichern" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Design speichern" @@ -1153,68 +1187,58 @@ msgid "No such document \"%s\"" msgstr "Unbekanntes Dokument." #: actions/editapplication.php:54 -#, fuzzy msgid "Edit Application" -msgstr "Sonstige Optionen" +msgstr "Anwendung bearbeiten" #: actions/editapplication.php:66 -#, fuzzy msgid "You must be logged in to edit an application." -msgstr "Du musst angemeldet sein, um eine Gruppe zu bearbeiten." +msgstr "Du musst angemeldet sein, um eine Anwendung zu bearbeiten." #: actions/editapplication.php:81 actions/oauthconnectionssettings.php:166 #: actions/showapplication.php:87 -#, fuzzy msgid "No such application." -msgstr "Unbekannte Nachricht." +msgstr "Anwendung nicht bekannt." #: actions/editapplication.php:161 -#, fuzzy msgid "Use this form to edit your application." -msgstr "Benutze dieses Formular, um die Gruppe zu bearbeiten." +msgstr "Benutze dieses Formular, um die Anwendung zu bearbeiten." #: actions/editapplication.php:177 actions/newapplication.php:159 -#, fuzzy msgid "Name is required." -msgstr "Gleiches Passwort wie zuvor. Pflichteingabe." +msgstr "Name ist erforderlich." #: actions/editapplication.php:180 actions/newapplication.php:165 -#, fuzzy msgid "Name is too long (max 255 chars)." -msgstr "Der vollständige Name ist zu lang (maximal 255 Zeichen)." +msgstr "Der Name ist zu lang (maximal 255 Zeichen)." #: actions/editapplication.php:183 actions/newapplication.php:162 -#, fuzzy msgid "Name already in use. Try another one." -msgstr "Nutzername wird bereits verwendet. Suche dir einen anderen aus." +msgstr "Der Name wird bereits verwendet. Suche dir einen anderen aus." #: actions/editapplication.php:186 actions/newapplication.php:168 -#, fuzzy msgid "Description is required." -msgstr "Beschreibung" +msgstr "Beschreibung ist erforderlich." #: actions/editapplication.php:194 msgid "Source URL is too long." -msgstr "" +msgstr "Homepage ist zu lang." #: actions/editapplication.php:200 actions/newapplication.php:185 -#, fuzzy msgid "Source URL is not valid." msgstr "" "Homepage ist keine gültige URL. URL’s müssen ein Präfix wie http enthalten." #: actions/editapplication.php:203 actions/newapplication.php:188 msgid "Organization is required." -msgstr "" +msgstr "Organisation ist erforderlich. (Pflichtangabe)" #: actions/editapplication.php:206 actions/newapplication.php:191 -#, fuzzy msgid "Organization is too long (max 255 chars)." -msgstr "Der eingegebene Aufenthaltsort ist zu lang (maximal 255 Zeichen)." +msgstr "Die angegebene Organisation ist zu lang (maximal 255 Zeichen)." #: actions/editapplication.php:209 actions/newapplication.php:194 msgid "Organization homepage is required." -msgstr "" +msgstr "Homepage der Organisation ist erforderlich (Pflichtangabe)." #: actions/editapplication.php:218 actions/newapplication.php:206 msgid "Callback is too long." @@ -1238,35 +1262,34 @@ msgstr "Gruppe %s bearbeiten" msgid "You must be logged in to create a group." msgstr "Du musst angemeldet sein, um eine Gruppe zu erstellen." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "Du musst ein Administrator sein, um die Gruppe zu bearbeiten" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Benutze dieses Formular, um die Gruppe zu bearbeiten." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "Die Beschreibung ist zu lang (max. %d Zeichen)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Konnte Gruppe nicht aktualisieren." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Konnte keinen Favoriten erstellen." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Einstellungen gespeichert." #: actions/emailsettings.php:60 -#, fuzzy msgid "Email settings" msgstr "E-Mail-Einstellungen" @@ -1305,9 +1328,8 @@ msgid "Cancel" msgstr "Abbrechen" #: actions/emailsettings.php:121 -#, fuzzy msgid "Email address" -msgstr "E-Mail-Adressen" +msgstr "E-Mail-Adresse" #: actions/emailsettings.php:123 msgid "Email address, like \"UserName@example.org\"" @@ -1601,7 +1623,7 @@ msgstr "Dieser Nutzer ist bereits von der Gruppe gesperrt" msgid "User is not a member of group." msgstr "Nutzer ist kein Mitglied dieser Gruppe." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Benutzerzugang zu der Gruppe blockieren" @@ -1634,30 +1656,30 @@ msgstr "Keine ID" msgid "You must be logged in to edit a group." msgstr "Du musst angemeldet sein, um eine Gruppe zu bearbeiten." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Gruppen-Design" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Konnte dein Design nicht aktualisieren." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Design-Einstellungen gespeichert." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Gruppen-Logo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1665,58 +1687,58 @@ msgstr "" "Du kannst ein Logo für Deine Gruppe hochladen. Die maximale Dateigröße ist %" "s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Benutzer ohne passendes Profil" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Wähle eine quadratische Fläche aus dem Bild, um das Logo zu speichern." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo aktualisiert." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Aktualisierung des Logos fehlgeschlagen." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "%s Gruppen-Mitglieder" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" msgstr "%s Gruppen-Mitglieder, Seite %d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Liste der Benutzer in dieser Gruppe." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Admin" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Blockieren" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Benutzer zu einem Admin dieser Gruppe ernennen" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Zum Admin ernennen" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Diesen Benutzer zu einem Admin ernennen" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Aktualisierungen von %1$s auf %2$s!" @@ -1984,16 +2006,19 @@ msgstr "" "Wenn du möchtest kannst du zu der Einladung eine persönliche Nachricht " "anfügen." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Senden" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s hat Dich eingeladen, auch bei %2$s mitzumachen." -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2053,7 +2078,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Du musst angemeldet sein, um Mitglied einer Gruppe zu werden." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Kein Nutzername." + +#: actions/joingroup.php:141 #, fuzzy, php-format msgid "%1$s joined group %2$s" msgstr "%s ist der Gruppe %s beigetreten" @@ -2062,11 +2092,11 @@ msgstr "%s ist der Gruppe %s beigetreten" msgid "You must be logged in to leave a group." msgstr "Du musst angemeldet sein, um aus einer Gruppe auszutreten." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Du bist kein Mitglied dieser Gruppe." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%s hat die Gruppe %s verlassen" @@ -2084,8 +2114,7 @@ msgid "Error setting user. You are probably not authorized." msgstr "" "Fehler beim setzen des Benutzers. Du bist vermutlich nicht autorisiert." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Anmelden" @@ -2285,9 +2314,8 @@ msgid "You must be logged in to list your applications." msgstr "Du musst angemeldet sein, um eine Gruppe zu bearbeiten." #: actions/oauthappssettings.php:74 -#, fuzzy msgid "OAuth applications" -msgstr "Sonstige Optionen" +msgstr "OAuth-Anwendungen" #: actions/oauthappssettings.php:85 msgid "Applications you have registered" @@ -2341,8 +2369,8 @@ msgstr "Content-Typ " msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Kein unterstütztes Datenformat." @@ -2486,7 +2514,7 @@ msgstr "Konnte neues Passwort nicht speichern" msgid "Password saved." msgstr "Passwort gespeichert." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2519,7 +2547,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Ungültiger SSL-Server. Die maximale Länge ist 255 Zeichen." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Seite" @@ -2694,7 +2721,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 Kleinbuchstaben oder Ziffern, keine Sonder- oder Leerzeichen" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Vollständiger Name" @@ -2723,7 +2750,7 @@ msgid "Bio" msgstr "Biografie" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2807,7 +2834,8 @@ msgstr "Konnte Profil nicht speichern." msgid "Couldn't save tags." msgstr "Konnte Tags nicht speichern." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Einstellungen gespeichert." @@ -2820,28 +2848,28 @@ msgstr "Jenseits des Seitenlimits (%s)" msgid "Could not retrieve public stream." msgstr "Konnte öffentlichen Stream nicht abrufen." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Öffentliche Zeitleiste, Seite %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Öffentliche Zeitleiste" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Feed des öffentlichen Streams (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Feed des öffentlichen Streams (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Feed des öffentlichen Streams (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2850,17 +2878,17 @@ msgstr "" "Dies ist die öffentliche Zeitlinie von %%site.name%% es wurde allerdings " "noch nichts gepostet." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Sei der erste der etwas schreibt!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2869,7 +2897,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3045,8 +3073,7 @@ msgstr "Entschuldigung, ungültiger Bestätigungscode." msgid "Registration successful" msgstr "Registrierung erfolgreich" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Registrieren" @@ -3235,7 +3262,7 @@ msgstr "Du kannst deine eigene Nachricht nicht wiederholen." msgid "You already repeated that notice." msgstr "Du hast diesen Benutzer bereits blockiert." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "Erstellt" @@ -3245,33 +3272,33 @@ msgstr "Erstellt" msgid "Repeated!" msgstr "Erstellt" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Antworten an %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Antworten an %1$s, Seite %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Feed der Antworten an %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Feed der Antworten an %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Feed der Nachrichten von %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, fuzzy, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3280,14 +3307,14 @@ msgstr "" "Dies ist die Zeitleiste für %s und Freunde aber bisher hat niemand etwas " "gepostet." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, fuzzy, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3317,7 +3344,6 @@ msgid "User is already sandboxed." msgstr "Dieser Benutzer hat dich blockiert." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3343,7 +3369,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Site-Einstellungen speichern" @@ -3376,7 +3402,7 @@ msgstr "Seitenerstellung" msgid "Description" msgstr "Beschreibung" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statistiken" @@ -3439,35 +3465,35 @@ msgstr "%ss favorisierte Nachrichten" msgid "Could not retrieve favorite notices." msgstr "Konnte Favoriten nicht abrufen." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Feed der Freunde von %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Feed der Freunde von %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Feed der Freunde von %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3475,7 +3501,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Dies ist ein Weg Dinge zu teilen die dir gefallen." @@ -3489,67 +3515,67 @@ msgstr "%s Gruppe" msgid "%1$s group, page %2$d" msgstr "%s Gruppen-Mitglieder, Seite %d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Gruppenprofil" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Nachricht" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Gruppenaktionen" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Nachrichtenfeed der Gruppe %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Nachrichtenfeed der Gruppe %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Nachrichtenfeed der Gruppe %s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "Postausgang von %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Mitglieder" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Kein)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Alle Mitglieder" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Erstellt" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3559,7 +3585,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3572,7 +3598,7 @@ msgstr "" "Freien Software [StatusNet](http://status.net/). Seine Mitglieder erstellen " "kurze Nachrichten über Ihr Leben und Interessen. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Administratoren" @@ -4045,22 +4071,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Mit %1$s gekennzeichnete Nachrichten, Seite %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Nachrichten Feed für Tag %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Nachrichten Feed für Tag %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Nachrichten Feed für Tag %s (Atom)" @@ -4117,7 +4143,7 @@ msgstr "" msgid "No such tag." msgstr "Tag nicht vorhanden." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API-Methode im Aufbau." @@ -4150,70 +4176,72 @@ msgstr "" "Die Nachrichtenlizenz '%s' ist nicht kompatibel mit der Lizenz der Seite '%" "s'." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Benutzer" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Nutzer Einstellungen dieser StatusNet Seite." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Das Zeichenlimit der Biografie muss numerisch sein!" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "Willkommens-Nachricht ungültig. Maximale Länge sind 255 Zeichen." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Neue Nutzer" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Willkommens-Nachricht für neue Nutzer (maximal 255 Zeichen)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Standard Abonnement" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Neue Nutzer abonnieren automatisch diesen Nutzer" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Einladungen" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Einladungen aktivieren" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "Ist es Nutzern erlaubt neue Nutzer einzuladen." @@ -4398,7 +4426,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Eigene" @@ -4440,6 +4468,11 @@ msgstr "Konnte Gruppe nicht aktualisieren." msgid "Group leave failed." msgstr "Gruppenprofil" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Konnte Gruppe nicht aktualisieren." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4458,27 +4491,27 @@ msgstr "Konnte Nachricht nicht einfügen." msgid "Could not update message with new URI." msgstr "Konnte Nachricht nicht mit neuer URI versehen." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Datenbankfehler beim Einfügen des Hashtags: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Problem bei Speichern der Nachricht. Sie ist zu lang." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Problem bei Speichern der Nachricht. Unbekannter Benutzer." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Zu schnell zu viele Nachrichten; atme kurz durch und schicke sie erneut in " "ein paar Minuten ab." -#: classes/Notice.php:237 +#: classes/Notice.php:254 #, fuzzy msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " @@ -4487,21 +4520,21 @@ msgstr "" "Zu schnell zu viele Nachrichten; atme kurz durch und schicke sie erneut in " "ein paar Minuten ab." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" "Du wurdest für das Schreiben von Nachrichten auf dieser Seite gesperrt." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problem bei Speichern der Nachricht." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Problem bei Speichern der Nachricht." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -4532,19 +4565,29 @@ msgstr "Konnte Abonnement nicht löschen." msgid "Couldn't delete subscription." msgstr "Konnte Abonnement nicht löschen." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Herzlich willkommen bei %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Konnte Gruppe nicht erstellen." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Konnte Gruppenmitgliedschaft nicht setzen." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Konnte Gruppenmitgliedschaft nicht setzen." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Konnte Abonnement nicht erstellen." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Ändern der Profileinstellungen" @@ -4587,123 +4630,191 @@ msgstr "Seite ohne Titel" msgid "Primary site navigation" msgstr "Hauptnavigation" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Startseite" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Persönliches Profil und Freundes-Zeitleiste" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Eigene" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Ändere deine E-Mail, dein Avatar, Passwort, Profil" -#: lib/action.php:444 -msgid "Connect" -msgstr "Verbinden" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Konto" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Konnte nicht zum Server umleiten: %s" -#: lib/action.php:448 +#: lib/action.php:453 #, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Verbinden" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Hauptnavigation" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Einladen" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Admin" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Lade Freunde und Kollegen ein dir auf %s zu folgen" -#: lib/action.php:458 -msgid "Logout" -msgstr "Abmelden" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Einladen" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Von der Seite abmelden" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Abmelden" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Neues Konto erstellen" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registrieren" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Auf der Seite anmelden" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Hilfe" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Anmelden" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Hilf mir!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Suchen" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Hilfe" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Suche nach Leuten oder Text" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Suchen" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Seitennachricht" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Lokale Ansichten" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Neue Nachricht" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Unternavigation" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Hilfe" + +#: lib/action.php:765 msgid "About" msgstr "Über" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "AGB" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Privatsphäre" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Quellcode" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Kontakt" -#: lib/action.php:751 +#: lib/action.php:782 #, fuzzy msgid "Badge" msgstr "Stups" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "StatusNet-Software-Lizenz" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4712,12 +4823,12 @@ msgstr "" "**%%site.name%%** ist ein Microbloggingdienst von [%%site.broughtby%%](%%" "site.broughtbyurl%%)." -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** ist ein Microbloggingdienst." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4728,114 +4839,167 @@ msgstr "" "(Version %s) betrieben, die unter der [GNU Affero General Public License]" "(http://www.fsf.org/licensing/licenses/agpl-3.0.html) erhältlich ist." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "StatusNet-Software-Lizenz" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 #, fuzzy msgid "All " msgstr "Alle " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "Lizenz." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Seitenerstellung" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Später" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Vorher" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 #, fuzzy msgid "You cannot make changes to this site." msgstr "Du kannst diesem Benutzer keine Nachricht schicken." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "Registrierung nicht gestattet" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() noch nicht implementiert." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() noch nicht implementiert." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Konnte die Design Einstellungen nicht löschen." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "Bestätigung der E-Mail-Adresse" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Seite" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "SMS-Konfiguration" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Eigene" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "SMS-Konfiguration" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Benutzer" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "SMS-Konfiguration" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Zugang" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "SMS-Konfiguration" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Pfad" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "SMS-Konfiguration" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Eigene" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4930,12 +5094,12 @@ msgstr "Nachrichten in denen dieser Anhang erscheint" msgid "Tags for this attachment" msgstr "Tags für diesen Anhang" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Passwort geändert" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Passwort geändert" @@ -5210,19 +5374,19 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Keine Konfigurationsdatei gefunden." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "Ich habe an folgenden Stellen nach Konfigurationsdateien gesucht: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 #, fuzzy msgid "Go to the installer." msgstr "Auf der Seite anmelden" @@ -5419,23 +5583,23 @@ msgstr "Systemfehler beim hochladen der Datei." msgid "Not an image or corrupt file." msgstr "Kein Bild oder defekte Datei." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Bildformat wird nicht unterstützt." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Daten verloren." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Unbekannter Dateityp" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "kB" @@ -5795,6 +5959,12 @@ msgstr "An" msgid "Available characters" msgstr "Verfügbare Zeichen" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Senden" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Nachricht senden" @@ -5851,23 +6021,23 @@ msgstr "W" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "im Zusammenhang" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Wiederholt von" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Auf diese Nachricht antworten" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Antworten" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Nachricht wiederholt" @@ -5916,6 +6086,10 @@ msgstr "Antworten" msgid "Favorites" msgstr "Favoriten" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Benutzer" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Posteingang" @@ -6007,7 +6181,7 @@ msgstr "Diese Nachricht wiederholen?" msgid "Repeat this notice" msgstr "Diese Nachricht wiederholen" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -6027,6 +6201,10 @@ msgstr "Site durchsuchen" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Suchen" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -6079,6 +6257,15 @@ msgstr "Leute, die %s abonniert haben" msgid "Groups %s is a member of" msgstr "Gruppen in denen %s Mitglied ist" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Einladen" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Lade Freunde und Kollegen ein dir auf %s zu folgen" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6149,47 +6336,47 @@ msgstr "Nachricht" msgid "Moderate" msgstr "Moderieren" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "vor wenigen Sekunden" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "vor einer Minute" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "vor %d Minuten" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "vor einer Stunde" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "vor %d Stunden" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "vor einem Tag" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "vor %d Tagen" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "vor einem Monat" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "vor %d Monaten" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "vor einem Jahr" diff --git a/locale/el/LC_MESSAGES/statusnet.po b/locale/el/LC_MESSAGES/statusnet.po index 6ff718d45..ed9ab7803 100644 --- a/locale/el/LC_MESSAGES/statusnet.po +++ b/locale/el/LC_MESSAGES/statusnet.po @@ -9,78 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:24+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:33+0000\n" "Language-Team: Greek\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: el\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Πρόσβαση" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Ρυθμίσεις OpenID" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Περιγραφή" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" +msgctxt "LABEL" +msgid "Private" msgstr "" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:173 -msgid "Closed" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" msgstr "" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" msgstr "" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Ρυθμίσεις OpenID" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Αποχώρηση" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Δεν υπάρχει τέτοια σελίδα" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -94,72 +100,82 @@ msgstr "Δεν υπάρχει τέτοια σελίδα" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Κανένας τέτοιος χρήστης." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s και οι φίλοι του/της" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s και οι φίλοι του/της" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Ροή φίλων του/της %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Ροή φίλων του/της %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Ροή φίλων του/της %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Εσείς και οι φίλοι σας" @@ -177,20 +193,20 @@ msgstr "" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Η μέθοδος του ΑΡΙ δε βρέθηκε!" @@ -224,8 +240,9 @@ msgstr "Απέτυχε η ενημέρωση του χρήστη." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "" @@ -250,7 +267,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -366,68 +383,68 @@ msgstr "Απέτυχε η ενημέρωση του χρήστη." msgid "Could not find target user." msgstr "Απέτυχε η εύρεση οποιασδήποτε κατάστασης." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Το ψευδώνυμο πρέπει να έχει μόνο πεζούς χαρακτήρες και χωρίς κενά." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Το ψευδώνυμο είναι ήδη σε χρήση. Δοκιμάστε κάποιο άλλο." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "" -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Η αρχική σελίδα δεν είναι έγκυρο URL." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Το ονοματεπώνυμο είναι πολύ μεγάλο (μέγιστο 255 χαρακτ.)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Η περιγραφή είναι πολύ μεγάλη (μέγιστο %d χαρακτ.)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Η τοποθεσία είναι πολύ μεγάλη (μέγιστο 255 χαρακτ.)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Το ψευδώνυμο είναι ήδη σε χρήση. Δοκιμάστε κάποιο άλλο." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -438,15 +455,15 @@ msgstr "" msgid "Group not found!" msgstr "Η ομάδα δεν βρέθηκε!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ" @@ -455,7 +472,7 @@ msgstr "Αδύνατη η αποθήκευση των νέων πληροφορ msgid "You are not a member of this group." msgstr "" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Αδύνατη η αποθήκευση του προφίλ." @@ -487,7 +504,7 @@ msgstr "Μήνυμα" #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -530,7 +547,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -553,13 +570,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Λογαριασμός" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -643,12 +660,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "χρονοδιάγραμμα του χρήστη %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -684,7 +701,7 @@ msgstr "" msgid "Repeats of %s" msgstr "" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "" @@ -705,8 +722,7 @@ msgstr "" #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "" @@ -718,7 +734,7 @@ msgstr "" msgid "Invalid size." msgstr "" -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "" @@ -735,30 +751,30 @@ msgid "User without matching profile" msgstr "" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Ρυθμίσεις του άβαταρ" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Διαγραφή" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "" @@ -766,7 +782,7 @@ msgstr "" msgid "Pick a square area of the image to be your avatar" msgstr "" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -800,23 +816,23 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Όχι" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "Αδυναμία διαγραφής αυτού του μηνύματος." #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Ναι" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "" @@ -824,40 +840,44 @@ msgstr "" msgid "Failed to save block information." msgstr "" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 #, fuzzy msgid "No such group." msgstr "Αδύνατη η αποθήκευση του προφίλ." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "Αδύνατη η αποθήκευση του προφίλ." -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s και οι φίλοι του/της" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "" @@ -936,7 +956,7 @@ msgstr "Ομάδες με τα περισσότερα μέλη" #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -962,12 +982,13 @@ msgstr "Αδυναμία διαγραφής αυτού του μηνύματος msgid "Delete this application" msgstr "Περιγράψτε την ομάδα ή το θέμα" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "" @@ -996,7 +1017,7 @@ msgstr "Είσαι σίγουρος ότι θες να διαγράψεις αυ msgid "Do not delete this notice" msgstr "Αδυναμία διαγραφής αυτού του μηνύματος." -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "" @@ -1013,18 +1034,18 @@ msgstr "" msgid "Delete user" msgstr "Διαγραφή χρήστη" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Διαγράψτε αυτόν τον χρήστη" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1128,6 +1149,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1227,31 +1259,31 @@ msgstr "" msgid "You must be logged in to create a group." msgstr "" -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." msgstr "Το βιογραφικό είναι πολύ μεγάλο (μέγιστο 140 χαρακτ.)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 #, fuzzy msgid "Could not update group." msgstr "Αδύνατη η αποθήκευση του προφίλ." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "Αδύνατη η αποθήκευση του προφίλ." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "" @@ -1593,7 +1625,7 @@ msgstr "" msgid "User is not a member of group." msgstr "" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "" @@ -1625,90 +1657,90 @@ msgstr "" msgid "You must be logged in to edit a group." msgstr "" -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "Απέτυχε η ενημέρωση του χρήστη." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "Οι προτιμήσεις αποθηκεύτηκαν" -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 #, fuzzy msgid "Logo updated." msgstr "Αποσύνδεση" -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "" -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Διαχειριστής" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 #, fuzzy msgid "Make Admin" msgstr "Διαχειριστής" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "" @@ -1953,16 +1985,18 @@ msgstr "" msgid "Optionally add a personal message to the invitation." msgstr "" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +msgctxt "BUTTON" msgid "Send" msgstr "" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -1997,7 +2031,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "" -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Μήνυμα" + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "" @@ -2006,11 +2045,11 @@ msgstr "" msgid "You must be logged in to leave a group." msgstr "" -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "" @@ -2027,8 +2066,7 @@ msgstr "Λάθος όνομα χρήστη ή κωδικός" msgid "Error setting user. You are probably not authorized." msgstr "" -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Σύνδεση" @@ -2276,8 +2314,8 @@ msgstr "Σύνδεση" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "" @@ -2423,7 +2461,7 @@ msgstr "Αδύνατη η αποθήκευση του νέου κωδικού" msgid "Password saved." msgstr "Ο κωδικός αποθηκεύτηκε." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2456,7 +2494,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "" @@ -2631,7 +2668,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 μικρά γράμματα ή αριθμοί, χωρίς σημεία στίξης ή κενά" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Ονοματεπώνυμο" @@ -2660,7 +2697,7 @@ msgid "Bio" msgstr "Βιογραφικό" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2745,7 +2782,8 @@ msgstr "Απέτυχε η αποθήκευση του προφίλ." msgid "Couldn't save tags." msgstr "Αδύνατη η αποθήκευση του προφίλ." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "" @@ -2758,46 +2796,46 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "Δημόσια ροή %s" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2806,7 +2844,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2977,8 +3015,7 @@ msgstr "" msgid "Registration successful" msgstr "" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "" @@ -3161,7 +3198,7 @@ msgstr "" msgid "You already repeated that notice." msgstr "Αδυναμία διαγραφής αυτού του μηνύματος." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "Δημιουργία" @@ -3171,47 +3208,47 @@ msgstr "Δημιουργία" msgid "Repeated!" msgstr "Δημιουργία" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Ροή φίλων του/της %s" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Ροή φίλων του/της %s" -#: actions/replies.php:158 +#: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" msgstr "Ροή φίλων του/της %s" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3237,7 +3274,6 @@ msgid "User is already sandboxed." msgstr "" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3262,7 +3298,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "Ρυθμίσεις OpenID" @@ -3295,7 +3331,7 @@ msgstr "Προσκλήσεις" msgid "Description" msgstr "Περιγραφή" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "" @@ -3357,35 +3393,35 @@ msgstr "%s και οι φίλοι του/της" msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Ροή φίλων του/της %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Ροή φίλων του/της %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, fuzzy, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Ροή φίλων του/της %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3393,7 +3429,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3407,68 +3443,68 @@ msgstr "" msgid "%1$s group, page %2$d" msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 #, fuzzy msgid "Group profile" msgstr "Αδύνατη η αποθήκευση του προφίλ." -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, fuzzy, php-format msgid "FOAF for %s group" msgstr "Αδύνατη η αποθήκευση του προφίλ." -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Μέλη" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Δημιουργημένος" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3478,7 +3514,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3487,7 +3523,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Διαχειριστές" @@ -3944,22 +3980,22 @@ msgstr "" msgid "SMS" msgstr "" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Ροή φίλων του/της %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "" @@ -4010,7 +4046,7 @@ msgstr "" msgid "No such tag." msgstr "" -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Η μέθοδος του ΑΡΙ είναι υπό κατασκευή." @@ -4041,74 +4077,75 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +msgctxt "TITLE" msgid "User" msgstr "" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Νέοι χρήστες" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "Όλες οι συνδρομές" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "" "Αυτόματα γίνε συνδρομητής σε όσους γίνονται συνδρομητές σε μένα (χρήση " "κυρίως από λογισμικό και όχι ανθρώπους)" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Προσκλήσεις" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4282,7 +4319,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Προσωπικά" @@ -4323,6 +4360,11 @@ msgstr "Αδύνατη η αποθήκευση του προφίλ." msgid "Group leave failed." msgstr "Αδύνατη η αποθήκευση του προφίλ." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Αδύνατη η αποθήκευση του προφίλ." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4340,43 +4382,43 @@ msgstr "" msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Σφάλμα στη βάση δεδομένων κατά την εισαγωγή hashtag: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "" -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "" -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "" -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "" -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4407,20 +4449,30 @@ msgstr "Απέτυχε η διαγραφή συνδρομής." msgid "Couldn't delete subscription." msgstr "Απέτυχε η διαγραφή συνδρομής." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Δεν ήταν δυνατή η δημιουργία ομάδας." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ" + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ" +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Αδύνατη η αποθήκευση των νέων πληροφοριών του προφίλ" + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Αλλάξτε τις ρυθμίσεις του προφίλ σας" @@ -4462,121 +4514,185 @@ msgstr "" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Αρχή" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 -msgid "Change your email, avatar, password, profile" -msgstr "" +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Προσωπικά" +#. TRANS: Tooltip for main menu option "Account" #: lib/action.php:444 -msgid "Connect" -msgstr "Σύνδεση" +#, fuzzy +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "Αλλάξτε τον κωδικό σας" -#: lib/action.php:444 +#: lib/action.php:447 #, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Λογαριασμός" + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Αδυναμία ανακατεύθηνσης στο διακομιστή: %s" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Σύνδεση" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" -msgstr "" +msgstr "Επιβεβαίωση διεύθυνσης email" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Διαχειριστής" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Προσκάλεσε φίλους και συναδέλφους σου να γίνουν μέλη στο %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Αποσύνδεση" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Μήνυμα" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Αποσύνδεση" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Δημιουργία ενός λογαριασμού" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Περιγραφή" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Βοήθεια" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Σύνδεση" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Βοηθήστε με!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Βοήθεια" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "" -#: lib/action.php:493 +#: lib/action.php:502 +msgctxt "MENU" +msgid "Search" +msgstr "" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Βοήθεια" + +#: lib/action.php:765 msgid "About" msgstr "Περί" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "Συχνές ερωτήσεις" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Επικοινωνία" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, fuzzy, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4585,13 +4701,13 @@ msgstr "" "To **%%site.name%%** είναι μία υπηρεσία microblogging (μικρο-ιστολογίου) που " "έφερε κοντά σας το [%%site.broughtby%%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, fuzzy, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "" "Το **%%site.name%%** είναι μία υπηρεσία microblogging (μικρο-ιστολογίου). " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4599,111 +4715,161 @@ msgid "" "org/licensing/licenses/agpl-3.0.html)." msgstr "" -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "Επιβεβαίωση διεύθυνσης email" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +msgctxt "MENU" +msgid "Site" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "Επιβεβαίωση διεύθυνσης email" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Προσωπικά" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "Επιβεβαίωση διεύθυνσης email" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +msgctxt "MENU" +msgid "User" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "Επιβεβαίωση διεύθυνσης email" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Πρόσβαση" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "Επιβεβαίωση διεύθυνσης email" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "Επιβεβαίωση διεύθυνσης email" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Προσωπικά" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4794,12 +4960,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Ο κωδικός αποθηκεύτηκε." -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Ο κωδικός αποθηκεύτηκε." @@ -5078,20 +5244,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "Ο κωδικός επιβεβαίωσης δεν βρέθηκε." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5279,24 +5445,24 @@ msgstr "" msgid "Not an image or corrupt file." msgstr "" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "" -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "Αδύνατη η αποθήκευση του προφίλ." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5592,6 +5758,11 @@ msgstr "" msgid "Available characters" msgstr "Διαθέσιμοι χαρακτήρες" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "" @@ -5650,23 +5821,23 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Επαναλαμβάνεται από" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Ρυθμίσεις OpenID" @@ -5716,6 +5887,10 @@ msgstr "" msgid "Favorites" msgstr "" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "" @@ -5807,7 +5982,7 @@ msgstr "Αδυναμία διαγραφής αυτού του μηνύματος msgid "Repeat this notice" msgstr "Αδυναμία διαγραφής αυτού του μηνύματος." -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5828,6 +6003,10 @@ msgstr "" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "" + #: lib/searchaction.php:162 msgid "Search help" msgstr "" @@ -5880,6 +6059,15 @@ msgstr "" msgid "Groups %s is a member of" msgstr "" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Προσκάλεσε φίλους και συναδέλφους σου να γίνουν μέλη στο %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -5952,47 +6140,47 @@ msgstr "Μήνυμα" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "" diff --git a/locale/en_GB/LC_MESSAGES/statusnet.po b/locale/en_GB/LC_MESSAGES/statusnet.po index 98e7790f2..d0ba439ba 100644 --- a/locale/en_GB/LC_MESSAGES/statusnet.po +++ b/locale/en_GB/LC_MESSAGES/statusnet.po @@ -2,7 +2,6 @@ # # Author@translatewiki.net: Bruce89 # Author@translatewiki.net: CiaranG -# Author@translatewiki.net: Lockal # -- # This file is distributed under the same license as the StatusNet package. # @@ -10,75 +9,82 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:27+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:36+0000\n" "Language-Team: British English\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: en-gb\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Access" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Site access settings" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Registration" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Private" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Invite only" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Private" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Make registration invitation only." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Closed" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Invite only" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Disable new registrations." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Save" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Closed" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Save access settings" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Save" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "No such page" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -92,52 +98,60 @@ msgstr "No such page" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "No such user." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s and friends, page %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s and friends" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Feed for friends of %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Feed for friends of %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Feed for friends of %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" "This is the timeline for %s and friends but no one has posted anything yet." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -146,7 +160,8 @@ msgstr "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -155,7 +170,7 @@ msgstr "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -164,7 +179,8 @@ msgstr "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "You and friends" @@ -182,20 +198,20 @@ msgstr "Updates from %1$s and friends on %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "API method not found." @@ -230,8 +246,9 @@ msgstr "Couldn't update user." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "User has no profile." @@ -258,7 +275,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -368,68 +385,68 @@ msgstr "Could not determine source user." msgid "Could not find target user." msgstr "Could not find target user." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Nickname must have only lowercase letters and numbers, and no spaces." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Nickname already in use. Try another one." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Not a valid nickname." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Homepage is not a valid URL." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Full name is too long (max 255 chars)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Description is too long (max %d chars)" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Location is too long (max 255 chars)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Too many aliases! Maximum %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Invalid alias: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Alias \"%s\" already in use. Try another one." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Alias can't be the same as nickname." @@ -440,15 +457,15 @@ msgstr "Alias can't be the same as nickname." msgid "Group not found!" msgstr "Group not found!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "You are already a member of that group." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "You have been blocked from that group by the admin." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Could not join user %1$s to group %2$s." @@ -457,7 +474,7 @@ msgstr "Could not join user %1$s to group %2$s." msgid "You are not a member of this group." msgstr "You are not a member of this group." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Could not remove user %1$s to group %2$s." @@ -488,7 +505,7 @@ msgstr "Invalid token." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -531,7 +548,7 @@ msgstr "The request token %s has been denied and revoked." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -557,13 +574,13 @@ msgstr "" "the ability to %3$s your %4$s account data. You should only " "give access to your %4$s account to third parties you trust." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Account" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -645,12 +662,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s updates favourited by %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s timeline" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -686,7 +703,7 @@ msgstr "Repeated to %s" msgid "Repeats of %s" msgstr "Repeats of %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Notices tagged with %s" @@ -707,8 +724,7 @@ msgstr "No such attachment." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "No nickname." @@ -720,7 +736,7 @@ msgstr "No size." msgid "Invalid size." msgstr "Invalid size." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -737,30 +753,30 @@ msgid "User without matching profile" msgstr "User without matching profile" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Avatar settings" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Original" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Preview" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Delete" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Upload" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Crop" @@ -768,7 +784,7 @@ msgstr "Crop" msgid "Pick a square area of the image to be your avatar" msgstr "Pick a square area of the image to be your avatar" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Lost our file data." @@ -803,22 +819,22 @@ msgstr "" "will not be notified of any @-replies from them." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "No" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Do not block this user" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Yes" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Block this user" @@ -826,39 +842,43 @@ msgstr "Block this user" msgid "Failed to save block information." msgstr "Failed to save block information." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "No such group." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s blocked profiles" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s blocked profiles, page %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "A list of the users blocked from joining this group." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Unblock user from group" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Unblock" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Unblock this user" @@ -933,7 +953,7 @@ msgstr "You are not the owner of this application." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "There was a problem with your session token." @@ -959,12 +979,13 @@ msgstr "Do not delete this application" msgid "Delete this application" msgstr "Delete this application" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Not logged in." @@ -993,7 +1014,7 @@ msgstr "Are you sure you want to delete this notice?" msgid "Do not delete this notice" msgstr "Do not delete this notice" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Delete this notice" @@ -1009,7 +1030,7 @@ msgstr "You can only delete local users." msgid "Delete user" msgstr "Delete user" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1017,12 +1038,12 @@ msgstr "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Delete this user" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Design" @@ -1125,6 +1146,17 @@ msgstr "Restore default designs" msgid "Reset back to default" msgstr "Reset back to default" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Save" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Save design" @@ -1216,29 +1248,29 @@ msgstr "Edit %s group" msgid "You must be logged in to create a group." msgstr "You must be logged in to create a group." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "You must be an admin to edit the group." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Use this form to edit the group." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "description is too long (max %d chars)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Could not update group." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Could not create aliases" -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Options saved." @@ -1532,23 +1564,20 @@ msgid "Could not convert request token to access token." msgstr "Couldn't convert request tokens to access tokens." #: actions/finishremotesubscribe.php:118 -#, fuzzy msgid "Remote service uses unknown version of OMB protocol." -msgstr "Unknown version of OMB protocol." +msgstr "Remote service uses unknown version of OMB protocol." #: actions/finishremotesubscribe.php:138 lib/oauthstore.php:306 msgid "Error updating remote profile" msgstr "Error updating remote profile." #: actions/getfile.php:79 -#, fuzzy msgid "No such file." -msgstr "No such notice." +msgstr "No such file." #: actions/getfile.php:83 -#, fuzzy msgid "Cannot read file." -msgstr "Lost our file." +msgstr "Cannot read file." #: actions/groupblock.php:71 actions/groupunblock.php:71 #: actions/makeadmin.php:71 actions/subedit.php:46 @@ -1564,9 +1593,8 @@ msgstr "No profile with that ID." #: actions/groupblock.php:81 actions/groupunblock.php:81 #: actions/makeadmin.php:81 -#, fuzzy msgid "No group specified." -msgstr "No profile specified." +msgstr "No group specified." #: actions/groupblock.php:91 msgid "Only an admin can block group members." @@ -1580,10 +1608,9 @@ msgstr "User is already blocked from group." msgid "User is not a member of group." msgstr "User is not a member of group." -#: actions/groupblock.php:136 actions/groupmembers.php:316 -#, fuzzy +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" -msgstr "Block user" +msgstr "Block user from group" #: actions/groupblock.php:162 #, php-format @@ -1609,21 +1636,18 @@ msgid "Database error blocking user from group." msgstr "Database error blocking user from group." #: actions/groupbyid.php:74 actions/userbyid.php:70 -#, fuzzy msgid "No ID." -msgstr "No ID" +msgstr "No ID." #: actions/groupdesignsettings.php:68 -#, fuzzy msgid "You must be logged in to edit a group." -msgstr "You must be logged in to create a group." +msgstr "You must be logged in to edit a group." -#: actions/groupdesignsettings.php:141 -#, fuzzy +#: actions/groupdesignsettings.php:144 msgid "Group design" -msgstr "Groups" +msgstr "Group design" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1631,85 +1655,80 @@ msgstr "" "Customise the way your group looks with a background image and a colour " "palette of your choice." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 -#, fuzzy msgid "Couldn't update your design." -msgstr "Couldn't update user." +msgstr "Couldn't update your design." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 -#, fuzzy +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." -msgstr "Sync preferences saved." +msgstr "Design preferences saved." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Group logo" -#: actions/grouplogo.php:150 -#, fuzzy, php-format +#: actions/grouplogo.php:153 +#, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." -msgstr "You can upload a logo image for your group." +msgstr "" +"You can upload a logo image for your group. The maximum file size is %s." -#: actions/grouplogo.php:178 -#, fuzzy +#: actions/grouplogo.php:181 msgid "User without matching profile." -msgstr "User without matching profile" +msgstr "User without matching profile." -#: actions/grouplogo.php:362 -#, fuzzy +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." -msgstr "Pick a square area of the image to be your avatar" +msgstr "Pick a square area of the image to be the logo." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo updated." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Failed updating logo." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "%s group members" -#: actions/groupmembers.php:96 -#, fuzzy, php-format +#: actions/groupmembers.php:103 +#, php-format msgid "%1$s group members, page %2$d" -msgstr "%s group members, page %d" +msgstr "%1$s group members, page %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "A list of the users in this group." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Admin" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Block" -#: actions/groupmembers.php:443 -#, fuzzy +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" -msgstr "You must be an admin to edit the group" +msgstr "Make user an admin of the group" -#: actions/groupmembers.php:475 -#, fuzzy +#: actions/groupmembers.php:482 msgid "Make Admin" -msgstr "Admin" +msgstr "Make admin" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" -msgstr "" +msgstr "Make this user an admin" -#: actions/grouprss.php:133 -#, fuzzy, php-format +#: actions/grouprss.php:140 +#, php-format msgid "Updates from members of %1$s on %2$s!" -msgstr "Updates from %1$s on %2$s!" +msgstr "Updates from members of %1$s on %2$s!" #: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98 @@ -1741,12 +1760,12 @@ msgid "Create a new group" msgstr "Create a new group" #: actions/groupsearch.php:52 -#, fuzzy, php-format +#, php-format msgid "" "Search for groups on %%site.name%% by their name, location, or description. " "Separate the terms by spaces; they must be 3 characters or more." msgstr "" -"Search for people on %%site.name%% by their name, location, or interests. " +"Search for groups on %%site.name%% by their name, location, or description. " "Separate the terms by spaces; they must be 3 characters or more." #: actions/groupsearch.php:58 @@ -1755,9 +1774,8 @@ msgstr "Group search" #: actions/groupsearch.php:79 actions/noticesearch.php:117 #: actions/peoplesearch.php:83 -#, fuzzy msgid "No results." -msgstr "No results" +msgstr "No results." #: actions/groupsearch.php:82 #, php-format @@ -1786,9 +1804,8 @@ msgid "Error removing the block." msgstr "Error removing the block." #: actions/imsettings.php:59 -#, fuzzy msgid "IM settings" -msgstr "I.M. Settings" +msgstr "IM settings" #: actions/imsettings.php:70 #, php-format @@ -1880,9 +1897,9 @@ msgid "That is not your Jabber ID." msgstr "That is not your Jabber ID." #: actions/inbox.php:59 -#, fuzzy, php-format +#, php-format msgid "Inbox for %1$s - page %2$d" -msgstr "Inbox for %s" +msgstr "Inbox for %1$s - page %2$d" #: actions/inbox.php:62 #, php-format @@ -1964,16 +1981,19 @@ msgstr "Personal message" msgid "Optionally add a personal message to the invitation." msgstr "Optionally add a personal message to the invitation." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Send" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s has invited you to join them on %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2034,23 +2054,27 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "You must be logged in to join a group." -#: actions/joingroup.php:131 -#, fuzzy, php-format +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "No nickname or ID." + +#: actions/joingroup.php:141 +#, php-format msgid "%1$s joined group %2$s" -msgstr "%s joined group %s" +msgstr "%1$s joined group %2$s" #: actions/leavegroup.php:60 msgid "You must be logged in to leave a group." msgstr "You must be logged in to leave a group." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "You are not a member of that group." -#: actions/leavegroup.php:127 -#, fuzzy, php-format +#: actions/leavegroup.php:137 +#, php-format msgid "%1$s left group %2$s" -msgstr "%s left group %s" +msgstr "%1$s left group %2$s" #: actions/login.php:80 actions/otp.php:62 actions/register.php:137 msgid "Already logged in." @@ -2064,8 +2088,7 @@ msgstr "Incorrect username or password." msgid "Error setting user. You are probably not authorized." msgstr "Error setting user. You are probably not authorised." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Login" @@ -2107,47 +2130,43 @@ msgid "Only an admin can make another user an admin." msgstr "" #: actions/makeadmin.php:96 -#, fuzzy, php-format +#, php-format msgid "%1$s is already an admin for group \"%2$s\"." -msgstr "User is already blocked from group." +msgstr "%1$s is already an admin for group \"%2$s\"." #: actions/makeadmin.php:133 -#, fuzzy, php-format +#, php-format msgid "Can't get membership record for %1$s in group %2$s." -msgstr "Could not remove user %s to group %s" +msgstr "Can't get membership record for %1$s in group %2$s." #: actions/makeadmin.php:146 -#, fuzzy, php-format +#, php-format msgid "Can't make %1$s an admin for group %2$s." -msgstr "You must be an admin to edit the group" +msgstr "Can't make %1$s an admin for group %2$s." #: actions/microsummary.php:69 msgid "No current status" msgstr "No current status" #: actions/newapplication.php:52 -#, fuzzy msgid "New Application" -msgstr "No such notice." +msgstr "New Application" #: actions/newapplication.php:64 -#, fuzzy msgid "You must be logged in to register an application." -msgstr "You must be logged in to create a group." +msgstr "You must be logged in to register an application." #: actions/newapplication.php:143 -#, fuzzy msgid "Use this form to register a new application." -msgstr "Use this form to create a new group." +msgstr "Use this form to register a new application." #: actions/newapplication.php:176 msgid "Source URL is required." -msgstr "" +msgstr "Source URL is required." #: actions/newapplication.php:258 actions/newapplication.php:267 -#, fuzzy msgid "Could not create application." -msgstr "Could not create aliases" +msgstr "Could not create application." #: actions/newgroup.php:53 msgid "New group" @@ -2185,9 +2204,9 @@ msgid "Message sent" msgstr "Message sent" #: actions/newmessage.php:185 -#, fuzzy, php-format +#, php-format msgid "Direct message to %s sent." -msgstr "Direct message to %s sent" +msgstr "Could not create application." #: actions/newmessage.php:210 actions/newnotice.php:245 lib/channel.php:170 msgid "Ajax Error" @@ -2215,9 +2234,9 @@ msgid "Text search" msgstr "Text search" #: actions/noticesearch.php:91 -#, fuzzy, php-format +#, php-format msgid "Search results for \"%1$s\" on %2$s" -msgstr "Search results for \"%s\" on %s" +msgstr "Search results for \"%1$s\" on %2$s" #: actions/noticesearch.php:121 #, php-format @@ -2225,6 +2244,8 @@ msgid "" "Be the first to [post on this topic](%%%%action.newnotice%%%%?" "status_textarea=%s)!" msgstr "" +"Be the first to [post on this topic](%%%%action.newnotice%%%%?" +"status_textarea=%s)!" #: actions/noticesearch.php:124 #, php-format @@ -2260,14 +2281,12 @@ msgid "Nudge sent!" msgstr "Nudge sent!" #: actions/oauthappssettings.php:59 -#, fuzzy msgid "You must be logged in to list your applications." -msgstr "You must be logged in to create a group." +msgstr "You must be logged in to list your applications." #: actions/oauthappssettings.php:74 -#, fuzzy msgid "OAuth applications" -msgstr "Other options" +msgstr "OAuth applications" #: actions/oauthappssettings.php:85 msgid "Applications you have registered" @@ -2287,9 +2306,8 @@ msgid "You have allowed the following applications to access you account." msgstr "" #: actions/oauthconnectionssettings.php:175 -#, fuzzy msgid "You are not a user of that application." -msgstr "You are not a member of that group." +msgstr "You are not a user of that application." #: actions/oauthconnectionssettings.php:186 msgid "Unable to revoke access for app: " @@ -2314,16 +2332,15 @@ msgid "%1$s's status on %2$s" msgstr "%1$s's status on %2$s" #: actions/oembed.php:157 -#, fuzzy msgid "content type " -msgstr "Connect" +msgstr "content type " #: actions/oembed.php:160 msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Not a supported data format." @@ -2336,9 +2353,8 @@ msgid "Notice Search" msgstr "Notice Search" #: actions/othersettings.php:60 -#, fuzzy msgid "Other settings" -msgstr "Other Settings" +msgstr "Other settings" #: actions/othersettings.php:71 msgid "Manage various other options." @@ -2357,9 +2373,8 @@ msgid "Automatic shortening service to use." msgstr "Automatic shortening service to use." #: actions/othersettings.php:122 -#, fuzzy msgid "View profile designs" -msgstr "Profile settings" +msgstr "View profile designs" #: actions/othersettings.php:123 msgid "Show or hide profile designs." @@ -2370,34 +2385,29 @@ msgid "URL shortening service is too long (max 50 chars)." msgstr "URL shortening service is too long (max 50 chars)." #: actions/otp.php:69 -#, fuzzy msgid "No user ID specified." -msgstr "No profile specified." +msgstr "No user ID specified." #: actions/otp.php:83 -#, fuzzy msgid "No login token specified." -msgstr "No profile specified." +msgstr "No login token specified." #: actions/otp.php:90 -#, fuzzy msgid "No login token requested." -msgstr "No profile id in request." +msgstr "No login token requested." #: actions/otp.php:95 -#, fuzzy msgid "Invalid login token specified." -msgstr "Invalid notice content" +msgstr "Invalid login token specified." #: actions/otp.php:104 -#, fuzzy msgid "Login token expired." -msgstr "Login to site" +msgstr "Login token expired." #: actions/outbox.php:58 -#, fuzzy, php-format +#, php-format msgid "Outbox for %1$s - page %2$d" -msgstr "Outbox for %s" +msgstr "Outbox for %1$s - page %2$d" #: actions/outbox.php:61 #, php-format @@ -2469,7 +2479,7 @@ msgstr "Can't save new password." msgid "Password saved." msgstr "Password saved." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2502,10 +2512,8 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 -#, fuzzy msgid "Site" -msgstr "Invite" +msgstr "Site" #: actions/pathsadminpanel.php:238 msgid "Server" @@ -2556,24 +2564,20 @@ msgid "Theme directory" msgstr "" #: actions/pathsadminpanel.php:279 -#, fuzzy msgid "Avatars" -msgstr "Avatar" +msgstr "Avatars" #: actions/pathsadminpanel.php:284 -#, fuzzy msgid "Avatar server" -msgstr "Avatar settings" +msgstr "Avatar server" #: actions/pathsadminpanel.php:288 -#, fuzzy msgid "Avatar path" -msgstr "Avatar updated." +msgstr "Avatar path" #: actions/pathsadminpanel.php:292 -#, fuzzy msgid "Avatar directory" -msgstr "Avatar updated." +msgstr "Avatar directory" #: actions/pathsadminpanel.php:301 msgid "Backgrounds" @@ -2616,9 +2620,8 @@ msgid "When to use SSL" msgstr "" #: actions/pathsadminpanel.php:335 -#, fuzzy msgid "SSL server" -msgstr "Server" +msgstr "SSL server" #: actions/pathsadminpanel.php:336 msgid "Server to direct SSL requests to" @@ -2647,9 +2650,9 @@ msgid "Not a valid people tag: %s" msgstr "Not a valid people tag: %s" #: actions/peopletag.php:144 -#, fuzzy, php-format +#, php-format msgid "Users self-tagged with %1$s - page %2$d" -msgstr "Users self-tagged with %s - page %d" +msgstr "Users self-tagged with %1$s - page %2$d" #: actions/postnotice.php:84 msgid "Invalid notice content" @@ -2679,7 +2682,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 lowercase letters or numbers, no punctuation or spaces" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Full name" @@ -2707,7 +2710,7 @@ msgid "Bio" msgstr "Bio" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2778,9 +2781,8 @@ msgid "Couldn't update user for autosubscribe." msgstr "Couldn't update user for autosubscribe." #: actions/profilesettings.php:363 -#, fuzzy msgid "Couldn't save location prefs." -msgstr "Couldn't save tags." +msgstr "Couldn't save location prefs." #: actions/profilesettings.php:375 msgid "Couldn't save profile." @@ -2790,7 +2792,8 @@ msgstr "Couldn't save profile." msgid "Couldn't save tags." msgstr "Couldn't save tags." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Settings saved." @@ -2803,48 +2806,45 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "Could not retrieve public stream." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Public timeline, page %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Public timeline" -#: actions/public.php:159 -#, fuzzy +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" -msgstr "Public Stream Feed" +msgstr "Public Stream Feed (RSS 1.0)" -#: actions/public.php:163 -#, fuzzy +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" -msgstr "Public Stream Feed" +msgstr "Public Stream Feed (RSS 2.0)" -#: actions/public.php:167 -#, fuzzy +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" -msgstr "Public Stream Feed" +msgstr "Public Stream Feed (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2857,7 +2857,7 @@ msgstr "" "tool. [Join now](%%action.register%%) to share notices about yourself with " "friends, family, and colleagues! ([Read more](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3026,16 +3026,14 @@ msgid "Sorry, only invited people can register." msgstr "Sorry, only invited people can register." #: actions/register.php:92 -#, fuzzy msgid "Sorry, invalid invitation code." -msgstr "Error with confirmation code." +msgstr "Sorry, invalid invitation code." #: actions/register.php:112 msgid "Registration successful" msgstr "Registration successful" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Register" @@ -3095,12 +3093,11 @@ msgid "Creative Commons Attribution 3.0" msgstr "" #: actions/register.php:497 -#, fuzzy msgid "" " except this private data: password, email address, IM address, and phone " "number." msgstr "" -" except this private data: password, e-mail address, IM address, phone " +" except this private data: password, email address, IM address, and phone " "number." #: actions/register.php:538 @@ -3160,9 +3157,8 @@ msgid "Remote subscribe" msgstr "Remote subscribe" #: actions/remotesubscribe.php:124 -#, fuzzy msgid "Subscribe to a remote user" -msgstr "Subscribe to this user" +msgstr "Subscribe to a remote user" #: actions/remotesubscribe.php:129 msgid "User nickname" @@ -3190,98 +3186,91 @@ msgid "Invalid profile URL (bad format)" msgstr "Invalid profile URL (bad format)" #: actions/remotesubscribe.php:168 -#, fuzzy msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)." -msgstr "Not a valid profile URL (no YADIS document)." +msgstr "Not a valid profile URL (no YADIS document or invalid XRDS defined)." #: actions/remotesubscribe.php:176 -#, fuzzy msgid "That’s a local profile! Login to subscribe." -msgstr "That's a local profile! Login to subscribe." +msgstr "That’s a local profile! Login to subscribe." #: actions/remotesubscribe.php:183 -#, fuzzy msgid "Couldn’t get a request token." -msgstr "Couldn't get a request token." +msgstr "Couldn’t get a request token." #: actions/repeat.php:57 -#, fuzzy msgid "Only logged-in users can repeat notices." -msgstr "Only the user can read their own mailboxes." +msgstr "Only logged-in users can repeat notices." #: actions/repeat.php:64 actions/repeat.php:71 -#, fuzzy msgid "No notice specified." -msgstr "No profile specified." +msgstr "No notice specified." #: actions/repeat.php:76 msgid "You can't repeat your own notice." msgstr "You can't repeat your own notice." #: actions/repeat.php:90 -#, fuzzy msgid "You already repeated that notice." -msgstr "You have already blocked this user." +msgstr "You already repeated that notice." -#: actions/repeat.php:114 lib/noticelist.php:656 -#, fuzzy +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" -msgstr "Created" +msgstr "Repeated" #: actions/repeat.php:119 -#, fuzzy msgid "Repeated!" -msgstr "Created" +msgstr "Repeated!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Replies to %s" -#: actions/replies.php:127 -#, fuzzy, php-format +#: actions/replies.php:128 +#, php-format msgid "Replies to %1$s, page %2$d" -msgstr "Replies to %1$s on %2$s!" +msgstr "Replies to %1$s, page %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Replies feed for %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Replies feed for %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Notice feed for %s" -#: actions/replies.php:198 -#, fuzzy, php-format +#: actions/replies.php:199 +#, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -"This is the timeline for %s and friends but no one has posted anything yet." +"This is the timeline showing replies to %1$s but %2$s hasn't received a " +"notice to his attention yet." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 -#, fuzzy, php-format +#: actions/replies.php:206 +#, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " "attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -"You can try to [nudge %s](../%s) from his profile or [post something to his " -"or her attention](%%%%action.newnotice%%%%?status_textarea=%s)." +"You can try to [nudge %1$s](../%2$s) or [post something to his or her " +"attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." #: actions/repliesrss.php:72 #, php-format @@ -3289,9 +3278,8 @@ msgid "Replies to %1$s on %2$s!" msgstr "Replies to %1$s on %2$s!" #: actions/rsd.php:146 actions/version.php:157 -#, fuzzy msgid "StatusNet" -msgstr "Status deleted." +msgstr "StatusNet" #: actions/sandbox.php:65 actions/unsandbox.php:65 msgid "You cannot sandbox users on this site." @@ -3302,14 +3290,12 @@ msgid "User is already sandboxed." msgstr "User is already sandboxed." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" #: actions/sessionsadminpanel.php:65 -#, fuzzy msgid "Session settings for this StatusNet site." -msgstr "Design settings for this StausNet site." +msgstr "Session settings for this StatusNet site." #: actions/sessionsadminpanel.php:175 msgid "Handle sessions" @@ -3328,19 +3314,17 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Save site settings" #: actions/showapplication.php:82 -#, fuzzy msgid "You must be logged in to view an application." -msgstr "You must be logged in to leave a group." +msgstr "You must be logged in to view an application." #: actions/showapplication.php:157 -#, fuzzy msgid "Application profile" -msgstr "Notice has no profile" +msgstr "Application profile" #: actions/showapplication.php:159 lib/applicationeditform.php:180 msgid "Icon" @@ -3348,21 +3332,19 @@ msgstr "" #: actions/showapplication.php:169 actions/version.php:195 #: lib/applicationeditform.php:195 -#, fuzzy msgid "Name" -msgstr "Nickname" +msgstr "Name" #: actions/showapplication.php:178 lib/applicationeditform.php:222 -#, fuzzy msgid "Organization" -msgstr "Pagination" +msgstr "Organization" #: actions/showapplication.php:187 actions/version.php:198 #: lib/applicationeditform.php:209 lib/groupeditform.php:172 msgid "Description" msgstr "Description" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statistics" @@ -3411,35 +3393,34 @@ msgid "" msgstr "" #: actions/showapplication.php:309 -#, fuzzy msgid "Are you sure you want to reset your consumer key and secret?" -msgstr "Are you sure you want to delete this notice?" +msgstr "Are you sure you want to reset your consumer key and secret?" #: actions/showfavorites.php:79 -#, fuzzy, php-format +#, php-format msgid "%1$s's favorite notices, page %2$d" -msgstr "%s's favourite notices" +msgstr "%1$s's favorite notices, page %2$d" #: actions/showfavorites.php:132 msgid "Could not retrieve favorite notices." msgstr "Could not retrieve favourite notices." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Feed for friends of %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Feed for friends of %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Feed for friends of %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3447,7 +3428,7 @@ msgstr "" "You haven't chosen any favourite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3456,7 +3437,7 @@ msgstr "" "%s hasn't added any notices to his favourites yet. Post something " "interesting they would add to their favourites :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3467,7 +3448,7 @@ msgstr "" "account](%%%%action.register%%%%) and then post something interesting they " "would add to their favourites :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3477,71 +3458,71 @@ msgid "%s group" msgstr "%s group" #: actions/showgroup.php:84 -#, fuzzy, php-format +#, php-format msgid "%1$s group, page %2$d" -msgstr "%s group members, page %d" +msgstr "%1$s group, page %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Group profile" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Note" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Group actions" -#: actions/showgroup.php:328 -#, fuzzy, php-format +#: actions/showgroup.php:336 +#, php-format msgid "Notice feed for %s group (RSS 1.0)" -msgstr "Notice feed for %s group" +msgstr "Notice feed for %s group (RSS 1.0)" -#: actions/showgroup.php:334 -#, fuzzy, php-format +#: actions/showgroup.php:342 +#, php-format msgid "Notice feed for %s group (RSS 2.0)" -msgstr "Notice feed for %s group" +msgstr "Notice feed for %s group (RSS 2.0)" -#: actions/showgroup.php:340 -#, fuzzy, php-format +#: actions/showgroup.php:348 +#, php-format msgid "Notice feed for %s group (Atom)" -msgstr "Notice feed for %s group" +msgstr "Notice feed for %s group (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "Outbox for %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Members" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(None)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "All members" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Created" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3556,8 +3537,8 @@ msgstr "" "their life and interests. [Join now](%%%%action.register%%%%) to become part " "of this group and many more! ([Read more](%%%%doc.help%%%%))" -#: actions/showgroup.php:454 -#, fuzzy, php-format +#: actions/showgroup.php:462 +#, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." "wikipedia.org/wiki/Micro-blogging) service based on the Free Software " @@ -3565,12 +3546,13 @@ msgid "" "their life and interests. " msgstr "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." -"wikipedia.org/wiki/Micro-blogging) service " +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. Its members share short messages about " +"their life and interests. " -#: actions/showgroup.php:482 -#, fuzzy +#: actions/showgroup.php:490 msgid "Admins" -msgstr "Admin" +msgstr "Admins" #: actions/showmessage.php:81 msgid "No such message." @@ -3600,29 +3582,29 @@ msgid " tagged %s" msgstr " tagged %s" #: actions/showstream.php:79 -#, fuzzy, php-format +#, php-format msgid "%1$s, page %2$d" -msgstr "%1$s and friends, page %2$d" +msgstr "%1$s, page %2$d" #: actions/showstream.php:122 -#, fuzzy, php-format +#, php-format msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)" -msgstr "Notice feed for %s tagged %s (RSS 1.0)" +msgstr "Notice feed for %1$s tagged %2$s (RSS 1.0)" #: actions/showstream.php:129 -#, fuzzy, php-format +#, php-format msgid "Notice feed for %s (RSS 1.0)" -msgstr "Notice feed for %s" +msgstr "Notice feed for %s (RSS 1.0)" #: actions/showstream.php:136 -#, fuzzy, php-format +#, php-format msgid "Notice feed for %s (RSS 2.0)" -msgstr "Notice feed for %s" +msgstr "Notice feed for %s (RSS 2.0)" #: actions/showstream.php:143 -#, fuzzy, php-format +#, php-format msgid "Notice feed for %s (Atom)" -msgstr "Notice feed for %s" +msgstr "Notice feed for %s (Atom)" #: actions/showstream.php:148 #, php-format @@ -3630,10 +3612,9 @@ msgid "FOAF for %s" msgstr "FOAF for %s" #: actions/showstream.php:200 -#, fuzzy, php-format +#, php-format msgid "This is the timeline for %1$s but %2$s hasn't posted anything yet." -msgstr "" -"This is the timeline for %s and friends but no one has posted anything yet." +msgstr "This is the timeline for %1$s but %2$s hasn't posted anything yet." #: actions/showstream.php:205 msgid "" @@ -3642,13 +3623,13 @@ msgid "" msgstr "" #: actions/showstream.php:207 -#, fuzzy, php-format +#, php-format msgid "" "You can try to nudge %1$s or [post something to his or her attention](%%%%" "action.newnotice%%%%?status_textarea=%2$s)." msgstr "" -"You can try to [nudge %s](../%s) from his profile or [post something to his " -"or her attention](%%%%action.newnotice%%%%?status_textarea=%s)." +"You can try to nudge %1$s or [post something to his or her attention](%%%%" +"action.newnotice%%%%?status_textarea=%2$s)." #: actions/showstream.php:243 #, php-format @@ -3671,19 +3652,17 @@ msgstr "" "[StatusNet](http://status.net/) tool. " #: actions/showstream.php:305 -#, fuzzy, php-format +#, php-format msgid "Repeat of %s" -msgstr "Replies to %s" +msgstr "Repeat of %s" #: actions/silence.php:65 actions/unsilence.php:65 -#, fuzzy msgid "You cannot silence users on this site." -msgstr "You can't send a message to this user." +msgstr "You cannot silence users on this site." #: actions/silence.php:72 -#, fuzzy msgid "User is already silenced." -msgstr "User is already blocked from group." +msgstr "User is already silenced." #: actions/siteadminpanel.php:69 msgid "Basic settings for this StatusNet site." @@ -3694,9 +3673,8 @@ msgid "Site name must have non-zero length." msgstr "" #: actions/siteadminpanel.php:140 -#, fuzzy msgid "You must have a valid contact email address." -msgstr "Not a valid e-mail address." +msgstr "You must have a valid contact email address." #: actions/siteadminpanel.php:158 #, php-format @@ -3756,9 +3734,8 @@ msgid "Contact email address for your site" msgstr "Contact e-mail address for your site" #: actions/siteadminpanel.php:263 -#, fuzzy msgid "Local" -msgstr "Local views" +msgstr "Local" #: actions/siteadminpanel.php:274 msgid "Default timezone" @@ -3829,9 +3806,8 @@ msgid "How long users must wait (in seconds) to post the same thing again." msgstr "" #: actions/smssettings.php:58 -#, fuzzy msgid "SMS settings" -msgstr "SMS Settings" +msgstr "SMS settings" #: actions/smssettings.php:69 #, php-format @@ -3860,16 +3836,14 @@ msgid "Enter the code you received on your phone." msgstr "Enter the code you received on your phone." #: actions/smssettings.php:138 -#, fuzzy msgid "SMS phone number" -msgstr "SMS Phone number" +msgstr "SMS phone number" #: actions/smssettings.php:140 msgid "Phone number, no punctuation or spaces, with area code" msgstr "Phone number, no punctuation or spaces, with area code" #: actions/smssettings.php:174 -#, fuzzy msgid "" "Send me notices through SMS; I understand I may incur exorbitant charges " "from my carrier." @@ -3882,7 +3856,6 @@ msgid "No phone number." msgstr "No phone number." #: actions/smssettings.php:311 -#, fuzzy msgid "No carrier selected." msgstr "No carrier selected." @@ -3895,13 +3868,12 @@ msgid "That phone number already belongs to another user." msgstr "That phone number already belongs to another user." #: actions/smssettings.php:347 -#, fuzzy msgid "" "A confirmation code was sent to the phone number you added. Check your phone " "for the code and instructions on how to use it." msgstr "" -"A confirmation code was sent to the phone number you added. Check your inbox " -"(and spam box!) for the code and instructions on how to use it." +"A confirmation code was sent to the phone number you added. Check your phone " +"for the code and instructions on how to use it." #: actions/smssettings.php:374 msgid "That is the wrong confirmation number." @@ -3912,23 +3884,21 @@ msgid "That is not your phone number." msgstr "That is not your phone number." #: actions/smssettings.php:465 -#, fuzzy msgid "Mobile carrier" msgstr "Mobile carrier" #: actions/smssettings.php:469 -#, fuzzy msgid "Select a carrier" msgstr "Select a carrier" #: actions/smssettings.php:476 -#, fuzzy, php-format +#, php-format msgid "" "Mobile carrier for your phone. If you know a carrier that accepts SMS over " "email but isn't listed here, send email to let us know at %s." msgstr "" -"Mobile carrier for your phone. If you know a carrier that accepts SMS over e-" -"mail but isn't listed here, send e-mail to let us know at %s." +"Mobile carrier for your phone. If you know a carrier that accepts SMS over " +"email but isn't listed here, send email to let us know at %s." #: actions/smssettings.php:498 msgid "No code entered" @@ -3948,14 +3918,12 @@ msgid "This action only accepts POST requests." msgstr "" #: actions/subscribe.php:107 -#, fuzzy msgid "No such profile." -msgstr "No such notice." +msgstr "No such profile." #: 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." +msgstr "You cannot subscribe to an OMB 0.1 remote profile with this action." #: actions/subscribe.php:145 msgid "Subscribed" @@ -3967,9 +3935,9 @@ msgid "%s subscribers" msgstr "%s subscribers" #: actions/subscribers.php:52 -#, fuzzy, php-format +#, php-format msgid "%1$s subscribers, page %2$d" -msgstr "%s subscribers, page %d" +msgstr "%1$s subscribers, page %2$d" #: actions/subscribers.php:63 msgid "These are the people who listen to your notices." @@ -4004,9 +3972,9 @@ msgid "%s subscriptions" msgstr "%s subscriptions" #: actions/subscriptions.php:54 -#, fuzzy, php-format +#, php-format msgid "%1$s subscriptions, page %2$d" -msgstr "%s subscriptions, page %d" +msgstr "%1$s subscriptions, page %2$d" #: actions/subscriptions.php:65 msgid "These are the people whose notices you listen to." @@ -4040,30 +4008,29 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 -#, fuzzy, php-format +#: actions/tag.php:69 +#, php-format msgid "Notices tagged with %1$s, page %2$d" -msgstr "Users self-tagged with %s - page %d" +msgstr "Notices tagged with %1$s, page %2$d" -#: actions/tag.php:86 -#, fuzzy, php-format +#: actions/tag.php:87 +#, php-format msgid "Notice feed for tag %s (RSS 1.0)" -msgstr "Notice feed for %s" +msgstr "Notice feed for tag %s (RSS 1.0)" -#: actions/tag.php:92 -#, fuzzy, php-format +#: actions/tag.php:93 +#, php-format msgid "Notice feed for tag %s (RSS 2.0)" -msgstr "Notice feed for %s" +msgstr "Notice feed for tag %s (RSS 2.0)" -#: actions/tag.php:98 -#, fuzzy, php-format +#: actions/tag.php:99 +#, php-format msgid "Notice feed for tag %s (Atom)" -msgstr "Notice feed for %s" +msgstr "Notice feed for tag %s (Atom)" #: actions/tagother.php:39 -#, fuzzy msgid "No ID argument." -msgstr "No id argument." +msgstr "No ID argument." #: actions/tagother.php:65 #, php-format @@ -4109,24 +4076,21 @@ msgstr "Use this form to add tags to your subscribers or subscriptions." msgid "No such tag." msgstr "No such tag." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API method under construction." #: actions/unblock.php:59 -#, fuzzy msgid "You haven't blocked that user." -msgstr "You have already blocked this user." +msgstr "You haven't blocked that user." #: actions/unsandbox.php:72 -#, fuzzy msgid "User is not sandboxed." -msgstr "User has blocked you." +msgstr "User is not sandboxed." #: actions/unsilence.php:72 -#, fuzzy msgid "User is not silenced." -msgstr "User has no profile." +msgstr "User is not silenced." #: actions/unsubscribe.php:77 msgid "No profile id in request." @@ -4137,79 +4101,78 @@ msgid "Unsubscribed" msgstr "Unsubscribed" #: actions/updateprofile.php:62 actions/userauthorization.php:337 -#, fuzzy, php-format +#, php-format msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." -msgstr "Notice licence ‘%s’ is not compatible with site licence ‘%s’." +msgstr "" +"Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "User" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profile" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "New users" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Default subscription" -#: actions/useradminpanel.php:241 -#, fuzzy +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." -msgstr "" -"Automatically subscribe to whoever subscribes to me (best for non-humans)" +msgstr "Automatically subscribe new users to this user." -#: actions/useradminpanel.php:250 -#, fuzzy +#: actions/useradminpanel.php:251 msgid "Invitations" -msgstr "Invitation(s) sent" +msgstr "Invitations" -#: actions/useradminpanel.php:255 -#, fuzzy +#: actions/useradminpanel.php:256 msgid "Invitations enabled" -msgstr "Invitation(s) sent" +msgstr "Invitations enabled" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4218,15 +4181,14 @@ msgid "Authorize subscription" msgstr "Authorise subscription" #: actions/userauthorization.php:110 -#, fuzzy msgid "" "Please check these details to make sure that you want to subscribe to this " "user’s notices. If you didn’t just ask to subscribe to someone’s notices, " "click “Reject”." msgstr "" "Please check these details to make sure that you want to subscribe to this " -"user's notices. If you didn't just ask to subscribe to someone's notices, " -"click \"Cancel\"." +"user’s notices. If you didn’t just ask to subscribe to someone’s notices, " +"click “Reject”." #: actions/userauthorization.php:196 actions/version.php:165 msgid "License" @@ -4258,14 +4220,13 @@ msgid "Subscription authorized" msgstr "Subscription authorised" #: actions/userauthorization.php:256 -#, fuzzy msgid "" "The subscription has been authorized, but no callback URL was passed. Check " "with the site’s instructions for details on how to authorize the " "subscription. Your subscription token is:" msgstr "" -"The subscription has been authorised, but no callback URL was passed. Check " -"with the site's instructions for details on how to authorise the " +"The subscription has been authorized, but no callback URL was passed. Check " +"with the site’s instructions for details on how to authorize the " "subscription. Your subscription token is:" #: actions/userauthorization.php:266 @@ -4273,14 +4234,13 @@ msgid "Subscription rejected" msgstr "Subscription rejected" #: actions/userauthorization.php:268 -#, fuzzy msgid "" "The subscription has been rejected, but no callback URL was passed. Check " "with the site’s instructions for details on how to fully reject the " "subscription." msgstr "" "The subscription has been rejected, but no callback URL was passed. Check " -"with the site's instructions for details on how to fully reject the " +"with the site’s instructions for details on how to fully reject the " "subscription." #: actions/userauthorization.php:303 @@ -4309,19 +4269,18 @@ msgid "Avatar URL ‘%s’ is not valid." msgstr "" #: actions/userauthorization.php:350 -#, fuzzy, php-format +#, php-format msgid "Can’t read avatar URL ‘%s’." -msgstr "Can't read avatar URL '%s'" +msgstr "Can’t read avatar URL ‘%s’." #: actions/userauthorization.php:355 -#, fuzzy, php-format +#, php-format msgid "Wrong image type for avatar URL ‘%s’." -msgstr "Wrong image type for '%s'" +msgstr "Wrong image type for avatar URL ‘%s’." #: actions/userdesignsettings.php:76 lib/designsettings.php:65 -#, fuzzy msgid "Profile design" -msgstr "Profile settings" +msgstr "Profile design" #: actions/userdesignsettings.php:87 lib/designsettings.php:76 msgid "" @@ -4334,19 +4293,18 @@ msgid "Enjoy your hotdog!" msgstr "" #: actions/usergroups.php:64 -#, fuzzy, php-format +#, php-format msgid "%1$s groups, page %2$d" -msgstr "%s group members, page %d" +msgstr "%1$s groups, page %2$d" #: actions/usergroups.php:130 -#, fuzzy msgid "Search for more groups" -msgstr "Search for people or text" +msgstr "Search for more groups" #: actions/usergroups.php:153 -#, fuzzy, php-format +#, php-format msgid "%s is not a member of any group." -msgstr "You are not a member of that group." +msgstr "%s is not a member of any group." #: actions/usergroups.php:158 #, php-format @@ -4354,9 +4312,9 @@ msgid "Try [searching for groups](%%action.groupsearch%%) and joining them." msgstr "" #: actions/version.php:73 -#, fuzzy, php-format +#, php-format msgid "StatusNet %s" -msgstr "Statistics" +msgstr "StatusNet %s" #: actions/version.php:153 #, php-format @@ -4406,10 +4364,9 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 -#, fuzzy +#: actions/version.php:196 lib/action.php:778 msgid "Version" -msgstr "Personal" +msgstr "Version" #: actions/version.php:197 msgid "Author(s)" @@ -4433,29 +4390,29 @@ msgid "A file this large would exceed your monthly quota of %d bytes." msgstr "" #: classes/Group_member.php:41 -#, fuzzy msgid "Group join failed." -msgstr "Group profile" +msgstr "Group join failed." #: classes/Group_member.php:53 -#, fuzzy msgid "Not part of group." -msgstr "Could not update group." +msgstr "Not part of group." #: classes/Group_member.php:60 -#, fuzzy msgid "Group leave failed." -msgstr "Group profile" +msgstr "Group leave failed." + +#: classes/Local_group.php:41 +msgid "Could not update local group." +msgstr "Could not update local group." #: classes/Login_token.php:76 -#, fuzzy, php-format +#, php-format msgid "Could not create login token for %s" -msgstr "Could not create aliases" +msgstr "Could not create login token for %s" #: classes/Message.php:45 -#, fuzzy msgid "You are banned from sending direct messages." -msgstr "Error sending direct message." +msgstr "You are banned from sending direct messages." #: classes/Message.php:61 msgid "Could not insert message." @@ -4465,51 +4422,49 @@ msgstr "Could not insert message." msgid "Could not update message with new URI." msgstr "Could not update message with new URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "DB error inserting hashtag: %s" -#: classes/Notice.php:222 -#, fuzzy +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." -msgstr "Problem saving notice." +msgstr "Problem saving notice. Too long." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Problem saving notice. Unknown user." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Too many notices too fast; take a breather and post again in a few minutes." -#: classes/Notice.php:237 -#, fuzzy +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -"Too many notices too fast; take a breather and post again in a few minutes." +"Too many duplicate messages too quickly; take a breather and post again in a " +"few minutes." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "You are banned from posting notices on this site." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problem saving notice." -#: classes/Notice.php:882 -#, fuzzy +#: classes/Notice.php:911 msgid "Problem saving group inbox." -msgstr "Problem saving notice." +msgstr "Problem saving group inbox." -#: classes/Notice.php:1407 -#, fuzzy, php-format +#: classes/Notice.php:1442 +#, php-format msgid "RT @%1$s %2$s" -msgstr "%1$s (%2$s)" +msgstr "RT @%1$s %2$s" #: classes/Subscription.php:66 lib/oauthstore.php:465 msgid "You have been banned from subscribing." @@ -4529,27 +4484,34 @@ msgid "Not subscribed!" msgstr "Not subscribed!" #: classes/Subscription.php:163 -#, fuzzy msgid "Couldn't delete self-subscription." -msgstr "Couldn't delete subscription." +msgstr "Couldn't delete self-subscription." #: classes/Subscription.php:179 lib/subs.php:69 msgid "Couldn't delete subscription." msgstr "Couldn't delete subscription." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Welcome to %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Could not create group." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +msgid "Could not set group URI." +msgstr "Could not set group URI." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Could not set group membership." +#: classes/User_group.php:506 +msgid "Could not save local group info." +msgstr "Could not save local group info." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Change your profile settings" @@ -4579,9 +4541,9 @@ msgid "Other options" msgstr "Other options" #: lib/action.php:144 -#, fuzzy, php-format +#, php-format msgid "%1$s - %2$s" -msgstr "%1$s (%2$s)" +msgstr "%1$s - %2$s" #: lib/action.php:159 msgid "Untitled page" @@ -4591,122 +4553,190 @@ msgstr "Untitled page" msgid "Primary site navigation" msgstr "Primary site navigation" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Home" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Personal profile and friends timeline" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Personal" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Change your e-mail, avatar, password, profile" -#: lib/action.php:444 -msgid "Connect" -msgstr "Connect" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Account" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" -msgstr "Could not redirect to server: %s" +msgstr "Connect to services" + +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Connect" -#: lib/action.php:448 +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 #, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" -msgstr "Primary site navigation" +msgstr "Change site configuration" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Invite" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Admin" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Invite friends and colleagues to join you on %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Logout" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Invite" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Logout from the site" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Logout" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Create an account" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Register" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Login to the site" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Help" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Login" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Help me!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Search" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Help" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Search for people or text" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Search" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Site notice" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Local views" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Page notice" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Secondary site navigation" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Help" + +#: lib/action.php:765 msgid "About" msgstr "About" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "F.A.Q." -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Privacy" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Source" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Contact" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Badge" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "StatusNet software licence" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4715,12 +4745,12 @@ msgstr "" "**%%site.name%%** is a microblogging service brought to you by [%%site." "broughtby%%](%%site.broughtbyurl%%)." -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** is a microblogging service." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4731,115 +4761,157 @@ msgstr "" "s, available under the [GNU Affero General Public Licence](http://www.fsf." "org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Site content license" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "All " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "licence." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Pagination" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "After" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Before" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 -#, fuzzy +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." -msgstr "You can't send a message to this user." +msgstr "You cannot make changes to this site." -#: lib/adminpanelaction.php:107 -#, fuzzy +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." -msgstr "Registration not allowed." +msgstr "Changes to that panel are not allowed." -#: lib/adminpanelaction.php:206 -#, fuzzy +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." -msgstr "Command not yet implemented." +msgstr "showForm() not implemented." -#: lib/adminpanelaction.php:235 -#, fuzzy +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." -msgstr "Command not yet implemented." +msgstr "saveSettings() not implemented." -#: lib/adminpanelaction.php:258 -#, fuzzy +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." -msgstr "Unable to save your design settings!" +msgstr "Unable to delete design setting." -#: lib/adminpanelaction.php:312 -#, fuzzy +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" -msgstr "E-mail address confirmation" +msgstr "Basic site configuration" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Site" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Design configuration" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 #, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Design" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" -msgstr "SMS confirmation" +msgstr "User configuration" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 #, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "User" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" -msgstr "Design configuration" +msgstr "Access configuration" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 #, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Access" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" -msgstr "SMS confirmation" +msgstr "Paths configuration" -#: lib/adminpanelaction.php:337 -#, fuzzy +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" -msgstr "Design configuration" +msgstr "Sessions configuration" + +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Version" -#: lib/apiauth.php:95 +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4853,24 +4925,21 @@ msgid "Icon for this application" msgstr "" #: lib/applicationeditform.php:204 -#, fuzzy, php-format +#, php-format msgid "Describe your application in %d characters" -msgstr "Describe the group or topic in %d characters" +msgstr "Describe your application in %d characters" #: lib/applicationeditform.php:207 -#, fuzzy msgid "Describe your application" -msgstr "Describe the group or topic" +msgstr "Describe your application" #: lib/applicationeditform.php:216 -#, fuzzy msgid "Source URL" -msgstr "Source" +msgstr "Source URL" #: lib/applicationeditform.php:218 -#, fuzzy msgid "URL of the homepage of this application" -msgstr "URL of the homepage or blog of the group or topic" +msgstr "URL of the homepage of this application" #: lib/applicationeditform.php:224 msgid "Organization responsible for this application" @@ -4909,9 +4978,8 @@ msgid "Default access for this application: read-only, or read-write" msgstr "" #: lib/applicationlist.php:154 -#, fuzzy msgid "Revoke" -msgstr "Remove" +msgstr "Revoke" #: lib/attachmentlist.php:87 msgid "Attachments" @@ -4922,9 +4990,8 @@ msgid "Author" msgstr "" #: lib/attachmentlist.php:278 -#, fuzzy msgid "Provider" -msgstr "Profile" +msgstr "Provider" #: lib/attachmentnoticesection.php:67 msgid "Notices where this attachment appears" @@ -4934,15 +5001,13 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 -#, fuzzy +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" -msgstr "Password change" +msgstr "Password changing failed" -#: lib/authenticationplugin.php:233 -#, fuzzy +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" -msgstr "Password change" +msgstr "Password changing is not allowed" #: lib/channel.php:138 lib/channel.php:158 msgid "Command results" @@ -4983,9 +5048,8 @@ msgid "" msgstr "" #: lib/command.php:152 lib/command.php:390 lib/command.php:451 -#, fuzzy msgid "Notice with that id does not exist" -msgstr "No profile with that id." +msgstr "Notice with that id does not exist" #: lib/command.php:168 lib/command.php:406 lib/command.php:467 #: lib/command.php:523 @@ -5063,14 +5127,13 @@ msgid "Already repeated that notice" msgstr "Already repeated that notice." #: lib/command.php:426 -#, fuzzy, php-format +#, php-format msgid "Notice from %s repeated" -msgstr "Notice posted" +msgstr "Notice from %s repeated" #: lib/command.php:428 -#, fuzzy msgid "Error repeating notice." -msgstr "Error saving notice." +msgstr "Error repeating notice." #: lib/command.php:482 #, php-format @@ -5138,14 +5201,13 @@ msgid "This link is useable only once, and is good for only 2 minutes: %s" msgstr "" #: lib/command.php:692 -#, fuzzy, php-format +#, php-format msgid "Unsubscribed %s" -msgstr "Unsubscribed from %s" +msgstr "Unsubscribed %s" #: lib/command.php:709 -#, fuzzy msgid "You are not subscribed to anyone." -msgstr "You are not subscribed to that profile." +msgstr "You are not subscribed to anyone." #: lib/command.php:711 msgid "You are subscribed to this person:" @@ -5154,9 +5216,8 @@ msgstr[0] "You are already subscribed to these users:" msgstr[1] "You are already subscribed to these users:" #: lib/command.php:731 -#, fuzzy msgid "No one is subscribed to you." -msgstr "Could not subscribe other to you." +msgstr "No one is subscribed to you." #: lib/command.php:733 msgid "This person is subscribed to you:" @@ -5165,9 +5226,8 @@ msgstr[0] "Could not subscribe other to you." msgstr[1] "Could not subscribe other to you." #: lib/command.php:753 -#, fuzzy msgid "You are not a member of any groups." -msgstr "You are not a member of that group." +msgstr "You are not a member of any groups." #: lib/command.php:755 msgid "You are a member of this group:" @@ -5217,19 +5277,19 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "No configuration file found" -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Go to the installer." @@ -5246,9 +5306,8 @@ msgid "Updates by SMS" msgstr "Updates by SMS" #: lib/connectsettingsaction.php:120 -#, fuzzy msgid "Connections" -msgstr "Connect" +msgstr "Connections" #: lib/connectsettingsaction.php:121 msgid "Authorized connected applications" @@ -5259,15 +5318,14 @@ msgid "Database error" msgstr "" #: lib/designsettings.php:105 -#, fuzzy msgid "Upload file" -msgstr "Upload" +msgstr "Upload file" #: lib/designsettings.php:109 -#, fuzzy msgid "" "You can upload your personal background image. The maximum file size is 2MB." -msgstr "You can upload your personal avatar. The maximum file size is %s." +msgstr "" +"You can upload your personal background image. The maximum file size is 2MB." #: lib/designsettings.php:418 msgid "Design defaults restored." @@ -5419,23 +5477,23 @@ msgstr "System error uploading file." msgid "Not an image or corrupt file." msgstr "Not an image or corrupt file." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Unsupported image file format." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Lost our file." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Unknown file type" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5517,11 +5575,9 @@ msgstr "" "Change your email address or notification options at %8$s\n" #: lib/mail.php:258 -#, fuzzy, php-format +#, php-format msgid "Bio: %s" -msgstr "" -"Bio: %s\n" -"\n" +msgstr "Bio: %s" #: lib/mail.php:286 #, php-format @@ -5660,7 +5716,6 @@ msgid "" msgstr "" #: lib/mailbox.php:227 lib/noticelist.php:482 -#, fuzzy msgid "from" msgstr "from" @@ -5681,9 +5736,9 @@ msgid "Sorry, no incoming email allowed." msgstr "Sorry, no incoming e-mail allowed." #: lib/mailhandler.php:228 -#, fuzzy, php-format +#, php-format msgid "Unsupported message type: %s" -msgstr "Unsupported image file format." +msgstr "Unsupported message type: %s" #: lib/mediafile.php:98 lib/mediafile.php:123 msgid "There was a database error while saving your file. Please try again." @@ -5724,9 +5779,8 @@ msgid "File could not be moved to destination directory." msgstr "" #: lib/mediafile.php:201 lib/mediafile.php:237 -#, fuzzy msgid "Could not determine file's MIME type." -msgstr "Could not retrieve public stream." +msgstr "Could not determine file's MIME type." #: lib/mediafile.php:270 #, php-format @@ -5750,6 +5804,11 @@ msgstr "To" msgid "Available characters" msgstr "Available characters" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Send" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Send a notice" @@ -5768,14 +5827,12 @@ msgid "Attach a file" msgstr "" #: lib/noticeform.php:212 -#, fuzzy msgid "Share my location" -msgstr "Couldn't save tags." +msgstr "Share my location" #: lib/noticeform.php:215 -#, fuzzy msgid "Do not share my location" -msgstr "Couldn't save tags." +msgstr "Do not share my location" #: lib/noticeform.php:216 msgid "" @@ -5789,9 +5846,8 @@ msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" msgstr "" #: lib/noticelist.php:430 -#, fuzzy msgid "N" -msgstr "No" +msgstr "N" #: lib/noticelist.php:430 msgid "S" @@ -5809,27 +5865,25 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "in context" -#: lib/noticelist.php:583 -#, fuzzy +#: lib/noticelist.php:601 msgid "Repeated by" -msgstr "Created" +msgstr "Repeated by" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Reply to this notice" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Reply" -#: lib/noticelist.php:655 -#, fuzzy +#: lib/noticelist.php:673 msgid "Notice repeated" -msgstr "Notice deleted." +msgstr "Notice repeated" #: lib/nudgeform.php:116 msgid "Nudge this user" @@ -5875,6 +5929,10 @@ msgstr "Replies" msgid "Favorites" msgstr "Favourites" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "User" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Inbox" @@ -5897,9 +5955,8 @@ msgid "Tags in %s's notices" msgstr "Tags in %s's notices" #: lib/plugin.php:114 -#, fuzzy msgid "Unknown" -msgstr "Unknown action" +msgstr "Unknown" #: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82 msgid "Subscriptions" @@ -5930,9 +5987,8 @@ msgid "All groups" msgstr "All groups" #: lib/profileformaction.php:123 -#, fuzzy msgid "No return-to arguments." -msgstr "No id argument." +msgstr "No return-to arguments." #: lib/profileformaction.php:137 msgid "Unimplemented method." @@ -5959,16 +6015,14 @@ msgid "Popular" msgstr "Popular" #: lib/repeatform.php:107 -#, fuzzy msgid "Repeat this notice?" -msgstr "Reply to this notice" +msgstr "Repeat this notice?" #: lib/repeatform.php:132 -#, fuzzy msgid "Repeat this notice" -msgstr "Reply to this notice" +msgstr "Repeat this notice" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5981,14 +6035,17 @@ msgid "Sandbox this user" msgstr "Sandbox this user" #: lib/searchaction.php:120 -#, fuzzy msgid "Search site" -msgstr "Search" +msgstr "Search site" #: lib/searchaction.php:126 msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Search" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Search help" @@ -6040,6 +6097,15 @@ msgstr "People subscribed to %s" msgid "Groups %s is a member of" msgstr "Groups %s is a member of" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Invite" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Invite friends and colleagues to join you on %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6110,47 +6176,47 @@ msgstr "Message" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "a few seconds ago" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "about a minute ago" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "about %d minutes ago" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "about an hour ago" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "about %d hours ago" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "about a day ago" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "about %d days ago" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "about a month ago" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "about %d months ago" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "about a year ago" @@ -6165,6 +6231,6 @@ msgid "%s is not a valid color! Use 3 or 6 hex chars." msgstr "%s is not a valid colour! Use 3 or 6 hex chars." #: lib/xmppmanager.php:402 -#, fuzzy, php-format +#, php-format msgid "Message too long - maximum is %1$d characters, you sent %2$d." -msgstr "Message too long - maximum is %d characters, you sent %d" +msgstr "Message too long - maximum is %1$d characters, you sent %2$d." diff --git a/locale/es/LC_MESSAGES/statusnet.po b/locale/es/LC_MESSAGES/statusnet.po index b5e0469b6..fe861905d 100644 --- a/locale/es/LC_MESSAGES/statusnet.po +++ b/locale/es/LC_MESSAGES/statusnet.po @@ -3,6 +3,7 @@ # Author@translatewiki.net: Brion # Author@translatewiki.net: Crazymadlover # Author@translatewiki.net: McDutchie +# Author@translatewiki.net: PerroVerd # Author@translatewiki.net: Peter17 # Author@translatewiki.net: Translationista # -- @@ -12,75 +13,82 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:30+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:39+0000\n" "Language-Team: Spanish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: es\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Acceder" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Configuración de acceso de la web" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Registro" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Privado" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "¿Prohibir a los usuarios anónimos (no conectados) ver el sitio?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Invitar sólo" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Privado" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Haz que el registro sea sólo con invitaciones." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Cerrado" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Invitar sólo" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Inhabilitar nuevos registros." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Guardar" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Cerrado" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Guardar la configuración de acceso" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Guardar" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "No existe tal página" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -94,45 +102,53 @@ msgstr "No existe tal página" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "No existe ese usuario." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s y amigos, página %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s y amigos" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Feed de los amigos de %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Feed de los amigos de %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Feed de los amigos de %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." @@ -140,7 +156,7 @@ msgstr "" "Esta es la línea temporal de %s y amistades, pero nadie ha publicado nada " "todavía." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -149,7 +165,8 @@ msgstr "" "Esta es la línea temporal de %s y amistades, pero nadie ha publicado nada " "todavía." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -158,7 +175,7 @@ msgstr "" "Trata de suscribirte a más personas, [unirte a un grupo] (%%action.groups%%) " "o publicar algo." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -167,7 +184,8 @@ msgstr "" "Puede intentar [guiñar a %1$s](../%2$s) desde su perfil o [publicar algo a " "su atención ](%%%%action.newnotice%%%%?status_textarea=%3$s)." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Tú y amigos" @@ -185,20 +203,20 @@ msgstr "¡Actualizaciones de %1$s y amigos en %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "Método de API no encontrado." @@ -232,8 +250,9 @@ msgstr "No se pudo actualizar el usuario." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "El usuario no tiene un perfil." @@ -259,7 +278,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -369,7 +388,7 @@ msgstr "No se pudo determinar el usuario fuente." msgid "Could not find target user." msgstr "No se pudo encontrar ningún usuario de destino." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -377,62 +396,62 @@ msgstr "" "El usuario debe tener solamente letras minúsculas y números y no puede tener " "espacios." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "El usuario ya existe. Prueba con otro." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Usuario inválido" -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "La página de inicio no es un URL válido." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Tu nombre es demasiado largo (max. 255 carac.)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "La descripción es demasiado larga (máx. %d caracteres)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "La ubicación es demasiado larga (máx. 255 caracteres)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "¡Muchos seudónimos! El máximo es %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Alias inválido: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "El alias \"%s\" ya está en uso. Intenta usar otro." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "El alias no puede ser el mismo que el usuario." @@ -443,15 +462,15 @@ msgstr "El alias no puede ser el mismo que el usuario." msgid "Group not found!" msgstr "¡No se ha encontrado el grupo!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Ya eres miembro de ese grupo" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Has sido bloqueado de ese grupo por el administrador." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "No se pudo unir el usuario %s al grupo %s" @@ -460,7 +479,7 @@ msgstr "No se pudo unir el usuario %s al grupo %s" msgid "You are not a member of this group." msgstr "No eres miembro de este grupo." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "No se pudo eliminar al usuario %1$s del grupo %2$s." @@ -491,7 +510,7 @@ msgstr "Token inválido." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -537,7 +556,7 @@ msgstr "El token de solicitud %2 ha sido denegado y revocado." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -563,13 +582,13 @@ msgstr "" "permiso para %3$s la información de tu cuenta %4$s. Sólo " "debes dar acceso a tu cuenta %4$s a terceras partes en las que confíes." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Cuenta" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -653,12 +672,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s actualizaciones favoritas de %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "línea temporal de %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -694,7 +713,7 @@ msgstr "Repetido a %s" msgid "Repeats of %s" msgstr "Repeticiones de %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Avisos marcados con %s" @@ -715,8 +734,7 @@ msgstr "No existe tal archivo adjunto." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Ningún apodo." @@ -728,7 +746,7 @@ msgstr "Ningún tamaño." msgid "Invalid size." msgstr "Tamaño inválido." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -745,30 +763,30 @@ msgid "User without matching profile" msgstr "Usuario sin perfil equivalente" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Configuración de Avatar" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Original" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Vista previa" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Borrar" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Cargar" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Cortar" @@ -776,7 +794,7 @@ msgstr "Cortar" msgid "Pick a square area of the image to be your avatar" msgstr "Elige un área cuadrada de la imagen para que sea tu avatar" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Se perdió nuestros datos de archivo." @@ -811,22 +829,22 @@ msgstr "" "te notificará de ninguna de sus respuestas @." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "No" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "No bloquear a este usuario" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Sí" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Bloquear este usuario." @@ -834,40 +852,44 @@ msgstr "Bloquear este usuario." msgid "Failed to save block information." msgstr "No se guardó información de bloqueo." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "No existe ese grupo." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s perfiles bloqueados" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s perfiles bloqueados, página %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" "Una lista de los usuarios que han sido bloqueados para unirse a este grupo." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Desbloquear usuario de grupo" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Desbloquear" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Desbloquear este usuario" @@ -942,7 +964,7 @@ msgstr "No eres el propietario de esta aplicación." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Hubo problemas con tu clave de sesión." @@ -968,12 +990,13 @@ msgstr "No eliminar esta aplicación" msgid "Delete this application" msgstr "Borrar esta aplicación" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "No conectado." @@ -1002,7 +1025,7 @@ msgstr "¿Estás seguro de que quieres eliminar este aviso?" msgid "Do not delete this notice" msgstr "No eliminar este mensaje" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Borrar este aviso" @@ -1018,7 +1041,7 @@ msgstr "Sólo puedes eliminar usuarios locales." msgid "Delete user" msgstr "Borrar usuario" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1026,12 +1049,12 @@ msgstr "" "¿Realmente deseas eliminar este usuario? Esto borrará de la base de datos " "todos los datos sobre el usuario, sin dejar una copia de seguridad." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Borrar este usuario" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Diseño" @@ -1134,6 +1157,17 @@ msgstr "Restaurar los diseños predeterminados" msgid "Reset back to default" msgstr "Volver a los valores predeterminados" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Guardar" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Guardar el diseño" @@ -1225,29 +1259,29 @@ msgstr "Editar grupo %s" msgid "You must be logged in to create a group." msgstr "Debes estar conectado para crear un grupo" -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Para editar el grupo debes ser administrador." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Usa este formulario para editar el grupo." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "La descripción es muy larga (máx. %d caracteres)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "No se pudo actualizar el grupo." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "No fue posible crear alias." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Se guardó Opciones." @@ -1590,7 +1624,7 @@ msgstr "Usuario ya está bloqueado del grupo." msgid "User is not a member of group." msgstr "Usuario no es miembro del grupo" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Bloquear usuario de grupo" @@ -1627,11 +1661,11 @@ msgstr "Sin ID." msgid "You must be logged in to edit a group." msgstr "Debes estar conectado para editar un grupo." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Diseño de grupo" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1639,20 +1673,20 @@ msgstr "" "Personaliza el aspecto de tu grupo con una imagen de fondo y la paleta de " "colores que prefieras." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "No fue posible actualizar tu diseño." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Preferencias de diseño guardadas." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Logo de grupo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1660,57 +1694,57 @@ msgstr "" "Puedes subir una imagen de logo para tu grupo. El tamaño máximo del archivo " "debe ser %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Usuario sin perfil coincidente." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Elige un área cuadrada de la imagen para que sea tu logo." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo actualizado." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Error al actualizar el logo." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Miembros del grupo %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "%1$s miembros de grupo, página %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Lista de los usuarios en este grupo." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Admin" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Bloquear" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Convertir al usuario en administrador del grupo" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Convertir en administrador" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Convertir a este usuario en administrador" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "¡Actualizaciones de miembros de %1$s en %2$s!" @@ -1974,16 +2008,19 @@ msgstr "Mensaje Personal" msgid "Optionally add a personal message to the invitation." msgstr "Opcionalmente añada un mensaje personalizado a su invitación." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Enviar" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s te ha invitado a que te unas con el/ellos en %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2044,7 +2081,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Debes estar conectado para unirte a un grupo." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Ningún apodo." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s se ha unido al grupo %2$" @@ -2053,11 +2095,11 @@ msgstr "%1$s se ha unido al grupo %2$" msgid "You must be logged in to leave a group." msgstr "Debes estar conectado para dejar un grupo." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "No eres miembro de este grupo." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s ha dejado el grupo %2$s" @@ -2074,8 +2116,7 @@ msgstr "Nombre de usuario o contraseña incorrectos." msgid "Error setting user. You are probably not authorized." msgstr "Error al configurar el usuario. Posiblemente no tengas autorización." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Inicio de sesión" @@ -2333,8 +2374,8 @@ msgstr "tipo de contenido " msgid "Only " msgstr "Sólo " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "No es un formato de dato soportado" @@ -2474,9 +2515,9 @@ msgstr "No se puede guardar la nueva contraseña." msgid "Password saved." msgstr "Se guardó Contraseña." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" -msgstr "" +msgstr "Rutas" #: actions/pathsadminpanel.php:70 msgid "Path and server settings for this StatusNet site." @@ -2507,7 +2548,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Servidor SSL no válido. La longitud máxima es de 255 caracteres." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Sitio" @@ -2521,7 +2561,7 @@ msgstr "" #: actions/pathsadminpanel.php:242 msgid "Path" -msgstr "" +msgstr "Ruta" #: actions/pathsadminpanel.php:242 #, fuzzy @@ -2683,7 +2723,7 @@ msgstr "" "1-64 letras en minúscula o números, sin signos de puntuación o espacios" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Nombre completo" @@ -2711,7 +2751,7 @@ msgid "Bio" msgstr "Biografía" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2793,7 +2833,8 @@ msgstr "No se pudo guardar el perfil." msgid "Couldn't save tags." msgstr "No se pudo guardar las etiquetas." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Se guardó configuración." @@ -2806,31 +2847,31 @@ msgstr "Más allá del límite de páginas (%s)" msgid "Could not retrieve public stream." msgstr "No se pudo acceder a corriente pública." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Línea temporal pública, página %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Línea temporal pública" -#: actions/public.php:159 +#: actions/public.php:160 #, fuzzy msgid "Public Stream Feed (RSS 1.0)" msgstr "Feed del flujo público" -#: actions/public.php:163 +#: actions/public.php:164 #, fuzzy msgid "Public Stream Feed (RSS 2.0)" msgstr "Feed del flujo público" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "Feed del flujo público" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2839,17 +2880,17 @@ msgstr "" "Esta es la línea temporal pública de %%site.name%%, pero aún no se ha " "publicado nada." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "¡Sé la primera persona en publicar algo!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2858,7 +2899,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, fuzzy, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3039,8 +3080,7 @@ msgstr "El código de invitación no es válido." msgid "Registration successful" msgstr "Registro exitoso." -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Registrarse" @@ -3226,7 +3266,7 @@ msgstr "No puedes repetir tus propios mensajes." msgid "You already repeated that notice." msgstr "Ya has repetido este mensaje." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Repetido" @@ -3234,47 +3274,47 @@ msgstr "Repetido" msgid "Repeated!" msgstr "¡Repetido!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Respuestas a %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Respuestas a %1$s, página %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Feed de avisos de %s" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Feed de avisos de %s" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Feed de avisos de %s" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3301,7 +3341,6 @@ msgid "User is already sandboxed." msgstr "El usuario te ha bloqueado." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Sesiones" @@ -3326,7 +3365,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Guardar la configuración del sitio" @@ -3357,7 +3396,7 @@ msgstr "Organización" msgid "Description" msgstr "Descripción" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Estadísticas" @@ -3419,35 +3458,35 @@ msgstr "Avisos favoritos de %s" msgid "Could not retrieve favorite notices." msgstr "No se pudo recibir avisos favoritos." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Feed de los amigos de %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Feed de los amigos de %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Feed de los amigos de %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3455,7 +3494,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3469,68 +3508,68 @@ msgstr "Grupo %s" msgid "%1$s group, page %2$d" msgstr "Miembros del grupo %s, página %d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Perfil del grupo" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Nota" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Alias" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Acciones del grupo" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Feed de avisos de grupo %s" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Feed de avisos de grupo %s" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "Feed de avisos de grupo %s" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "Bandeja de salida para %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 #, fuzzy msgid "Members" msgstr "Miembros" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Ninguno)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Todos los miembros" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Creado" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3540,7 +3579,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, fuzzy, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3551,7 +3590,7 @@ msgstr "" "**%s** es un grupo de usuarios en %%%%site.name%%%%, un servicio [micro-" "blogging](http://en.wikipedia.org/wiki/Micro-blogging) " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Administradores" @@ -4017,22 +4056,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Usuarios auto marcados con %s - página %d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Feed de avisos de %s" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Feed de avisos de %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Feed de avisos de %s" @@ -4087,7 +4126,7 @@ msgstr "" msgid "No such tag." msgstr "No existe ese tag." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Método API en construcción." @@ -4119,70 +4158,72 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Usuario" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Configuración de usuarios en este sitio StatusNet." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Límite para la bio inválido: Debe ser numérico." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "Texto de bienvenida inválido. La longitud máx. es de 255 caracteres." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Suscripción predeterminada inválida : '%1$s' no es un usuario" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Perfil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Límite de la bio" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Longitud máxima de bio de perfil en caracteres." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Nuevos usuarios" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Bienvenida a nuevos usuarios" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Texto de bienvenida para nuevos usuarios (máx. 255 caracteres)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Suscripción predeterminada" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Suscribir automáticamente nuevos usuarios a este usuario." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Invitaciones" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Invitaciones habilitadas" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4368,7 +4409,7 @@ msgstr "" msgid "Plugins" msgstr "Complementos" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Sesiones" @@ -4408,6 +4449,11 @@ msgstr "No es parte del grupo." msgid "Group leave failed." msgstr "Perfil de grupo" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "No se pudo actualizar el grupo." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4425,27 +4471,27 @@ msgstr "No se pudo insertar mensaje." msgid "Could not update message with new URI." msgstr "No se pudo actualizar mensaje con nuevo URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Error de la BD al insertar la etiqueta clave: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Ha habido un problema al guardar el mensaje. Es muy largo." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Ha habido un problema al guardar el mensaje. Usuario desconocido." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Demasiados avisos demasiado rápido; para y publicar nuevamente en unos " "minutos." -#: classes/Notice.php:237 +#: classes/Notice.php:254 #, fuzzy msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " @@ -4454,20 +4500,20 @@ msgstr "" "Demasiados avisos demasiado rápido; para y publicar nuevamente en unos " "minutos." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Tienes prohibido publicar avisos en este sitio." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Hubo un problema al guardar el aviso." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Hubo un problema al guardar el aviso." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4498,20 +4544,30 @@ msgstr "No se pudo eliminar la suscripción." msgid "Couldn't delete subscription." msgstr "No se pudo eliminar la suscripción." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Bienvenido a %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "No se pudo crear grupo." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "No se pudo configurar miembros de grupo." + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "No se pudo configurar miembros de grupo." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "No se ha podido guardar la suscripción." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Cambia tus opciones de perfil" @@ -4553,120 +4609,190 @@ msgstr "Página sin título" msgid "Primary site navigation" msgstr "Navegación de sitio primario" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Inicio" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Perfil personal y línea de tiempo de amigos" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Personal" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Cambia tu correo electrónico, avatar, contraseña, perfil" -#: lib/action.php:444 -msgid "Connect" -msgstr "Conectarse" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Cuenta" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Conectar a los servicios" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Conectarse" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Cambiar la configuración del sitio" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Invitar" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Admin" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Invita a amigos y colegas a unirse a %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Salir" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Invitar" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Salir de sitio" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Salir" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Crear una cuenta" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registrarse" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Ingresar a sitio" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Ayuda" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Inicio de sesión" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Ayúdame!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Buscar" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Ayuda" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Buscar personas o texto" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Buscar" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Aviso de sitio" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Vistas locales" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Aviso de página" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Navegación de sitio secundario" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Ayuda" + +#: lib/action.php:765 msgid "About" msgstr "Acerca de" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "Preguntas Frecuentes" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Privacidad" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Fuente" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Ponerse en contacto" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Insignia" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Licencia de software de StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4675,12 +4801,12 @@ msgstr "" "**%%site.name%%** es un servicio de microblogueo de [%%site.broughtby%%**](%%" "site.broughtbyurl%%)." -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** es un servicio de microblogueo." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4691,112 +4817,165 @@ msgstr "" "disponible bajo la [GNU Affero General Public License](http://www.fsf.org/" "licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Licencia de contenido del sitio" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "Derechos de autor de contenido y datos por los colaboradores. Todos los " "derechos reservados." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Todo" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "Licencia." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Paginación" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Después" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Antes" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "No puedes hacer cambios a este sitio." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "Registro de usuario no permitido." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 #, fuzzy msgid "showForm() not implemented." msgstr "Todavía no se implementa comando." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 #, fuzzy msgid "saveSettings() not implemented." msgstr "Todavía no se implementa comando." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 #, fuzzy msgid "Unable to delete design setting." msgstr "¡No se pudo guardar tu configuración de Twitter!" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Configuración básica del sitio" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Sitio" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Configuración del diseño" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Diseño" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Configuración de usuario" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Usuario" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Configuración de acceso" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Acceder" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "SMS confirmación" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Rutas" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Configuración de sesiones" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Sesiones" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4889,11 +5068,11 @@ msgstr "Mensajes donde aparece este adjunto" msgid "Tags for this attachment" msgstr "Etiquetas de este archivo adjunto" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "El cambio de contraseña ha fallado" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Cambio de contraseña " @@ -5171,19 +5350,19 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Ningún archivo de configuración encontrado. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Ir al instalador." @@ -5375,23 +5554,23 @@ msgstr "Error del sistema al cargar el archivo." msgid "Not an image or corrupt file." msgstr "No es una imagen o es un fichero corrupto." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Formato de imagen no soportado." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Se perdió nuestro archivo." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Tipo de archivo desconocido" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "kB" @@ -5702,6 +5881,12 @@ msgstr "Para" msgid "Available characters" msgstr "Caracteres disponibles" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Enviar" + #: lib/noticeform.php:160 #, fuzzy msgid "Send a notice" @@ -5761,24 +5946,24 @@ msgstr "" msgid "at" msgstr "en" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "en contexto" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "Crear" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Responder este aviso." -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Responder" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Aviso borrado" @@ -5827,6 +6012,10 @@ msgstr "Respuestas" msgid "Favorites" msgstr "Favoritos" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Usuario" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Bandeja de Entrada" @@ -5921,7 +6110,7 @@ msgstr "Responder este aviso." msgid "Repeat this notice" msgstr "Responder este aviso." -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5944,6 +6133,10 @@ msgstr "Buscar" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Buscar" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Buscar ayuda" @@ -5997,6 +6190,15 @@ msgstr "Personas suscritas a %s" msgid "Groups %s is a member of" msgstr "%s es miembro de los grupos" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Invitar" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Invita a amigos y colegas a unirse a %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6069,47 +6271,47 @@ msgstr "Mensaje" msgid "Moderate" msgstr "Moderar" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "hace unos segundos" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "hace un minuto" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "hace %d minutos" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "hace una hora" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "hace %d horas" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "hace un día" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "hace %d días" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "hace un mes" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "hace %d meses" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "hace un año" diff --git a/locale/fa/LC_MESSAGES/statusnet.po b/locale/fa/LC_MESSAGES/statusnet.po index 600323e43..bb453f582 100644 --- a/locale/fa/LC_MESSAGES/statusnet.po +++ b/locale/fa/LC_MESSAGES/statusnet.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:38+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:45+0000\n" "Last-Translator: Ahmad Sufi Mahmudi\n" "Language-Team: Persian\n" "MIME-Version: 1.0\n" @@ -20,70 +20,77 @@ msgstr "" "X-Language-Code: fa\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "دسترسی" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "تنظیمات دیگر" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "ثبت نام" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "خصوصی" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "فقط دعوت کردن" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "خصوصی" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "تنها آماده کردن دعوت نامه های ثبت نام." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "مسدود" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "فقط دعوت کردن" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "غیر فعال کردن نام نوبسی جدید" -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "ذخیره‌کردن" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "مسدود" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "تنظیمات چهره" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "ذخیره‌کردن" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "چنین صفحه‌ای وجود ندارد" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -97,51 +104,59 @@ msgstr "چنین صفحه‌ای وجود ندارد" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "چنین کاربری وجود ندارد." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s کاربران مسدود شده، صفحه‌ی %d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s و دوستان" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "خوراک دوستان %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "خوراک دوستان %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "خوراک دوستان %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "این خط‌زمانی %s و دوستانش است، اما هیچ‌یک تاکنون چیزی پست نکرده‌اند." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -150,7 +165,8 @@ msgstr "" "پیگیری افراد بیش‌تری بشوید [به یک گروه بپیوندید](%%action.groups%%) یا خودتان " "چیزی را ارسال کنید." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, fuzzy, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -159,7 +175,7 @@ msgstr "" "اولین کسی باشید که در [این موضوع](%%%%action.newnotice%%%%?status_textarea=%" "s) پیام می‌فرستد." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -168,7 +184,8 @@ msgstr "" "چرا [ثبت نام](%%%%action.register%%%%) نمی‌کنید و سپس با فرستادن پیام توجه %s " "را جلب کنید." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "شما و دوستان" @@ -186,20 +203,20 @@ msgstr "به روز رسانی از %1$ و دوستان در %2$" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "رابط مورد نظر پیدا نشد." @@ -231,8 +248,9 @@ msgstr "نمی‌توان کاربر را به‌هنگام‌سازی کرد." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "کاربر هیچ شناس‌نامه‌ای ندارد." @@ -257,7 +275,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -370,68 +388,68 @@ msgstr "نمی‌توان کاربر منبع را تعیین کرد." msgid "Could not find target user." msgstr "نمی‌توان کاربر هدف را پیدا کرد." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "لقب باید شامل حروف کوچک و اعداد و بدون فاصله باشد." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "این لقب در حال حاضر ثبت شده است. لطفا یکی دیگر انتخاب کنید." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "لقب نا معتبر." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "برگهٔ آغازین یک نشانی معتبر نیست." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "نام کامل طولانی است (۲۵۵ حرف در حالت بیشینه(." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "توصیف بسیار زیاد است (حداکثر %d حرف)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "مکان طولانی است (حداکثر ۲۵۵ حرف)" -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "نام‌های مستعار بسیار زیاد هستند! حداکثر %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "نام‌مستعار غیر مجاز: «%s»" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "نام‌مستعار «%s» ازپیش گرفته‌شده‌است. یکی دیگر را امتحان کنید." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "نام و نام مستعار شما نمی تواند یکی باشد ." @@ -442,15 +460,15 @@ msgstr "نام و نام مستعار شما نمی تواند یکی باشد . msgid "Group not found!" msgstr "گروه یافت نشد!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "شما از پیش یک عضو این گروه هستید." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "دسترسی شما به گروه توسط مدیر آن محدود شده است." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "عضویت %s در گروه %s نا موفق بود." @@ -459,7 +477,7 @@ msgstr "عضویت %s در گروه %s نا موفق بود." msgid "You are not a member of this group." msgstr "شما یک عضو این گروه نیستید." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "خارج شدن %s از گروه %s نا موفق بود" @@ -491,7 +509,7 @@ msgstr "اندازه‌ی نادرست" #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -533,7 +551,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -556,13 +574,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "حساب کاربری" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -646,12 +664,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s به روز رسانی های دوست داشتنی %s / %s" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "خط زمانی %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -687,7 +705,7 @@ msgstr "" msgid "Repeats of %s" msgstr "تکرار %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "پیام‌هایی که با %s نشانه گزاری شده اند." @@ -708,8 +726,7 @@ msgstr "چنین پیوستی وجود ندارد." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "بدون لقب." @@ -721,7 +738,7 @@ msgstr "بدون اندازه." msgid "Invalid size." msgstr "اندازه‌ی نادرست" -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "چهره" @@ -739,30 +756,30 @@ msgid "User without matching profile" msgstr "کاربر بدون مشخصات" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "تنظیمات چهره" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "اصلی" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "پیش‌نمایش" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "حذف" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "پایین‌گذاری" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "برش" @@ -770,7 +787,7 @@ msgstr "برش" msgid "Pick a square area of the image to be your avatar" msgstr "یک مربع از عکس خود را انتخاب کنید تا چهره‌ی شما باشد." -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "فایل اطلاعات خود را گم کرده ایم." @@ -806,22 +823,22 @@ msgstr "" "نخواهید شد" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "خیر" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "کاربر را مسدود نکن" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "بله" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "کاربر را مسدود کن" @@ -829,39 +846,43 @@ msgstr "کاربر را مسدود کن" msgid "Failed to save block information." msgstr "" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "چنین گروهی وجود ندارد." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s کاربران مسدود شده" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s کاربران مسدود شده، صفحه‌ی %d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "فهرستی از افراد مسدود شده در پیوستن به این گروه." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "آزاد کردن کاربر در پیوستن به گروه" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "آزاد سازی" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "آزاد سازی کاربر" @@ -940,7 +961,7 @@ msgstr "شما یک عضو این گروه نیستید." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -969,12 +990,13 @@ msgstr "این پیام را پاک نکن" msgid "Delete this application" msgstr "این پیام را پاک کن" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "شما به سیستم وارد نشده اید." @@ -1003,7 +1025,7 @@ msgstr "آیا اطمینان دارید که می‌خواهید این پیا msgid "Do not delete this notice" msgstr "این پیام را پاک نکن" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "این پیام را پاک کن" @@ -1019,7 +1041,7 @@ msgstr "شما فقط می‌توانید کاربران محلی را پاک ک msgid "Delete user" msgstr "حذف کاربر" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1027,12 +1049,12 @@ msgstr "" "آیا مطمئن هستید که می‌خواهید این کاربر را پاک کنید؟ با این کار تمام اطلاعات " "پاک و بدون برگشت خواهند بود." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "حذف این کاربر" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "طرح" @@ -1135,6 +1157,17 @@ msgstr "بازگرداندن طرح‌های پیش‌فرض" msgid "Reset back to default" msgstr "برگشت به حالت پیش گزیده" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "ذخیره‌کردن" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "ذخیره‌کردن طرح" @@ -1235,30 +1268,30 @@ msgstr "ویرایش گروه %s" msgid "You must be logged in to create a group." msgstr "برای ساخت یک گروه، باید وارد شده باشید." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "برای ویرایش گروه، باید یک مدیر باشید." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "از این روش برای ویرایش گروه استفاده کنید." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "توصیف بسیار زیاد است (حداکثر %d حرف)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "نمی‌توان گروه را به‌هنگام‌سازی کرد." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "نمی‌توان نام‌های مستعار را ساخت." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "گزینه‌ها ذخیره شدند." @@ -1596,7 +1629,7 @@ msgstr "هم اکنون دسترسی کاربر به گروه مسدود شده msgid "User is not a member of group." msgstr "کاربر عضو گروه نیست." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "دسترسی کاربر به گروه را مسدود کن" @@ -1628,87 +1661,87 @@ msgstr "" msgid "You must be logged in to edit a group." msgstr "برای ویرایش گروه باید وارد شوید." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "ظاهر گروه" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "ظاهر گروه را تغییر دهید تا شما را راضی کند." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "نمی‌توان ظاهر را به روز کرد." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "ترجیحات طرح ذخیره شد." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "نشان گروه" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "شما می‌توانید یک نشان برای گروه خود با بیشینه حجم %s بفرستید." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "کاربر بدون مشخصات" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "یک ناحیه‌ی مربع از تصویر را انتخاب کنید تا به عنوان نشان باشد." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "نشان به‌هنگام‌سازی شد." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "اشکال در ارسال نشان." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "اعضای گروه %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" msgstr "اعضای گروه %s، صفحهٔ %d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "یک فهرست از کاربران در این گروه" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "مدیر" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "بازداشتن" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "کاربر یک مدیر گروه شود" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "مدیر شود" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "این کاربر یک مدیر شود" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "به روز رسانی کابران %1$s در %2$s" @@ -1967,16 +2000,19 @@ msgstr "پیام خصوصی" msgid "Optionally add a personal message to the invitation." msgstr "اگر دوست دارید می‌توانید یک پیام به همراه دعوت نامه ارسال کنید." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "فرستادن" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s شما را دعوت کرده است که در %2$s به آن‌ها بپیوندید." -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2011,7 +2047,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "برای پیوستن به یک گروه، باید وارد شده باشید." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "بدون لقب." + +#: actions/joingroup.php:141 #, fuzzy, php-format msgid "%1$s joined group %2$s" msgstr "ملحق شدن به گروه" @@ -2020,11 +2061,11 @@ msgstr "ملحق شدن به گروه" msgid "You must be logged in to leave a group." msgstr "برای ترک یک گروه، شما باید وارد شده باشید." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "شما یک کاربر این گروه نیستید." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%s گروه %s را ترک کرد." @@ -2041,8 +2082,7 @@ msgstr "نام کاربری یا رمز عبور نادرست." msgid "Error setting user. You are probably not authorized." msgstr "خطا در تنظیم کاربر. شما احتمالا اجازه ی این کار را ندارید." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "ورود" @@ -2300,8 +2340,8 @@ msgstr "نوع محتوا " msgid "Only " msgstr " فقط" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "یک قالب دادهٔ پشتیبانی‌شده نیست." @@ -2447,7 +2487,7 @@ msgstr "نمی‌توان گذرواژه جدید را ذخیره کرد." msgid "Password saved." msgstr "گذرواژه ذخیره شد." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "مسیر ها" @@ -2480,7 +2520,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "سایت" @@ -2653,7 +2692,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "۱-۶۴ کاراکتر کوچک یا اعداد، بدون نقطه گذاری یا فاصله" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "نام‌کامل" @@ -2681,7 +2720,7 @@ msgid "Bio" msgstr "شرح‌حال" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2761,7 +2800,8 @@ msgstr "نمی‌توان شناسه را ذخیره کرد." msgid "Couldn't save tags." msgstr "نمی‌توان نشان را ذخیره کرد." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "تنظیمات ذخیره شد." @@ -2774,45 +2814,45 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "خط زمانی عمومی، صفحه‌ی %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "خط زمانی عمومی" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "اولین کسی باشید که پیام می‌فرستد!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "چرا [ثبت نام](%%action.register%%) نمی‌کنید و اولین پیام را نمی‌فرستید؟" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2821,7 +2861,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2994,8 +3034,7 @@ msgstr "با عرض تاسف، کد دعوت نا معتبر است." msgid "Registration successful" msgstr "ثبت نام با موفقیت انجام شد." -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "ثبت نام" @@ -3158,7 +3197,7 @@ msgstr "شما نمی توانید آگهی خودتان را تکرار کنی msgid "You already repeated that notice." msgstr "شما قبلا آن آگهی را تکرار کردید." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "" @@ -3166,47 +3205,47 @@ msgstr "" msgid "Repeated!" msgstr "" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "پاسخ‌های به %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "پاسخ‌های به %s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "خوراک پاسخ‌ها برای %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "خوراک پاسخ‌ها برای %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "خوراک پاسخ‌ها برای %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, fuzzy, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "این خط‌زمانی %s و دوستانش است، اما هیچ‌یک تاکنون چیزی پست نکرده‌اند." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, fuzzy, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3234,7 +3273,6 @@ msgid "User is already sandboxed." msgstr "" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3260,7 +3298,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "" @@ -3294,7 +3332,7 @@ msgstr "صفحه بندى" msgid "Description" msgstr "" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "آمار" @@ -3357,35 +3395,35 @@ msgstr "دوست داشتنی های %s" msgid "Could not retrieve favorite notices." msgstr "ناتوان در بازیابی آگهی های محبوب." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3393,7 +3431,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "این یک راه است برای به اشتراک گذاشتن آنچه که دوست دارید." @@ -3407,67 +3445,67 @@ msgstr "" msgid "%1$s group, page %2$d" msgstr "اعضای گروه %s، صفحهٔ %d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "نام های مستعار" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "اعضا" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "هیچ" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "همه ی اعضا" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "ساخته شد" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3477,7 +3515,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3486,7 +3524,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "" @@ -3945,22 +3983,22 @@ msgstr "" msgid "SMS" msgstr "" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "کاربران خود برچسب‌گذاری شده با %s - صفحهٔ %d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "" @@ -4010,7 +4048,7 @@ msgstr "" msgid "No such tag." msgstr "" -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "روش API در دست ساخت." @@ -4040,70 +4078,72 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "کاربر" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "حداکثر طول یک زندگی نامه(در پروفایل) بر حسب کاراکتر." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "خوشامدگویی کاربر جدید" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "پیام خوشامدگویی برای کاربران جدید( حداکثر 255 کاراکتر)" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "دعوت نامه ها" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "دعوت نامه ها فعال شدند" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "خواه به کاربران اجازه ی دعوت کردن کاربران جدید داده شود." @@ -4276,7 +4316,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "شخصی" @@ -4316,6 +4356,11 @@ msgstr "نمی‌توان گروه را به‌هنگام‌سازی کرد." msgid "Group leave failed." msgstr "" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "نمی‌توان گروه را به‌هنگام‌سازی کرد." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4333,27 +4378,27 @@ msgstr "پیغام نمی تواند درج گردد" msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "مشکل در ذخیره کردن پیام. بسیار طولانی." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "مشکل در ذخیره کردن پیام. کاربر نا شناخته." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "تعداد خیلی زیاد آگهی و بسیار سریع؛ استراحت کنید و مجددا دقایقی دیگر ارسال " "کنید." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4361,20 +4406,20 @@ msgstr "" "تعداد زیاد پیام های دو نسخه ای و بسرعت؛ استراحت کنید و دقایقی دیگر مجددا " "ارسال کنید." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "شما از فرستادن پست در این سایت مردود شدید ." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "مشکل در ذخیره کردن آگهی." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "مشکل در ذخیره کردن آگهی." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4403,19 +4448,29 @@ msgstr "" msgid "Couldn't delete subscription." msgstr "" -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "خوش امدید به %1$s , @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "نمیتوان گروه را تشکیل داد" -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "نمیتوان گروه را تشکیل داد" + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "" +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "نمی‌توان شناس‌نامه را ذخیره کرد." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "تنضبمات پروفيلتان را تغیر دهید" @@ -4457,132 +4512,201 @@ msgstr "صفحه ی بدون عنوان" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "خانه" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "شخصی" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "آدرس ایمیل، آواتار، کلمه ی عبور، پروفایل خود را تغییر دهید" -#: lib/action.php:444 -msgid "Connect" -msgstr "وصل‌شدن" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "حساب کاربری" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "متصل شدن به خدمات" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "وصل‌شدن" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "تغییر پیکربندی سایت" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "دعوت‌کردن" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "مدیر" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr " به شما ملحق شوند %s دوستان و همکاران را دعوت کنید تا در" -#: lib/action.php:458 -msgid "Logout" -msgstr "خروج" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "دعوت‌کردن" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "خارج شدن از سایت ." -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "خروج" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "یک حساب کاربری بسازید" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "ثبت نام" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "ورود به وب‌گاه" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "کمک" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "ورود" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "به من کمک کنید!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "جست‌وجو" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "کمک" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "جستجو برای شخص با متن" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "جست‌وجو" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "خبر سایت" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "دید محلی" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "خبر صفحه" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "کمک" + +#: lib/action.php:765 msgid "About" msgstr "دربارهٔ" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "سوال‌های رایج" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "خصوصی" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "منبع" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "تماس" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "StatusNet مجوز نرم افزار" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." "broughtby%%](%%site.broughtbyurl%%). " msgstr "" -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "" -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4590,109 +4714,162 @@ msgid "" "org/licensing/licenses/agpl-3.0.html)." msgstr "" -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "مجوز محتویات سایت" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "همه " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "مجوز." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "صفحه بندى" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "بعد از" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "قبل از" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "شما نمی توانید در این سایت تغیری ایجاد کنید" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "اجازه‌ی ثبت نام داده نشده است." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "نمی توان تنظیمات طراحی شده را پاک کرد ." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "پیکره بندی اصلی سایت" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "سایت" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "طرح" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "پیکره بندی اصلی سایت" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "کاربر" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "پیکره بندی اصلی سایت" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "دسترسی" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "مسیر ها" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "پیکره بندی اصلی سایت" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "شخصی" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4784,12 +4961,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "تغییر گذرواژه" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "تغییر گذرواژه" @@ -5067,19 +5244,19 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "" -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "شما ممکن است بخواهید نصاب را اجرا کنید تا این را تعمیر کند." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "برو به نصاب." @@ -5267,23 +5444,23 @@ msgstr "خطای سیستم ارسال فایل." msgid "Not an image or corrupt file." msgstr "تصویر یا فایل خرابی نیست" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "فرمت(فایل) عکس پشتیبانی نشده." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "فایلمان گم شده" -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "نوع فایل پشتیبانی نشده" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "مگابایت" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "کیلوبایت" @@ -5584,6 +5761,12 @@ msgstr "به" msgid "Available characters" msgstr "کاراکترهای موجود" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "فرستادن" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "یک آگهی بفرستید" @@ -5642,23 +5825,23 @@ msgstr "" msgid "at" msgstr "در" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "در زمینه" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "تکرار از" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "به این آگهی جواب دهید" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "جواب دادن" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "آگهی تکرار شد" @@ -5706,6 +5889,10 @@ msgstr "پاسخ ها" msgid "Favorites" msgstr "چیزهای مورد علاقه" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "کاربر" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "صندوق دریافتی" @@ -5796,7 +5983,7 @@ msgstr "به این آگهی جواب دهید" msgid "Repeat this notice" msgstr "" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5816,6 +6003,10 @@ msgstr "جست‌وجوی وب‌گاه" msgid "Keyword(s)" msgstr "کلمه(های) کلیدی" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "جست‌وجو" + #: lib/searchaction.php:162 msgid "Search help" msgstr "راهنمای جستجو" @@ -5867,6 +6058,15 @@ msgstr "" msgid "Groups %s is a member of" msgstr "هست عضو %s گروه" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "دعوت‌کردن" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr " به شما ملحق شوند %s دوستان و همکاران را دعوت کنید تا در" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -5937,47 +6137,47 @@ msgstr "پیام" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "چند ثانیه پیش" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "حدود یک دقیقه پیش" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "حدود %d دقیقه پیش" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "حدود یک ساعت پیش" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "حدود %d ساعت پیش" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "حدود یک روز پیش" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "حدود %d روز پیش" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "حدود یک ماه پیش" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "حدود %d ماه پیش" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "حدود یک سال پیش" diff --git a/locale/fi/LC_MESSAGES/statusnet.po b/locale/fi/LC_MESSAGES/statusnet.po index b92edf111..97ab7038b 100644 --- a/locale/fi/LC_MESSAGES/statusnet.po +++ b/locale/fi/LC_MESSAGES/statusnet.po @@ -10,82 +10,88 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:33+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:42+0000\n" "Language-Team: Finnish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fi\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "Hyväksy" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Profiilikuva-asetukset" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Rekisteröidy" -#: actions/accessadminpanel.php:161 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 #, fuzzy +msgctxt "LABEL" msgid "Private" msgstr "Yksityisyys" -#: actions/accessadminpanel.php:163 -msgid "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:167 +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 #, fuzzy msgid "Invite only" msgstr "Kutsu" -#: actions/accessadminpanel.php:169 -msgid "Make registration invitation only." +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:173 +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 #, fuzzy msgid "Closed" msgstr "Estä" -#: actions/accessadminpanel.php:175 -msgid "Disable new registrations." -msgstr "" - -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Tallenna" - -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Profiilikuva-asetukset" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Tallenna" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Sivua ei ole." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -99,45 +105,53 @@ msgstr "Sivua ei ole." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Käyttäjää ei ole." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s ja kaverit, sivu %d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s ja kaverit" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Käyttäjän %s kavereiden syöte (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Käyttäjän %s kavereiden syöte (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Käyttäjän %s kavereiden syöte (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." @@ -145,7 +159,7 @@ msgstr "" "Tämä on käyttäjän %s ja kavereiden aikajana, mutta kukaan ei ole lähettyänyt " "vielä mitään." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -154,7 +168,8 @@ msgstr "" "Kokeile useamman käyttäjän tilaamista, [liity ryhmään] (%%action.groups%%) " "tai lähetä päivitys itse." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, fuzzy, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -163,14 +178,15 @@ msgstr "" "Ole ensimmäinen joka [lähettää päivityksen tästä aiheesta] (%%%%action." "newnotice%%%%?status_textarea=%s)!" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Sinä ja kaverit" @@ -188,20 +204,20 @@ msgstr "Käyttäjän %1$s ja kavereiden päivitykset palvelussa %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "API-metodia ei löytynyt!" @@ -235,8 +251,9 @@ msgstr "Ei voitu päivittää käyttäjää." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Käyttäjällä ei ole profiilia." @@ -261,7 +278,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 #, fuzzy @@ -380,7 +397,7 @@ msgstr "Julkista päivitysvirtaa ei saatu." msgid "Could not find target user." msgstr "Ei löytynyt yhtään päivitystä." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -388,62 +405,62 @@ msgstr "" "Käyttäjätunnuksessa voi olla ainoastaan pieniä kirjaimia ja numeroita ilman " "välilyöntiä." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Tunnus on jo käytössä. Yritä toista tunnusta." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Tuo ei ole kelvollinen tunnus." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Kotisivun verkko-osoite ei ole toimiva." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Koko nimi on liian pitkä (max 255 merkkiä)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." msgstr "kuvaus on liian pitkä (max 140 merkkiä)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Kotipaikka on liian pitkä (max 255 merkkiä)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Liikaa aliaksia. Maksimimäärä on %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Virheellinen alias: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Alias \"%s\" on jo käytössä. Yritä toista aliasta." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Alias ei voi olla sama kuin ryhmätunnus." @@ -454,15 +471,15 @@ msgstr "Alias ei voi olla sama kuin ryhmätunnus." msgid "Group not found!" msgstr "Ryhmää ei löytynyt!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Sinä kuulut jo tähän ryhmään." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Sinut on estetty osallistumasta tähän ryhmään ylläpitäjän toimesta." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Käyttäjä %s ei voinut liittyä ryhmään %s." @@ -471,7 +488,7 @@ msgstr "Käyttäjä %s ei voinut liittyä ryhmään %s." msgid "You are not a member of this group." msgstr "Sinä et kuulu tähän ryhmään." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Ei voitu poistaa käyttäjää %s ryhmästä %s" @@ -503,7 +520,7 @@ msgstr "Koko ei kelpaa." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -549,7 +566,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -572,13 +589,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Käyttäjätili" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -664,12 +681,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr " Palvelun %s päivitykset, jotka %s / %s on merkinnyt suosikikseen." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s aikajana" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -706,7 +723,7 @@ msgstr "Vastaukset käyttäjälle %s" msgid "Repeats of %s" msgstr "Vastaukset käyttäjälle %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Päivitykset joilla on tagi %s" @@ -727,8 +744,7 @@ msgstr "Liitettä ei ole." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Tunnusta ei ole." @@ -740,7 +756,7 @@ msgstr "Kokoa ei ole." msgid "Invalid size." msgstr "Koko ei kelpaa." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Kuva" @@ -757,30 +773,30 @@ msgid "User without matching profile" msgstr "Käyttäjälle ei löydy profiilia" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Profiilikuva-asetukset" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Alkuperäinen" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Esikatselu" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Poista" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Lataa" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Rajaa" @@ -788,7 +804,7 @@ msgstr "Rajaa" msgid "Pick a square area of the image to be your avatar" msgstr "Valitse neliön muotoinen alue kuvasta profiilikuvaksi" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Tiedoston data hävisi." @@ -821,22 +837,22 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Ei" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Älä estä tätä käyttäjää" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Kyllä" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Estä tämä käyttäjä" @@ -844,39 +860,43 @@ msgstr "Estä tämä käyttäjä" msgid "Failed to save block information." msgstr "Käyttäjän estotiedon tallennus epäonnistui." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Tuota ryhmää ei ole." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "Käyttäjän profiili" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s ja kaverit, sivu %d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Lista käyttäjistä, jotka ovat estetty liittymästä tähän ryhmään." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Poista käyttäjän esto ryhmästä" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Poista esto" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Poista esto tältä käyttäjältä" @@ -957,7 +977,7 @@ msgstr "Sinä et kuulu tähän ryhmään." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Istuntoavaimesi kanssa oli ongelma." @@ -983,12 +1003,13 @@ msgstr "Älä poista tätä päivitystä" msgid "Delete this application" msgstr "Poista tämä päivitys" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Et ole kirjautunut sisään." @@ -1017,7 +1038,7 @@ msgstr "Oletko varma että haluat poistaa tämän päivityksen?" msgid "Do not delete this notice" msgstr "Älä poista tätä päivitystä" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Poista tämä päivitys" @@ -1034,19 +1055,19 @@ msgstr "Et voi poistaa toisen käyttäjän päivitystä." msgid "Delete user" msgstr "Poista käyttäjä" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" msgstr "Poista tämä päivitys" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Ulkoasu" @@ -1154,6 +1175,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Tallenna" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1257,30 +1289,30 @@ msgstr "Muokkaa ryhmää %s" msgid "You must be logged in to create a group." msgstr "Sinun pitää olla kirjautunut sisään jotta voit luoda ryhmän." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "Sinun pitää olla ylläpitäjä, jotta voit muokata ryhmää" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Käytä tätä lomaketta muokataksesi ryhmää." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "kuvaus on liian pitkä (max %d merkkiä)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Ei voitu päivittää ryhmää." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Ei voitu lisätä aliasta." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Asetukset tallennettu." @@ -1627,7 +1659,7 @@ msgstr "Käyttäjä on asettanut eston sinulle." msgid "User is not a member of group." msgstr "Käyttäjä ei kuulu tähän ryhmään." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Estä käyttäjä ryhmästä" @@ -1661,87 +1693,87 @@ msgid "You must be logged in to edit a group." msgstr "" "Sinun pitää olla kirjautunut sisään, jotta voit muuttaa ryhmän tietoja." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Ryhmän ulkoasu" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Ei voitu päivittää sinun sivusi ulkoasua." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Ulkoasuasetukset tallennettu." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Ryhmän logo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "Voit ladata ryhmälle logokuvan. Maksimikoko on %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Käyttäjälle ei löydy profiilia" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Valitse neliön muotoinen alue kuvasta logokuvaksi" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo päivitetty." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Logon päivittäminen epäonnistui." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Ryhmän %s jäsenet" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" msgstr "Ryhmän %s jäsenet, sivu %d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Lista ryhmän käyttäjistä." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Ylläpito" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Estä" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Tee tästä käyttäjästä ylläpitäjä" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Tee ylläpitäjäksi" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Tee tästä käyttäjästä ylläpitäjä" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Ryhmän %1$s käyttäjien päivitykset palvelussa %2$s!" @@ -2002,16 +2034,19 @@ msgstr "Henkilökohtainen viesti" msgid "Optionally add a personal message to the invitation." msgstr "Voit myös lisätä oman viestisi kutsuun" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Lähetä" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s on kutsunut sinut liittymään palveluun %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2071,7 +2106,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Sinun pitää olla kirjautunut sisään, jos haluat liittyä ryhmään." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Tunnusta ei ole." + +#: actions/joingroup.php:141 #, fuzzy, php-format msgid "%1$s joined group %2$s" msgstr "%s liittyi ryhmään %s" @@ -2080,11 +2120,11 @@ msgstr "%s liittyi ryhmään %s" msgid "You must be logged in to leave a group." msgstr "Sinun pitää olla kirjautunut sisään, jotta voit erota ryhmästä." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Sinä et kuulu tähän ryhmään." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%s erosi ryhmästä %s" @@ -2102,8 +2142,7 @@ msgstr "Väärä käyttäjätunnus tai salasana" msgid "Error setting user. You are probably not authorized." msgstr "Sinulla ei ole valtuutusta tähän." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Kirjaudu sisään" @@ -2364,8 +2403,8 @@ msgstr "Yhdistä" msgid "Only " msgstr "Vain " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Tuo ei ole tuettu tietomuoto." @@ -2511,7 +2550,7 @@ msgstr "Uutta salasanaa ei voida tallentaa." msgid "Password saved." msgstr "Salasana tallennettu." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Polut" @@ -2544,7 +2583,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 #, fuzzy msgid "Site" msgstr "Kutsu" @@ -2732,7 +2770,7 @@ msgstr "" "välilyöntejä" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Koko nimi" @@ -2760,7 +2798,7 @@ msgid "Bio" msgstr "Tietoja" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2845,7 +2883,8 @@ msgstr "Ei voitu tallentaa profiilia." msgid "Couldn't save tags." msgstr "Tageja ei voitu tallentaa." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Asetukset tallennettu." @@ -2858,45 +2897,45 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "Julkista päivitysvirtaa ei saatu." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Julkinen aikajana, sivu %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Julkinen aikajana" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Julkinen syöte (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Julkisen Aikajanan Syöte (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Julkinen syöte (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Ole ensimmäinen joka lähettää päivityksen!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2905,7 +2944,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, fuzzy, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3082,8 +3121,7 @@ msgstr "Virheellinen kutsukoodin." msgid "Registration successful" msgstr "Rekisteröityminen onnistui" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Rekisteröidy" @@ -3278,7 +3316,7 @@ msgstr "Et voi rekisteröityä, jos et hyväksy lisenssiehtoja." msgid "You already repeated that notice." msgstr "Sinä olet jo estänyt tämän käyttäjän." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "Luotu" @@ -3288,33 +3326,33 @@ msgstr "Luotu" msgid "Repeated!" msgstr "Luotu" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Vastaukset käyttäjälle %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "Viesti käyttäjälle %1$s, %2$s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Päivityksien syöte käyttäjälle %s" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Päivityksien syöte käyttäjälle %s" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Päivityksien syöte käyttäjälle %s" -#: actions/replies.php:198 +#: actions/replies.php:199 #, fuzzy, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3323,14 +3361,14 @@ msgstr "" "Tämä on käyttäjän %s aikajana, mutta %s ei ole lähettänyt vielä yhtään " "päivitystä." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, fuzzy, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3360,7 +3398,6 @@ msgid "User is already sandboxed." msgstr "Käyttäjä on asettanut eston sinulle." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3386,7 +3423,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "Profiilikuva-asetukset" @@ -3421,7 +3458,7 @@ msgstr "Sivutus" msgid "Description" msgstr "Kuvaus" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Tilastot" @@ -3483,35 +3520,35 @@ msgstr "Käyttäjän %s suosikkipäivitykset" msgid "Could not retrieve favorite notices." msgstr "Ei saatu haettua suosikkipäivityksiä." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Käyttäjän %s kavereiden syöte (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Käyttäjän %s kavereiden syöte (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Käyttäjän %s kavereiden syöte (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3519,7 +3556,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3533,67 +3570,67 @@ msgstr "Ryhmä %s" msgid "%1$s group, page %2$d" msgstr "Ryhmän %s jäsenet, sivu %d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Ryhmän profiili" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Huomaa" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Aliakset" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Ryhmän toiminnot" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Syöte ryhmän %s päivityksille (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Syöte ryhmän %s päivityksille (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Syöte ryhmän %s päivityksille (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "Käyttäjän %s lähetetyt viestit" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Jäsenet" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Tyhjä)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Kaikki jäsenet" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Luotu" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3603,7 +3640,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, fuzzy, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3614,7 +3651,7 @@ msgstr "" "**%s** on ryhmä palvelussa %%%%site.name%%%%, joka on [mikroblogauspalvelu]" "(http://en.wikipedia.org/wiki/Micro-blogging)" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Ylläpitäjät" @@ -4085,22 +4122,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Käyttäjät joilla henkilötagi %s - sivu %d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Päivityksien syöte käyttäjälle %s" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Päivityksien syöte käyttäjälle %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Päivityksien syöte käyttäjälle %s" @@ -4157,7 +4194,7 @@ msgstr "" msgid "No such tag." msgstr "Tuota tagia ei ole." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API-metodi on työn alla!" @@ -4190,77 +4227,79 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Käyttäjä" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profiili" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 #, fuzzy msgid "New users" msgstr "Kutsu uusia käyttäjiä" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "Kaikki tilaukset" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "" "Tilaa automaattisesti kaikki, jotka tilaavat päivitykseni (ei sovi hyvin " "ihmiskäyttäjille)" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "Kutsu(t) lähetettiin" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 #, fuzzy msgid "Invitations enabled" msgstr "Kutsu(t) lähetettiin" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4446,7 +4485,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Omat" @@ -4487,6 +4526,11 @@ msgstr "Ei voitu päivittää ryhmää." msgid "Group leave failed." msgstr "Ryhmän profiili" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Ei voitu päivittää ryhmää." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4505,28 +4549,28 @@ msgstr "Viestin tallennus ei onnistunut." msgid "Could not update message with new URI." msgstr "Viestin päivittäminen uudella URI-osoitteella ei onnistunut." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Tietokantavirhe tallennettaessa risutagiä: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "Ongelma päivityksen tallentamisessa." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Virhe tapahtui päivityksen tallennuksessa. Tuntematon käyttäjä." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Liian monta päivitystä liian nopeasti; pidä pieni hengähdystauko ja jatka " "päivityksien lähettämista muutaman minuutin päästä." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4534,20 +4578,20 @@ msgstr "" "Liian monta päivitystä liian nopeasti; pidä pieni hengähdystauko ja jatka " "päivityksien lähettämista muutaman minuutin päästä." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Päivityksesi tähän palveluun on estetty." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Ongelma päivityksen tallentamisessa." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Ongelma päivityksen tallentamisessa." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -4579,19 +4623,29 @@ msgstr "Ei voitu poistaa tilausta." msgid "Couldn't delete subscription." msgstr "Ei voitu poistaa tilausta." -#: classes/User.php:372 +#: classes/User.php:373 #, fuzzy, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Viesti käyttäjälle %1$s, %2$s" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Ryhmän luonti ei onnistunut." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Ryhmän jäsenyystietoja ei voitu asettaa." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Ryhmän jäsenyystietoja ei voitu asettaa." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Tilausta ei onnistuttu tallentamaan." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Vaihda profiiliasetuksesi" @@ -4634,123 +4688,191 @@ msgstr "Nimetön sivu" msgid "Primary site navigation" msgstr "Ensisijainen sivunavigointi" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Koti" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Henkilökohtainen profiili ja kavereiden aikajana" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Omat" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Muuta sähköpostiosoitettasi, kuvaasi, salasanaasi, profiiliasi" -#: lib/action.php:444 -msgid "Connect" -msgstr "Yhdistä" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Käyttäjätili" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Ei voitu uudelleenohjata palvelimelle: %s" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Yhdistä" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 #, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Ensisijainen sivunavigointi" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Kutsu" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Ylläpito" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Kutsu kavereita ja työkavereita liittymään palveluun %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Kirjaudu ulos" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Kutsu" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Kirjaudu ulos palvelusta" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Kirjaudu ulos" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Luo uusi käyttäjätili" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Rekisteröidy" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Kirjaudu sisään palveluun" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Ohjeet" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Kirjaudu sisään" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Auta minua!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Haku" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Ohjeet" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Hae ihmisiä tai tekstiä" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Haku" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Palvelun ilmoitus" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Paikalliset näkymät" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Sivuilmoitus" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Toissijainen sivunavigointi" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Ohjeet" + +#: lib/action.php:765 msgid "About" msgstr "Tietoa" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "UKK" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Yksityisyys" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Lähdekoodi" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Ota yhteyttä" -#: lib/action.php:751 +#: lib/action.php:782 #, fuzzy msgid "Badge" msgstr "Tönäise" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "StatusNet-ohjelmiston lisenssi" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4759,12 +4881,12 @@ msgstr "" "**%%site.name%%** on mikroblogipalvelu, jonka tarjoaa [%%site.broughtby%%](%%" "site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** on mikroblogipalvelu. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4775,117 +4897,170 @@ msgstr "" "versio %s, saatavilla lisenssillä [GNU Affero General Public License](http://" "www.fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "StatusNet-ohjelmiston lisenssi" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Kaikki " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "lisenssi." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Sivutus" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Myöhemmin" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Aiemmin" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 #, fuzzy msgid "You cannot make changes to this site." msgstr "Et voi lähettää viestiä tälle käyttäjälle." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "Rekisteröityminen ei ole sallittu." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 #, fuzzy msgid "showForm() not implemented." msgstr "Komentoa ei ole vielä toteutettu." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 #, fuzzy msgid "saveSettings() not implemented." msgstr "Komentoa ei ole vielä toteutettu." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 #, fuzzy msgid "Unable to delete design setting." msgstr "Twitter-asetuksia ei voitu tallentaa!" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "Sähköpostiosoitteen vahvistus" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Kutsu" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "SMS vahvistus" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Ulkoasu" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "SMS vahvistus" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Käyttäjä" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "SMS vahvistus" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Hyväksy" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "SMS vahvistus" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Polut" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "SMS vahvistus" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Omat" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4981,12 +5156,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Salasanan vaihto" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Salasanan vaihto" @@ -5267,20 +5442,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "Varmistuskoodia ei ole annettu." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 #, fuzzy msgid "Go to the installer." msgstr "Kirjaudu sisään palveluun" @@ -5475,23 +5650,23 @@ msgstr "Tiedoston lähetyksessä tapahtui järjestelmävirhe." msgid "Not an image or corrupt file." msgstr "Tuo ei ole kelvollinen kuva tai tiedosto on rikkoutunut." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Kuvatiedoston formaattia ei ole tuettu." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Tiedosto hävisi." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Tunnistamaton tiedoston tyyppi" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5806,6 +5981,12 @@ msgstr "Vastaanottaja" msgid "Available characters" msgstr "Sallitut merkit" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Lähetä" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Lähetä päivitys" @@ -5865,25 +6046,25 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 #, fuzzy msgid "in context" msgstr "Ei sisältöä!" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "Luotu" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Vastaa tähän päivitykseen" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Vastaus" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Päivitys on poistettu." @@ -5933,6 +6114,10 @@ msgstr "Vastaukset" msgid "Favorites" msgstr "Suosikit" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Käyttäjä" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Saapuneet" @@ -6027,7 +6212,7 @@ msgstr "Vastaa tähän päivitykseen" msgid "Repeat this notice" msgstr "Vastaa tähän päivitykseen" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -6050,6 +6235,10 @@ msgstr "Haku" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Haku" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -6104,6 +6293,15 @@ 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/subgroupnav.php:105 +msgid "Invite" +msgstr "Kutsu" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Kutsu kavereita ja työkavereita liittymään palveluun %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6178,47 +6376,47 @@ msgstr "Viesti" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "muutama sekunti sitten" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "noin minuutti sitten" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "noin %d minuuttia sitten" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "noin tunti sitten" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "noin %d tuntia sitten" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "noin päivä sitten" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "noin %d päivää sitten" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "noin kuukausi sitten" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "noin %d kuukautta sitten" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "noin vuosi sitten" diff --git a/locale/fr/LC_MESSAGES/statusnet.po b/locale/fr/LC_MESSAGES/statusnet.po index cf0cc849b..68e210ff1 100644 --- a/locale/fr/LC_MESSAGES/statusnet.po +++ b/locale/fr/LC_MESSAGES/statusnet.po @@ -14,75 +14,82 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:48+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:48+0000\n" "Language-Team: French\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Accès" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Paramètres d’accès au site" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Inscription" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Privé" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "Interdire aux utilisateurs anonymes (non connectés) de voir le site ?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Sur invitation uniquement" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Privé" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Autoriser l’inscription sur invitation seulement." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Fermé" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Sur invitation uniquement" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Désactiver les nouvelles inscriptions." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Enregistrer" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Fermé" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Sauvegarder les paramètres d’accès" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Enregistrer" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Page non trouvée" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -96,45 +103,53 @@ msgstr "Page non trouvée" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Utilisateur non trouvé." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s et ses amis, page %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s et ses amis" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Flux pour les amis de %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Flux pour les amis de %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Flux pour les amis de %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." @@ -142,7 +157,7 @@ msgstr "" "Ceci est le flux pour %s et ses amis mais personne n’a rien posté pour le " "moment." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -151,7 +166,8 @@ msgstr "" "Essayez de vous abonner à plus d’utilisateurs, de vous [inscrire à un groupe]" "(%%action.groups%%) ou de poster quelque chose vous-même." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -161,7 +177,7 @@ msgstr "" "profil ou [poster quelque chose à son intention](%%%%action.newnotice%%%%?" "status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -170,7 +186,8 @@ msgstr "" "Pourquoi ne pas [créer un compte](%%%%action.register%%%%) et ensuite faire " "un clin d’œil à %s ou poster un avis à son intention." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Vous et vos amis" @@ -188,20 +205,20 @@ msgstr "Statuts de %1$s et ses amis dans %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "Méthode API non trouvée !" @@ -235,8 +252,9 @@ msgstr "Impossible de mettre à jour l’utilisateur." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Aucun profil ne correspond à cet utilisateur." @@ -262,7 +280,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -374,7 +392,7 @@ msgstr "Impossible de déterminer l’utilisateur source." msgid "Could not find target user." msgstr "Impossible de trouver l’utilisateur cible." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -382,62 +400,62 @@ msgstr "" "Les pseudos ne peuvent contenir que des caractères minuscules et des " "chiffres, sans espaces." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Pseudo déjà utilisé. Essayez-en un autre." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Pseudo invalide." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "L’adresse du site personnel n’est pas un URL valide. " -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Nom complet trop long (maximum de 255 caractères)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "La description est trop longue (%d caractères maximum)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Emplacement trop long (maximum de 255 caractères)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Trop d’alias ! Maximum %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Alias invalide : « %s »" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Alias « %s » déjà utilisé. Essayez-en un autre." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "L’alias ne peut pas être le même que le pseudo." @@ -448,15 +466,15 @@ msgstr "L’alias ne peut pas être le même que le pseudo." msgid "Group not found!" msgstr "Groupe non trouvé !" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Vous êtes déjà membre de ce groupe." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Vous avez été bloqué de ce groupe par l’administrateur." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Impossible de joindre l’utilisateur %1$s au groupe %2$s." @@ -465,7 +483,7 @@ msgstr "Impossible de joindre l’utilisateur %1$s au groupe %2$s." msgid "You are not a member of this group." msgstr "Vous n’êtes pas membre de ce groupe." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Impossible de retirer l’utilisateur %1$s du groupe %2$s." @@ -496,7 +514,7 @@ msgstr "Jeton incorrect." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -544,7 +562,7 @@ msgstr "Le jeton de connexion %s a été refusé et révoqué." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -572,13 +590,13 @@ msgstr "" "devriez donner l’accès à votre compte %4$s qu’aux tiers à qui vous faites " "confiance." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Compte" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -662,12 +680,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s statuts favoris de %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Activité de %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -703,7 +721,7 @@ msgstr "Repris pour %s" msgid "Repeats of %s" msgstr "Reprises de %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Avis marqués avec %s" @@ -724,8 +742,7 @@ msgstr "Pièce jointe non trouvée." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Aucun pseudo." @@ -737,7 +754,7 @@ msgstr "Aucune taille" msgid "Invalid size." msgstr "Taille incorrecte." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -756,30 +773,30 @@ msgid "User without matching profile" msgstr "Utilisateur sans profil correspondant" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Paramètres de l’avatar" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Image originale" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Aperçu" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Supprimer" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Transfert" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Recadrer" @@ -787,7 +804,7 @@ msgstr "Recadrer" msgid "Pick a square area of the image to be your avatar" msgstr "Sélectionnez une zone de forme carrée pour définir votre avatar" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Données perdues." @@ -822,22 +839,22 @@ msgstr "" "serez pas informé des @-réponses de sa part." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Non" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Ne pas bloquer cet utilisateur" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Oui" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Bloquer cet utilisateur" @@ -845,39 +862,43 @@ msgstr "Bloquer cet utilisateur" msgid "Failed to save block information." msgstr "Impossible d’enregistrer les informations de blocage." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Aucun groupe trouvé." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s profils bloqués" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s profils bloqués, page %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Une liste des utilisateurs dont l’inscription à ce groupe est bloquée." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Débloquer l’utilisateur de ce groupe" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Débloquer" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Débloquer cet utilisateur" @@ -952,7 +973,7 @@ msgstr "Vous n’êtes pas le propriétaire de cette application." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Un problème est survenu avec votre jeton de session." @@ -978,12 +999,13 @@ msgstr "Ne pas supprimer cette application" msgid "Delete this application" msgstr "Supprimer cette application" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Non connecté." @@ -1012,7 +1034,7 @@ msgstr "Voulez-vous vraiment supprimer cet avis ?" msgid "Do not delete this notice" msgstr "Ne pas supprimer cet avis" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Supprimer cet avis" @@ -1028,7 +1050,7 @@ msgstr "Vous pouvez seulement supprimer les utilisateurs locaux." msgid "Delete user" msgstr "Supprimer l’utilisateur" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1036,12 +1058,12 @@ msgstr "" "Voulez-vous vraiment supprimer cet utilisateur ? Ceci effacera toutes les " "données à son propos de la base de données, sans sauvegarde." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Supprimer cet utilisateur" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Conception" @@ -1144,6 +1166,17 @@ msgstr "Restaurer les conceptions par défaut" msgid "Reset back to default" msgstr "Revenir aux valeurs par défaut" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Enregistrer" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Sauvegarder la conception" @@ -1235,29 +1268,29 @@ msgstr "Modifier le groupe %s" msgid "You must be logged in to create a group." msgstr "Vous devez ouvrir une session pour créer un groupe." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Vous devez être administrateur pour modifier le groupe." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Remplissez ce formulaire pour modifier les options du groupe." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "la description est trop longue (%d caractères maximum)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Impossible de mettre à jour le groupe." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Impossible de créer les alias." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Vos options ont été enregistrées." @@ -1598,7 +1631,7 @@ msgstr "Cet utilisateur est déjà bloqué pour le groupe." msgid "User is not a member of group." msgstr "L’utilisateur n’est pas membre du groupe." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Bloquer cet utilisateur du groupe" @@ -1634,11 +1667,11 @@ msgstr "Aucun identifiant." msgid "You must be logged in to edit a group." msgstr "Vous devez ouvrir une session pour modifier un groupe." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Conception du groupe" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1646,20 +1679,20 @@ msgstr "" "Personnalisez l’apparence de votre groupe avec une image d’arrière plan et " "une palette de couleurs de votre choix" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Impossible de mettre à jour votre conception." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Préférences de conception enregistrées." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Logo du groupe" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1667,57 +1700,57 @@ msgstr "" "Vous pouvez choisir un logo pour votre groupe. La taille maximale du fichier " "est de %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Utilisateur sans profil correspondant." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Sélectionnez une zone de forme carrée sur l’image qui sera le logo." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo mis à jour." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "La mise à jour du logo a échoué." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Membres du groupe %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "Membres du groupe %1$s - page %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Liste des utilisateurs inscrits à ce groupe." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Administrer" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Bloquer" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Faire de cet utilisateur un administrateur du groupe" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Faire un administrateur" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Faire de cet utilisateur un administrateur" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Mises à jour des membres de %1$s dans %2$s !" @@ -1988,16 +2021,19 @@ msgstr "Message personnel" msgid "Optionally add a personal message to the invitation." msgstr "Ajouter un message personnel à l’invitation (optionnel)." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Envoyer" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s vous invite à vous inscrire sur %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2060,7 +2096,11 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Vous devez ouvrir une session pour rejoindre un groupe." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "Aucun pseudo ou ID." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s a rejoint le groupe %2$s" @@ -2069,11 +2109,11 @@ msgstr "%1$s a rejoint le groupe %2$s" msgid "You must be logged in to leave a group." msgstr "Vous devez ouvrir une session pour quitter un groupe." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Vous n’êtes pas membre de ce groupe." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s a quitté le groupe %2$s" @@ -2092,8 +2132,7 @@ msgstr "" "Erreur lors de la mise en place de l’utilisateur. Vous n’y êtes probablement " "pas autorisé." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Ouvrir une session" @@ -2355,8 +2394,8 @@ msgstr "type de contenu " msgid "Only " msgstr "Seulement " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Format de données non supporté." @@ -2496,7 +2535,7 @@ msgstr "Impossible de sauvegarder le nouveau mot de passe." msgid "Password saved." msgstr "Mot de passe enregistré." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Chemins" @@ -2529,7 +2568,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Serveur SSL invalide. La longueur maximale est de 255 caractères." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Site" @@ -2704,7 +2742,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1 à 64 lettres minuscules ou chiffres, sans ponctuation ni espaces" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Nom complet" @@ -2732,7 +2770,7 @@ msgid "Bio" msgstr "Bio" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2816,7 +2854,8 @@ msgstr "Impossible d’enregistrer le profil." msgid "Couldn't save tags." msgstr "Impossible d’enregistrer les marques." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Préférences enregistrées." @@ -2829,28 +2868,28 @@ msgstr "Au-delà de la limite de page (%s)" msgid "Could not retrieve public stream." msgstr "Impossible de récupérer le flux public." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Flux public - page %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Flux public" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Fil du flux public (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Fil du flux public (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Fil du flux public (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2859,11 +2898,11 @@ msgstr "" "Ceci est la chronologie publique de %%site.name%% mais personne n’a encore " "rien posté." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Soyez le premier à poster !" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2871,7 +2910,7 @@ msgstr "" "Pourquoi ne pas [créer un compte](%%action.register%%) et être le premier à " "poster !" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2885,7 +2924,7 @@ msgstr "" "vous avec vos amis, famille et collègues ! ([Plus d’informations](%%doc.help%" "%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3067,8 +3106,7 @@ msgstr "Désolé, code d’invitation invalide." msgid "Registration successful" msgstr "Compte créé avec succès" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Créer un compte" @@ -3256,7 +3294,7 @@ msgstr "Vous ne pouvez pas reprendre votre propre avis." msgid "You already repeated that notice." msgstr "Vous avez déjà repris cet avis." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Repris" @@ -3264,33 +3302,33 @@ msgstr "Repris" msgid "Repeated!" msgstr "Repris !" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Réponses à %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Réponses à %1$s, page %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Flux des réponses pour %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Flux des réponses pour %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Flux des réponses pour %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3299,7 +3337,7 @@ msgstr "" "Ceci est la chronologie des réponses à %1$s mais %2$s n’a encore reçu aucun " "avis à son intention." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3309,7 +3347,7 @@ msgstr "" "abonner à plus de personnes ou vous [inscrire à des groupes](%%action.groups%" "%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3338,7 +3376,6 @@ msgid "User is already sandboxed." msgstr "L’utilisateur est déjà dans le bac à sable." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Sessions" @@ -3363,7 +3400,7 @@ msgid "Turn on debugging output for sessions." msgstr "Activer la sortie de déboguage pour les sessions." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Sauvegarder les paramètres du site" @@ -3393,7 +3430,7 @@ msgstr "Organisation" msgid "Description" msgstr "Description" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statistiques" @@ -3456,22 +3493,22 @@ msgstr "Avis favoris de %1$s, page %2$d" msgid "Could not retrieve favorite notices." msgstr "Impossible d’afficher les favoris." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Flux pour les amis de %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Flux pour les amis de %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Flux pour les amis de %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3480,7 +3517,7 @@ msgstr "" "favori sur les avis que vous aimez pour les mémoriser à l’avenir ou les " "mettre en lumière." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3489,7 +3526,7 @@ msgstr "" "%s n’a pas ajouté d’avis à ses favoris pour le moment. Publiez quelque chose " "d’intéressant, et cela pourrait être ajouté à ses favoris :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3500,7 +3537,7 @@ msgstr "" "un compte](%%%%action.register%%%%), puis poster quelque chose " "d’intéressant, qui serait ajouté à ses favoris :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "C’est un moyen de partager ce que vous aimez." @@ -3514,67 +3551,67 @@ msgstr "Groupe %s" msgid "%1$s group, page %2$d" msgstr "Groupe %1$s, page %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Profil du groupe" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Note" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Alias" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Actions du groupe" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Fil des avis du groupe %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Fil des avis du groupe %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Fil des avis du groupe %s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "ami d’un ami pour le groupe %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Membres" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(aucun)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Tous les membres" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Créé" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3590,7 +3627,7 @@ msgstr "" "action.register%%%%) pour devenir membre de ce groupe et bien plus ! ([En " "lire plus](%%%%doc.help%%%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3603,7 +3640,7 @@ msgstr "" "logiciel libre [StatusNet](http://status.net/). Ses membres partagent des " "messages courts à propos de leur vie et leurs intérêts. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Administrateurs" @@ -3984,17 +4021,17 @@ msgstr "Impossible d’enregistrer l’abonnement." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." -msgstr "" +msgstr "Cette action n'accepte que les requêtes de type POST." #: actions/subscribe.php:107 -#, fuzzy msgid "No such profile." -msgstr "Fichier non trouvé." +msgstr "Profil 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." +msgstr "" +"Vous ne pouvez pas vous abonner à un profil OMB 0.1 distant par cette " +"action." #: actions/subscribe.php:145 msgid "Subscribed" @@ -4089,22 +4126,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Avis marqués avec %1$s, page %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Flux des avis pour la marque %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Flux des avis pour la marque %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Flux des avis pour la marque %s (Atom)" @@ -4159,7 +4196,7 @@ msgstr "" msgid "No such tag." msgstr "Cette marque n’existe pas." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Méthode API en construction." @@ -4191,71 +4228,73 @@ msgstr "" "La licence du flux auquel vous êtes abonné(e), « %1$s », n’est pas compatible " "avec la licence du site « %2$s »." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Utilisateur" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Paramètres des utilisateurs pour ce site StatusNet." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Limite de bio invalide : doit être numérique." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "Texte de bienvenue invalide. La taille maximale est de 255 caractères." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Abonnement par défaut invalide : « %1$s » n’est pas un utilisateur." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Limite de bio" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Longueur maximale de la bio d’un profil en caractères." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Nouveaux utilisateurs" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Accueil des nouveaux utilisateurs" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" "Texte de bienvenue pour les nouveaux utilisateurs (maximum 255 caractères)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Abonnements par défaut" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Abonner automatiquement les nouveaux utilisateurs à cet utilisateur." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Invitations" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Invitations activées" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" "S’il faut autoriser les utilisateurs à inviter de nouveaux utilisateurs." @@ -4455,7 +4494,7 @@ msgstr "" msgid "Plugins" msgstr "Extensions" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Version" @@ -4494,6 +4533,10 @@ msgstr "N’appartient pas au groupe." msgid "Group leave failed." msgstr "La désinscription du groupe a échoué." +#: classes/Local_group.php:41 +msgid "Could not update local group." +msgstr "Impossible de mettre à jour le groupe local." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4511,27 +4554,27 @@ msgstr "Impossible d’insérer le message." msgid "Could not update message with new URI." msgstr "Impossible de mettre à jour le message avec un nouvel URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Erreur de base de donnée en insérant la marque (hashtag) : %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Problème lors de l’enregistrement de l’avis ; trop long." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Erreur lors de l’enregistrement de l’avis. Utilisateur inconnu." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Trop d’avis, trop vite ! Faites une pause et publiez à nouveau dans quelques " "minutes." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4539,19 +4582,19 @@ msgstr "" "Trop de messages en double trop vite ! Prenez une pause et publiez à nouveau " "dans quelques minutes." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Il vous est interdit de poster des avis sur ce site." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problème lors de l’enregistrement de l’avis." -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "Problème lors de l’enregistrement de la boîte de réception du groupe." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4580,19 +4623,28 @@ msgstr "Impossible de supprimer l’abonnement à soi-même." msgid "Couldn't delete subscription." msgstr "Impossible de cesser l’abonnement" -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Bienvenue à %1$s, @%2$s !" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Impossible de créer le groupe." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Impossible de définir l'URI du groupe." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Impossible d’établir l’inscription au groupe." +#: classes/User_group.php:506 +msgid "Could not save local group info." +msgstr "Impossible d’enregistrer les informations du groupe local." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Modifier vos paramètres de profil" @@ -4634,120 +4686,190 @@ msgstr "Page sans nom" msgid "Primary site navigation" msgstr "Navigation primaire du site" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Accueil" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Profil personnel et flux des amis" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Personnel" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Modifier votre courriel, avatar, mot de passe, profil" -#: lib/action.php:444 -msgid "Connect" -msgstr "Connecter" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Compte" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Se connecter aux services" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Connecter" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Modifier la configuration du site" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Inviter" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Administrer" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Inviter des amis et collègues à vous rejoindre dans %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Fermeture de session" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Inviter" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Fermer la session" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Fermeture de session" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Créer un compte" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Créer un compte" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Ouvrir une session" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Aide" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Ouvrir une session" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "À l’aide !" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Rechercher" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Aide" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Rechercher des personnes ou du texte" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Rechercher" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Notice du site" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Vues locales" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Avis de la page" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Navigation secondaire du site" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Aide" + +#: lib/action.php:765 msgid "About" msgstr "À propos" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "CGU" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Confidentialité" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Source" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Contact" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Insigne" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Licence du logiciel StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4756,12 +4878,12 @@ msgstr "" "**%%site.name%%** est un service de microblogging qui vous est proposé par " "[%%site.broughtby%%](%%site.broughtbyurl%%)." -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** est un service de micro-blogging." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4772,111 +4894,164 @@ msgstr "" "version %s, disponible sous la licence [GNU Affero General Public License] " "(http://www.fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Licence du contenu du site" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "Le contenu et les données de %1$s sont privés et confidentiels." -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" "Le contenu et les données sont sous le droit d’auteur de %1$s. Tous droits " "réservés." -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "Le contenu et les données sont sous le droit d’auteur du contributeur. Tous " "droits réservés." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Tous " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "licence." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Pagination" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Après" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Avant" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." -msgstr "" +msgstr "Impossible de gérer le contenu distant pour le moment." -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." -msgstr "" +msgstr "Impossible de gérer le contenu XML embarqué pour le moment." -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." -msgstr "" +msgstr "Impossible de gérer le contenu en Base64 embarqué pour le moment." -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Vous ne pouvez pas faire de modifications sur ce site." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "La modification de ce panneau n’est pas autorisée." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() n’a pas été implémentée." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() n’a pas été implémentée." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Impossible de supprimer les paramètres de conception." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Configuration basique du site" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Site" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Configuration de la conception" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Conception" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Configuration utilisateur" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Utilisateur" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Configuration d’accès" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Accès" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Configuration des chemins" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Chemins" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Configuration des sessions" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Sessions" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "La ressource de l’API a besoin de l’accès en lecture et en écriture, mais " "vous n’y avez accès qu’en lecture." -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4970,11 +5145,11 @@ msgstr "Avis sur lesquels cette pièce jointe apparaît." msgid "Tags for this attachment" msgstr "Marques de cette pièce jointe" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "La modification du mot de passe a échoué" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "La modification du mot de passe n’est pas autorisée" @@ -5179,7 +5354,7 @@ msgstr "" "pendant 2 minutes : %s" #: lib/command.php:692 -#, fuzzy, php-format +#, php-format msgid "Unsubscribed %s" msgstr "Désabonné de %s" @@ -5214,7 +5389,6 @@ msgstr[0] "Vous êtes membre de ce groupe :" msgstr[1] "Vous êtes membre de ces groupes :" #: lib/command.php:769 -#, fuzzy msgid "" "Commands:\n" "on - turn on notifications\n" @@ -5267,6 +5441,7 @@ msgstr "" "d - message direct à l’utilisateur\n" "get - obtenir le dernier avis de l’utilisateur\n" "whois - obtenir le profil de l’utilisateur\n" +"lose - forcer un utilisateur à arrêter de vous suivre\n" "fav - ajouter de dernier avis de l’utilisateur comme favori\n" "fav # - ajouter l’avis correspondant à l’identifiant comme " "favori\n" @@ -5294,20 +5469,20 @@ msgstr "" "tracks - pas encore implémenté.\n" "tracking - pas encore implémenté.\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Aucun fichier de configuration n’a été trouvé. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" "J’ai cherché des fichiers de configuration dans les emplacements suivants : " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "Vous pouvez essayer de lancer l’installeur pour régler ce problème." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Aller au programme d’installation" @@ -5500,23 +5675,23 @@ msgstr "Erreur système lors du transfert du fichier." msgid "Not an image or corrupt file." msgstr "Ceci n’est pas une image, ou c’est un fichier corrompu." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Format de fichier d’image non supporté." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Fichier perdu." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Type de fichier inconnu" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "Mo" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "Ko" @@ -5899,6 +6074,12 @@ msgstr "À" msgid "Available characters" msgstr "Caractères restants" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Envoyer" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Envoyer un avis" @@ -5957,23 +6138,23 @@ msgstr "O" msgid "at" msgstr "chez" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "dans le contexte" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Repris par" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Répondre à cet avis" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Répondre" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Avis repris" @@ -6021,6 +6202,10 @@ msgstr "Réponses" msgid "Favorites" msgstr "Favoris" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Utilisateur" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Boîte de réception" @@ -6110,7 +6295,7 @@ msgstr "Reprendre cet avis ?" msgid "Repeat this notice" msgstr "Reprendre cet avis" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "Aucun utilisateur unique défini pour le mode mono-utilisateur." @@ -6130,6 +6315,10 @@ msgstr "Rechercher sur le site" msgid "Keyword(s)" msgstr "Mot(s) clef(s)" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Rechercher" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Aide sur la recherche" @@ -6181,6 +6370,15 @@ msgstr "Abonnés de %s" msgid "Groups %s is a member of" msgstr "Groupes de %s" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Inviter" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Inviter des amis et collègues à vous rejoindre dans %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6251,47 +6449,47 @@ msgstr "Message" msgid "Moderate" msgstr "Modérer" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "il y a quelques secondes" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "il y a 1 minute" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "il y a %d minutes" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "il y a 1 heure" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "il y a %d heures" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "il y a 1 jour" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "il y a %d jours" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "il y a 1 mois" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "il y a %d mois" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "il y a environ 1 an" diff --git a/locale/ga/LC_MESSAGES/statusnet.po b/locale/ga/LC_MESSAGES/statusnet.po index b60553d44..0b62fe337 100644 --- a/locale/ga/LC_MESSAGES/statusnet.po +++ b/locale/ga/LC_MESSAGES/statusnet.po @@ -8,84 +8,90 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:51+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:51+0000\n" "Language-Team: Irish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ga\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=5; plural=n==1 ? 0 : n==2 ? 1 : n<7 ? 2 : n<11 ? 3 : " "4;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "Aceptar" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Configuracións de Twitter" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Rexistrar" -#: actions/accessadminpanel.php:161 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 #, fuzzy +msgctxt "LABEL" msgid "Private" msgstr "Privacidade" -#: actions/accessadminpanel.php:163 -msgid "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:167 +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 #, fuzzy msgid "Invite only" msgstr "Invitar" -#: actions/accessadminpanel.php:169 -msgid "Make registration invitation only." +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:173 +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 #, fuzzy msgid "Closed" msgstr "Bloquear" -#: actions/accessadminpanel.php:175 -msgid "Disable new registrations." -msgstr "" - -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Gardar" - -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Configuracións de Twitter" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Gardar" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page" msgstr "Non existe a etiqueta." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -99,72 +105,82 @@ msgstr "Non existe a etiqueta." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Ningún usuario." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s e amigos" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s e amigos" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Fonte para os amigos de %s" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Fonte para os amigos de %s" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, fuzzy, php-format msgid "Feed for friends of %s (Atom)" msgstr "Fonte para os amigos de %s" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 #, fuzzy msgid "You and friends" msgstr "%s e amigos" @@ -183,20 +199,20 @@ msgstr "Actualizacións dende %1$s e amigos en %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Método da API non atopado" @@ -230,8 +246,9 @@ msgstr "Non se puido actualizar o usuario." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "O usuario non ten perfil." @@ -256,7 +273,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 #, fuzzy @@ -379,68 +396,68 @@ msgstr "Non se pudo recuperar a liña de tempo publica." msgid "Could not find target user." msgstr "Non se puido atopar ningún estado" -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "O alcume debe ter só letras minúsculas e números, e sen espazos." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "O alcume xa está sendo empregado por outro usuario. Tenta con outro." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Non é un alcume válido." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "A páxina persoal semella que non é unha URL válida." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "O nome completo é demasiado longo (max 255 car)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "O teu Bio é demasiado longo (max 140 car.)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "A localización é demasiado longa (max 255 car.)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, fuzzy, php-format msgid "Invalid alias: \"%s\"" msgstr "Etiqueta inválida: '%s'" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "O alcume xa está sendo empregado por outro usuario. Tenta con outro." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -452,15 +469,15 @@ msgstr "" msgid "Group not found!" msgstr "Método da API non atopado" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Xa estas suscrito a estes usuarios:" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Non podes seguir a este usuario: o Usuario non se atopa." @@ -469,7 +486,7 @@ msgstr "Non podes seguir a este usuario: o Usuario non se atopa." msgid "You are not a member of this group." msgstr "Non estás suscrito a ese perfil" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Non podes seguir a este usuario: o Usuario non se atopa." @@ -501,7 +518,7 @@ msgstr "Tamaño inválido." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -545,7 +562,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -568,14 +585,14 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 #, fuzzy msgid "Account" msgstr "Sobre" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -663,12 +680,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s updates favorited by %s / %s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Liña de tempo de %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -704,7 +721,7 @@ msgstr "Replies to %s" msgid "Repeats of %s" msgstr "Replies to %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Chíos tagueados con %s" @@ -726,8 +743,7 @@ msgstr "Ningún documento." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Sen alcume." @@ -739,7 +755,7 @@ msgstr "Sen tamaño." msgid "Invalid size." msgstr "Tamaño inválido." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -756,32 +772,32 @@ msgid "User without matching profile" msgstr "Usuario sen un perfil que coincida." #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 #, fuzzy msgid "Avatar settings" msgstr "Configuracións de Twitter" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 #, fuzzy msgid "Delete" msgstr "eliminar" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Subir" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "" @@ -789,7 +805,7 @@ msgstr "" msgid "Pick a square area of the image to be your avatar" msgstr "" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -826,23 +842,23 @@ msgstr "" "ser notificado de ningunha resposta-@ del." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "No" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "Bloquear usuario" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Si" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "Bloquear usuario" @@ -851,41 +867,45 @@ msgstr "Bloquear usuario" msgid "Failed to save block information." msgstr "Erro ao gardar información de bloqueo." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 #, fuzzy msgid "No such group." msgstr "Non existe a etiqueta." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s e amigos" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 #, fuzzy msgid "Unblock user from group" msgstr "Desbloqueo de usuario fallido." -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Desbloquear" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 #, fuzzy msgid "Unblock this user" msgstr "Bloquear usuario" @@ -967,7 +987,7 @@ msgstr "Non estás suscrito a ese perfil" #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 #, fuzzy msgid "There was a problem with your session token." msgstr "Houbo un problema co teu token de sesión. Tentao de novo, anda..." @@ -994,12 +1014,13 @@ msgstr "Non se pode eliminar este chíos." msgid "Delete this application" msgstr "Eliminar chío" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Non está logueado." @@ -1030,7 +1051,7 @@ msgstr "Estas seguro que queres eliminar este chío?" msgid "Do not delete this notice" msgstr "Non se pode eliminar este chíos." -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 #, fuzzy msgid "Delete this notice" msgstr "Eliminar chío" @@ -1050,19 +1071,19 @@ msgstr "Non deberías eliminar o estado de outro usuario" msgid "Delete user" msgstr "eliminar" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" msgstr "Eliminar chío" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1172,6 +1193,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Gardar" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1277,32 +1309,32 @@ msgstr "" msgid "You must be logged in to create a group." msgstr "Debes estar logueado para invitar a outros usuarios a empregar %s" -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "Debes estar logueado para invitar a outros usuarios a empregar %s" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "O teu Bio é demasiado longo (max 140 car.)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 #, fuzzy msgid "Could not update group." msgstr "Non se puido actualizar o usuario." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "Non se puido crear o favorito." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 #, fuzzy msgid "Options saved." msgstr "Configuracións gardadas." @@ -1653,7 +1685,7 @@ msgstr "O usuario bloqueoute." msgid "User is not a member of group." msgstr "%1s non é unha orixe fiable." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 #, fuzzy msgid "Block user from group" msgstr "Bloquear usuario" @@ -1691,91 +1723,91 @@ msgstr "Sen id." msgid "You must be logged in to edit a group." msgstr "Debes estar logueado para invitar a outros usuarios a empregar %s" -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "Non se puido actualizar o usuario." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "Preferencias gardadas." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Usuario sen un perfil que coincida." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 #, fuzzy msgid "Logo updated." msgstr "Avatar actualizado." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 #, fuzzy msgid "Failed updating logo." msgstr "Acounteceu un fallo ó actualizar o avatar." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Bloquear" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Actualizacións dende %1$s en %2$s!" @@ -2034,16 +2066,19 @@ msgstr "Mensaxe persoal" msgid "Optionally add a personal message to the invitation." msgstr "Opcionalmente engadir unha mensaxe persoal á invitación." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Enviar" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s invitoute a unirse a él en %2$s." -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2103,7 +2138,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Debes estar logueado para invitar a outros usuarios a empregar %s" -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Sen alcume." + +#: actions/joingroup.php:141 #, fuzzy, php-format msgid "%1$s joined group %2$s" msgstr "%s / Favoritos dende %s" @@ -2113,12 +2153,12 @@ msgstr "%s / Favoritos dende %s" msgid "You must be logged in to leave a group." msgstr "Debes estar logueado para invitar a outros usuarios a empregar %s" -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 #, fuzzy msgid "You are not a member of that group." msgstr "Non estás suscrito a ese perfil" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%s / Favoritos dende %s" @@ -2136,8 +2176,7 @@ msgstr "Usuario ou contrasinal incorrectos." msgid "Error setting user. You are probably not authorized." msgstr "Non está autorizado." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Inicio de sesión" @@ -2395,8 +2434,8 @@ msgstr "Conectar" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Non é un formato de datos soportado." @@ -2544,7 +2583,7 @@ msgstr "Non se pode gardar a contrasinal." msgid "Password saved." msgstr "Contrasinal gardada." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2577,7 +2616,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 #, fuzzy msgid "Site" msgstr "Invitar" @@ -2763,7 +2801,7 @@ msgstr "" "De 1 a 64 letras minúsculas ou númeors, nin espazos nin signos de puntuación" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Nome completo" @@ -2792,7 +2830,7 @@ msgid "Bio" msgstr "Bio" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2877,7 +2915,8 @@ msgstr "Non se puido gardar o perfil." msgid "Couldn't save tags." msgstr "Non se puideron gardar as etiquetas." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Configuracións gardadas." @@ -2890,48 +2929,48 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "Non se pudo recuperar a liña de tempo publica." -#: actions/public.php:129 +#: actions/public.php:130 #, fuzzy, php-format msgid "Public timeline, page %d" msgstr "Liña de tempo pública" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Liña de tempo pública" -#: actions/public.php:159 +#: actions/public.php:160 #, fuzzy msgid "Public Stream Feed (RSS 1.0)" msgstr "Sindicación do Fio Público" -#: actions/public.php:163 +#: actions/public.php:164 #, fuzzy msgid "Public Stream Feed (RSS 2.0)" msgstr "Sindicación do Fio Público" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "Sindicación do Fio Público" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2944,7 +2983,7 @@ msgstr "" "(http://status.net/). [Únete agora](%%action.register%%) para compartir " "chíos cos teus amigos, colegas e familia! ([Ler mais](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, fuzzy, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3121,8 +3160,7 @@ msgstr "Acounteceu un erro co código de confirmación." msgid "Registration successful" msgstr "Xa estas rexistrado!!" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Rexistrar" @@ -3318,7 +3356,7 @@ msgstr "Non podes rexistrarte se non estas de acordo coa licenza." msgid "You already repeated that notice." msgstr "Xa bloqueaches a este usuario." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "Crear" @@ -3328,47 +3366,47 @@ msgstr "Crear" msgid "Repeated!" msgstr "Crear" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Replies to %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "Mensaxe de %1$s en %2$s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Fonte de chíos para %s" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Fonte de chíos para %s" -#: actions/replies.php:158 +#: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" msgstr "Fonte de chíos para %s" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3396,7 +3434,6 @@ msgid "User is already sandboxed." msgstr "O usuario bloqueoute." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3421,7 +3458,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "Configuracións de Twitter" @@ -3457,7 +3494,7 @@ msgstr "Invitación(s) enviada(s)." msgid "Description" msgstr "Subscricións" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Estatísticas" @@ -3519,35 +3556,35 @@ msgstr "Chíos favoritos de %s" msgid "Could not retrieve favorite notices." msgstr "Non se pode " -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Fonte para os amigos de %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Fonte para os amigos de %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Fonte para os amigos de %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3555,7 +3592,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3569,73 +3606,73 @@ msgstr "" msgid "%1$s group, page %2$d" msgstr "Tódalas subscricións" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 #, fuzzy msgid "Group profile" msgstr "Non existe o perfil." -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 #, fuzzy msgid "Note" msgstr "Chíos" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 #, fuzzy msgid "Group actions" msgstr "Outras opcions" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Fonte de chíos para %s" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Fonte de chíos para %s" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "Fonte de chíos para %s" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, fuzzy, php-format msgid "FOAF for %s group" msgstr "Band. Saída para %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 #, fuzzy msgid "Members" msgstr "Membro dende" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 #, fuzzy msgid "(None)" msgstr "(nada)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 #, fuzzy msgid "Created" msgstr "Crear" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, fuzzy, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3649,7 +3686,7 @@ msgstr "" "(http://status.net/). [Únete agora](%%action.register%%) para compartir " "chíos cos teus amigos, colegas e familia! ([Ler mais](%%doc.help%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, fuzzy, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3662,7 +3699,7 @@ msgstr "" "(http://status.net/). [Únete agora](%%action.register%%) para compartir " "chíos cos teus amigos, colegas e familia! ([Ler mais](%%doc.help%%))" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "" @@ -4137,22 +4174,22 @@ msgstr "Jabber." msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Usuarios auto-etiquetados como %s - páxina %d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Fonte de chíos para %s" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Fonte de chíos para %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Fonte de chíos para %s" @@ -4211,7 +4248,7 @@ msgstr "" msgid "No such tag." msgstr "Non existe a etiqueta." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Método da API en contrución." @@ -4244,77 +4281,79 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Usuario" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Perfil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 #, fuzzy msgid "New users" msgstr "Invitar a novos usuarios" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "Tódalas subscricións" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "" "Suscribirse automáticamente a calquera que se suscriba a min (o mellor para " "non humáns)" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "Invitación(s) enviada(s)." -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 #, fuzzy msgid "Invitations enabled" msgstr "Invitación(s) enviada(s)." -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4502,7 +4541,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Persoal" @@ -4543,6 +4582,11 @@ msgstr "Non se puido actualizar o usuario." msgid "Group leave failed." msgstr "Non existe o perfil." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Non se puido actualizar o usuario." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4561,28 +4605,28 @@ msgstr "Non se pode inserir unha mensaxe." msgid "Could not update message with new URI." msgstr "Non se puido actualizar a mensaxe coa nova URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Erro ó inserir o hashtag na BD: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "Aconteceu un erro ó gardar o chío." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Aconteceu un erro ó gardar o chío. Usuario descoñecido." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Demasiados chíos en pouco tempo; tomate un respiro e envíao de novo dentro " "duns minutos." -#: classes/Notice.php:237 +#: classes/Notice.php:254 #, fuzzy msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " @@ -4591,20 +4635,20 @@ msgstr "" "Demasiados chíos en pouco tempo; tomate un respiro e envíao de novo dentro " "duns minutos." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Tes restrinxido o envio de chíos neste sitio." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Aconteceu un erro ó gardar o chío." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Aconteceu un erro ó gardar o chío." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -4636,21 +4680,31 @@ msgstr "Non se pode eliminar a subscrición." msgid "Couldn't delete subscription." msgstr "Non se pode eliminar a subscrición." -#: classes/User.php:372 +#: classes/User.php:373 #, fuzzy, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Mensaxe de %1$s en %2$s" -#: classes/User_group.php:423 +#: classes/User_group.php:462 #, fuzzy msgid "Could not create group." msgstr "Non se puido crear o favorito." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Non se pode gardar a subscrición." + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "Non se pode gardar a subscrición." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Non se pode gardar a subscrición." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Configuración de perfil" @@ -4694,130 +4748,190 @@ msgstr "" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Persoal" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Persoal" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 #, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Cambiar contrasinal" -#: lib/action.php:444 -msgid "Connect" -msgstr "Conectar" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Sobre" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Non se pode redireccionar ao servidor: %s" -#: lib/action.php:448 +#: lib/action.php:453 #, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Conectar" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Navegación de subscricións" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Invitar" +#: lib/action.php:460 +msgctxt "MENU" +msgid "Admin" +msgstr "" -#: lib/action.php:453 lib/subgroupnav.php:106 +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 #, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "" "Emprega este formulario para invitar ós teus amigos e colegas a empregar " "este servizo." -#: lib/action.php:458 -msgid "Logout" -msgstr "Sair" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Invitar" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Sair" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 #, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Crear nova conta" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Rexistrar" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Axuda" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Inicio de sesión" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 #, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Axuda" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Buscar" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Axuda" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Buscar" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 #, fuzzy msgid "Site notice" msgstr "Novo chío" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 #, fuzzy msgid "Page notice" msgstr "Novo chío" -#: lib/action.php:727 +#: lib/action.php:758 #, fuzzy msgid "Secondary site navigation" msgstr "Navegación de subscricións" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Axuda" + +#: lib/action.php:765 msgid "About" msgstr "Sobre" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "Preguntas frecuentes" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Privacidade" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Fonte" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Contacto" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4826,12 +4940,12 @@ msgstr "" "**%%site.name%%** é un servizo de microbloguexo que che proporciona [%%site." "broughtby%%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** é un servizo de microbloguexo." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4842,120 +4956,172 @@ msgstr "" "%s, dispoñible baixo licenza [GNU Affero General Public License](http://www." "fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "Atopar no contido dos chíos" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 #, fuzzy msgid "All " msgstr "Todos" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 #, fuzzy msgid "After" msgstr "« Despois" -#: lib/action.php:1149 +#: lib/action.php:1180 #, fuzzy msgid "Before" msgstr "Antes »" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 #, fuzzy msgid "You cannot make changes to this site." msgstr "Non podes enviar mensaxes a este usurio." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "Non se permite o rexistro neste intre." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 #, fuzzy msgid "showForm() not implemented." msgstr "Comando non implementado." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 #, fuzzy msgid "saveSettings() not implemented." msgstr "Comando non implementado." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 #, fuzzy msgid "Unable to delete design setting." msgstr "Non se puideron gardar os teus axustes de Twitter!" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "Confirmar correo electrónico" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Invitar" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "Confirmación de SMS" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Persoal" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "Confirmación de SMS" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Usuario" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "Confirmación de SMS" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Aceptar" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "Confirmación de SMS" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "Confirmación de SMS" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Persoal" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -5051,12 +5217,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Contrasinal gardada." -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Contrasinal gardada." @@ -5377,20 +5543,20 @@ msgstr "" "tracks - non implementado por agora.\n" "tracking - non implementado por agora.\n" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "Sen código de confirmación." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5587,25 +5753,25 @@ msgstr "Aconteceu un erro no sistema namentras se estaba cargando o ficheiro." msgid "Not an image or corrupt file." msgstr "Non é unha imaxe ou está corrupta." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Formato de ficheiro de imaxe non soportado." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "Bloqueo de usuario fallido." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 #, fuzzy msgid "Unknown file type" msgstr "tipo de ficheiro non soportado" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5968,6 +6134,12 @@ msgstr "A" msgid "Available characters" msgstr "6 ou máis caracteres" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Enviar" + #: lib/noticeform.php:160 #, fuzzy msgid "Send a notice" @@ -6028,27 +6200,27 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 #, fuzzy msgid "in context" msgstr "Sen contido!" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "Crear" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 #, fuzzy msgid "Reply to this notice" msgstr "Non se pode eliminar este chíos." -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 #, fuzzy msgid "Reply" msgstr "contestar" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Chío publicado" @@ -6101,6 +6273,10 @@ msgstr "Respostas" msgid "Favorites" msgstr "Favoritos" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Usuario" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Band. Entrada" @@ -6198,7 +6374,7 @@ msgstr "Non se pode eliminar este chíos." msgid "Repeat this notice" msgstr "Non se pode eliminar este chíos." -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -6221,6 +6397,10 @@ msgstr "Buscar" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Buscar" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -6276,6 +6456,17 @@ msgstr "Suscrito a %s" msgid "Groups %s is a member of" msgstr "" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Invitar" + +#: lib/subgroupnav.php:106 +#, fuzzy, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" +"Emprega este formulario para invitar ós teus amigos e colegas a empregar " +"este servizo." + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6355,47 +6546,47 @@ msgstr "Nova mensaxe" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "fai uns segundos" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "fai un minuto" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "fai %d minutos" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "fai unha hora" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "fai %d horas" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "fai un día" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "fai %d días" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "fai un mes" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "fai %d meses" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "fai un ano" diff --git a/locale/he/LC_MESSAGES/statusnet.po b/locale/he/LC_MESSAGES/statusnet.po index 424917efb..89fd4dd7a 100644 --- a/locale/he/LC_MESSAGES/statusnet.po +++ b/locale/he/LC_MESSAGES/statusnet.po @@ -7,82 +7,88 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:54+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:54+0000\n" "Language-Team: Hebrew\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: he\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "קבל" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "הגדרות" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "הירשם" -#: actions/accessadminpanel.php:161 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 #, fuzzy +msgctxt "LABEL" msgid "Private" msgstr "פרטיות" -#: actions/accessadminpanel.php:163 -msgid "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:167 +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 msgid "Invite only" msgstr "" -#: actions/accessadminpanel.php:169 -msgid "Make registration invitation only." +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:173 +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 #, fuzzy msgid "Closed" msgstr "אין משתמש כזה." -#: actions/accessadminpanel.php:175 -msgid "Disable new registrations." -msgstr "" - -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "שמור" - -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "הגדרות" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "שמור" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page" msgstr "אין הודעה כזו." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -96,72 +102,82 @@ msgstr "אין הודעה כזו." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "אין משתמש כזה." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s וחברים" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s וחברים" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "הזנות החברים של %s" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "הזנות החברים של %s" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, fuzzy, php-format msgid "Feed for friends of %s (Atom)" msgstr "הזנות החברים של %s" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 #, fuzzy msgid "You and friends" msgstr "%s וחברים" @@ -180,20 +196,20 @@ msgstr "" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "קוד האישור לא נמצא." @@ -227,8 +243,9 @@ msgstr "עידכון המשתמש נכשל." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "למשתמש אין פרופיל." @@ -253,7 +270,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -370,68 +387,68 @@ msgstr "עידכון המשתמש נכשל." msgid "Could not find target user." msgstr "עידכון המשתמש נכשל." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "כינוי יכול להכיל רק אותיות אנגליות קטנות ומספרים, וללא רווחים." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "כינוי זה כבר תפוס. נסה כינוי אחר." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "שם משתמש לא חוקי." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "לאתר הבית יש כתובת לא חוקית." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "השם המלא ארוך מידי (מותרות 255 אותיות בלבד)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." msgstr "הביוגרפיה ארוכה מידי (לכל היותר 140 אותיות)" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "שם המיקום ארוך מידי (מותר עד 255 אותיות)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, fuzzy, php-format msgid "Invalid alias: \"%s\"" msgstr "כתובת אתר הבית '%s' אינה חוקית" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "כינוי זה כבר תפוס. נסה כינוי אחר." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -443,16 +460,16 @@ msgstr "" msgid "Group not found!" msgstr "לא נמצא" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 #, fuzzy msgid "You are already a member of that group." msgstr "כבר נכנסת למערכת!" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "נכשלה ההפניה לשרת: %s" @@ -462,7 +479,7 @@ msgstr "נכשלה ההפניה לשרת: %s" msgid "You are not a member of this group." msgstr "לא שלחנו אלינו את הפרופיל הזה" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "נכשלה יצירת OpenID מתוך: %s" @@ -494,7 +511,7 @@ msgstr "גודל לא חוקי." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -538,7 +555,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -561,14 +578,14 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 #, fuzzy msgid "Account" msgstr "אודות" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -654,12 +671,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "מיקרובלוג מאת %s" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -695,7 +712,7 @@ msgstr "תגובת עבור %s" msgid "Repeats of %s" msgstr "תגובת עבור %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "" @@ -718,8 +735,7 @@ msgstr "אין מסמך כזה." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "אין כינוי" @@ -731,7 +747,7 @@ msgstr "אין גודל." msgid "Invalid size." msgstr "גודל לא חוקי." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "תמונה" @@ -748,32 +764,32 @@ msgid "User without matching profile" msgstr "" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 #, fuzzy msgid "Avatar settings" msgstr "הגדרות" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 #, fuzzy msgid "Delete" msgstr "מחק" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "ההעלה" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "" @@ -781,7 +797,7 @@ msgstr "" msgid "Pick a square area of the image to be your avatar" msgstr "" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -816,23 +832,23 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "לא" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "אין משתמש כזה." #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "כן" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "אין משתמש כזה." @@ -841,41 +857,45 @@ msgstr "אין משתמש כזה." msgid "Failed to save block information." msgstr "" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 #, fuzzy msgid "No such group." msgstr "אין הודעה כזו." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "למשתמש אין פרופיל." -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s וחברים" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 #, fuzzy msgid "Unblock user from group" msgstr "אין משתמש כזה." -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 #, fuzzy msgid "Unblock this user" msgstr "אין משתמש כזה." @@ -956,7 +976,7 @@ msgstr "לא שלחנו אלינו את הפרופיל הזה" #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -982,12 +1002,13 @@ msgstr "אין הודעה כזו." msgid "Delete this application" msgstr "תאר את עצמך ואת נושאי העניין שלך ב-140 אותיות" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "לא מחובר." @@ -1015,7 +1036,7 @@ msgstr "" msgid "Do not delete this notice" msgstr "אין הודעה כזו." -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "" @@ -1034,19 +1055,19 @@ msgstr "ניתן להשתמש במנוי המקומי!" msgid "Delete user" msgstr "מחק" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" msgstr "אין משתמש כזה." #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1156,6 +1177,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "שמור" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1256,31 +1288,31 @@ msgstr "" msgid "You must be logged in to create a group." msgstr "" -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." msgstr "הביוגרפיה ארוכה מידי (לכל היותר 140 אותיות)" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 #, fuzzy msgid "Could not update group." msgstr "עידכון המשתמש נכשל." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "שמירת מידע התמונה נכשל" -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 #, fuzzy msgid "Options saved." msgstr "ההגדרות נשמרו." @@ -1625,7 +1657,7 @@ msgstr "למשתמש אין פרופיל." msgid "User is not a member of group." msgstr "לא שלחנו אלינו את הפרופיל הזה" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 #, fuzzy msgid "Block user from group" msgstr "אין משתמש כזה." @@ -1661,92 +1693,92 @@ msgstr "אין זיהוי." msgid "You must be logged in to edit a group." msgstr "" -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 #, fuzzy msgid "Group design" msgstr "קבוצות" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "עידכון המשתמש נכשל." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "העדפות נשמרו." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "למשתמש אין פרופיל." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 #, fuzzy msgid "Logo updated." msgstr "התמונה עודכנה." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 #, fuzzy msgid "Failed updating logo." msgstr "עדכון התמונה נכשל." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "מיקרובלוג מאת %s" @@ -2000,16 +2032,19 @@ msgstr "" msgid "Optionally add a personal message to the invitation." msgstr "" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "שלח" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2044,7 +2079,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "" -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "אין כינוי" + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "" @@ -2053,12 +2093,12 @@ msgstr "" msgid "You must be logged in to leave a group." msgstr "" -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 #, fuzzy msgid "You are not a member of that group." msgstr "לא שלחנו אלינו את הפרופיל הזה" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "הסטטוס של %1$s ב-%2$s " @@ -2076,8 +2116,7 @@ msgstr "שם משתמש או סיסמה לא נכונים." msgid "Error setting user. You are probably not authorized." msgstr "לא מורשה." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "היכנס" @@ -2326,8 +2365,8 @@ msgstr "התחבר" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "" @@ -2475,7 +2514,7 @@ msgstr "לא ניתן לשמור את הסיסמה" msgid "Password saved." msgstr "הסיסמה נשמרה." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2508,7 +2547,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "" @@ -2690,7 +2728,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1 עד 64 אותיות אנגליות קטנות או מספרים, ללא סימני פיסוק או רווחים." #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "שם מלא" @@ -2719,7 +2757,7 @@ msgid "Bio" msgstr "ביוגרפיה" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2801,7 +2839,8 @@ msgstr "שמירת הפרופיל נכשלה." msgid "Couldn't save tags." msgstr "שמירת הפרופיל נכשלה." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "ההגדרות נשמרו." @@ -2814,48 +2853,48 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, fuzzy, php-format msgid "Public timeline, page %d" msgstr "קו זמן ציבורי" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "קו זמן ציבורי" -#: actions/public.php:159 +#: actions/public.php:160 #, fuzzy msgid "Public Stream Feed (RSS 1.0)" msgstr "הזנת זרם הציבורי" -#: actions/public.php:163 +#: actions/public.php:164 #, fuzzy msgid "Public Stream Feed (RSS 2.0)" msgstr "הזנת זרם הציבורי" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "הזנת זרם הציבורי" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2864,7 +2903,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3035,8 +3074,7 @@ msgstr "שגיאה באישור הקוד." msgid "Registration successful" msgstr "" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "הירשם" @@ -3204,7 +3242,7 @@ msgstr "לא ניתן להירשם ללא הסכמה לרשיון" msgid "You already repeated that notice." msgstr "כבר נכנסת למערכת!" -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "צור" @@ -3214,47 +3252,47 @@ msgstr "צור" msgid "Repeated!" msgstr "צור" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "תגובת עבור %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "תגובת עבור %s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "הזנת הודעות של %s" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "הזנת הודעות של %s" -#: actions/replies.php:158 +#: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" msgstr "הזנת הודעות של %s" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3282,7 +3320,6 @@ msgid "User is already sandboxed." msgstr "למשתמש אין פרופיל." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3307,7 +3344,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "הגדרות" @@ -3342,7 +3379,7 @@ msgstr "מיקום" msgid "Description" msgstr "הרשמות" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "סטטיסטיקה" @@ -3403,35 +3440,35 @@ msgstr "%s וחברים" msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "הזנות החברים של %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "הזנות החברים של %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, fuzzy, php-format msgid "Feed for favorites of %s (Atom)" msgstr "הזנות החברים של %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3439,7 +3476,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3453,71 +3490,71 @@ msgstr "" msgid "%1$s group, page %2$d" msgstr "כל המנויים" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 #, fuzzy msgid "Group profile" msgstr "אין הודעה כזו." -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 #, fuzzy msgid "Note" msgstr "הודעות" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "הזנת הודעות של %s" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "הזנת הודעות של %s" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "הזנת הודעות של %s" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, fuzzy, php-format msgid "FOAF for %s group" msgstr "הזנת הודעות של %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 #, fuzzy msgid "Members" msgstr "חבר מאז" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 #, fuzzy msgid "Created" msgstr "צור" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3527,7 +3564,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3536,7 +3573,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "" @@ -3995,22 +4032,22 @@ msgstr "אין זיהוי Jabber כזה." msgid "SMS" msgstr "סמס" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "מיקרובלוג מאת %s" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "הזנת הודעות של %s" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "הזנת הודעות של %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "הזנת הודעות של %s" @@ -4064,7 +4101,7 @@ msgstr "" msgid "No such tag." msgstr "אין הודעה כזו." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "" @@ -4099,74 +4136,76 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "מתשמש" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "פרופיל" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 #, fuzzy msgid "New users" msgstr "מחק" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "כל המנויים" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "ההרשמה אושרה" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "מיקום" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4351,7 +4390,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "אישי" @@ -4392,6 +4431,11 @@ msgstr "עידכון המשתמש נכשל." msgid "Group leave failed." msgstr "אין הודעה כזו." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "עידכון המשתמש נכשל." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4409,46 +4453,46 @@ msgstr "" msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "בעיה בשמירת ההודעה." -#: classes/Notice.php:226 +#: classes/Notice.php:243 #, fuzzy msgid "Problem saving notice. Unknown user." msgstr "בעיה בשמירת ההודעה." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "בעיה בשמירת ההודעה." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "בעיה בשמירת ההודעה." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4480,21 +4524,31 @@ msgstr "מחיקת המנוי לא הצליחה." msgid "Couldn't delete subscription." msgstr "מחיקת המנוי לא הצליחה." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "" -#: classes/User_group.php:423 +#: classes/User_group.php:462 #, fuzzy msgid "Could not create group." msgstr "שמירת מידע התמונה נכשל" -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "יצירת המנוי נכשלה." + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "יצירת המנוי נכשלה." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "יצירת המנוי נכשלה." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "" @@ -4538,127 +4592,188 @@ msgstr "" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "בית" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 -msgid "Change your email, avatar, password, profile" -msgstr "" +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "אישי" +#. TRANS: Tooltip for main menu option "Account" #: lib/action.php:444 -msgid "Connect" -msgstr "התחבר" +#, fuzzy +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "שנה סיסמה" -#: lib/action.php:444 +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "אודות" + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "נכשלה ההפניה לשרת: %s" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "התחבר" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 #, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "הרשמות" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" +#: lib/action.php:460 +msgctxt "MENU" +msgid "Admin" msgstr "" -#: lib/action.php:453 lib/subgroupnav.php:106 +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 #, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "" -#: lib/action.php:458 -msgid "Logout" -msgstr "צא" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "גודל לא חוקי." -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "צא" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 #, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "צור חשבון חדש" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "הירשם" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "עזרה" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "היכנס" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 #, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "עזרה" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "חיפוש" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "עזרה" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "חיפוש" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 #, fuzzy msgid "Site notice" msgstr "הודעה חדשה" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 #, fuzzy msgid "Page notice" msgstr "הודעה חדשה" -#: lib/action.php:727 +#: lib/action.php:758 #, fuzzy msgid "Secondary site navigation" msgstr "הרשמות" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "עזרה" + +#: lib/action.php:765 msgid "About" msgstr "אודות" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "רשימת שאלות נפוצות" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "פרטיות" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "מקור" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "צור קשר" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4667,12 +4782,12 @@ msgstr "" "**%%site.name%%** הוא שרות ביקרובלוג הניתן על ידי [%%site.broughtby%%](%%" "site.broughtbyurl%%)." -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** הוא שרות ביקרובלוג." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4683,113 +4798,165 @@ msgstr "" "s, המופצת תחת רשיון [GNU Affero General Public License](http://www.fsf.org/" "licensing/licenses/agpl-3.0.html)" -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "הודעה חדשה" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 #, fuzzy msgid "After" msgstr "<< אחרי" -#: lib/action.php:1149 +#: lib/action.php:1180 #, fuzzy msgid "Before" msgstr "לפני >>" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "הרשמות" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "הודעה חדשה" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "אישי" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "הרשמות" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "מתשמש" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "הרשמות" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "קבל" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "הרשמות" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "הרשמות" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "אישי" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4885,12 +5052,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "הסיסמה נשמרה." -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "הסיסמה נשמרה." @@ -5174,20 +5341,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "אין קוד אישור." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5382,24 +5549,24 @@ msgstr "שגיאת מערכת בהעלאת הקובץ." msgid "Not an image or corrupt file." msgstr "זהו לא קובץ תמונה, או שחל בו שיבוש." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "פורמט התמונה אינו נתמך." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "אין הודעה כזו." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5703,6 +5870,12 @@ msgstr "אל" msgid "Available characters" msgstr "לפחות 6 אותיות" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "שלח" + #: lib/noticeform.php:160 #, fuzzy msgid "Send a notice" @@ -5763,26 +5936,26 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 #, fuzzy msgid "in context" msgstr "אין תוכן!" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "צור" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 #, fuzzy msgid "Reply" msgstr "הגב" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "הודעות" @@ -5832,6 +6005,10 @@ msgstr "תגובות" msgid "Favorites" msgstr "מועדפים" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "מתשמש" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "" @@ -5927,7 +6104,7 @@ msgstr "אין הודעה כזו." msgid "Repeat this notice" msgstr "אין הודעה כזו." -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5949,6 +6126,10 @@ msgstr "חיפוש" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "חיפוש" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -6003,6 +6184,15 @@ msgstr "הרשמה מרוחקת" msgid "Groups %s is a member of" msgstr "" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6079,47 +6269,47 @@ msgstr "הודעה חדשה" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "לפני מספר שניות" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "לפני כדקה" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "לפני כ-%d דקות" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "לפני כשעה" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "לפני כ-%d שעות" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "לפני כיום" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "לפני כ-%d ימים" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "לפני כחודש" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "לפני כ-%d חודשים" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "לפני כשנה" diff --git a/locale/hsb/LC_MESSAGES/statusnet.po b/locale/hsb/LC_MESSAGES/statusnet.po index 7b6870afe..f46e7357a 100644 --- a/locale/hsb/LC_MESSAGES/statusnet.po +++ b/locale/hsb/LC_MESSAGES/statusnet.po @@ -9,79 +9,86 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:50:58+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:02:57+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: hsb\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : (n%100==3 || " "n%100==4) ? 2 : 3)\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Přistup" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Sydłowe nastajenja składować" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Registrować" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Priwatny" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Jenož přeprosyć" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Priwatny" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Začinjeny" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Jenož přeprosyć" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Nowe registrowanja znjemóžnić." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Składować" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Začinjeny" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Sydłowe nastajenja składować" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Składować" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Strona njeeksistuje" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -95,72 +102,82 @@ msgstr "Strona njeeksistuje" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Wužiwar njeeksistuje" -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s a přećeljo, strona %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s a přećeljo" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Kanal za přećelow wužiwarja %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Kanal za přećelow wužiwarja %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Kanal za přećelow wužiwarja %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Ty a přećeljo" @@ -178,20 +195,20 @@ msgstr "" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "API-metoda njenamakana." @@ -223,8 +240,9 @@ msgstr "Wužiwar njeje so dał aktualizować." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Wužiwar nima profil." @@ -248,7 +266,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -358,68 +376,68 @@ msgstr "" msgid "Could not find target user." msgstr "" -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "" -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Přimjeno so hižo wužiwa. Spytaj druhe." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Žane płaćiwe přimjeno." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Startowa strona njeje płaćiwy URL." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Dospołne mjeno je předołho (maks. 255 znamješkow)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Wopisanje je předołho (maks. %d znamješkow)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Městno je předołho (maks. 255 znamješkow)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Přewjele aliasow! Maksimum: %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Njepłaćiwy alias: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Alias \"%s\" so hižo wužiwa. Spytaj druhi." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Alias njemóže samsny kaž přimjeno być." @@ -430,15 +448,15 @@ msgstr "Alias njemóže samsny kaž přimjeno być." msgid "Group not found!" msgstr "Skupina njenamakana!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Sy hižo čłon teje skupiny." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Njebě móžno wužiwarja %1$s skupinje %2%s přidać." @@ -447,7 +465,7 @@ msgstr "Njebě móžno wužiwarja %1$s skupinje %2%s přidać." msgid "You are not a member of this group." msgstr "Njejsy čłon tuteje skupiny." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Njebě móžno wužiwarja %1$s ze skupiny %2$s wotstronić." @@ -479,7 +497,7 @@ msgstr "Njepłaćiwa wulkosć." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -522,7 +540,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -545,13 +563,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Konto" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -633,12 +651,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -674,7 +692,7 @@ msgstr "" msgid "Repeats of %s" msgstr "" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "" @@ -695,8 +713,7 @@ msgstr "Přiwěšk njeeksistuje." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Žane přimjeno." @@ -708,7 +725,7 @@ msgstr "Žana wulkosć." msgid "Invalid size." msgstr "Njepłaćiwa wulkosć." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Awatar" @@ -726,30 +743,30 @@ msgid "User without matching profile" msgstr "Wužiwar bjez hodźaceho so profila" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Nastajenja awatara" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Original" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Přehlad" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Zničić" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Nahrać" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "" @@ -757,7 +774,7 @@ msgstr "" msgid "Pick a square area of the image to be your avatar" msgstr "" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -789,22 +806,22 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Ně" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Tutoho wužiwarja njeblokować" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Haj" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Tutoho wužiwarja blokować" @@ -812,39 +829,43 @@ msgstr "Tutoho wužiwarja blokować" msgid "Failed to save block information." msgstr "" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Skupina njeeksistuje." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s zablokowa profile, stronu %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "" @@ -921,7 +942,7 @@ msgstr "Njejsy wobsedźer tuteje aplikacije." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -947,12 +968,13 @@ msgstr "Tutu zdźělenku njewušmórnyć" msgid "Delete this application" msgstr "Tutu zdźělenku wušmórnyć" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Njepřizjewjeny." @@ -979,7 +1001,7 @@ msgstr "Chceš woprawdźe tutu zdźělenku wušmórnyć?" msgid "Do not delete this notice" msgstr "Tutu zdźělenku njewušmórnyć" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Tutu zdźělenku wušmórnyć" @@ -995,18 +1017,18 @@ msgstr "Móžeš jenož lokalnych wužiwarjow wušmórnyć." msgid "Delete user" msgstr "Wužiwarja wušmórnyć" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Tutoho wužiwarja wušmórnyć" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Design" @@ -1108,6 +1130,17 @@ msgstr "Standardne designy wobnowić" msgid "Reset back to default" msgstr "Na standard wróćo stajić" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Składować" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Design składować" @@ -1201,29 +1234,29 @@ msgstr "" msgid "You must be logged in to create a group." msgstr "Dyrbiš přizjewjeny być, zo by skupinu wutworił." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Dyrbiš administrator być, zo by skupinu wobdźěłał." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Wuž tutón formular, zo by skupinu wobdźěłał." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "wopisanje je předołho (maks. %d znamješkow)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Skupina njeje so dała aktualizować." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Aliasy njejsu so dali wutworić." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Opcije składowane." @@ -1552,7 +1585,7 @@ msgstr "Wužiwar je hižo za skupinu zablokowany." msgid "User is not a member of group." msgstr "Wužiwar njeje čłon skupiny." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Wužiwarja za skupinu blokować" @@ -1584,30 +1617,30 @@ msgstr "Žadyn ID." msgid "You must be logged in to edit a group." msgstr "Dyrbiš přizjewjeny być, zo by skupinu wobdźěłał." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Skupinski design" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "" -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Designowe nastajenja składowane." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Skupinske logo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1615,57 +1648,57 @@ msgstr "" "Móžeš logowy wobraz za swoju skupinu nahrać. Maksimalna datajowa wulkosć je %" "s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Wužiwar bjez hodźaceho so profila." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo zaktualizowane." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "" -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "%1$s skupinskich čłonow, strona %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Lisćina wužiwarjow w tutej skupinje." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Administrator" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Blokować" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Tutoho wužiwarja k administratorej činić" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "" @@ -1903,16 +1936,19 @@ msgstr "Wosobinska powěsć" msgid "Optionally add a personal message to the invitation." msgstr "Wosobinsku powěsć po dobrozdaću přeprošenju přidać." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Pósłać" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -1947,7 +1983,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "" -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Žane přimjeno." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "" @@ -1956,11 +1997,11 @@ msgstr "" msgid "You must be logged in to leave a group." msgstr "Dyrbiš přizjewjeny być, zo by skupinu wopušćił." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Njejsy čłon teje skupiny." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "" @@ -1977,8 +2018,7 @@ msgstr "Wopačne wužiwarske mjeno abo hesło." msgid "Error setting user. You are probably not authorized." msgstr "Zmylk při nastajenju wužiwarja. Snano njejsy awtorizowany." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Přizjewić" @@ -2218,8 +2258,8 @@ msgstr "" msgid "Only " msgstr "Jenož " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Njeje podpěrany datowy format." @@ -2358,7 +2398,7 @@ msgstr "" msgid "Password saved." msgstr "Hesło składowane." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Šćežki" @@ -2391,7 +2431,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Sydło" @@ -2559,7 +2598,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Dospołne mjeno" @@ -2587,7 +2626,7 @@ msgid "Bio" msgstr "Biografija" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2667,7 +2706,8 @@ msgstr "" msgid "Couldn't save tags." msgstr "" -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Nastajenja składowane." @@ -2680,45 +2720,45 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2727,7 +2767,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2897,8 +2937,7 @@ msgstr "Wodaj, njepłaćiwy přeprošenski kod." msgid "Registration successful" msgstr "Registrowanje wuspěšne" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Registrować" @@ -3057,7 +3096,7 @@ msgstr "Njemóžeš swójsku zdźělenku wospjetować." msgid "You already repeated that notice." msgstr "Sy tutu zdźělenku hižo wospjetował." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Wospjetowany" @@ -3065,47 +3104,47 @@ msgstr "Wospjetowany" msgid "Repeated!" msgstr "Wospjetowany!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3130,7 +3169,6 @@ msgid "User is already sandboxed." msgstr "" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Posedźenja" @@ -3156,7 +3194,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Sydłowe nastajenja składować" @@ -3186,7 +3224,7 @@ msgstr "Organizacija" msgid "Description" msgstr "Wopisanje" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statistika" @@ -3248,35 +3286,35 @@ msgstr "%1$s a přećeljo, strona %2$d" msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3284,7 +3322,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3298,67 +3336,67 @@ msgstr "" msgid "%1$s group, page %2$d" msgstr "%1$s skupinskich čłonow, strona %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Skupinski profil" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Aliasy" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Skupinske akcije" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Čłonojo" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Žadyn)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Wšitcy čłonojo" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Wutworjeny" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3368,7 +3406,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3377,7 +3415,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Administratorojo" @@ -3825,22 +3863,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "" @@ -3890,7 +3928,7 @@ msgstr "" msgid "No such tag." msgstr "" -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "" @@ -3920,70 +3958,72 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Wužiwar" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Wužiwarske nastajenja za sydło StatusNet." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Nowi wužiwarjo" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Powitanje noweho wužiwarja" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Powitanski tekst za nowych wužiwarjow (maks. 255 znamješkow)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Standardny abonement" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Přeprošenja" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Přeprošenja zmóžnjene" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4156,7 +4196,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Wersija" @@ -4193,6 +4233,11 @@ msgstr "Njeje dźěl skupiny." msgid "Group leave failed." msgstr "Wopušćenje skupiny je so njeporadźiło." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Skupina njeje so dała aktualizować." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4210,43 +4255,43 @@ msgstr "" msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "" -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "" -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "" -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "" -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4275,19 +4320,29 @@ msgstr "Sebjeabonement njeje so dał zničić." msgid "Couldn't delete subscription." msgstr "Abonoment njeje so dał zničić." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "" -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Skupina njeje so dała aktualizować." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "" +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Profil njeje so składować dał." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "" @@ -4329,132 +4384,203 @@ msgstr "Strona bjez titula" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 -msgid "Change your email, avatar, password, profile" -msgstr "" +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Wosobinski" +#. TRANS: Tooltip for main menu option "Account" #: lib/action.php:444 -msgid "Connect" -msgstr "Zwjazać" +#, fuzzy +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "Změń swoje hesło." -#: lib/action.php:444 +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Konto" + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" -msgstr "" +msgstr "Zwiski" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Zwjazać" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" -msgstr "" +msgstr "SMS-wobkrućenje" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Přeprosyć" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Administrator" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "" +"Wužij tutón formular, zo by swojich přećelow a kolegow přeprosył, zo bychu " +"tutu słužbu wužiwali." -#: lib/action.php:458 -msgid "Logout" -msgstr "" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Přeprosyć" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" -msgstr "" +msgstr "Šat za sydło." + +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Logo" -#: lib/action.php:463 +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Konto załožić" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registrować" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" -msgstr "" +msgstr "Při sydle přizjewić" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Pomoc" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Přizjewić" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Pomhaj!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Pytać" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Pomoc" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Za ludźimi abo tekstom pytać" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Pytać" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Pomoc" + +#: lib/action.php:765 msgid "About" msgstr "Wo" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "Huste prašenja" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Priwatnosć" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Žórło" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Kontakt" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." "broughtby%%](%%site.broughtbyurl%%). " msgstr "" -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "" -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4462,108 +4588,161 @@ msgid "" "org/licensing/licenses/agpl-3.0.html)." msgstr "" -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Změny na tutym woknje njejsu dowolene." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Sydło" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Design" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "SMS-wobkrućenje" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Wužiwar" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "SMS-wobkrućenje" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Přistup" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Šćežki" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "SMS-wobkrućenje" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Posedźenja" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4653,11 +4832,11 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Změnjenje hesła je so njeporadźiło" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "Změnjenje hesła njeje dowolene" @@ -4936,19 +5115,19 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Žana konfiguraciska dataja namakana. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5134,23 +5313,23 @@ msgstr "" msgid "Not an image or corrupt file." msgstr "" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "" -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Naša dataja je so zhubiła." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Njeznaty datajowy typ" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "KB" @@ -5443,6 +5622,12 @@ msgstr "Komu" msgid "Available characters" msgstr "K dispoziciji stejace znamješka" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Pósłać" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Zdźělenku pósłać" @@ -5499,23 +5684,23 @@ msgstr "Z" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Wospjetowany wot" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Na tutu zdźělenku wotmołwić" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Wotmołwić" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Zdźělenka wospjetowana" @@ -5563,6 +5748,10 @@ msgstr "Wotmołwy" msgid "Favorites" msgstr "Fawority" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Wužiwar" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "" @@ -5652,7 +5841,7 @@ msgstr "Tutu zdźělenku wospjetować?" msgid "Repeat this notice" msgstr "Tutu zdźělenku wospjetować" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5672,6 +5861,10 @@ msgstr "Pytanske sydło" msgid "Keyword(s)" msgstr "Klučowe hesła" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Pytać" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Pytanska pomoc" @@ -5723,6 +5916,15 @@ msgstr "" msgid "Groups %s is a member of" msgstr "" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Přeprosyć" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -5793,47 +5995,47 @@ msgstr "Powěsć" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "před něšto sekundami" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "před něhdźe jednej mjeńšinu" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "před %d mjeńšinami" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "před něhdźe jednej hodźinu" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "před něhdźe %d hodźinami" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "před něhdźe jednym dnjom" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "před něhdźe %d dnjemi" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "před něhdźe jednym měsacom" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "před něhdźe %d měsacami" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "před něhdźe jednym lětom" diff --git a/locale/ia/LC_MESSAGES/statusnet.po b/locale/ia/LC_MESSAGES/statusnet.po index fa42bd3fe..cc6af7f0f 100644 --- a/locale/ia/LC_MESSAGES/statusnet.po +++ b/locale/ia/LC_MESSAGES/statusnet.po @@ -8,75 +8,82 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:01+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:00+0000\n" "Language-Team: Interlingua\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Accesso" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Configurationes de accesso al sito" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Registration" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Private" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "Prohibir al usatores anonyme (sin session aperte) de vider le sito?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Solmente per invitation" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Private" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Permitter le registration solmente al invitatos." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Claudite" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Solmente per invitation" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Disactivar le creation de nove contos." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Salveguardar" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Claudite" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Salveguardar configurationes de accesso" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Salveguardar" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Pagina non existe" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -90,45 +97,53 @@ msgstr "Pagina non existe" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Usator non existe." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s e amicos, pagina %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s e amicos" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Syndication pro le amicos de %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Syndication pro le amicos de %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Syndication pro le amicos de %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." @@ -136,7 +151,7 @@ msgstr "" "Isto es le chronologia pro %s e su amicos, ma necuno ha ancora publicate " "alique." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -145,7 +160,8 @@ msgstr "" "Proba subscriber te a altere personas, [face te membro de un gruppo](%%" "action.groups%%) o publica alique tu mesme." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -154,7 +170,7 @@ msgstr "" "Tu pote tentar [dar un pulsata a %1$s](../%2$s) in su profilo o [publicar un " "message a su attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -163,7 +179,8 @@ msgstr "" "Proque non [registrar un conto](%%%%action.register%%%%) e postea dar un " "pulsata a %s o publicar un message a su attention." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Tu e amicos" @@ -181,20 +198,20 @@ msgstr "Actualisationes de %1$s e su amicos in %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "Methodo API non trovate." @@ -228,8 +245,9 @@ msgstr "Non poteva actualisar le usator." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Le usator non ha un profilo." @@ -255,7 +273,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -365,68 +383,68 @@ msgstr "Non poteva determinar le usator de origine." msgid "Could not find target user." msgstr "Non poteva trovar le usator de destination." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Le pseudonymo pote solmente haber minusculas e numeros, sin spatios." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Pseudonymo ja in uso. Proba un altere." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Non un pseudonymo valide." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Le pagina personal non es un URL valide." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Le nomine complete es troppo longe (max. 255 characteres)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Description es troppo longe (max %d charachteres)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Loco es troppo longe (max. 255 characteres)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Troppo de aliases! Maximo: %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Alias invalide: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Le alias \"%s\" es ja in uso. Proba un altere." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Le alias non pote esser identic al pseudonymo." @@ -437,15 +455,15 @@ msgstr "Le alias non pote esser identic al pseudonymo." msgid "Group not found!" msgstr "Gruppo non trovate!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Tu es ja membro de iste gruppo." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Le administrator te ha blocate de iste gruppo." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Non poteva inscriber le usator %1$s in le gruppo %2$s." @@ -454,7 +472,7 @@ msgstr "Non poteva inscriber le usator %1$s in le gruppo %2$s." msgid "You are not a member of this group." msgstr "Tu non es membro de iste gruppo." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Non poteva remover le usator %1$s del gruppo %2$s." @@ -485,7 +503,7 @@ msgstr "Indicio invalide." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -531,7 +549,7 @@ msgstr "Le indicio de requesta %s ha essite refusate e revocate." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -557,13 +575,13 @@ msgstr "" "%3$s le datos de tu conto de %4$s. Tu debe solmente dar " "accesso a tu conto de %4$s a tertie personas in le quales tu ha confidentia." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Conto" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -648,12 +666,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s actualisationes favoritisate per %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Chronologia de %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -690,7 +708,7 @@ msgstr "Repetite a %s" msgid "Repeats of %s" msgstr "Repetitiones de %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Notas con etiquetta %s" @@ -711,8 +729,7 @@ msgstr "Annexo non existe." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Nulle pseudonymo." @@ -724,7 +741,7 @@ msgstr "Nulle dimension." msgid "Invalid size." msgstr "Dimension invalide." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -742,30 +759,30 @@ msgid "User without matching profile" msgstr "Usator sin profilo correspondente" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Configuration del avatar" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Original" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Previsualisation" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Deler" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Incargar" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Taliar" @@ -773,7 +790,7 @@ msgstr "Taliar" msgid "Pick a square area of the image to be your avatar" msgstr "Selige un area quadrate del imagine pro facer lo tu avatar" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Datos del file perdite." @@ -808,22 +825,22 @@ msgstr "" "recipera notification de su @-responsas." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "No" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Non blocar iste usator" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Si" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Blocar iste usator" @@ -831,39 +848,43 @@ msgstr "Blocar iste usator" msgid "Failed to save block information." msgstr "Falleva de salveguardar le information del blocada." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Gruppo non existe." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s profilos blocate" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s profilos blocate, pagina %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Un lista del usatores excludite del membrato de iste gruppo." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Disblocar le usator del gruppo" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Disblocar" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Disblocar iste usator" @@ -938,7 +959,7 @@ msgstr "Tu non es le proprietario de iste application." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Il habeva un problema con tu indicio de session." @@ -964,12 +985,13 @@ msgstr "Non deler iste application" msgid "Delete this application" msgstr "Deler iste application" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Non identificate." @@ -998,7 +1020,7 @@ msgstr "Es tu secur de voler deler iste nota?" msgid "Do not delete this notice" msgstr "Non deler iste nota" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Deler iste nota" @@ -1014,7 +1036,7 @@ msgstr "Tu pote solmente deler usatores local." msgid "Delete user" msgstr "Deler usator" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1022,12 +1044,12 @@ msgstr "" "Es tu secur de voler deler iste usator? Isto radera tote le datos super le " "usator del base de datos, sin copia de reserva." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Deler iste usator" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Apparentia" @@ -1130,6 +1152,17 @@ msgstr "Restaurar apparentias predefinite" msgid "Reset back to default" msgstr "Revenir al predefinitiones" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Salveguardar" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Salveguardar apparentia" @@ -1221,29 +1254,29 @@ msgstr "Modificar gruppo %s" msgid "You must be logged in to create a group." msgstr "Tu debe aperir un session pro crear un gruppo." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Tu debe esser administrator pro modificar le gruppo." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Usa iste formulario pro modificar le gruppo." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "description es troppo longe (max %d chars)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Non poteva actualisar gruppo." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Non poteva crear aliases." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Optiones salveguardate." @@ -1583,7 +1616,7 @@ msgstr "Le usator es ja blocate del gruppo." msgid "User is not a member of group." msgstr "Le usator non es membro del gruppo." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Blocar usator del gruppo" @@ -1618,11 +1651,11 @@ msgstr "Nulle ID." msgid "You must be logged in to edit a group." msgstr "Tu debe aperir un session pro modificar un gruppo." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Apparentia del gruppo" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1630,20 +1663,20 @@ msgstr "" "Personalisa le apparentia de tu gruppo con un imagine de fundo e un paletta " "de colores de tu preferentia." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Non poteva actualisar tu apparentia." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Preferentias de apparentia salveguardate." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Logotypo del gruppo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1651,57 +1684,57 @@ msgstr "" "Tu pote incargar un imagine pro le logotypo de tu gruppo. Le dimension " "maximal del file es %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Usator sin profilo correspondente" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Selige un area quadrate del imagine que devenira le logotypo." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logotypo actualisate." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Falleva de actualisar le logotypo." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Membros del gruppo %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "Membros del gruppo %1$s, pagina %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Un lista de usatores in iste gruppo." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Administrator" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Blocar" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Facer le usator administrator del gruppo" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Facer administrator" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Facer iste usator administrator" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Actualisationes de membros de %1$s in %2$s!" @@ -1966,16 +1999,19 @@ msgstr "Message personal" msgid "Optionally add a personal message to the invitation." msgstr "Si tu vole, adde un message personal al invitation." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Inviar" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s te ha invitate a accompaniar le/la in %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2036,7 +2072,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Tu debe aperir un session pro facer te membro de un gruppo." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Nulle pseudonymo." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s es ora membro del gruppo %2$s" @@ -2045,11 +2086,11 @@ msgstr "%1$s es ora membro del gruppo %2$s" msgid "You must be logged in to leave a group." msgstr "Tu debe aperir un session pro quitar un gruppo." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Tu non es membro de iste gruppo." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s quitava le gruppo %2$s" @@ -2067,8 +2108,7 @@ msgid "Error setting user. You are probably not authorized." msgstr "" "Error de acceder al conto de usator. Tu probabilemente non es autorisate." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Aperir session" @@ -2326,8 +2366,8 @@ msgstr "typo de contento " msgid "Only " msgstr "Solmente " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Formato de datos non supportate." @@ -2467,7 +2507,7 @@ msgstr "Non pote salveguardar le nove contrasigno." msgid "Password saved." msgstr "Contrasigno salveguardate." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Camminos" @@ -2500,7 +2540,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Servitor SSL invalide. Le longitude maximal es 255 characteres." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Sito" @@ -2674,7 +2713,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 minusculas o numeros, sin punctuation o spatios" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Nomine complete" @@ -2702,7 +2741,7 @@ msgid "Bio" msgstr "Bio" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2785,7 +2824,8 @@ msgstr "Non poteva salveguardar profilo." msgid "Couldn't save tags." msgstr "Non poteva salveguardar etiquettas." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Preferentias confirmate." @@ -2798,28 +2838,28 @@ msgstr "Ultra le limite de pagina (%s)" msgid "Could not retrieve public stream." msgstr "Non poteva recuperar le fluxo public." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Chronologia public, pagina %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Chronologia public" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Syndication del fluxo public (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Syndication del fluxo public (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Syndication del fluxo public (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2828,11 +2868,11 @@ msgstr "" "Isto es le chronologia public pro %%site.name%%, ma nulle persona ha ancora " "scribite alique." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Sia le prime a publicar!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2840,7 +2880,7 @@ msgstr "" "Proque non [registrar un conto](%%action.register%%) e devenir le prime a " "publicar?" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2853,7 +2893,7 @@ msgstr "" "[Inscribe te ora](%%action.register%%) pro condivider notas super te con " "amicos, familia e collegas! ([Leger plus](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3031,8 +3071,7 @@ msgstr "Pardono, le codice de invitation es invalide." msgid "Registration successful" msgstr "Registration succedite" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Crear conto" @@ -3218,7 +3257,7 @@ msgstr "Tu non pote repeter tu proprie nota." msgid "You already repeated that notice." msgstr "Tu ha ja repetite iste nota." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Repetite" @@ -3226,33 +3265,33 @@ msgstr "Repetite" msgid "Repeated!" msgstr "Repetite!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Responsas a %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Responsas a %1$s, pagina %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Syndication de responsas pro %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Syndication de responsas pro %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Syndication de responsas pro %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3261,7 +3300,7 @@ msgstr "" "Isto es le chronologia de responsas a %1$s, ma %2$s non ha ancora recipite " "alcun nota a su attention." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3270,7 +3309,7 @@ msgstr "" "Tu pote facer conversation con altere usatores, subscriber te a plus " "personas o [devenir membro de gruppos](%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3297,7 +3336,6 @@ msgid "User is already sandboxed." msgstr "Usator es ja in cassa de sablo." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Sessiones" @@ -3322,7 +3360,7 @@ msgid "Turn on debugging output for sessions." msgstr "Producer informationes technic pro cercar defectos in sessiones." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Salveguardar configurationes del sito" @@ -3352,7 +3390,7 @@ msgstr "Organisation" msgid "Description" msgstr "Description" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statisticas" @@ -3415,22 +3453,22 @@ msgstr "Notas favorite de %1$s, pagina %2$d" msgid "Could not retrieve favorite notices." msgstr "Non poteva recuperar notas favorite." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Syndication del favorites de %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Syndication del favorites de %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Syndication del favorites de %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3439,7 +3477,7 @@ msgstr "" "Favorite sub notas que te place pro memorisar los pro plus tarde o pro " "mitter los in evidentia." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3448,7 +3486,7 @@ msgstr "" "%s non ha ancora addite alcun nota a su favorites. Publica alique " "interessante que ille favoritisarea :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3459,7 +3497,7 @@ msgstr "" "conto](%%%%action.register%%%%) e postea publicar alique interessante que " "ille favoritisarea :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Isto es un modo de condivider lo que te place." @@ -3473,67 +3511,67 @@ msgstr "Gruppo %s" msgid "%1$s group, page %2$d" msgstr "Gruppo %1$s, pagina %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Profilo del gruppo" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Nota" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Aliases" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Actiones del gruppo" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Syndication de notas pro le gruppo %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Syndication de notas pro le gruppo %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Syndication de notas pro le gruppo %s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "Amico de un amico pro le gruppo %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Membros" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Nulle)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Tote le membros" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Create" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3548,7 +3586,7 @@ msgstr "" "lor vita e interesses. [Crea un conto](%%%%action.register%%%%) pro devenir " "parte de iste gruppo e multe alteres! ([Lege plus](%%%%doc.help%%%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3561,7 +3599,7 @@ msgstr "" "[StatusNet](http://status.net/). Su membros condivide breve messages super " "lor vita e interesses. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Administratores" @@ -4041,22 +4079,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Notas etiquettate con %1$s, pagina %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Syndication de notas pro le etiquetta %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Syndication de notas pro le etiquetta %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Syndication de notas pro le etiquetta %s (Atom)" @@ -4111,7 +4149,7 @@ msgstr "" msgid "No such tag." msgstr "Etiquetta non existe." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Methodo API in construction." @@ -4143,70 +4181,72 @@ msgstr "" "Le licentia del fluxo que tu ascolta, ‘%1$s’, non es compatibile con le " "licentia del sito ‘%2$s’." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Usator" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Configurationes de usator pro iste sito de StatusNet." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Limite de biographia invalide. Debe esser un numero." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "Texto de benvenita invalide. Longitude maximal es 255 characteres." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Subscription predefinite invalide: '%1$s' non es usator." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profilo" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Limite de biographia" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Le longitude maximal del biographia de un profilo in characteres." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Nove usatores" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Message de benvenita a nove usatores" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Texto de benvenita pro nove usatores (max. 255 characteres)" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Subscription predefinite" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Subscriber automaticamente le nove usatores a iste usator." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Invitationes" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Invitationes activate" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "Si le usatores pote invitar nove usatores." @@ -4402,7 +4442,7 @@ msgstr "" msgid "Plugins" msgstr "Plug-ins" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Version" @@ -4441,6 +4481,11 @@ msgstr "Non es membro del gruppo." msgid "Group leave failed." msgstr "Le cancellation del membrato del gruppo ha fallite." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Non poteva actualisar gruppo." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4458,27 +4503,27 @@ msgstr "Non poteva inserer message." msgid "Could not update message with new URI." msgstr "Non poteva actualisar message con nove URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Error in base de datos durante insertion del marca (hashtag): %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Problema salveguardar nota. Troppo longe." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Problema salveguardar nota. Usator incognite." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Troppo de notas troppo rapidemente; face un pausa e publica de novo post " "alcun minutas." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4486,19 +4531,19 @@ msgstr "" "Troppo de messages duplicate troppo rapidemente; face un pausa e publica de " "novo post alcun minutas." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Il te es prohibite publicar notas in iste sito." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problema salveguardar nota." -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "Problema salveguardar le cassa de entrata del gruppo." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4527,19 +4572,29 @@ msgstr "Non poteva deler auto-subscription." msgid "Couldn't delete subscription." msgstr "Non poteva deler subscription." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Benvenite a %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Non poteva crear gruppo." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Non poteva configurar le membrato del gruppo." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Non poteva configurar le membrato del gruppo." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Non poteva salveguardar le subscription." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Cambiar le optiones de tu profilo" @@ -4581,120 +4636,190 @@ msgstr "Pagina sin titulo" msgid "Primary site navigation" msgstr "Navigation primari del sito" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Initio" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Profilo personal e chronologia de amicos" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Personal" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Cambiar tu e-mail, avatar, contrasigno, profilo" -#: lib/action.php:444 -msgid "Connect" -msgstr "Connecter" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Conto" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Connecter con servicios" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Connecter" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Modificar le configuration del sito" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Invitar" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Administrator" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Invitar amicos e collegas a accompaniar te in %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Clauder session" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Invitar" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Terminar le session del sito" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Clauder session" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Crear un conto" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Crear conto" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Identificar te a iste sito" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Adjuta" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Aperir session" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Adjuta me!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Cercar" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Adjuta" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Cercar personas o texto" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Cercar" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Aviso del sito" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Vistas local" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Aviso de pagina" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Navigation secundari del sito" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Adjuta" + +#: lib/action.php:765 msgid "About" msgstr "A proposito" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "CdS" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Confidentialitate" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Fonte" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Contacto" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Insignia" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Licentia del software StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4703,12 +4828,12 @@ msgstr "" "**%%site.name%%** es un servicio de microblog offerite per [%%site.broughtby%" "%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** es un servicio de microblog. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4719,108 +4844,161 @@ msgstr "" "net/), version %s, disponibile sub le [GNU Affero General Public License]" "(http://www.fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Licentia del contento del sito" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "Le contento e datos de %1$s es private e confidential." -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "Contento e datos sub copyright de %1$s. Tote le derectos reservate." -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "Contento e datos sub copyright del contributores. Tote le derectos reservate." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Totes " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "licentia." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Pagination" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Post" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Ante" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Tu non pote facer modificationes in iste sito." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Le modification de iste pannello non es permittite." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() non implementate." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() non implementate." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Impossibile deler configuration de apparentia." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Configuration basic del sito" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Sito" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Configuration del apparentia" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Apparentia" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Configuration del usator" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Usator" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Configuration del accesso" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Accesso" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Configuration del camminos" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Camminos" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Configuration del sessiones" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Sessiones" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "Le ressource de API require accesso pro lectura e scriptura, ma tu ha " "solmente accesso pro lectura." -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4914,11 +5092,11 @@ msgstr "Notas ubi iste annexo appare" msgid "Tags for this attachment" msgstr "Etiquettas pro iste annexo" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Cambio del contrasigno fallite" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "Cambio del contrasigno non permittite" @@ -5233,19 +5411,19 @@ msgstr "" "tracks - non ancora implementate.\n" "tracking - non ancora implementate.\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Nulle file de configuration trovate. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "Io cercava files de configuration in le sequente locos: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "Considera executar le installator pro reparar isto." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Ir al installator." @@ -5433,25 +5611,25 @@ msgstr "Error de systema durante le incargamento del file." #: lib/imagefile.php:96 msgid "Not an image or corrupt file." -msgstr "Le file non es un imagine o es defecte." +msgstr "Le file non es un imagine o es defectuose." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Formato de file de imagine non supportate." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "File perdite." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Typo de file incognite" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "KB" @@ -5834,6 +6012,12 @@ msgstr "A" msgid "Available characters" msgstr "Characteres disponibile" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Inviar" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Inviar un nota" @@ -5892,23 +6076,23 @@ msgstr "W" msgid "at" msgstr "a" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "in contexto" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Repetite per" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Responder a iste nota" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Responder" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Nota repetite" @@ -5956,6 +6140,10 @@ msgstr "Responsas" msgid "Favorites" msgstr "Favorites" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Usator" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Cassa de entrata" @@ -6045,7 +6233,7 @@ msgstr "Repeter iste nota?" msgid "Repeat this notice" msgstr "Repeter iste nota" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "Nulle signule usator definite pro le modo de singule usator." @@ -6065,6 +6253,10 @@ msgstr "Cercar in sito" msgid "Keyword(s)" msgstr "Parola(s)-clave" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Cercar" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Adjuta super le recerca" @@ -6116,6 +6308,15 @@ msgstr "Personas qui seque %s" msgid "Groups %s is a member of" msgstr "Gruppos del quales %s es membro" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Invitar" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Invitar amicos e collegas a accompaniar te in %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6186,47 +6387,47 @@ msgstr "Message" msgid "Moderate" msgstr "Moderar" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "alcun secundas retro" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "circa un minuta retro" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "circa %d minutas retro" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "circa un hora retro" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "circa %d horas retro" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "circa un die retro" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "circa %d dies retro" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "circa un mense retro" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "circa %d menses retro" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "circa un anno retro" diff --git a/locale/is/LC_MESSAGES/statusnet.po b/locale/is/LC_MESSAGES/statusnet.po index 08e4fec95..aaf79c8f7 100644 --- a/locale/is/LC_MESSAGES/statusnet.po +++ b/locale/is/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:05+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:04+0000\n" "Language-Team: Icelandic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: is\n" "X-Message-Group: out-statusnet\n" @@ -21,71 +21,77 @@ msgstr "" "= 31 && n % 100 != 41 && n % 100 != 51 && n % 100 != 61 && n % 100 != 71 && " "n % 100 != 81 && n % 100 != 91);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "Samþykkja" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Stillingar fyrir mynd" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Nýskrá" -#: actions/accessadminpanel.php:161 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 #, fuzzy +msgctxt "LABEL" msgid "Private" msgstr "Friðhelgi" -#: actions/accessadminpanel.php:163 -msgid "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:167 +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 #, fuzzy msgid "Invite only" msgstr "Bjóða" -#: actions/accessadminpanel.php:169 -msgid "Make registration invitation only." +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:173 +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 msgid "Closed" msgstr "" -#: actions/accessadminpanel.php:175 -msgid "Disable new registrations." -msgstr "" - -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Vista" - -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Stillingar fyrir mynd" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Vista" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page" msgstr "Ekkert þannig merki." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -99,72 +105,82 @@ msgstr "Ekkert þannig merki." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Enginn svoleiðis notandi." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s og vinirnir, síða %d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s og vinirnir" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "" @@ -182,20 +198,20 @@ msgstr "Færslur frá %1$s og vinum á %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Aðferð í forritsskilum fannst ekki!" @@ -229,8 +245,9 @@ msgstr "Gat ekki uppfært notanda." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Notandi hefur enga persónulega síðu." @@ -255,7 +272,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -372,68 +389,68 @@ msgstr "" msgid "Could not find target user." msgstr "" -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Stuttnefni geta bara verið lágstafir og tölustafir en engin bil." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Stuttnefni nú þegar í notkun. Prófaðu eitthvað annað." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Ekki tækt stuttnefni." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Heimasíða er ekki gild vefslóð." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Fullt nafn er of langt (í mesta lagi 255 stafir)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." msgstr "Lýsing er of löng (í mesta lagi 140 tákn)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Staðsetning er of löng (í mesta lagi 255 stafir)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "" -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -445,16 +462,16 @@ msgstr "" msgid "Group not found!" msgstr "Aðferð í forritsskilum fannst ekki!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 #, fuzzy msgid "You are already a member of that group." msgstr "Þú ert nú þegar meðlimur í þessum hópi" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Gat ekki bætt notandanum %s í hópinn %s" @@ -464,7 +481,7 @@ msgstr "Gat ekki bætt notandanum %s í hópinn %s" msgid "You are not a member of this group." msgstr "Þú ert ekki meðlimur í þessum hópi." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Gat ekki fjarlægt notandann %s úr hópnum %s" @@ -496,7 +513,7 @@ msgstr "Ótæk stærð." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -540,7 +557,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -563,13 +580,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Aðgangur" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -655,12 +672,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s færslur gerðar að uppáhaldsbabli af %s / %s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Rás %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -696,7 +713,7 @@ msgstr "Svör við %s" msgid "Repeats of %s" msgstr "Svör við %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Babl merkt með %s" @@ -717,8 +734,7 @@ msgstr "" #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Ekkert stuttnefni." @@ -730,7 +746,7 @@ msgstr "Engin stærð." msgid "Invalid size." msgstr "Ótæk stærð." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Mynd" @@ -747,30 +763,30 @@ msgid "User without matching profile" msgstr "Notandi með enga persónulega síðu sem passar við" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Stillingar fyrir mynd" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Upphafleg mynd" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Forsýn" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Eyða" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Hlaða upp" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Skera af" @@ -779,7 +795,7 @@ msgid "Pick a square area of the image to be your avatar" msgstr "" "Veldu ferningslaga svæði á upphaflegu myndinni sem einkennismyndina þína" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Týndum skráargögnunum okkar" @@ -812,23 +828,23 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Nei" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "Opna á þennan notanda" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Já" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Loka á þennan notanda" @@ -836,39 +852,43 @@ msgstr "Loka á þennan notanda" msgid "Failed to save block information." msgstr "Mistókst að vista upplýsingar um notendalokun" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Enginn þannig hópur." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s og vinirnir, síða %d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Opna" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Opna á þennan notanda" @@ -949,7 +969,7 @@ msgstr "Þú ert ekki meðlimur í þessum hópi." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Það komu upp vandamál varðandi setutókann þinn." @@ -975,12 +995,13 @@ msgstr "Gat ekki uppfært hóp." msgid "Delete this application" msgstr "Eyða þessu babli" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Ekki innskráð(ur)." @@ -1007,7 +1028,7 @@ msgstr "Ertu viss um að þú viljir eyða þessu babli?" msgid "Do not delete this notice" msgstr "" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Eyða þessu babli" @@ -1026,19 +1047,19 @@ msgstr "Þú getur ekki eytt stöðu annars notanda." msgid "Delete user" msgstr "Eyða" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" msgstr "Eyða þessu babli" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1145,6 +1166,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Vista" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1247,30 +1279,30 @@ msgstr "Breyta hópnum %s" msgid "You must be logged in to create a group." msgstr "Þú verður að hafa skráð þig inn til að búa til hóp." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "Þú verður að vera stjórnandi til að geta breytt hópnum" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Notaðu þetta eyðublað til að breyta hópnum." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." msgstr "Lýsing er of löng (í mesta lagi 140 tákn)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Gat ekki uppfært hóp." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "" -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Valmöguleikar vistaðir." @@ -1615,7 +1647,7 @@ msgstr "" msgid "User is not a member of group." msgstr "" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "" @@ -1648,87 +1680,87 @@ msgstr "Ekkert einkenni" msgid "You must be logged in to edit a group." msgstr "" -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "" -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "" -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Einkennismynd hópsins" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Notandi með enga persónulega síðu sem passar við" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Einkennismynd uppfærð." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Tókst ekki að uppfæra einkennismynd" -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Hópmeðlimir %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" msgstr "Hópmeðlimir %s, síða %d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Listi yfir notendur í þessum hóp." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Stjórnandi" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Loka" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Færslur frá %1$s á %2$s!" @@ -1985,16 +2017,19 @@ msgstr "Persónuleg skilaboð" msgid "Optionally add a personal message to the invitation." msgstr "Bættu persónulegum skilaboðum við boðskortið ef þú vilt." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Senda" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s hefur boðið þér að slást í hópinn með þeim á %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2055,7 +2090,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Þú verður að hafa skráð þig inn til að bæta þér í hóp." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Ekkert stuttnefni." + +#: actions/joingroup.php:141 #, fuzzy, php-format msgid "%1$s joined group %2$s" msgstr "%s bætti sér í hópinn %s" @@ -2064,11 +2104,11 @@ msgstr "%s bætti sér í hópinn %s" msgid "You must be logged in to leave a group." msgstr "Þú verður aða hafa skráð þig inn til að ganga úr hóp." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Þú ert ekki meðlimur í þessum hópi." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%s gekk úr hópnum %s" @@ -2086,8 +2126,7 @@ msgstr "Rangt notendanafn eða lykilorð." msgid "Error setting user. You are probably not authorized." msgstr "Engin heimild." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Innskráning" @@ -2346,8 +2385,8 @@ msgstr "" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Enginn stuðningur við gagnasnið." @@ -2494,7 +2533,7 @@ msgstr "Get ekki vistað nýja lykilorðið." msgid "Password saved." msgstr "Lykilorð vistað." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2527,7 +2566,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 #, fuzzy msgid "Site" msgstr "Bjóða" @@ -2710,7 +2748,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 lágstafir eða tölustafir, engin greinarmerki eða bil" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Fullt nafn" @@ -2741,7 +2779,7 @@ msgid "Bio" msgstr "Lýsing" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2826,7 +2864,8 @@ msgstr "Gat ekki vistað persónulega síðu." msgid "Couldn't save tags." msgstr "Gat ekki vistað merki." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Stillingar vistaðar." @@ -2839,45 +2878,45 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "Gat ekki sótt efni úr almenningsveitu." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Almenningsrás, síða %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Almenningsrás" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2886,7 +2925,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3059,8 +3098,7 @@ msgstr "" msgid "Registration successful" msgstr "Nýskráning tókst" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Nýskrá" @@ -3250,7 +3288,7 @@ msgstr "Þú getur ekki nýskráð þig nema þú samþykkir leyfið." msgid "You already repeated that notice." msgstr "Þú hefur nú þegar lokað á þennan notanda." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "Í sviðsljósinu" @@ -3259,47 +3297,47 @@ msgstr "Í sviðsljósinu" msgid "Repeated!" msgstr "" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Svör við %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "Skilaboð til %1$s á %2$s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "" -#: actions/replies.php:158 +#: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" msgstr "Bablveita fyrir hópinn %s" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3326,7 +3364,6 @@ msgid "User is already sandboxed." msgstr "" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3351,7 +3388,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "Stillingar fyrir mynd" @@ -3386,7 +3423,7 @@ msgstr "Uppröðun" msgid "Description" msgstr "Lýsing" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Tölfræði" @@ -3448,35 +3485,35 @@ msgstr "Uppáhaldsbabl %s" msgid "Could not retrieve favorite notices." msgstr "Gat ekki sótt uppáhaldsbabl." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Bablveita uppáhaldsbabls %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Bablveita uppáhaldsbabls %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, fuzzy, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Bablveita uppáhaldsbabls %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3484,7 +3521,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3498,67 +3535,67 @@ msgstr "%s hópurinn" msgid "%1$s group, page %2$d" msgstr "Hópmeðlimir %s, síða %d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Hópssíðan" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "Vefslóð" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Athugasemd" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Hópsaðgerðir" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, fuzzy, php-format msgid "FOAF for %s group" msgstr "%s hópurinn" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Meðlimir" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Ekkert)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Allir meðlimir" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3568,7 +3605,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3577,7 +3614,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "" @@ -4040,22 +4077,22 @@ msgstr "Jabber snarskilaboðaþjónusta" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Notendur sjálfmerktir með %s - síða %d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Bablveita fyrir %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "" @@ -4112,7 +4149,7 @@ msgstr "" msgid "No such tag." msgstr "Ekkert þannig merki." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Aðferð í forritsskilum er í þróun." @@ -4145,77 +4182,79 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Notandi" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Persónuleg síða" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 #, fuzzy msgid "New users" msgstr "Bjóða nýjum notendum að vera með" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "Allar áskriftir" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "" "Gerast sjálfkrafa áskrifandi að hverjum þeim sem gerist áskrifandi að þér " "(best fyrir ómannlega notendur)" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "Boðskort hefur verið sent út" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 #, fuzzy msgid "Invitations enabled" msgstr "Boðskort hefur verið sent út" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4399,7 +4438,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Persónulegt" @@ -4440,6 +4479,11 @@ msgstr "Gat ekki uppfært hóp." msgid "Group leave failed." msgstr "Hópssíðan" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Gat ekki uppfært hóp." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4458,46 +4502,46 @@ msgstr "Gat ekki skeytt skilaboðum inn í." msgid "Could not update message with new URI." msgstr "Gat ekki uppfært skilaboð með nýju veffangi." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Gagnagrunnsvilla við innsetningu myllumerkis: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "" -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Gat ekki vistað babl. Óþekktur notandi." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Of mikið babl í einu; slakaðu aðeins á og haltu svo áfram eftir nokkrar " "mínútur." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Það hefur verið lagt bann við babli frá þér á þessari síðu." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Vandamál komu upp við að vista babl." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Vandamál komu upp við að vista babl." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -4529,19 +4573,29 @@ msgstr "Gat ekki eytt áskrift." msgid "Couldn't delete subscription." msgstr "Gat ekki eytt áskrift." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Gat ekki búið til hóp." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Gat ekki skráð hópmeðlimi." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Gat ekki skráð hópmeðlimi." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Gat ekki vistað áskrift." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Breyta persónulegu stillingunum þínum" @@ -4583,124 +4637,192 @@ msgstr "Ónafngreind síða" msgid "Primary site navigation" msgstr "Stikl aðalsíðu" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Heim" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Persónuleg síða og vinarás" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Persónulegt" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "" "Breyttu tölvupóstinum þínum, einkennismyndinni þinni, lykilorðinu þínu, " "persónulegu síðunni þinni" -#: lib/action.php:444 -msgid "Connect" -msgstr "Tengjast" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Aðgangur" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Gat ekki framsent til vefþjóns: %s" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Tengjast" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 #, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Stikl aðalsíðu" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Bjóða" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Stjórnandi" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Bjóða vinum og vandamönnum að slást í hópinn á %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Útskráning" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Bjóða" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Skrá þig út af síðunni" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Útskráning" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Búa til aðgang" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Nýskrá" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Skrá þig inn á síðuna" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Hjálp" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Innskráning" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Hjálp!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Leita" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Hjálp" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Leita að fólki eða texta" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Leita" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Babl vefsíðunnar" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Staðbundin sýn" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Babl síðunnar" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Stikl undirsíðu" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Hjálp" + +#: lib/action.php:765 msgid "About" msgstr "Um" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "Spurt og svarað" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Friðhelgi" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Frumþula" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Tengiliður" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Hugbúnaðarleyfi StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4709,12 +4831,12 @@ msgstr "" "**%%site.name%%** er örbloggsþjónusta í boði [%%site.broughtby%%](%%site." "broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** er örbloggsþjónusta." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4725,116 +4847,168 @@ msgstr "" "sem er gefinn út undir [GNU Affero almenningsleyfinu](http://www.fsf.org/" "licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "Hugbúnaðarleyfi StatusNet" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Allt " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "leyfi." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Uppröðun" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Eftir" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Áður" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 #, fuzzy msgid "You cannot make changes to this site." msgstr "Þú getur ekki sent þessum notanda skilaboð." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "Nýskráning ekki leyfð." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 #, fuzzy msgid "showForm() not implemented." msgstr "Skipun hefur ekki verið fullbúin" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 #, fuzzy msgid "saveSettings() not implemented." msgstr "Skipun hefur ekki verið fullbúin" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "Staðfesting tölvupóstfangs" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Bjóða" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "SMS staðfesting" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Persónulegt" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "SMS staðfesting" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Notandi" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "SMS staðfesting" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Samþykkja" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "SMS staðfesting" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "SMS staðfesting" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Persónulegt" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4929,12 +5103,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Lykilorðabreyting" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Lykilorðabreyting" @@ -5215,20 +5389,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "Enginn staðfestingarlykill." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 #, fuzzy msgid "Go to the installer." msgstr "Skrá þig inn á síðuna" @@ -5420,23 +5594,23 @@ msgstr "Kerfisvilla kom upp við upphal skráar." msgid "Not an image or corrupt file." msgstr "Annaðhvort ekki mynd eða þá að skráin er gölluð." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Skráarsnið myndar ekki stutt." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Týndum skránni okkar" -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Óþekkt skráargerð" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5741,6 +5915,12 @@ msgstr "Til" msgid "Available characters" msgstr "Leyfileg tákn" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Senda" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Senda babl" @@ -5800,24 +5980,24 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "Í sviðsljósinu" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Svara þessu babli" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Svara" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Babl sent inn" @@ -5867,6 +6047,10 @@ msgstr "Svör" msgid "Favorites" msgstr "Uppáhald" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Notandi" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Innhólf" @@ -5960,7 +6144,7 @@ msgstr "Svara þessu babli" msgid "Repeat this notice" msgstr "Svara þessu babli" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5982,6 +6166,10 @@ msgstr "" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Leita" + #: lib/searchaction.php:162 msgid "Search help" msgstr "" @@ -6035,6 +6223,15 @@ msgstr "Fólk sem eru áskrifendur að %s" msgid "Groups %s is a member of" msgstr "Hópar sem %s er meðlimur í" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Bjóða" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Bjóða vinum og vandamönnum að slást í hópinn á %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6107,47 +6304,47 @@ msgstr "Skilaboð" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "fyrir nokkrum sekúndum" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "fyrir um einni mínútu síðan" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "fyrir um %d mínútum síðan" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "fyrir um einum klukkutíma síðan" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "fyrir um %d klukkutímum síðan" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "fyrir um einum degi síðan" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "fyrir um %d dögum síðan" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "fyrir um einum mánuði síðan" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "fyrir um %d mánuðum síðan" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "fyrir um einu ári síðan" diff --git a/locale/it/LC_MESSAGES/statusnet.po b/locale/it/LC_MESSAGES/statusnet.po index 7e3d7998a..61d4cfaf9 100644 --- a/locale/it/LC_MESSAGES/statusnet.po +++ b/locale/it/LC_MESSAGES/statusnet.po @@ -9,77 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:09+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:07+0000\n" "Language-Team: Italian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: it\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Accesso" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Impostazioni di accesso al sito" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Registrazione" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Privato" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" "Proibire agli utenti anonimi (che non hanno effettuato l'accesso) di vedere " "il sito?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Solo invito" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Privato" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Rende la registrazione solo su invito" -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Chiuso" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Solo invito" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Disabilita la creazione di nuovi account" -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Salva" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Chiuso" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Salva impostazioni di accesso" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Salva" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Pagina inesistente." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -93,45 +100,53 @@ msgstr "Pagina inesistente." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Utente inesistente." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s e amici, pagina %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s e amici" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Feed degli amici di %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Feed degli amici di %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Feed degli amici di %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." @@ -139,7 +154,7 @@ msgstr "" "Questa è l'attività di %s e i suoi amici, ma nessuno ha ancora scritto " "qualche cosa." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -148,7 +163,8 @@ msgstr "" "Prova ad abbonarti a più persone, [entra in un gruppo](%%action.groups%%) o " "scrivi un messaggio." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -158,7 +174,7 @@ msgstr "" "qualche cosa alla sua attenzione](%%%%action.newnotice%%%%?status_textarea=%3" "$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -167,7 +183,8 @@ msgstr "" "Perché non [crei un account](%%%%action.register%%%%) e richiami %s o scrivi " "un messaggio alla sua attenzione." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Tu e i tuoi amici" @@ -185,20 +202,20 @@ msgstr "Messaggi da %1$s e amici su %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "Metodo delle API non trovato." @@ -232,8 +249,9 @@ msgstr "Impossibile aggiornare l'utente." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "L'utente non ha un profilo." @@ -259,7 +277,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -369,7 +387,7 @@ msgstr "Impossibile determinare l'utente sorgente." msgid "Could not find target user." msgstr "Impossibile trovare l'utente destinazione." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -377,62 +395,62 @@ msgstr "" "Il soprannome deve essere composto solo da lettere minuscole e numeri, senza " "spazi." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Soprannome già in uso. Prova con un altro." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Non è un soprannome valido." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "L'indirizzo della pagina web non è valido." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Nome troppo lungo (max 255 caratteri)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "La descrizione è troppo lunga (max %d caratteri)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Ubicazione troppo lunga (max 255 caratteri)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Troppi alias! Massimo %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Alias non valido: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "L'alias \"%s\" è già in uso. Prova con un altro." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "L'alias non può essere lo stesso del soprannome." @@ -443,15 +461,15 @@ msgstr "L'alias non può essere lo stesso del soprannome." msgid "Group not found!" msgstr "Gruppo non trovato!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Fai già parte di quel gruppo." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "L'amministratore ti ha bloccato l'accesso a quel gruppo." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Impossibile iscrivere l'utente %1$s al gruppo %2$s." @@ -460,7 +478,7 @@ msgstr "Impossibile iscrivere l'utente %1$s al gruppo %2$s." msgid "You are not a member of this group." msgstr "Non fai parte di questo gruppo." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Impossibile rimuovere l'utente %1$s dal gruppo %2$s." @@ -491,7 +509,7 @@ msgstr "Token non valido." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -535,7 +553,7 @@ msgstr "Il token di richiesta %s è stato rifiutato o revocato." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -561,13 +579,13 @@ msgstr "" "%3$s ai dati del tuo account %4$s. È consigliato fornire " "accesso al proprio account %4$s solo ad applicazioni di cui ci si può fidare." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Account" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -650,12 +668,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s aggiornamenti preferiti da %2$s / %3$s" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Attività di %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -691,7 +709,7 @@ msgstr "Ripetuto a %s" msgid "Repeats of %s" msgstr "Ripetizioni di %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Messaggi etichettati con %s" @@ -712,8 +730,7 @@ msgstr "Nessun allegato." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Nessun soprannome." @@ -725,7 +742,7 @@ msgstr "Nessuna dimensione." msgid "Invalid size." msgstr "Dimensione non valida." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Immagine" @@ -743,30 +760,30 @@ msgid "User without matching profile" msgstr "Utente senza profilo corrispondente" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Impostazioni immagine" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Originale" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Anteprima" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Elimina" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Carica" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Ritaglia" @@ -774,7 +791,7 @@ msgstr "Ritaglia" msgid "Pick a square area of the image to be your avatar" msgstr "Scegli un'area quadrata per la tua immagine personale" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Perso il nostro file di dati." @@ -809,22 +826,22 @@ msgstr "" "risposte che ti invierà." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "No" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Non bloccare questo utente" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Sì" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Blocca questo utente" @@ -832,39 +849,43 @@ msgstr "Blocca questo utente" msgid "Failed to save block information." msgstr "Salvataggio delle informazioni per il blocco non riuscito." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Nessuna gruppo." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "Profili bloccati di %s" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "Profili bloccati di %1$s, pagina %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Un elenco degli utenti a cui è bloccato l'accesso a questo gruppo." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Sblocca l'utente dal gruppo" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Sblocca" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Sblocca questo utente" @@ -939,7 +960,7 @@ msgstr "Questa applicazione non è di tua proprietà." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Si è verificato un problema con il tuo token di sessione." @@ -964,12 +985,13 @@ msgstr "Non eliminare l'applicazione" msgid "Delete this application" msgstr "Elimina l'applicazione" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Accesso non effettuato." @@ -998,7 +1020,7 @@ msgstr "Vuoi eliminare questo messaggio?" msgid "Do not delete this notice" msgstr "Non eliminare il messaggio" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Elimina questo messaggio" @@ -1014,7 +1036,7 @@ msgstr "Puoi eliminare solo gli utenti locali." msgid "Delete user" msgstr "Elimina utente" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1022,12 +1044,12 @@ msgstr "" "Vuoi eliminare questo utente? Questa azione eliminerà tutti i dati " "dell'utente dal database, senza una copia di sicurezza." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Elimina questo utente" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Aspetto" @@ -1130,6 +1152,17 @@ msgstr "Ripristina i valori predefiniti" msgid "Reset back to default" msgstr "Reimposta i valori predefiniti" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Salva" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Salva aspetto" @@ -1221,29 +1254,29 @@ msgstr "Modifica il gruppo %s" msgid "You must be logged in to create a group." msgstr "Devi eseguire l'accesso per creare un gruppo." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Devi essere amministratore per modificare il gruppo." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Usa questo modulo per modificare il gruppo." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "La descrizione è troppo lunga (max %d caratteri)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Impossibile aggiornare il gruppo." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Impossibile creare gli alias." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Opzioni salvate." @@ -1587,7 +1620,7 @@ msgstr "L'utente è già bloccato dal gruppo." msgid "User is not a member of group." msgstr "L'utente non fa parte del gruppo." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Blocca l'utente dal gruppo" @@ -1622,11 +1655,11 @@ msgstr "Nessun ID." msgid "You must be logged in to edit a group." msgstr "Devi eseguire l'accesso per modificare un gruppo." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Aspetto del gruppo" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1634,20 +1667,20 @@ msgstr "" "Personalizza l'aspetto del tuo gruppo con un'immagine di sfondo e dei colori " "personalizzati." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Impossibile aggiornare l'aspetto." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Preferenze dell'aspetto salvate." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Logo del gruppo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1655,57 +1688,57 @@ msgstr "" "Puoi caricare un'immagine per il logo del tuo gruppo. La dimensione massima " "del file è di %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Utente senza profilo corrispondente." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Scegli un'area quadrata dell'immagine per il logo." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo aggiornato." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Aggiornamento del logo non riuscito." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Membri del gruppo %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "Membri del gruppo %1$s, pagina %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Un elenco degli utenti in questo gruppo." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Amministra" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Blocca" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Rende l'utente amministratore del gruppo" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Rendi amm." -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Rende questo utente un amministratore" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Messaggi dai membri di %1$s su %2$s!" @@ -1969,16 +2002,19 @@ msgstr "Messaggio personale" msgid "Optionally add a personal message to the invitation." msgstr "Puoi aggiungere un messaggio personale agli inviti." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Invia" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "Hai ricevuto un invito per seguire %1$s su %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2039,7 +2075,11 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Devi eseguire l'accesso per iscriverti a un gruppo." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "Nessun soprannome o ID." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s fa ora parte del gruppo %2$s" @@ -2048,11 +2088,11 @@ msgstr "%1$s fa ora parte del gruppo %2$s" msgid "You must be logged in to leave a group." msgstr "Devi eseguire l'accesso per lasciare un gruppo." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Non fai parte di quel gruppo." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s ha lasciato il gruppo %2$s" @@ -2069,8 +2109,7 @@ msgstr "Nome utente o password non corretto." msgid "Error setting user. You are probably not authorized." msgstr "Errore nell'impostare l'utente. Forse non hai l'autorizzazione." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Accedi" @@ -2324,8 +2363,8 @@ msgstr "tipo di contenuto " msgid "Only " msgstr "Solo " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Non è un formato di dati supportato." @@ -2466,7 +2505,7 @@ msgstr "Impossibile salvare la nuova password." msgid "Password saved." msgstr "Password salvata." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Percorsi" @@ -2499,7 +2538,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Server SSL non valido. La lunghezza massima è di 255 caratteri." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Sito" @@ -2674,7 +2712,7 @@ msgstr "" "1-64 lettere minuscole o numeri, senza spazi o simboli di punteggiatura" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Nome" @@ -2702,7 +2740,7 @@ msgid "Bio" msgstr "Biografia" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2785,7 +2823,8 @@ msgstr "Impossibile salvare il profilo." msgid "Couldn't save tags." msgstr "Impossibile salvare le etichette." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Impostazioni salvate." @@ -2798,28 +2837,28 @@ msgstr "Oltre il limite della pagina (%s)" msgid "Could not retrieve public stream." msgstr "Impossibile recuperare l'attività pubblica." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Attività pubblica, pagina %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Attività pubblica" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Feed dell'attività pubblica (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Feed dell'attività pubblica (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Feed dell'attività pubblica (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2828,18 +2867,18 @@ msgstr "" "Questa è l'attività pubblica di %%site.name%%, ma nessuno ha ancora scritto " "qualche cosa." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Fallo tu!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" "Perché non [crei un account](%%action.register%%) e scrivi qualche cosa!" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2852,7 +2891,7 @@ msgstr "" "net/). [Registrati](%%action.register%%) per condividere messaggi con i tuoi " "amici, i tuoi familiari e colleghi! ([Maggiori informazioni](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3029,10 +3068,9 @@ msgstr "Codice di invito non valido." msgid "Registration successful" msgstr "Registrazione riuscita" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" -msgstr "Registra" +msgstr "Registrati" #: actions/register.php:135 msgid "Registration not allowed." @@ -3218,7 +3256,7 @@ msgstr "Non puoi ripetere i tuoi stessi messaggi." msgid "You already repeated that notice." msgstr "Hai già ripetuto quel messaggio." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Ripetuti" @@ -3226,33 +3264,33 @@ msgstr "Ripetuti" msgid "Repeated!" msgstr "Ripetuti!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Risposte a %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Risposte a %1$s, pagina %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Feed delle risposte di %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Feed delle risposte di %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Feed delle risposte di %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3261,7 +3299,7 @@ msgstr "" "Questa è l'attività delle risposte a %1$s, ma %2$s non ha ricevuto ancora " "alcun messaggio." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3270,7 +3308,7 @@ msgstr "" "Puoi avviare una discussione con altri utenti, abbonarti a più persone o " "[entrare in qualche gruppo](%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3297,7 +3335,6 @@ msgid "User is already sandboxed." msgstr "L'utente è già nella \"sandbox\"." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Sessioni" @@ -3322,7 +3359,7 @@ msgid "Turn on debugging output for sessions." msgstr "Abilita il debug per le sessioni" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Salva impostazioni" @@ -3352,7 +3389,7 @@ msgstr "Organizzazione" msgid "Description" msgstr "Descrizione" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statistiche" @@ -3415,22 +3452,22 @@ msgstr "Messaggi preferiti di %1$s, pagina %2$d" msgid "Could not retrieve favorite notices." msgstr "Impossibile recuperare i messaggi preferiti." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Feed dei preferiti di %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Feed dei preferiti di %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Feed dei preferiti di di %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3438,7 +3475,7 @@ msgstr "" "Non hai ancora scelto alcun messaggio come preferito. Fai clic sul pulsate a " "forma di cuore per salvare i messaggi e rileggerli in un altro momento." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3447,7 +3484,7 @@ msgstr "" "%s non ha aggiunto alcun messaggio tra i suoi preferiti. Scrivi qualche cosa " "di interessante in modo che lo inserisca tra i suoi preferiti. :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3458,7 +3495,7 @@ msgstr "" "account](%%%%action.register%%%%) e quindi scrivi qualche cosa di " "interessante in modo che lo inserisca tra i suoi preferiti. :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Questo è un modo per condividere ciò che ti piace." @@ -3472,67 +3509,67 @@ msgstr "Gruppo %s" msgid "%1$s group, page %2$d" msgstr "Gruppi di %1$s, pagina %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Profilo del gruppo" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Nota" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Alias" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Azioni dei gruppi" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Feed dei messaggi per il gruppo %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Feed dei messaggi per il gruppo %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Feed dei messaggi per il gruppo %s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "FOAF per il gruppo %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Membri" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(nessuno)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Tutti i membri" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Creato" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3548,7 +3585,7 @@ msgstr "" "stesso](%%%%action.register%%%%) per far parte di questo gruppo e di molti " "altri! ([Maggiori informazioni](%%%%doc.help%%%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3560,7 +3597,7 @@ msgstr "" "(http://it.wikipedia.org/wiki/Microblogging) basato sul software libero " "[StatusNet](http://status.net/)." -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Amministratori" @@ -3934,17 +3971,16 @@ msgstr "Impossibile salvare l'abbonamento." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." -msgstr "" +msgstr "Quest'azione accetta solo richieste POST." #: actions/subscribe.php:107 -#, fuzzy msgid "No such profile." -msgstr "Nessun file." +msgstr "Nessun profilo." #: 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." +msgstr "" +"Non è possibile abbonarsi a un profilo remoto OMB 0.1 con quest'azione." #: actions/subscribe.php:145 msgid "Subscribed" @@ -4038,22 +4074,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Messaggi etichettati con %1$s, pagina %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Feed dei messaggi per l'etichetta %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Feed dei messaggi per l'etichetta %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Feed dei messaggi per l'etichetta %s (Atom)" @@ -4109,7 +4145,7 @@ msgstr "" msgid "No such tag." msgstr "Nessuna etichetta." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Metodo delle API in lavorazione." @@ -4141,71 +4177,73 @@ msgstr "" "La licenza \"%1$s\" dello stream di chi ascolti non è compatibile con la " "licenza \"%2$s\" di questo sito." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Utente" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Impostazioni utente per questo sito StatusNet." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Limite per la biografia non valido. Deve essere numerico." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" "Testo di benvenuto non valido. La lunghezza massima è di 255 caratteri." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Abbonamento predefinito non valido: \"%1$s\" non è un utente." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profilo" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Limite biografia" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Lunghezza massima in caratteri della biografia" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Nuovi utenti" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Messaggio per nuovi utenti" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Messaggio di benvenuto per nuovi utenti (max 255 caratteri)" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Abbonamento predefinito" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Abbonare automaticamente i nuovi utenti a questo utente" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Inviti" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Inviti abilitati" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "Indica se consentire agli utenti di invitarne di nuovi" @@ -4400,7 +4438,7 @@ msgstr "" msgid "Plugins" msgstr "Plugin" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Versione" @@ -4441,6 +4479,10 @@ msgstr "Non si fa parte del gruppo." msgid "Group leave failed." msgstr "Uscita dal gruppo non riuscita." +#: classes/Local_group.php:41 +msgid "Could not update local group." +msgstr "Impossibile aggiornare il gruppo locale." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4458,27 +4500,27 @@ msgstr "Impossibile inserire il messaggio." msgid "Could not update message with new URI." msgstr "Impossibile aggiornare il messaggio con il nuovo URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Errore del DB nell'inserire un hashtag: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Problema nel salvare il messaggio. Troppo lungo." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Problema nel salvare il messaggio. Utente sconosciuto." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Troppi messaggi troppo velocemente; fai una pausa e scrivi di nuovo tra " "qualche minuto." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4486,19 +4528,19 @@ msgstr "" "Troppi messaggi duplicati troppo velocemente; fai una pausa e scrivi di " "nuovo tra qualche minuto." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Ti è proibito inviare messaggi su questo sito." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problema nel salvare il messaggio." -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "Problema nel salvare la casella della posta del gruppo." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4527,19 +4569,27 @@ msgstr "Impossibile eliminare l'auto-abbonamento." msgid "Couldn't delete subscription." msgstr "Impossibile eliminare l'abbonamento." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Benvenuti su %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Impossibile creare il gruppo." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +msgid "Could not set group URI." +msgstr "Impossibile impostare l'URI del gruppo." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Impossibile impostare la membership al gruppo." +#: classes/User_group.php:506 +msgid "Could not save local group info." +msgstr "Impossibile salvare le informazioni del gruppo locale." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Modifica le impostazioni del tuo profilo" @@ -4581,120 +4631,190 @@ msgstr "Pagina senza nome" msgid "Primary site navigation" msgstr "Esplorazione sito primaria" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Home" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Profilo personale e attività degli amici" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Personale" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Modifica la tua email, immagine, password o il tuo profilo" -#: lib/action.php:444 -msgid "Connect" -msgstr "Connetti" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Account" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Connettiti con altri servizi" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Connetti" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Modifica la configurazione del sito" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Invita" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Amministra" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Invita amici e colleghi a seguirti su %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Esci" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Invita" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Termina la tua sessione sul sito" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Esci" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Crea un account" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registrati" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Accedi al sito" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Aiuto" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Accedi" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Aiutami!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Cerca" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Aiuto" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Cerca persone o del testo" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Cerca" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Messaggio del sito" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Viste locali" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Pagina messaggio" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Esplorazione secondaria del sito" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Aiuto" + +#: lib/action.php:765 msgid "About" msgstr "Informazioni" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "TOS" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Privacy" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Sorgenti" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Contatti" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Badge" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Licenza del software StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4703,12 +4823,12 @@ msgstr "" "**%%site.name%%** è un servizio di microblog offerto da [%%site.broughtby%%]" "(%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** è un servizio di microblog. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4719,110 +4839,163 @@ msgstr "" "s, disponibile nei termini della licenza [GNU Affero General Public License]" "(http://www.fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Licenza del contenuto del sito" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "I contenuti e i dati di %1$s sono privati e confidenziali." -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" "I contenuti e i dati sono copyright di %1$s. Tutti i diritti riservati." -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "I contenuti e i dati sono forniti dai collaboratori. Tutti i diritti " "riservati." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Tutti " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "licenza." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Paginazione" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Successivi" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Precedenti" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." -msgstr "" +msgstr "Impossibile gestire contenuti remoti." -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." -msgstr "" +msgstr "Impossibile gestire contenuti XML incorporati." -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." -msgstr "" +msgstr "Impossibile gestire contenuti Base64." -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Non puoi apportare modifiche al sito." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Le modifiche al pannello non sono consentite." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() non implementata." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() non implementata." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Impossibile eliminare le impostazioni dell'aspetto." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Configurazione di base" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Sito" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Configurazione aspetto" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Aspetto" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Configurazione utente" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Utente" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Configurazione di accesso" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Accesso" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Configurazione percorsi" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Percorsi" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Configurazione sessioni" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Sessioni" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "Le risorse API richiedono accesso lettura-scrittura, ma si dispone del solo " "accesso in lettura." -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4915,11 +5088,11 @@ msgstr "Messaggi in cui appare questo allegato" msgid "Tags for this attachment" msgstr "Etichette per questo allegato" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Modifica della password non riuscita" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "La modifica della password non è permessa" @@ -5120,9 +5293,9 @@ msgstr "" "minuti: %s" #: lib/command.php:692 -#, fuzzy, php-format +#, php-format msgid "Unsubscribed %s" -msgstr "Abbonamento a %s annullato" +msgstr "%s ha annullato l'abbonamento" #: lib/command.php:709 msgid "You are not subscribed to anyone." @@ -5155,7 +5328,6 @@ msgstr[0] "Non fai parte di questo gruppo:" msgstr[1] "Non fai parte di questi gruppi:" #: lib/command.php:769 -#, fuzzy msgid "" "Commands:\n" "on - turn on notifications\n" @@ -5208,6 +5380,7 @@ msgstr "" "d - invia un messaggio diretto all'utente\n" "get - recupera l'ultimo messaggio dell'utente\n" "whois - recupera le informazioni del profilo dell'utente\n" +"lose - forza un utente nel non seguirti più\n" "fav - aggiunge l'ultimo messaggio dell'utente tra i tuoi " "preferiti\n" "fav # - aggiunge un messaggio con quell'ID tra i tuoi " @@ -5236,21 +5409,21 @@ msgstr "" "tracks - non ancora implementato\n" "tracking - non ancora implementato\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Non è stato trovato alcun file di configurazione. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "I file di configurazione sono stati cercati in questi posti: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" "Potrebbe essere necessario lanciare il programma d'installazione per " "correggere il problema." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Vai al programma d'installazione." @@ -5439,23 +5612,23 @@ msgstr "Errore di sistema nel caricare il file." msgid "Not an image or corrupt file." msgstr "Non è un'immagine o il file è danneggiato." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Formato file immagine non supportato." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Perso il nostro file." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Tipo di file sconosciuto" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "kB" @@ -5837,6 +6010,11 @@ msgstr "A" msgid "Available characters" msgstr "Caratteri disponibili" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Invia" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Invia un messaggio" @@ -5895,23 +6073,23 @@ msgstr "O" msgid "at" msgstr "presso" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "in una discussione" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Ripetuto da" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Rispondi a questo messaggio" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Rispondi" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Messaggio ripetuto" @@ -5959,6 +6137,10 @@ msgstr "Risposte" msgid "Favorites" msgstr "Preferiti" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Utente" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "In arrivo" @@ -6048,7 +6230,7 @@ msgstr "Ripetere questo messaggio?" msgid "Repeat this notice" msgstr "Ripeti questo messaggio" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "Nessun utente singolo definito per la modalità single-user." @@ -6068,6 +6250,10 @@ msgstr "Cerca nel sito" msgid "Keyword(s)" msgstr "Parole" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Cerca" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Aiuto sulla ricerca" @@ -6119,6 +6305,15 @@ msgstr "Persone abbonate a %s" msgid "Groups %s is a member of" msgstr "Gruppi di cui %s fa parte" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Invita" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Invita amici e colleghi a seguirti su %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6189,47 +6384,47 @@ msgstr "Messaggio" msgid "Moderate" msgstr "Modera" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "pochi secondi fa" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "circa un minuto fa" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "circa %d minuti fa" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "circa un'ora fa" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "circa %d ore fa" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "circa un giorno fa" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "circa %d giorni fa" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "circa un mese fa" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "circa %d mesi fa" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "circa un anno fa" diff --git a/locale/ja/LC_MESSAGES/statusnet.po b/locale/ja/LC_MESSAGES/statusnet.po index e05ddbd15..acbcb457d 100644 --- a/locale/ja/LC_MESSAGES/statusnet.po +++ b/locale/ja/LC_MESSAGES/statusnet.po @@ -11,75 +11,82 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:12+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:10+0000\n" "Language-Team: Japanese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ja\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "アクセス" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "サイトアクセス設定" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "登録" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "プライベート" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "匿名ユーザー(ログインしていません)がサイトを見るのを禁止しますか?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "招待のみ" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "プライベート" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "招待のみ登録する" -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "閉じられた" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "招待のみ" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "新規登録を無効。" -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "保存" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "閉じられた" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "アクセス設定の保存" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "保存" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "そのようなページはありません。" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -93,51 +100,59 @@ msgstr "そのようなページはありません。" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "そのようなユーザはいません。" -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s と友人、ページ %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s と友人" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "%s の友人のフィード (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "%s の友人のフィード (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "%s の友人のフィード (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "これは %s と友人のタイムラインです。まだ誰も投稿していません。" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -146,7 +161,8 @@ msgstr "" "もっと多くの人をフォローしてみましょう。[グループに参加](%%action.groups%%) " "してみたり、何か投稿してみましょう。" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -155,7 +171,7 @@ msgstr "" "プロフィールから [%1$s さんに合図](../%2$s) したり、[知らせたいことについて投" "稿](%%%%action.newnotice%%%%?status_textarea=%3$s) したりできます。" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -164,7 +180,8 @@ msgstr "" "[アカウントを登録](%%%%action.register%%%%) して %s さんに合図したり、お知ら" "せを送ってみませんか。" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "あなたと友人" @@ -182,20 +199,20 @@ msgstr "%2$s に %1$s と友人からの更新があります!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "API メソッドが見つかりません。" @@ -229,8 +246,9 @@ msgstr "ユーザを更新できませんでした。" #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "ユーザはプロフィールをもっていません。" @@ -256,7 +274,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -367,7 +385,7 @@ msgstr "ソースユーザーを決定できません。" msgid "Could not find target user." msgstr "ターゲットユーザーを見つけられません。" -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -375,62 +393,62 @@ msgstr "" "ニックネームには、小文字アルファベットと数字のみ使用できます。スペースは使用" "できません。" -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "そのニックネームは既に使用されています。他のものを試してみて下さい。" -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "有効なニックネームではありません。" -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "ホームページのURLが不適切です。" -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "フルネームが長すぎます。(255字まで)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "記述が長すぎます。(最長140字)" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "場所が長すぎます。(255字まで)" -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "別名が多すぎます! 最大 %d。" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "不正な別名: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "別名 \"%s\" は既に使用されています。他のものを試してみて下さい。" -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "別名はニックネームと同じではいけません。" @@ -441,15 +459,15 @@ msgstr "別名はニックネームと同じではいけません。" msgid "Group not found!" msgstr "グループが見つかりません!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "すでにこのグループのメンバーです。" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "管理者によってこのグループからブロックされています。" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "ユーザ %1$s はグループ %2$s に参加できません。" @@ -458,7 +476,7 @@ msgstr "ユーザ %1$s はグループ %2$s に参加できません。" msgid "You are not a member of this group." msgstr "このグループのメンバーではありません。" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "ユーザ %1$s をグループ %2$s から削除できません。" @@ -489,7 +507,7 @@ msgstr "不正なトークン。" #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -532,7 +550,7 @@ msgstr "リクエストトークン%sは、拒否されて、取り消されま #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -555,13 +573,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "アカウント" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -643,12 +661,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s は %2$s でお気に入りを更新しました / %2$s。" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s のタイムライン" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -684,7 +702,7 @@ msgstr "%s への返信" msgid "Repeats of %s" msgstr "%s の返信" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "%s とタグ付けされたつぶやき" @@ -705,8 +723,7 @@ msgstr "そのような添付はありません。" #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "ニックネームがありません。" @@ -718,7 +735,7 @@ msgstr "サイズがありません。" msgid "Invalid size." msgstr "不正なサイズ。" -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "アバター" @@ -735,30 +752,30 @@ msgid "User without matching profile" msgstr "合っているプロフィールのないユーザ" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "アバター設定" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "オリジナル" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "プレビュー" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "削除" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "アップロード" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "切り取り" @@ -766,7 +783,7 @@ msgstr "切り取り" msgid "Pick a square area of the image to be your avatar" msgstr "あなたのアバターとなるイメージを正方形で指定" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "ファイルデータを紛失しました。" @@ -802,22 +819,22 @@ msgstr "" "どんな @-返信 についてもそれらから通知されないでしょう。" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "No" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "このユーザをアンブロックする" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Yes" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "このユーザをブロックする" @@ -825,39 +842,43 @@ msgstr "このユーザをブロックする" msgid "Failed to save block information." msgstr "ブロック情報の保存に失敗しました。" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "そのようなグループはありません。" -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s ブロックされたプロファイル" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s ブロックされたプロファイル、ページ %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "このグループへの参加をブロックされたユーザのリスト。" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "グループからのアンブロックユーザ" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "アンブロック" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "このユーザをアンブロックする" @@ -932,7 +953,7 @@ msgstr "このアプリケーションのオーナーではありません。" #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "あなたのセッショントークンに関する問題がありました。" @@ -958,12 +979,13 @@ msgstr "このアプリケーションを削除しないでください" msgid "Delete this application" msgstr "このアプリケーションを削除" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "ログインしていません。" @@ -992,7 +1014,7 @@ msgstr "本当にこのつぶやきを削除しますか?" msgid "Do not delete this notice" msgstr "このつぶやきを削除できません。" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "このつぶやきを削除" @@ -1008,7 +1030,7 @@ msgstr "ローカルユーザのみ削除できます。" msgid "Delete user" msgstr "ユーザ削除" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1016,12 +1038,12 @@ msgstr "" "あなたは本当にこのユーザを削除したいですか? これはバックアップなしでデータ" "ベースからユーザに関するすべてのデータをクリアします。" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "このユーザを削除" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "デザイン" @@ -1124,6 +1146,17 @@ msgstr "デフォルトデザインに戻す。" msgid "Reset back to default" msgstr "デフォルトへリセットする" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "保存" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "デザインの保存" @@ -1215,29 +1248,29 @@ msgstr "%s グループを編集" msgid "You must be logged in to create a group." msgstr "グループを作るにはログインしていなければなりません。" -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "グループを編集するには管理者である必要があります。" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "このフォームを使ってグループを編集します。" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "記述が長すぎます。(最長 %d 字)" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "グループを更新できません。" -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "別名を作成できません。" -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "オプションが保存されました。" @@ -1581,7 +1614,7 @@ msgstr "ユーザはすでにグループからブロックされています。 msgid "User is not a member of group." msgstr "ユーザはグループのメンバーではありません。" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "グループからユーザをブロック" @@ -1615,11 +1648,11 @@ msgstr "ID がありません。" msgid "You must be logged in to edit a group." msgstr "グループを編集するにはログインしていなければなりません。" -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "グループデザイン" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1627,20 +1660,20 @@ msgstr "" "あなたが選んだパレットの色とバックグラウンドイメージであなたのグループをカス" "タマイズしてください。" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "あなたのデザインを更新できません。" -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "デザイン設定が保存されました。" -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "グループロゴ" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1648,57 +1681,57 @@ msgstr "" "あなたのグループ用にロゴイメージをアップロードできます。最大ファイルサイズは " "%s。" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "合っているプロフィールのないユーザ" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "ロゴとなるイメージの正方形を選択。" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "ロゴが更新されました。" -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "ロゴの更新に失敗しました。" -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "%s グループメンバー" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "%1$s グループメンバー、ページ %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "このグループのユーザのリスト。" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "管理者" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "ブロック" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "ユーザをグループの管理者にする" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "管理者にする" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "このユーザを管理者にする" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "%2$s 上の %1$s のメンバーから更新する" @@ -1961,16 +1994,19 @@ msgstr "パーソナルメッセージ" msgid "Optionally add a personal message to the invitation." msgstr "任意に招待にパーソナルメッセージを加えてください。" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "投稿" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s があなたを %2$s へ招待しました" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2031,7 +2067,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "グループに入るためにはログインしなければなりません。" -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "ニックネームがありません。" + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s はグループ %2$s に参加しました" @@ -2040,11 +2081,11 @@ msgstr "%1$s はグループ %2$s に参加しました" msgid "You must be logged in to leave a group." msgstr "グループから離れるにはログインしていなければなりません。" -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "あなたはそのグループのメンバーではありません。" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s はグループ %2$s に残りました。" @@ -2061,8 +2102,7 @@ msgstr "ユーザ名またはパスワードが間違っています。" msgid "Error setting user. You are probably not authorized." msgstr "ユーザ設定エラー。 あなたはたぶん承認されていません。" -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "ログイン" @@ -2315,8 +2355,8 @@ msgstr "内容種別 " msgid "Only " msgstr "だけ " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "サポートされていないデータ形式。" @@ -2457,7 +2497,7 @@ msgstr "新しいパスワードを保存できません。" msgid "Password saved." msgstr "パスワードが保存されました。" -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "パス" @@ -2490,7 +2530,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "不正な SSL サーバー。最大 255 文字まで。" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "サイト" @@ -2663,7 +2702,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64文字の、小文字アルファベットか数字で、スペースや句読点は除く" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "フルネーム" @@ -2691,7 +2730,7 @@ msgid "Bio" msgstr "自己紹介" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2773,7 +2812,8 @@ msgstr "プロファイルを保存できません" msgid "Couldn't save tags." msgstr "タグを保存できません。" -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "設定が保存されました。" @@ -2786,28 +2826,28 @@ msgstr "ページ制限を超えました (%s)" msgid "Could not retrieve public stream." msgstr "パブリックストリームを検索できません。" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "パブリックタイムライン、ページ %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "パブリックタイムライン" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "パブリックストリームフィード (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "パブリックストリームフィード (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "パブリックストリームフィード (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2816,11 +2856,11 @@ msgstr "" "これは %%site.name%% のパブリックタイムラインです、しかしまだ誰も投稿していま" "せん。" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "投稿する1番目になってください!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2828,7 +2868,7 @@ msgstr "" "なぜ [アカウント登録](%%action.register%%) しないのですか、そして最初の投稿を" "してください!" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2842,7 +2882,7 @@ msgstr "" "族そして同僚などについてのつぶやきを共有しましょう! ([もっと読む](%%doc.help%" "%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3019,8 +3059,7 @@ msgstr "すみません、不正な招待コード。" msgid "Registration successful" msgstr "登録成功" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "登録" @@ -3205,7 +3244,7 @@ msgstr "自分のつぶやきは繰り返せません。" msgid "You already repeated that notice." msgstr "すでにそのつぶやきを繰り返しています。" -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "繰り返された" @@ -3213,33 +3252,33 @@ msgstr "繰り返された" msgid "Repeated!" msgstr "繰り返されました!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "%s への返信" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "%1$s への返信、ページ %2$s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "%s の返信フィード (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "%s の返信フィード (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "%s の返信フィード (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3248,7 +3287,7 @@ msgstr "" "これは %1$s への返信を表示したタイムラインです、しかし %2$s はまだつぶやきを" "受け取っていません。" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3257,7 +3296,7 @@ msgstr "" "あなたは、他のユーザを会話をするか、多くの人々をフォローするか、または [グ" "ループに加わる](%%action.groups%%)ことができます。" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3284,7 +3323,6 @@ msgid "User is already sandboxed." msgstr "ユーザはすでにサンドボックスです。" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "セッション" @@ -3309,7 +3347,7 @@ msgid "Turn on debugging output for sessions." msgstr "セッションのためのデバッグ出力をオン。" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "サイト設定の保存" @@ -3339,7 +3377,7 @@ msgstr "組織" msgid "Description" msgstr "概要" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "統計データ" @@ -3403,22 +3441,22 @@ msgstr "%1$s のお気に入りのつぶやき、ページ %2$d" msgid "Could not retrieve favorite notices." msgstr "お気に入りのつぶやきを検索できません。" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "%s のお気に入りのフィード (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "%s のお気に入りのフィード (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "%s のお気に入りのフィード (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3427,7 +3465,7 @@ msgstr "" "加するあなたがそれらがお気に入りのつぶやきのときにお気に入りボタンをクリック" "するか、またはそれらの上でスポットライトをはじいてください。" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3436,7 +3474,7 @@ msgstr "" "%s はまだ彼のお気に入りに少しのつぶやきも加えていません。 彼らがお気に入りに" "加えることおもしろいものを投稿してください:)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3447,7 +3485,7 @@ msgstr "" "%%%action.register%%%%) しないのですか。そして、彼らがお気に入りに加えるおも" "しろい何かを投稿しませんか:)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "これは、あなたが好きなことを共有する方法です。" @@ -3461,67 +3499,67 @@ msgstr "%s グループ" msgid "%1$s group, page %2$d" msgstr "%1$s グループ、ページ %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "グループプロファイル" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "ノート" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "別名" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "グループアクション" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "%s グループのつぶやきフィード (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "%s グループのつぶやきフィード (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "%s グループのつぶやきフィード (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "%s グループの FOAF" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "メンバー" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(なし)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "全てのメンバー" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "作成日" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3536,7 +3574,7 @@ msgstr "" "する短いメッセージを共有します。[今すぐ参加](%%%%action.register%%%%) してこ" "のグループの一員になりましょう! ([もっと読む](%%%%doc.help%%%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3549,7 +3587,7 @@ msgstr "" "wikipedia.org/wiki/Micro-blogging) サービス。メンバーは彼らの暮らしと興味に関" "する短いメッセージを共有します。" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "管理者" @@ -4032,22 +4070,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "%1$s とタグ付けされたつぶやき、ページ %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "%s とタグ付けされたつぶやきフィード (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "%s とタグ付けされたつぶやきフィード (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "%s とタグ付けされたつぶやきフィード (Atom)" @@ -4100,7 +4138,7 @@ msgstr "このフォームを使用して、フォロー者かフォローにタ msgid "No such tag." msgstr "そのようなタグはありません。" -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API メソッドが工事中です。" @@ -4132,70 +4170,72 @@ msgstr "" "リスニーストリームライセンス ‘%1$s’ は、サイトライセンス ‘%2$s’ と互換性があ" "りません。" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "ユーザ" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "この StatusNet サイトのユーザ設定。" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "不正な自己紹介制限。数字である必要があります。" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "不正なウェルカムテキスト。最大長は255字です。" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "不正なデフォルトフォローです: '%1$s' はユーザではありません。" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "プロファイル" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "自己紹介制限" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "プロファイル自己紹介の最大文字長。" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "新しいユーザ" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "新しいユーザを歓迎" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "新しいユーザへのウェルカムテキスト (最大255字)。" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "デフォルトフォロー" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "自動的にこのユーザに新しいユーザをフォローしてください。" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "招待" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "招待が可能" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "ユーザが新しいユーザを招待するのを許容するかどうか。" @@ -4381,7 +4421,7 @@ msgstr "" msgid "Plugins" msgstr "プラグイン" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "バージョン" @@ -4423,6 +4463,11 @@ msgstr "グループの一部ではありません。" msgid "Group leave failed." msgstr "グループ脱退に失敗しました。" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "グループを更新できません。" + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4440,26 +4485,26 @@ msgstr "メッセージを追加できません。" msgid "Could not update message with new URI." msgstr "新しいURIでメッセージをアップデートできませんでした。" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "ハッシュタグ追加 DB エラー: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "つぶやきを保存する際に問題が発生しました。長すぎです。" -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "つぶやきを保存する際に問題が発生しました。不明なユーザです。" -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "多すぎるつぶやきが速すぎます; 数分間の休みを取ってから再投稿してください。" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4467,19 +4512,19 @@ msgstr "" "多すぎる重複メッセージが速すぎます; 数分間休みを取ってから再度投稿してくださ" "い。" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "あなたはこのサイトでつぶやきを投稿するのが禁止されています。" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "つぶやきを保存する際に問題が発生しました。" -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "グループ受信箱を保存する際に問題が発生しました。" -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4508,19 +4553,29 @@ msgstr "自己フォローを削除できません。" msgid "Couldn't delete subscription." msgstr "フォローを削除できません" -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "ようこそ %1$s、@%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "グループを作成できません。" -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "グループメンバーシップをセットできません。" + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "グループメンバーシップをセットできません。" +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "フォローを保存できません。" + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "プロファイル設定の変更" @@ -4562,120 +4617,190 @@ msgstr "名称未設定ページ" msgid "Primary site navigation" msgstr "プライマリサイトナビゲーション" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "ホーム" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "パーソナルプロファイルと友人のタイムライン" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "パーソナル" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "メールアドレス、アバター、パスワード、プロパティの変更" -#: lib/action.php:444 -msgid "Connect" -msgstr "接続" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "アカウント" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "サービスへ接続" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "接続" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "サイト設定の変更" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "招待" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "管理者" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "友人や同僚が %s で加わるよう誘ってください。" -#: lib/action.php:458 -msgid "Logout" -msgstr "ログアウト" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "招待" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "サイトからログアウト" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "ログアウト" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "アカウントを作成" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "登録" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "サイトへログイン" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "ヘルプ" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "ログイン" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "助けて!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "検索" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "ヘルプ" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "人々かテキストを検索" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "検索" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "サイトつぶやき" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "ローカルビュー" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "ページつぶやき" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "セカンダリサイトナビゲーション" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "ヘルプ" + +#: lib/action.php:765 msgid "About" msgstr "About" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "よくある質問" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "プライバシー" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "ソース" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "連絡先" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "バッジ" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "StatusNet ソフトウェアライセンス" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4684,12 +4809,12 @@ msgstr "" "**%%site.name%%** は [%%site.broughtby%%](%%site.broughtbyurl%%) が提供するマ" "イクロブログサービスです。 " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** はマイクロブログサービスです。 " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4700,107 +4825,160 @@ msgstr "" "いています。 ライセンス [GNU Affero General Public License](http://www.fsf." "org/licensing/licenses/agpl-3.0.html)。" -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "サイト内容ライセンス" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "全て " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "ライセンス。" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "ページ化" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "<<後" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "前>>" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "あなたはこのサイトへの変更を行うことができません。" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "そのパネルへの変更は許可されていません。" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() は実装されていません。" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() は実装されていません。" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "デザイン設定を削除できません。" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "基本サイト設定" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "サイト" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "デザイン設定" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "デザイン" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "ユーザ設定" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "ユーザ" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "アクセス設定" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "アクセス" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "パス設定" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "パス" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "セッション設定" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "セッション" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "APIリソースは読み書きアクセスが必要です、しかしあなたは読みアクセスしか持って" "いません。" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4892,11 +5070,11 @@ msgstr "この添付が現れるつぶやき" msgid "Tags for this attachment" msgstr "この添付のタグ" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "パスワード変更に失敗しました" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "パスワード変更は許可されていません" @@ -5169,21 +5347,21 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "コンフィギュレーションファイルがありません。 " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "私は以下の場所でコンフィギュレーションファイルを探しました: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" "あなたは、これを修理するためにインストーラを動かしたがっているかもしれませ" "ん。" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "インストーラへ。" @@ -5371,23 +5549,23 @@ msgstr "ファイルのアップロードでシステムエラー" msgid "Not an image or corrupt file." msgstr "画像ではないかファイルが破損しています。" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "サポート外の画像形式です。" -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "ファイルを紛失。" -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "不明なファイルタイプ" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "kB" @@ -5771,6 +5949,12 @@ msgstr "To" msgid "Available characters" msgstr "利用可能な文字" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "投稿" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "つぶやきを送る" @@ -5833,23 +6017,23 @@ msgstr "西" msgid "at" msgstr "at" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "このつぶやきへ返信" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "返信" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "つぶやきを繰り返しました" @@ -5897,6 +6081,10 @@ msgstr "返信" msgid "Favorites" msgstr "お気に入り" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "ユーザ" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "受信箱" @@ -5986,7 +6174,7 @@ msgstr "このつぶやきを繰り返しますか?" msgid "Repeat this notice" msgstr "このつぶやきを繰り返す" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "single-user モードのためのシングルユーザが定義されていません。" @@ -6006,6 +6194,10 @@ msgstr "サイト検索" msgid "Keyword(s)" msgstr "キーワード" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "検索" + #: lib/searchaction.php:162 msgid "Search help" msgstr "ヘルプ検索" @@ -6057,6 +6249,15 @@ msgstr "人々は %s をフォローしました。" msgid "Groups %s is a member of" msgstr "グループ %s はメンバー" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "招待" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "友人や同僚が %s で加わるよう誘ってください。" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6128,47 +6329,47 @@ msgstr "メッセージ" msgid "Moderate" msgstr "管理" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "数秒前" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "約 1 分前" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "約 %d 分前" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "約 1 時間前" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "約 %d 時間前" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "約 1 日前" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "約 %d 日前" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "約 1 ヵ月前" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "約 %d ヵ月前" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "約 1 年前" diff --git a/locale/ko/LC_MESSAGES/statusnet.po b/locale/ko/LC_MESSAGES/statusnet.po index 1653bf31b..aca8a093a 100644 --- a/locale/ko/LC_MESSAGES/statusnet.po +++ b/locale/ko/LC_MESSAGES/statusnet.po @@ -7,83 +7,89 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:15+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:13+0000\n" "Language-Team: Korean\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ko\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "수락" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "아바타 설정" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "회원가입" -#: actions/accessadminpanel.php:161 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 #, fuzzy +msgctxt "LABEL" msgid "Private" msgstr "개인정보 취급방침" -#: actions/accessadminpanel.php:163 -msgid "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:167 +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 #, fuzzy msgid "Invite only" msgstr "초대" -#: actions/accessadminpanel.php:169 -msgid "Make registration invitation only." +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:173 +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 #, fuzzy msgid "Closed" msgstr "차단하기" -#: actions/accessadminpanel.php:175 -msgid "Disable new registrations." -msgstr "" - -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "저장" - -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "아바타 설정" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "저장" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page" msgstr "그러한 태그가 없습니다." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -97,72 +103,82 @@ msgstr "그러한 태그가 없습니다." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "그러한 사용자는 없습니다." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s 와 친구들, %d 페이지" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s 및 친구들" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "%s의 친구들을 위한 피드" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "%s의 친구들을 위한 피드" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, fuzzy, php-format msgid "Feed for friends of %s (Atom)" msgstr "%s의 친구들을 위한 피드" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 #, fuzzy msgid "You and friends" msgstr "%s 및 친구들" @@ -181,20 +197,20 @@ msgstr "%1$s 및 %2$s에 있는 친구들의 업데이트!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "API 메서드를 찾을 수 없습니다." @@ -228,8 +244,9 @@ msgstr "사용자를 업데이트 할 수 없습니다." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "이용자가 프로필을 가지고 있지 않습니다." @@ -254,7 +271,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 #, fuzzy @@ -373,7 +390,7 @@ msgstr "공개 stream을 불러올 수 없습니다." msgid "Could not find target user." msgstr "어떠한 상태도 찾을 수 없습니다." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -381,62 +398,62 @@ msgstr "" "별명은 반드시 영소문자와 숫자로만 이루어져야 하며 스페이스의 사용이 불가 합니" "다." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "별명이 이미 사용중 입니다. 다른 별명을 시도해 보십시오." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "유효한 별명이 아닙니다" -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "홈페이지 주소형식이 올바르지 않습니다." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "실명이 너무 깁니다. (최대 255글자)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." msgstr "설명이 너무 길어요. (최대 140글자)" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "위치가 너무 깁니다. (최대 255글자)" -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, fuzzy, php-format msgid "Invalid alias: \"%s\"" msgstr "유효하지 않은태그: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "별명이 이미 사용중 입니다. 다른 별명을 시도해 보십시오." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -448,16 +465,16 @@ msgstr "" msgid "Group not found!" msgstr "API 메서드를 찾을 수 없습니다." -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 #, fuzzy msgid "You are already a member of that group." msgstr "당신은 이미 이 그룹의 멤버입니다." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "그룹 %s에 %s는 가입할 수 없습니다." @@ -467,7 +484,7 @@ msgstr "그룹 %s에 %s는 가입할 수 없습니다." msgid "You are not a member of this group." msgstr "당신은 해당 그룹의 멤버가 아닙니다." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "그룹 %s에서 %s 사용자를 제거할 수 없습니다." @@ -499,7 +516,7 @@ msgstr "옳지 않은 크기" #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -543,7 +560,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -566,13 +583,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "계정" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -659,12 +676,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s 좋아하는 글이 업데이트 됐습니다. %S에 의해 / %s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s 타임라인" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -700,7 +717,7 @@ msgstr "%s에 답신" msgid "Repeats of %s" msgstr "%s에 답신" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "%s 태그된 통지" @@ -722,8 +739,7 @@ msgstr "그러한 문서는 없습니다." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "별명이 없습니다." @@ -735,7 +751,7 @@ msgstr "사이즈가 없습니다." msgid "Invalid size." msgstr "옳지 않은 크기" -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "아바타" @@ -752,30 +768,30 @@ msgid "User without matching profile" msgstr "프로필 매칭이 없는 사용자" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "아바타 설정" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "원래 설정" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "미리보기" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "삭제" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "올리기" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "자르기" @@ -783,7 +799,7 @@ msgstr "자르기" msgid "Pick a square area of the image to be your avatar" msgstr "당신의 아바타가 될 이미지영역을 지정하세요." -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "파일 데이터를 잃어버렸습니다." @@ -817,23 +833,23 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "아니오" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "이 사용자를 차단해제합니다." #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "네, 맞습니다." -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "이 사용자 차단하기" @@ -841,41 +857,45 @@ msgstr "이 사용자 차단하기" msgid "Failed to save block information." msgstr "정보차단을 저장하는데 실패했습니다." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "그러한 그룹이 없습니다." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "이용자 프로필" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s 와 친구들, %d 페이지" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 #, fuzzy msgid "A list of the users blocked from joining this group." msgstr "이 그룹의 회원리스트" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 #, fuzzy msgid "Unblock user from group" msgstr "사용자 차단 해제에 실패했습니다." -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "차단해제" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "이 사용자를 차단해제합니다." @@ -956,7 +976,7 @@ msgstr "당신은 해당 그룹의 멤버가 아닙니다." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "당신의 세션토큰관련 문제가 있습니다." @@ -982,12 +1002,13 @@ msgstr "이 통지를 지울 수 없습니다." msgid "Delete this application" msgstr "이 게시글 삭제하기" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "로그인하고 있지 않습니다." @@ -1017,7 +1038,7 @@ msgstr "정말로 통지를 삭제하시겠습니까?" msgid "Do not delete this notice" msgstr "이 통지를 지울 수 없습니다." -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "이 게시글 삭제하기" @@ -1036,19 +1057,19 @@ msgstr "당신은 다른 사용자의 상태를 삭제하지 않아도 된다." msgid "Delete user" msgstr "삭제" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" msgstr "이 게시글 삭제하기" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1159,6 +1180,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "저장" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1261,31 +1293,31 @@ msgstr "%s 그룹 편집" msgid "You must be logged in to create a group." msgstr "그룹을 만들기 위해서는 로그인해야 합니다." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "관리자만 그룹을 편집할 수 있습니다." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "다음 양식을 이용해 그룹을 편집하십시오." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." msgstr "설명이 너무 길어요. (최대 140글자)" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "그룹을 업데이트 할 수 없습니다." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "좋아하는 게시글을 생성할 수 없습니다." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "옵션들이 저장되었습니다." @@ -1634,7 +1666,7 @@ msgstr "회원이 당신을 차단해왔습니다." msgid "User is not a member of group." msgstr "당신은 해당 그룹의 멤버가 아닙니다." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 #, fuzzy msgid "Block user from group" msgstr "사용자를 차단합니다." @@ -1671,93 +1703,93 @@ msgstr "ID가 없습니다." msgid "You must be logged in to edit a group." msgstr "그룹을 만들기 위해서는 로그인해야 합니다." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 #, fuzzy msgid "Group design" msgstr "그룹" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "사용자를 업데이트 할 수 없습니다." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "싱크설정이 저장되었습니다." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "그룹 로고" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, fuzzy, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "당신그룹의 로고 이미지를 업로드할 수 있습니다." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "프로필 매칭이 없는 사용자" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 #, fuzzy msgid "Pick a square area of the image to be the logo." msgstr "당신의 아바타가 될 이미지영역을 지정하세요." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "로고를 업데이트했습니다." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "로고 업데이트에 실패했습니다." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "%s 그룹 회원" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" msgstr "%s 그룹 회원, %d페이지" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "이 그룹의 회원리스트" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "관리자" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "차단하기" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 #, fuzzy msgid "Make user an admin of the group" msgstr "관리자만 그룹을 편집할 수 있습니다." -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 #, fuzzy msgid "Make Admin" msgstr "관리자" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "%2$s에 있는 %1$s의 업데이트!" @@ -2011,16 +2043,19 @@ msgstr "개인적인 메시지" msgid "Optionally add a personal message to the invitation." msgstr "초대장에 메시지 첨부하기." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "보내기" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s님이 귀하를 %2$s에 초대하였습니다." -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2076,7 +2111,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "그룹가입을 위해서는 로그인이 필요합니다." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "별명이 없습니다." + +#: actions/joingroup.php:141 #, fuzzy, php-format msgid "%1$s joined group %2$s" msgstr "%s 는 그룹 %s에 가입했습니다." @@ -2085,11 +2125,11 @@ msgstr "%s 는 그룹 %s에 가입했습니다." msgid "You must be logged in to leave a group." msgstr "그룹을 떠나기 위해서는 로그인해야 합니다." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "당신은 해당 그룹의 멤버가 아닙니다." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%s가 그룹%s를 떠났습니다." @@ -2107,8 +2147,7 @@ msgstr "틀린 계정 또는 비밀 번호" msgid "Error setting user. You are probably not authorized." msgstr "인증이 되지 않았습니다." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "로그인" @@ -2364,8 +2403,8 @@ msgstr "연결" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "지원하는 형식의 데이터가 아닙니다." @@ -2511,7 +2550,7 @@ msgstr "새 비밀번호를 저장 할 수 없습니다." msgid "Password saved." msgstr "비밀 번호 저장" -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2544,7 +2583,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 #, fuzzy msgid "Site" msgstr "초대" @@ -2728,7 +2766,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64자 사이에 영소문자, 숫자로만 씁니다. 기호나 공백을 쓰면 안 됩니다." #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "실명" @@ -2757,7 +2795,7 @@ msgid "Bio" msgstr "자기소개" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2838,7 +2876,8 @@ msgstr "프로필을 저장 할 수 없습니다." msgid "Couldn't save tags." msgstr "태그를 저장할 수 없습니다." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "설정 저장" @@ -2851,48 +2890,48 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "공개 stream을 불러올 수 없습니다." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "공개 타임라인, %d 페이지" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "퍼블릭 타임라인" -#: actions/public.php:159 +#: actions/public.php:160 #, fuzzy msgid "Public Stream Feed (RSS 1.0)" msgstr "퍼블릭 스트림 피드" -#: actions/public.php:163 +#: actions/public.php:164 #, fuzzy msgid "Public Stream Feed (RSS 2.0)" msgstr "퍼블릭 스트림 피드" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "퍼블릭 스트림 피드" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2901,7 +2940,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, fuzzy, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3074,8 +3113,7 @@ msgstr "확인 코드 오류" msgid "Registration successful" msgstr "회원 가입이 성공적입니다." -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "회원가입" @@ -3264,7 +3302,7 @@ msgstr "라이선스에 동의하지 않는다면 등록할 수 없습니다." msgid "You already repeated that notice." msgstr "당신은 이미 이 사용자를 차단하고 있습니다." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "생성" @@ -3274,47 +3312,47 @@ msgstr "생성" msgid "Repeated!" msgstr "생성" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "%s에 답신" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "%2$s에서 %1$s까지 메시지" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "%s의 통지 피드" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "%s의 통지 피드" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "%s의 통지 피드" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3342,7 +3380,6 @@ msgid "User is already sandboxed." msgstr "회원이 당신을 차단해왔습니다." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3367,7 +3404,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "아바타 설정" @@ -3402,7 +3439,7 @@ msgstr "페이지수" msgid "Description" msgstr "설명" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "통계" @@ -3464,35 +3501,35 @@ msgstr "%s 님의 좋아하는 글들" msgid "Could not retrieve favorite notices." msgstr "좋아하는 게시글을 복구할 수 없습니다." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "%s의 친구들을 위한 피드" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "%s의 친구들을 위한 피드" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "%s의 친구들을 위한 피드" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3500,7 +3537,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3514,68 +3551,68 @@ msgstr "%s 그룹" msgid "%1$s group, page %2$d" msgstr "%s 그룹 회원, %d페이지" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "그룹 프로필" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "설명" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "그룹 행동" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "%s 그룹을 위한 공지피드" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "%s 그룹을 위한 공지피드" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "%s 그룹을 위한 공지피드" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "%s의 보낸쪽지함" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "회원" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(없습니다.)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "모든 회원" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 #, fuzzy msgid "Created" msgstr "생성" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3585,7 +3622,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, fuzzy, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3596,7 +3633,7 @@ msgstr "" "**%s** 는 %%%%site.name%%%% [마이크로블로깅)(http://en.wikipedia.org/wiki/" "Micro-blogging)의 사용자 그룹입니다. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 #, fuzzy msgid "Admins" msgstr "관리자" @@ -4064,22 +4101,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "이용자 셀프 테크 %s - %d 페이지" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "%s의 통지 피드" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "%s의 통지 피드" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "%s의 통지 피드" @@ -4133,7 +4170,7 @@ msgstr "당신의 구독자나 구독하는 사람에 태깅을 위해 이 양 msgid "No such tag." msgstr "그러한 태그가 없습니다." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API 메서드를 구성중 입니다." @@ -4166,75 +4203,77 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "이용자" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "프로필" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 #, fuzzy msgid "New users" msgstr "새 사용자를 초대" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "모든 예약 구독" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "나에게 구독하는 사람에게 자동 구독 신청" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "초대권을 보냈습니다" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 #, fuzzy msgid "Invitations enabled" msgstr "초대권을 보냈습니다" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4420,7 +4459,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "개인적인" @@ -4461,6 +4500,11 @@ msgstr "그룹을 업데이트 할 수 없습니다." msgid "Group leave failed." msgstr "그룹 프로필" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "그룹을 업데이트 할 수 없습니다." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4479,28 +4523,28 @@ msgstr "메시지를 삽입할 수 없습니다." msgid "Could not update message with new URI." msgstr "새 URI와 함께 메시지를 업데이트할 수 없습니다." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "해쉬테그를 추가 할 때에 데이타베이스 에러 : %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "통지를 저장하는데 문제가 발생했습니다." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "게시글 저장문제. 알려지지않은 회원" -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "너무 많은 게시글이 너무 빠르게 올라옵니다. 한숨고르고 몇분후에 다시 포스트를 " "해보세요." -#: classes/Notice.php:237 +#: classes/Notice.php:254 #, fuzzy msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " @@ -4509,20 +4553,20 @@ msgstr "" "너무 많은 게시글이 너무 빠르게 올라옵니다. 한숨고르고 몇분후에 다시 포스트를 " "해보세요." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "이 사이트에 게시글 포스팅으로부터 당신은 금지되었습니다." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "통지를 저장하는데 문제가 발생했습니다." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "통지를 저장하는데 문제가 발생했습니다." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -4554,19 +4598,29 @@ msgstr "예약 구독을 삭제 할 수 없습니다." msgid "Couldn't delete subscription." msgstr "예약 구독을 삭제 할 수 없습니다." -#: classes/User.php:372 +#: classes/User.php:373 #, fuzzy, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "%2$s에서 %1$s까지 메시지" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "새 그룹을 만들 수 없습니다." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "그룹 맴버십을 세팅할 수 없습니다." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "그룹 맴버십을 세팅할 수 없습니다." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "구독을 저장할 수 없습니다." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "프로필 세팅 바꾸기" @@ -4609,123 +4663,191 @@ msgstr "제목없는 페이지" msgid "Primary site navigation" msgstr "주 사이트 네비게이션" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "홈" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "개인 프로필과 친구 타임라인" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "개인적인" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "당신의 이메일, 아바타, 비밀 번호, 프로필을 변경하세요." -#: lib/action.php:444 -msgid "Connect" -msgstr "연결" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "계정" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "서버에 재접속 할 수 없습니다 : %s" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "연결" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 #, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "주 사이트 네비게이션" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "초대" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "관리자" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "%s에 친구를 가입시키기 위해 친구와 동료를 초대합니다." -#: lib/action.php:458 -msgid "Logout" -msgstr "로그아웃" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "초대" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "이 사이트로부터 로그아웃" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "로그아웃" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "계정 만들기" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "회원가입" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "이 사이트 로그인" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "도움말" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "로그인" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "도움이 필요해!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "검색" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "도움말" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "프로필이나 텍스트 검색" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "검색" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "사이트 공지" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "로컬 뷰" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "페이지 공지" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "보조 사이트 네비게이션" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "도움말" + +#: lib/action.php:765 msgid "About" msgstr "정보" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "자주 묻는 질문" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "개인정보 취급방침" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "소스 코드" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "연락하기" -#: lib/action.php:751 +#: lib/action.php:782 #, fuzzy msgid "Badge" msgstr "찔러 보기" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "라코니카 소프트웨어 라이선스" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4734,12 +4856,12 @@ msgstr "" "**%%site.name%%** 는 [%%site.broughtby%%](%%site.broughtbyurl%%)가 제공하는 " "마이크로블로깅서비스입니다." -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** 는 마이크로블로깅서비스입니다." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4750,117 +4872,169 @@ msgstr "" "을 사용합니다. StatusNet는 [GNU Affero General Public License](http://www." "fsf.org/licensing/licenses/agpl-3.0.html) 라이선스에 따라 사용할 수 있습니다." -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "라코니카 소프트웨어 라이선스" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "모든 것" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "라이선스" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "페이지수" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "뒷 페이지" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "앞 페이지" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 #, fuzzy msgid "You cannot make changes to this site." msgstr "당신은 이 사용자에게 메시지를 보낼 수 없습니다." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "가입이 허용되지 않습니다." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 #, fuzzy msgid "showForm() not implemented." msgstr "명령이 아직 실행되지 않았습니다." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 #, fuzzy msgid "saveSettings() not implemented." msgstr "명령이 아직 실행되지 않았습니다." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 #, fuzzy msgid "Unable to delete design setting." msgstr "트위터 환경설정을 저장할 수 없습니다." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "이메일 주소 확인서" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "초대" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "SMS 인증" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "개인적인" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "SMS 인증" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "이용자" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "SMS 인증" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "수락" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "SMS 인증" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "SMS 인증" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "개인적인" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4956,12 +5130,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "비밀번호 변경" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "비밀번호 변경" @@ -5239,20 +5413,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "확인 코드가 없습니다." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 #, fuzzy msgid "Go to the installer." msgstr "이 사이트 로그인" @@ -5445,23 +5619,23 @@ msgstr "파일을 올리는데 시스템 오류 발생" msgid "Not an image or corrupt file." msgstr "그림 파일이 아니거나 손상된 파일 입니다." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "지원하지 않는 그림 파일 형식입니다." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "파일을 잃어버렸습니다." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "알 수 없는 종류의 파일입니다" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5764,6 +5938,12 @@ msgstr "에게" msgid "Available characters" msgstr "사용 가능한 글자" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "보내기" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "게시글 보내기" @@ -5823,25 +6003,25 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 #, fuzzy msgid "in context" msgstr "내용이 없습니다!" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "생성" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "이 게시글에 대해 답장하기" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "답장하기" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "게시글이 등록되었습니다." @@ -5891,6 +6071,10 @@ msgstr "답신" msgid "Favorites" msgstr "좋아하는 글들" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "이용자" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "받은 쪽지함" @@ -5985,7 +6169,7 @@ msgstr "이 게시글에 대해 답장하기" msgid "Repeat this notice" msgstr "이 게시글에 대해 답장하기" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -6008,6 +6192,10 @@ msgstr "검색" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "검색" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -6062,6 +6250,15 @@ msgstr "%s에 의해 구독되는 사람들" msgid "Groups %s is a member of" msgstr "%s 그룹들은 의 멤버입니다." +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "초대" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "%s에 친구를 가입시키기 위해 친구와 동료를 초대합니다." + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6136,47 +6333,47 @@ msgstr "메시지" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "몇 초 전" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "1분 전" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "%d분 전" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "1시간 전" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "%d시간 전" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "하루 전" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "%d일 전" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "1달 전" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "%d달 전" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "1년 전" diff --git a/locale/mk/LC_MESSAGES/statusnet.po b/locale/mk/LC_MESSAGES/statusnet.po index 14efaf620..b80b0c905 100644 --- a/locale/mk/LC_MESSAGES/statusnet.po +++ b/locale/mk/LC_MESSAGES/statusnet.po @@ -9,77 +9,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:18+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:16+0000\n" "Language-Team: Macedonian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural= n==1 || n%10==1 ? 0 : 1;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Пристап" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Нагодувања за пристап на веб-страницата" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Регистрација" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Приватен" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" "Да им забранам на анонимните (ненајавени) корисници да ја гледаат веб-" "страницата?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Само со покана" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Приватен" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Регистрирање само со покана." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Затворен" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Само со покана" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Оневозможи нови регистрации." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Зачувај" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Затворен" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Зачувај нагодувања на пристап" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Зачувај" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Нема таква страница" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -93,52 +100,60 @@ msgstr "Нема таква страница" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Нема таков корисник." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s и пријателите, стр. %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s и пријатели" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Канал со пријатели на %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Канал со пријатели на %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Канал за пријатели на %S (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" "Ова е историјата за %s и пријателите, но досега никој нема објавено ништо." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -147,7 +162,8 @@ msgstr "" "Пробајте да се претплатите на повеќе луѓе, [зачленете се во група](%%action." "groups%%) или објавете нешто самите." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -157,7 +173,7 @@ msgstr "" "на корисникот или да [објавите нешто што сакате тој да го прочита](%%%%" "action.newnotice%%%%?status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -167,7 +183,8 @@ msgstr "" "го подбуцнете корисникот %s или да објавите забелешка што сакате тој да ја " "прочита." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Вие и пријателите" @@ -185,20 +202,20 @@ msgstr "Подновувања од %1$s и пријатели на %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "API методот не е пронајден." @@ -232,8 +249,9 @@ msgstr "Не можев да го подновам корисникот." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Корисникот нема профил." @@ -259,7 +277,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -372,68 +390,68 @@ msgstr "Не можев да го утврдам целниот корисник msgid "Could not find target user." msgstr "Не можев да го пронајдам целниот корисник." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Прекарот мора да има само мали букви и бројки и да нема празни места." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Тој прекар е во употреба. Одберете друг." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Неправилен прекар." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Главната страница не е важечка URL-адреса." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Целото име е предолго (максимум 255 знаци)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Описот е предолг (дозволено е највеќе %d знаци)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Локацијата е предолга (максимумот е 255 знаци)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Премногу алијаси! Дозволено е највеќе %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Неважечки алијас: „%s“" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Алијасот „%s“ е зафатен. Одберете друг." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Алијасот не може да биде ист како прекарот." @@ -444,15 +462,15 @@ msgstr "Алијасот не може да биде ист како прека msgid "Group not found!" msgstr "Групата не е пронајдена!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Веќе членувате во таа група." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Блокирани сте од таа група од администраторот." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Не можам да го зачленам корисникот %1$s во групата 2$s." @@ -461,7 +479,7 @@ msgstr "Не можам да го зачленам корисникот %1$s в msgid "You are not a member of this group." msgstr "Не членувате во оваа група." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Не можев да го отстранам корисникот %1$s од групата %2$s." @@ -492,7 +510,7 @@ msgstr "Погрешен жетон." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -535,7 +553,7 @@ msgstr "Жетонот на барањето %s е одбиен и поништ #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -561,13 +579,13 @@ msgstr "" "%3$s податоците за Вашата %4$s сметка. Треба да дозволувате " "пристап до Вашата %4$s сметка само на трети страни на кои им верувате." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Сметка" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -651,12 +669,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "Подновувања на %1$s омилени на %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Историја на %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -692,7 +710,7 @@ msgstr "Повторено за %s" msgid "Repeats of %s" msgstr "Повторувања на %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Забелешки означени со %s" @@ -713,8 +731,7 @@ msgstr "Нема таков прилог." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Нема прекар." @@ -726,7 +743,7 @@ msgstr "Нема големина." msgid "Invalid size." msgstr "Погрешна големина." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Аватар" @@ -745,30 +762,30 @@ msgid "User without matching profile" msgstr "Корисник без соодветен профил" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Нагодувања на аватарот" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Оригинал" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Преглед" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Бриши" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Подигни" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Отсечи" @@ -776,7 +793,7 @@ msgstr "Отсечи" msgid "Pick a square area of the image to be your avatar" msgstr "Одберете квадратна површина од сликата за аватар" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Податоците за податотеката се изгубени." @@ -812,22 +829,22 @@ msgstr "" "од корисникот." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Не" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Не го блокирај корисников" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Да" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Блокирај го корисников" @@ -835,39 +852,43 @@ msgstr "Блокирај го корисников" msgid "Failed to save block information." msgstr "Не можев да ги снимам инофрмациите за блокот." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Нема таква група." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s блокирани профили" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s блокирани профили, стр. %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Листана корисниците блокирани од придружување во оваа група." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Одблокирај корисник од група" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Одблокирај" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Одблокирај го овој корсник" @@ -942,7 +963,7 @@ msgstr "Не сте сопственик на овој програм." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Се појави проблем со Вашиот сесиски жетон." @@ -968,12 +989,13 @@ msgstr "Не го бриши овој програм" msgid "Delete this application" msgstr "Избриши го програмов" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Не сте најавени." @@ -1002,7 +1024,7 @@ msgstr "Дали сте сигурни дека сакате да ја избр msgid "Do not delete this notice" msgstr "Не ја бриши оваа забелешка" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Бриши ја оваа забелешка" @@ -1018,7 +1040,7 @@ msgstr "Може да бришете само локални корисници. msgid "Delete user" msgstr "Бриши корисник" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1026,12 +1048,12 @@ msgstr "" "Дали се сигурни дека сакате да го избришете овој корисник? Ова воедно ќе ги " "избрише сите податоци за корисникот од базата, без да може да се вратат." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Избриши овој корисник" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Изглед" @@ -1134,6 +1156,17 @@ msgstr "Врати основно-зададени нагодувања" msgid "Reset back to default" msgstr "Врати по основно" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Зачувај" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Зачувај изглед" @@ -1225,29 +1258,29 @@ msgstr "Уреди ја групата %s" msgid "You must be logged in to create a group." msgstr "Мора да сте најавени за да можете да создавате групи." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Мора да сте администратор за да можете да ја уредите групата." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "ОБразецов служи за уредување на групата." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "описот е предолг (максимум %d знаци)" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Не можев да ја подновам групата." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Не можеше да се создадат алијаси." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Нагодувањата се зачувани." @@ -1590,7 +1623,7 @@ msgstr "Корисникот е веќе блокиран од оваа груп msgid "User is not a member of group." msgstr "Корисникот не членува во групата." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Блокирај корисник од група" @@ -1627,11 +1660,11 @@ msgstr "Нема ID." msgid "You must be logged in to edit a group." msgstr "Мора да сте најавени за да можете да уредувате група." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Изглед на групата" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1639,20 +1672,20 @@ msgstr "" "Прилагодете го изгледот на Вашата група со позадинска слика и палета од бои " "по Ваш избор." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Не можев да го подновам Вашиот изглед." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Нагодувањата се зачувани." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Лого на групата" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1660,57 +1693,57 @@ msgstr "" "Можете да подигнете слика за логото на Вашата група. Максималната дозволена " "големина на податотеката е %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Корисник без соодветен профил." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Одберете квадратен простор на сликата за лого." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Логото е подновено." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Подновата на логото не успеа." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Членови на групата %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "Членови на групата %1$s, стр. %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Листа на корисниците на овааг група." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Администратор" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Блокирај" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Направи го корисникот администратор на групата" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Направи го/ја администратор" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Направи го корисникот администратор" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Подновувања од членови на %1$s на %2$s!" @@ -1976,16 +2009,19 @@ msgstr "Лична порака" msgid "Optionally add a personal message to the invitation." msgstr "Можете да додадете и лична порака во поканата." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Испрати" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s ве покани да се придружите на %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2046,7 +2082,11 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Мора да сте најавени за да можете да се зачлените во група." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "Нема прекар или ID." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s се зачлени во групата %2$s" @@ -2055,11 +2095,11 @@ msgstr "%1$s се зачлени во групата %2$s" msgid "You must be logged in to leave a group." msgstr "Мора да сте најавени за да можете да ја напуштите групата." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Не членувате во таа група." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s ја напушти групата %2$s" @@ -2076,8 +2116,7 @@ msgstr "Неточно корисничко име или лозинка" msgid "Error setting user. You are probably not authorized." msgstr "Грешка при поставувањето на корисникот. Веројатно не се заверени." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Најава" @@ -2334,8 +2373,8 @@ msgstr "тип на содржини " msgid "Only " msgstr "Само " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Ова не е поддржан формат на податотека." @@ -2476,7 +2515,7 @@ msgstr "Не можам да ја зачувам новата лозинка." msgid "Password saved." msgstr "Лозинката е зачувана." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Патеки" @@ -2509,7 +2548,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Неважечки SSL-сервер. Дозволени се најмногу 255 знаци" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Веб-страница" @@ -2684,7 +2722,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 мали букви или бројки. Без интерпукциски знаци и празни места." #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Цело име" @@ -2712,7 +2750,7 @@ msgid "Bio" msgstr "Биографија" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2796,7 +2834,8 @@ msgstr "Не можам да го зачувам профилот." msgid "Couldn't save tags." msgstr "Не можев да ги зачувам ознаките." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Нагодувањата се зачувани" @@ -2809,28 +2848,28 @@ msgstr "Надминато е ограничувањето на страница msgid "Could not retrieve public stream." msgstr "Не можам да го вратам јавниот поток." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Јавна историја, стр. %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Јавна историја" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Канал на јавниот поток (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Канал на јавниот поток (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Канал на јавниот поток (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2838,11 +2877,11 @@ msgid "" msgstr "" "Ова е јавната историја за %%site.name%%, но досега никој ништо нема објавено." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Создајте ја првата забелешка!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2850,7 +2889,7 @@ msgstr "" "Зошто не [регистрирате сметка](%%action.register%%) и станете првиот " "објавувач!" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2864,7 +2903,7 @@ msgstr "" "споделувате забелешки за себе со приајтелите, семејството и колегите! " "([Прочитајте повеќе](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3044,8 +3083,7 @@ msgstr "Жалиме, неважечки код за поканата." msgid "Registration successful" msgstr "Регистрацијата е успешна" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Регистрирај се" @@ -3233,7 +3271,7 @@ msgstr "Не можете да повторувате сопствена заб msgid "You already repeated that notice." msgstr "Веќе ја имате повторено таа забелешка." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Повторено" @@ -3241,33 +3279,33 @@ msgstr "Повторено" msgid "Repeated!" msgstr "Повторено!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Одговори испратени до %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Одговори на %1$s, стр. %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Канал со одговори за %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Канал со одговори за %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Канал со одговори за %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3276,7 +3314,7 @@ msgstr "" "Ова е историјата на која се прикажани одговорите на %1$s, но %2$s сè уште " "нема добиено порака од некој што сака да ја прочита." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3285,7 +3323,7 @@ msgstr "" "Можете да започнувате разговори со други корисници, да се претплаќате на " "други луѓе или да [се зачленувате во групи](%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3312,7 +3350,6 @@ msgid "User is already sandboxed." msgstr "Корисникот е веќе во песочен режим." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Сесии" @@ -3337,7 +3374,7 @@ msgid "Turn on debugging output for sessions." msgstr "Вклучи извод од поправка на грешки за сесии." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Зачувај нагодувања на веб-страницата" @@ -3367,7 +3404,7 @@ msgstr "Организација" msgid "Description" msgstr "Опис" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Статистики" @@ -3432,22 +3469,22 @@ msgstr "Омилени забелешки на %1$s, стр. %2$d" msgid "Could not retrieve favorite notices." msgstr "Не можев да ги вратам омилените забелешки." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Канал за омилени забелешки на %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Канал за омилени забелешки на %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Канал за омилени забелешки на %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3456,7 +3493,7 @@ msgstr "" "омилена забелешка веднаш до самата забелешката што Ви се допаѓа за да ја " "обележите за подоцна, или за да ѝ дадете на важност." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3465,7 +3502,7 @@ msgstr "" "%s сè уште нема додадено забелешки како омилени. Објавете нешто интересно, " "што корисникот би го обележал како омилено :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3476,7 +3513,7 @@ msgstr "" "%%action.register%%%%) и потоа објавите нешто интересно што корисникот би го " "додал како омилено :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Ова е начин да го споделите она што Ви се допаѓа." @@ -3490,67 +3527,67 @@ msgstr "Група %s" msgid "%1$s group, page %2$d" msgstr "Група %1$s, стр. %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Профил на група" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Забелешка" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Алијаси" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Групни дејства" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Канал со забелешки за групата %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Канал со забелешки за групата %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Канал со забелешки за групата%s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "FOAF за групата %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Членови" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Нема)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Сите членови" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Создадено" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3566,7 +3603,7 @@ msgstr "" "се](%%%%action.register%%%%) за да станете дел од оваа група и многу повеќе! " "([Прочитајте повеќе](%%%%doc.help%%%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3579,7 +3616,7 @@ msgstr "" "слободната програмска алатка [StatusNet](http://status.net/). Нејзините " "членови си разменуваат кратки пораки за нивниот живот и интереси. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Администратори" @@ -3957,17 +3994,16 @@ msgstr "Не можев да ја зачувам претплатата." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." -msgstr "" +msgstr "Ова дејство прифаќа само POST-барања" #: actions/subscribe.php:107 -#, fuzzy msgid "No such profile." -msgstr "Нема таква податотека." +msgstr "Нема таков профил." #: actions/subscribe.php:117 -#, fuzzy msgid "You cannot subscribe to an OMB 0.1 remote profile with this action." -msgstr "Не сте претплатени на тој профил." +msgstr "" +"Не можете да се претплатите на OMB 0.1 оддалечен профил со ова дејство." #: actions/subscribe.php:145 msgid "Subscribed" @@ -4061,22 +4097,22 @@ msgstr "Jabber" msgid "SMS" msgstr "СМС" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Забелешки означени со %1$s, стр. %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Канал со забелешки за ознаката %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Канал со забелешки за ознаката %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Канал со забелешки за ознаката %s (Atom)" @@ -4130,7 +4166,7 @@ msgstr "Со овој образец додавајте ознаки во Ваш msgid "No such tag." msgstr "Нема таква ознака." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API-методот е во изработка." @@ -4162,70 +4198,72 @@ msgstr "" "Лиценцата на потокот на следачот „%1$s“ не е компатибилна со лиценцата на " "веб-страницата „%2$s“." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Корисник" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Кориснички нагодувања за оваа StatusNet веб-страница." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Неважечко ограничување за биографијата. Мора да е бројчено." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "НЕважечки текст за добредојде. Дозволени се највеќе 255 знаци." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Неважечки опис по основно: „%1$s“ не е корисник." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Профил" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Ограничување за биографијата" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Максимална големина на профилната биографија во знаци." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Нови корисници" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Добредојде за нов корисник" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Текст за добредојде на нови корисници (највеќе до 255 знаци)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Основно-зададена претплата" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Автоматски претплатувај нови корисници на овој корисник." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Покани" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Поканите се овозможени" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "Дали да им е дозволено на корисниците да канат други корисници." @@ -4423,7 +4461,7 @@ msgstr "" msgid "Plugins" msgstr "Приклучоци" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Верзија" @@ -4463,6 +4501,10 @@ msgstr "Не е дел од групата." msgid "Group leave failed." msgstr "Напуштањето на групата не успеа." +#: classes/Local_group.php:41 +msgid "Could not update local group." +msgstr "Не можев да ја подновам локалната група." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4480,27 +4522,27 @@ msgstr "Не можев да ја испратам пораката." msgid "Could not update message with new URI." msgstr "Не можев да ја подновам пораката со нов URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Грешка во базата на податоци при вметнувањето на хеш-ознака: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Проблем со зачувувањето на белешката. Премногу долго." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Проблем со зачувувањето на белешката. Непознат корисник." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Премногу забелњшки за прекратко време; здивнете малку и продолжете за " "неколку минути." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4508,19 +4550,19 @@ msgstr "" "Премногу дуплирани пораки во прекратко време; здивнете малку и продолжете за " "неколку минути." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Забрането Ви е да објавувате забелешки на оваа веб-страница." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Проблем во зачувувањето на белешката." -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "Проблем при зачувувањето на групното приемно сандаче." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4550,19 +4592,27 @@ msgstr "Не можам да ја избришам самопретплатат msgid "Couldn't delete subscription." msgstr "Претплата не може да се избрише." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Добредојдовте на %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Не можев да ја создадам групата." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +msgid "Could not set group URI." +msgstr "Не можев да поставам URI на групата." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Не можев да назначам членство во групата." +#: classes/User_group.php:506 +msgid "Could not save local group info." +msgstr "Не можев да ги зачувам информациите за локалните групи." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Смени профилни нагодувања" @@ -4604,120 +4654,190 @@ msgstr "Страница без наслов" msgid "Primary site navigation" msgstr "Главна навигација" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Дома" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Личен профил и историја на пријатели" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Личен" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Промена на е-пошта, аватар, лозинка, профил" -#: lib/action.php:444 -msgid "Connect" -msgstr "Поврзи се" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Сметка" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Поврзи се со услуги" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Поврзи се" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Промена на конфигурацијата на веб-страницата" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Покани" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Администратор" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Поканете пријатели и колеги да Ви се придружат на %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Одјави се" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Покани" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Одјава" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Одјави се" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Создај сметка" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Регистрирај се" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Најава" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Помош" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Најава" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Напомош!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Барај" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Помош" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Пребарајте луѓе или текст" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Барај" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Напомена за веб-страницата" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Локални прегледи" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Напомена за страницата" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Споредна навигација" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Помош" + +#: lib/action.php:765 msgid "About" msgstr "За" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "ЧПП" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "Услови" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Приватност" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Изворен код" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Контакт" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Значка" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Лиценца на програмот StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4726,12 +4846,12 @@ msgstr "" "**%%site.name%%** е сервис за микроблогирање што ви го овозможува [%%site." "broughtby%%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** е сервис за микроблогирање." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4742,111 +4862,164 @@ msgstr "" "верзија %s, достапен пд [GNU Affero General Public License](http://www.fsf." "org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Лиценца на содржините на веб-страницата" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "Содржината и податоците на %1$s се лични и доверливи." -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" "Авторските права на содржината и податоците се во сопственост на %1$s. Сите " "права задржани." -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "Авторските права на содржината и податоците им припаѓаат на учесниците. Сите " "права задржани." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Сите " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "лиценца." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Прелом на страници" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "По" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Пред" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." -msgstr "" +msgstr "Сè уште не е поддржана обработката на оддалечена содржина." -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." -msgstr "" +msgstr "Сè уште не е поддржана обработката на XML содржина." -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." -msgstr "" +msgstr "Сè уште не е достапна обработката на вметната Base64 содржина." -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Не можете да ја менувате оваа веб-страница." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Менувањето на тој алатник не е дозволено." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() не е имплементирано." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() не е имплементирано." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Не можам да ги избришам нагодувањата за изглед." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Основни нагодувања на веб-страницата" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Веб-страница" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Конфигурација на изгледот" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Изглед" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Конфигурација на корисник" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Корисник" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Конфигурација на пристапот" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Пристап" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Конфигурација на патеки" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Патеки" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Конфигурација на сесиите" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Сесии" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "API-ресурсот бара да може и да чита и да запишува, а вие можете само да " "читате." -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "Неуспешен обид за API-заверка, прекар = %1$s, прокси = %2$s, IP = %3$s" @@ -4937,11 +5110,11 @@ msgstr "Забелешки кадешто се јавува овој прило msgid "Tags for this attachment" msgstr "Ознаки за овој прилог" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Менувањето на лозинката не успеа" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "Менувањето на лозинка не е дозволено" @@ -5143,9 +5316,9 @@ msgid "This link is useable only once, and is good for only 2 minutes: %s" msgstr "Оваа врска може да се употреби само еднаш, и трае само 2 минути: %s" #: lib/command.php:692 -#, fuzzy, php-format +#, php-format msgid "Unsubscribed %s" -msgstr "Претплатата на %s е откажана" +msgstr "Откажана претплата на %s" #: lib/command.php:709 msgid "You are not subscribed to anyone." @@ -5178,7 +5351,6 @@ msgstr[0] "Не ни го испративте тој профил." msgstr[1] "Не ни го испративте тој профил." #: lib/command.php:769 -#, fuzzy msgid "" "Commands:\n" "on - turn on notifications\n" @@ -5257,19 +5429,19 @@ msgstr "" "tracks - сè уште не е имплементирано.\n" "tracking - сè уште не е имплементирано.\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Нема пронајдено конфигурациска податотека. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "Побарав конфигурациони податотеки на следниве места: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "Препорачуваме да го пуштите инсталатерот за да го поправите ова." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Оди на инсталаторот." @@ -5459,23 +5631,23 @@ msgstr "Системска грешка при подигањето на под msgid "Not an image or corrupt file." msgstr "Не е слика или податотеката е пореметена." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Неподдржан фомрат на слики." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Податотеката е изгубена." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Непознат тип на податотека" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "МБ" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "кб" @@ -5862,6 +6034,11 @@ msgstr "За" msgid "Available characters" msgstr "Расположиви знаци" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Испрати" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Испрати забелешка" @@ -5920,23 +6097,23 @@ msgstr "З" msgid "at" msgstr "во" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "во контекст" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Повторено од" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Одговори на забелешкава" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Одговор" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Забелешката е повторена" @@ -5984,6 +6161,10 @@ msgstr "Одговори" msgid "Favorites" msgstr "Омилени" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Корисник" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Примени" @@ -6073,7 +6254,7 @@ msgstr "Да ја повторам белешкава?" msgid "Repeat this notice" msgstr "Повтори ја забелешкава" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "Не е зададен корисник за еднокорисничкиот режим." @@ -6093,6 +6274,10 @@ msgstr "Пребарај по веб-страницата" msgid "Keyword(s)" msgstr "Клучен збор" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Барај" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Помош со пребарување" @@ -6144,6 +6329,15 @@ msgstr "Луѓе претплатени на %s" msgid "Groups %s is a member of" msgstr "Групи кадешто членува %s" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Покани" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Поканете пријатели и колеги да Ви се придружат на %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6214,47 +6408,47 @@ msgstr "Порака" msgid "Moderate" msgstr "Модерирај" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "пред неколку секунди" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "пред една минута" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "пред %d минути" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "пред еден час" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "пред %d часа" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "пред еден ден" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "пред %d денови" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "пред еден месец" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "пред %d месеца" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "пред една година" diff --git a/locale/nb/LC_MESSAGES/statusnet.po b/locale/nb/LC_MESSAGES/statusnet.po index cf3daf093..a3e64e0cb 100644 --- a/locale/nb/LC_MESSAGES/statusnet.po +++ b/locale/nb/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Norwegian (bokmål)‬ # +# Author@translatewiki.net: Laaknor # Author@translatewiki.net: Nghtwlkr # -- # This file is distributed under the same license as the StatusNet package. @@ -8,75 +9,82 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:22+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:19+0000\n" "Language-Team: Norwegian (bokmål)‬\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: no\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Tilgang" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Innstillinger for nettstedstilgang" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Registrering" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Privat" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "Forhindre anonyme brukere (ikke innlogget) å se nettsted?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Kun invitasjon" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Privat" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Gjør at registrering kun kan skje gjennom invitasjon." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Lukket" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Kun invitasjon" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Deaktiver nye registreringer." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Lagre" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Lukket" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Lagre tilgangsinnstillinger" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Lagre" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Ingen slik side" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -90,51 +98,59 @@ msgstr "Ingen slik side" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Ingen slik bruker" -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s og venner, side %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s og venner" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Mating for venner av %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Mating for venner av %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Mating for venner av %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "Dette er tidslinjen for %s og venner, men ingen har postet noe enda." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -143,7 +159,8 @@ msgstr "" "Prøv å abbonere på flere personer, [bli med i en gruppe](%%action.groups%%) " "eller post noe selv." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -153,7 +170,7 @@ msgstr "" "å få hans eller hennes oppmerksomhet](%%%%action.newnotice%%%%?" "status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -162,7 +179,8 @@ msgstr "" "Hvorfor ikke [opprette en konto](%%%%action.register%%%%) og så knuff %s " "eller post en notis for å få hans eller hennes oppmerksomhet." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Du og venner" @@ -180,20 +198,20 @@ msgstr "Oppdateringer fra %1$s og venner på %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "API-metode ikke funnet!" @@ -227,8 +245,9 @@ msgstr "Klarte ikke å oppdatere bruker." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Brukeren har ingen profil." @@ -255,7 +274,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -366,68 +385,68 @@ msgstr "Kunne ikke bestemme kildebruker." msgid "Could not find target user." msgstr "Kunne ikke finne målbruker." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Kallenavn kan kun ha små bokstaver og tall og ingen mellomrom." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Det nicket er allerede i bruk. Prøv et annet." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Ugyldig nick." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Hjemmesiden er ikke en gyldig URL." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Beklager, navnet er for langt (max 250 tegn)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Beskrivelsen er for lang (maks %d tegn)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." -msgstr "" +msgstr "Plassering er for lang (maks 255 tegn)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "For mange alias! Maksimum %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Ugyldig alias: «%s»" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Aliaset «%s» er allerede i bruk. Prøv et annet." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Alias kan ikke være det samme som kallenavn." @@ -438,15 +457,15 @@ msgstr "Alias kan ikke være det samme som kallenavn." msgid "Group not found!" msgstr "Gruppe ikke funnet!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Du er allerede medlem av den gruppen." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Du har blitt blokkert fra den gruppen av administratoren." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Kunne ikke legge bruker %1$s til gruppe %2$s." @@ -455,7 +474,7 @@ msgstr "Kunne ikke legge bruker %1$s til gruppe %2$s." msgid "You are not a member of this group." msgstr "Du er ikke et medlem av denne gruppen." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Kunne ikke fjerne bruker %1$s fra gruppe %2$s." @@ -480,14 +499,13 @@ msgid "No oauth_token parameter provided." msgstr "Ingen verdi for oauth_token er oppgitt." #: actions/apioauthauthorize.php:106 -#, fuzzy msgid "Invalid token." -msgstr "Ugyldig størrelse" +msgstr "Ugyldig symbol." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -500,7 +518,7 @@ msgstr "Ugyldig størrelse" #: actions/unsubscribe.php:69 actions/userauthorization.php:52 #: lib/designsettings.php:294 msgid "There was a problem with your session token. Try again, please." -msgstr "" +msgstr "Det var et problem med din sesjons-autentisering. Prøv igjen." #: actions/apioauthauthorize.php:135 msgid "Invalid nickname / password!" @@ -508,11 +526,11 @@ msgstr "Ugyldig kallenavn / passord!" #: actions/apioauthauthorize.php:159 msgid "Database error deleting OAuth application user." -msgstr "" +msgstr "Databasefeil ved sletting av bruker fra programmet OAuth." #: actions/apioauthauthorize.php:185 msgid "Database error inserting OAuth application user." -msgstr "" +msgstr "Databasefeil ved innsetting av bruker i programmet OAuth." #: actions/apioauthauthorize.php:214 #, php-format @@ -528,16 +546,16 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 msgid "Unexpected form submission." -msgstr "" +msgstr "Uventet skjemainnsending." #: actions/apioauthauthorize.php:259 msgid "An application would like to connect to your account" -msgstr "" +msgstr "Et program ønsker å koble til kontoen din" #: actions/apioauthauthorize.php:276 msgid "Allow or deny access" @@ -550,14 +568,17 @@ msgid "" "the ability to %3$s your %4$s account data. You should only " "give access to your %4$s account to third parties you trust." msgstr "" +"Programmet %1$s av %2$s ønsker å kunne " +"%3$s dine %4$s-kontodata. Du bør bare gi tilgang til din %4" +"$s-konto til tredjeparter du stoler på." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Konto" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -582,7 +603,7 @@ msgstr "Tillat eller nekt tilgang til din kontoinformasjon." #: actions/apistatusesdestroy.php:107 msgid "This method requires a POST or DELETE." -msgstr "" +msgstr "Denne metoden krever en POST eller DELETE." #: actions/apistatusesdestroy.php:130 msgid "You may not delete another user's status." @@ -613,7 +634,7 @@ msgstr "Ingen status med den ID-en funnet." #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." -msgstr "" +msgstr "Det er for langt. Maks notisstørrelse er %d tegn." #: actions/apistatusesupdate.php:202 msgid "Not found" @@ -622,7 +643,7 @@ msgstr "Ikke funnet" #: actions/apistatusesupdate.php:225 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." -msgstr "" +msgstr "Maks notisstørrelse er %d tegn, inklusive vedleggs-URL." #: actions/apisubscriptions.php:231 actions/apisubscriptions.php:261 msgid "Unsupported format." @@ -639,12 +660,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s oppdateringer markert som favoritt av %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s tidslinje" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -680,7 +701,7 @@ msgstr "Gjentatt til %s" msgid "Repeats of %s" msgstr "Repetisjoner av %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Notiser merket med %s" @@ -701,8 +722,7 @@ msgstr "Ingen slike vedlegg." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Ingen kallenavn." @@ -714,7 +734,7 @@ msgstr "Ingen størrelse." msgid "Invalid size." msgstr "Ugyldig størrelse" -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Brukerbilde" @@ -722,49 +742,49 @@ msgstr "Brukerbilde" #: actions/avatarsettings.php:78 #, php-format msgid "You can upload your personal avatar. The maximum file size is %s." -msgstr "" +msgstr "Du kan laste opp en personlig avatar. Maks filstørrelse er %s." #: actions/avatarsettings.php:106 actions/avatarsettings.php:185 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72 #: actions/userrss.php:103 msgid "User without matching profile" -msgstr "" +msgstr "Bruker uten samsvarende profil" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Avatarinnstillinger" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Original" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Forhåndsvis" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Slett" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Last opp" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Beskjær" #: actions/avatarsettings.php:328 msgid "Pick a square area of the image to be your avatar" -msgstr "" +msgstr "Velg et kvadratisk utsnitt av bildet som din avatar." -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." -msgstr "" +msgstr "Mistet våre fildata." #: actions/avatarsettings.php:366 msgid "Avatar updated." @@ -792,66 +812,73 @@ msgid "" "unsubscribed from you, unable to subscribe to you in the future, and you " "will not be notified of any @-replies from them." msgstr "" +"Er du sikker på at du vil blokkere denne brukeren? Etter dette vil de ikke " +"lenger abbonere på deg, vil ikke kunne abbonere på deg i fremtiden og du vil " +"ikke bli varslet om @-svar fra dem." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Nei" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Ikke blokker denne brukeren" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Ja" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Blokker denne brukeren" #: actions/block.php:167 msgid "Failed to save block information." -msgstr "" - -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +msgstr "Kunne ikke lagre blokkeringsinformasjon." + +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Ingen slik gruppe." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s blokkerte profiler" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s blokkerte profiler, side %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." -msgstr "" +msgstr "En liste over brukere som er blokkert fra å delta i denne gruppen." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" -msgstr "" +msgstr "Opphev blokkering av bruker fra gruppe" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" -msgstr "" +msgstr "Opphev blokkering" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" -msgstr "" +msgstr "Opphev blokkering av denne brukeren" #: actions/bookmarklet.php:50 msgid "Post to " @@ -867,12 +894,12 @@ msgstr "Fant ikke bekreftelseskode." #: actions/confirmaddress.php:85 msgid "That confirmation code is not for you!" -msgstr "" +msgstr "Den bekreftelseskoden er ikke til deg." #: actions/confirmaddress.php:90 #, php-format msgid "Unrecognized address type %s" -msgstr "" +msgstr "Ukjent adressetype %s" #: actions/confirmaddress.php:94 msgid "That address has already been confirmed." @@ -907,7 +934,7 @@ msgstr "Samtale" #: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87 #: lib/profileaction.php:216 lib/searchgroupnav.php:82 msgid "Notices" -msgstr "" +msgstr "Notiser" #: actions/deleteapplication.php:63 msgid "You must be logged in to delete an application." @@ -924,7 +951,7 @@ msgstr "Du er ikke eieren av dette programmet." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -950,12 +977,13 @@ msgstr "Ikke slett dette programmet" msgid "Delete this application" msgstr "Slett dette programmet" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Ikke logget inn." @@ -984,7 +1012,7 @@ msgstr "Er du sikker på at du vil slette denne notisen?" msgid "Do not delete this notice" msgstr "Ikke slett denne notisen" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Slett denne notisen" @@ -1000,7 +1028,7 @@ msgstr "Du kan bare slette lokale brukere." msgid "Delete user" msgstr "Slett bruker" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1008,12 +1036,12 @@ msgstr "" "Er du sikker på at du vil slette denne brukeren? Dette vil slette alle data " "om brukeren fra databasen, uten sikkerhetskopi." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Slett denne brukeren" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1028,7 +1056,7 @@ msgstr "Ugyldig logo-URL." #: actions/designadminpanel.php:279 #, php-format msgid "Theme not available: %s" -msgstr "" +msgstr "Tema ikke tilgjengelig: %s" #: actions/designadminpanel.php:375 msgid "Change logo" @@ -1039,18 +1067,16 @@ msgid "Site logo" msgstr "Nettstedslogo" #: actions/designadminpanel.php:387 -#, fuzzy msgid "Change theme" -msgstr "Endre" +msgstr "Endre tema" #: actions/designadminpanel.php:404 -#, fuzzy msgid "Site theme" -msgstr "Endre" +msgstr "Nettstedstema" #: actions/designadminpanel.php:405 msgid "Theme for the site." -msgstr "" +msgstr "Tema for nettstedet." #: actions/designadminpanel.php:417 lib/designsettings.php:101 msgid "Change background image" @@ -1067,6 +1093,7 @@ msgid "" "You can upload a background image for the site. The maximum file size is %1" "$s." msgstr "" +"Du kan laste opp et bakgrunnsbilde for nettstedet. Maks filstørrelse er %1$s." #: actions/designadminpanel.php:457 lib/designsettings.php:139 msgid "On" @@ -1115,7 +1142,18 @@ msgstr "" #: actions/designadminpanel.php:584 lib/designsettings.php:254 msgid "Reset back to default" -msgstr "" +msgstr "Tilbakestill til standardverdier" + +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Lagre" #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" @@ -1203,38 +1241,37 @@ msgstr "Klarte ikke å oppdatere bruker." #: actions/editgroup.php:56 #, php-format msgid "Edit %s group" -msgstr "" +msgstr "Rediger %s gruppe" #: actions/editgroup.php:68 actions/grouplogo.php:70 actions/newgroup.php:65 msgid "You must be logged in to create a group." msgstr "Du må være innlogget for å opprette en gruppe." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 -#, fuzzy +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." -msgstr "Gjør brukeren til en administrator for gruppen" +msgstr "Du må være en administrator for å redigere gruppen." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." -msgstr "" +msgstr "Bruk dette skjemaet for å redigere gruppen." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "beskrivelse er for lang (maks %d tegn)" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Kunne ikke oppdatere gruppe." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Kunne ikke opprette alias." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." -msgstr "" +msgstr "Lagret valg." #: actions/emailsettings.php:60 msgid "Email settings" @@ -1243,7 +1280,7 @@ msgstr "E-postinnstillinger" #: actions/emailsettings.php:71 #, php-format msgid "Manage how you get email from %%site.name%%." -msgstr "" +msgstr "Velg hvordan du mottar e-post fra %%site.name%%." #: actions/emailsettings.php:100 actions/imsettings.php:100 #: actions/smssettings.php:104 @@ -1306,7 +1343,7 @@ msgstr "Ny" #: actions/emailsettings.php:153 actions/imsettings.php:139 #: actions/smssettings.php:169 msgid "Preferences" -msgstr "" +msgstr "Innstillinger" #: actions/emailsettings.php:158 msgid "Send me notices of new subscriptions through email." @@ -1339,7 +1376,7 @@ msgstr "Publiser en MicroID for min e-postadresse." #: actions/emailsettings.php:302 actions/imsettings.php:264 #: actions/othersettings.php:180 actions/smssettings.php:284 msgid "Preferences saved." -msgstr "" +msgstr "Innstillinger lagret." #: actions/emailsettings.php:320 msgid "No email address." @@ -1492,11 +1529,11 @@ msgstr "Nytt nick" #: actions/file.php:42 msgid "No attachments." -msgstr "" +msgstr "Ingen vedlegg." #: actions/file.php:51 msgid "No uploaded attachments." -msgstr "" +msgstr "Ingen opplastede vedlegg." #: actions/finishremotesubscribe.php:69 msgid "Not expecting this response!" @@ -1515,9 +1552,8 @@ msgid "That user has blocked you from subscribing." msgstr "" #: actions/finishremotesubscribe.php:110 -#, fuzzy msgid "You are not authorized." -msgstr "Ikke autorisert." +msgstr "Du er ikke autorisert." #: actions/finishremotesubscribe.php:113 msgid "Could not convert request token to access token." @@ -1569,7 +1605,7 @@ msgstr "Du er allerede logget inn!" msgid "User is not a member of group." msgstr "" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "" @@ -1601,88 +1637,88 @@ msgstr "Ingen ID." msgid "You must be logged in to edit a group." msgstr "" -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "Klarte ikke å oppdatere bruker." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "" -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Gruppelogo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Brukeren har ingen profil." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo oppdatert." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." -msgstr "" +msgstr "Kunne ikke oppdatere logo." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "%s gruppemedlemmer" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" -msgstr "" +msgstr "%1$s gruppemedlemmer, side %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "En liste over brukerne i denne gruppen." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Administrator" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Blokkér" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Gjør brukeren til en administrator for gruppen" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Gjør til administrator" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Gjør denne brukeren til administrator" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Oppdateringer fra medlemmer av %1$s på %2$s!" @@ -1695,7 +1731,7 @@ msgstr "Grupper" #: actions/groups.php:64 #, php-format msgid "Groups, page %d" -msgstr "" +msgstr "Grupper, side %d" #: actions/groups.php:90 #, php-format @@ -1751,7 +1787,7 @@ msgstr "" #: actions/groupunblock.php:128 actions/unblock.php:86 msgid "Error removing the block." -msgstr "" +msgstr "Feil under oppheving av blokkering." #: actions/imsettings.php:59 #, fuzzy @@ -1895,7 +1931,7 @@ msgstr "" #: actions/invite.php:144 msgid "Invitation(s) sent to the following people:" -msgstr "" +msgstr "Invitasjon(er) sendt til følgende personer:" #: actions/invite.php:150 msgid "" @@ -1924,16 +1960,19 @@ msgstr "Personlig melding" msgid "Optionally add a personal message to the invitation." msgstr "" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Send" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s har invitert deg til %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -1989,7 +2028,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Du må være innlogget for å bli med i en gruppe." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Ingen kallenavn." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "" @@ -1998,11 +2042,11 @@ msgstr "" msgid "You must be logged in to leave a group." msgstr "" -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s forlot gruppe %2$s" @@ -2020,8 +2064,7 @@ msgstr "Feil brukernavn eller passord" msgid "Error setting user. You are probably not authorized." msgstr "Ikke autorisert." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Logg inn" @@ -2264,8 +2307,8 @@ msgstr "innholdstype " msgid "Only " msgstr "Bare " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "" @@ -2408,7 +2451,7 @@ msgstr "Klarer ikke å lagre nytt passord." msgid "Password saved." msgstr "Passordet ble lagret" -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2441,7 +2484,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "" @@ -2614,7 +2656,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 små bokstaver eller nummer, ingen punktum eller mellomrom" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Fullt navn" @@ -2643,7 +2685,7 @@ msgid "Bio" msgstr "Om meg" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2726,7 +2768,8 @@ msgstr "Klarte ikke å lagre profil." msgid "Couldn't save tags." msgstr "Klarte ikke å lagre profil." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "" @@ -2739,46 +2782,46 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "%s offentlig strøm" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2787,7 +2830,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2958,8 +3001,7 @@ msgstr "" msgid "Registration successful" msgstr "" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "" @@ -3139,7 +3181,7 @@ msgstr "" msgid "You already repeated that notice." msgstr "Du er allerede logget inn!" -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Gjentatt" @@ -3147,47 +3189,47 @@ msgstr "Gjentatt" msgid "Repeated!" msgstr "Gjentatt!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Svar til %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Svar til %1$s, side %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Svarstrøm for %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Svarstrøm for %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Svarstrøm for %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, fuzzy, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "Dette er tidslinjen for %s og venner, men ingen har postet noe enda." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, fuzzy, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3217,7 +3259,6 @@ msgid "User is already sandboxed." msgstr "Du er allerede logget inn!" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3242,7 +3283,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "Innstillinger for IM" @@ -3273,7 +3314,7 @@ msgstr "Organisasjon" msgid "Description" msgstr "Beskrivelse" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statistikk" @@ -3335,35 +3376,35 @@ msgstr "%s og venner" msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Feed for %s sine venner" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Feed for %s sine venner" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, fuzzy, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Feed for %s sine venner" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3371,7 +3412,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3385,70 +3426,70 @@ msgstr "" msgid "%1$s group, page %2$d" msgstr "Alle abonnementer" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 #, fuzzy msgid "Group profile" msgstr "Klarte ikke å lagre profil." -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, fuzzy, php-format msgid "FOAF for %s group" msgstr "Klarte ikke å lagre profil." -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 #, fuzzy msgid "Members" msgstr "Medlem siden" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 #, fuzzy msgid "Created" msgstr "Opprett" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3458,7 +3499,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3467,7 +3508,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "" @@ -3926,22 +3967,22 @@ msgstr "Ingen Jabber ID." msgid "SMS" msgstr "" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Mikroblogg av %s" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Feed for taggen %s" @@ -3994,7 +4035,7 @@ msgstr "" msgid "No such tag." msgstr "" -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API-metode under utvikling." @@ -4025,75 +4066,76 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +msgctxt "TITLE" msgid "User" msgstr "" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 #, fuzzy msgid "New users" msgstr "slett" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "Alle abonnementer" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "" "Abonner automatisk på de som abonnerer på meg (best for ikke-mennesker)" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "Bekreftelseskode" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4268,7 +4310,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Personlig" @@ -4309,6 +4351,11 @@ msgstr "Klarte ikke å oppdatere bruker." msgid "Group leave failed." msgstr "Klarte ikke å lagre profil." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Kunne ikke oppdatere gruppe." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4326,43 +4373,43 @@ msgstr "" msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "" -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "" -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "" -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "" -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4393,21 +4440,31 @@ msgstr "Klarte ikke å lagre avatar-informasjonen" msgid "Couldn't delete subscription." msgstr "" -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "" -#: classes/User_group.php:423 +#: classes/User_group.php:462 #, fuzzy msgid "Could not create group." msgstr "Klarte ikke å lagre avatar-informasjonen" -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Klarte ikke å lagre avatar-informasjonen" + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "Klarte ikke å lagre avatar-informasjonen" +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Klarte ikke å lagre avatar-informasjonen" + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Endre profilinnstillingene dine" @@ -4450,122 +4507,187 @@ msgstr "" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Hjem" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 -msgid "Change your email, avatar, password, profile" -msgstr "" +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Personlig" +#. TRANS: Tooltip for main menu option "Account" #: lib/action.php:444 -msgid "Connect" -msgstr "Koble til" +#, fuzzy +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "Endre passordet ditt" -#: lib/action.php:444 +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Konto" + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" -msgstr "" +msgstr "Koble til" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Koble til" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Administrator" -#: lib/action.php:453 lib/subgroupnav.php:106 +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 #, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "" -#: lib/action.php:458 -msgid "Logout" -msgstr "Logg ut" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Kun invitasjon" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" -msgstr "" +msgstr "Tema for nettstedet." -#: lib/action.php:463 +#: lib/action.php:476 #, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Logg ut" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Opprett en ny konto" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registrering" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" -msgstr "" +msgstr "Tema for nettstedet." -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Hjelp" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Logg inn" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 #, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Hjelp" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Søk" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Hjelp" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Søk" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Hjelp" + +#: lib/action.php:765 msgid "About" msgstr "Om" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "OSS/FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Kilde" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Kontakt" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4574,12 +4696,12 @@ msgstr "" "**%%site.name%%** er en mikrobloggingtjeneste av [%%site.broughtby%%](%%site." "broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** er en mikrobloggingtjeneste. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4587,106 +4709,157 @@ msgid "" "org/licensing/licenses/agpl-3.0.html)." msgstr "" -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "" -#: lib/action.php:1149 +#: lib/action.php:1180 #, fuzzy msgid "Before" msgstr "Tidligere »" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Nettstedslogo" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Personlig" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +msgctxt "MENU" +msgid "User" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Tilgang" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Personlig" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4782,12 +4955,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Passordet ble lagret" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Passordet ble lagret" @@ -5067,20 +5240,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "Fant ikke bekreftelseskode." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5273,24 +5446,24 @@ msgstr "" msgid "Not an image or corrupt file." msgstr "" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "" -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "Klarte ikke å lagre profil." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5596,6 +5769,12 @@ msgstr "" msgid "Available characters" msgstr "6 eller flere tegn" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Send" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "" @@ -5654,25 +5833,25 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "Opprett" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 #, fuzzy msgid "Reply" msgstr "svar" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Nytt nick" @@ -5721,6 +5900,10 @@ msgstr "Svar" msgid "Favorites" msgstr "" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "" @@ -5815,7 +5998,7 @@ msgstr "Kan ikke slette notisen." msgid "Repeat this notice" msgstr "Kan ikke slette notisen." -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5837,6 +6020,10 @@ msgstr "Søk" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Søk" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -5890,6 +6077,15 @@ msgstr "Svar til %s" msgid "Groups %s is a member of" msgstr "" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -5964,47 +6160,47 @@ msgstr "" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "noen få sekunder siden" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "omtrent ett minutt siden" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "omtrent %d minutter siden" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "omtrent én time siden" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "omtrent %d timer siden" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "omtrent én dag siden" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "omtrent %d dager siden" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "omtrent én måned siden" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "omtrent %d måneder siden" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "omtrent ett år siden" diff --git a/locale/nl/LC_MESSAGES/statusnet.po b/locale/nl/LC_MESSAGES/statusnet.po index 1cd71ad86..a9e757956 100644 --- a/locale/nl/LC_MESSAGES/statusnet.po +++ b/locale/nl/LC_MESSAGES/statusnet.po @@ -10,75 +10,82 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:28+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:32+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Toegang" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Instellingen voor sitetoegang" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Registratie" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Privé" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "Mogen anonieme gebruikers (niet aangemeld) de website bekijken?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Alleen op uitnodiging" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Privé" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Registratie alleen op uitnodiging." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Gesloten" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Alleen op uitnodiging" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Nieuwe registraties uitschakelen." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Opslaan" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Gesloten" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Toegangsinstellingen opslaan" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Opslaan" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Deze pagina bestaat niet" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -92,45 +99,53 @@ msgstr "Deze pagina bestaat niet" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Onbekende gebruiker." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s en vrienden, pagina %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s en vrienden" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Feed voor vrienden van %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Feed voor vrienden van %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Feed voor vrienden van %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." @@ -138,7 +153,7 @@ msgstr "" "Dit is de tijdlijn voor %s en vrienden, maar niemand heeft nog mededelingen " "geplaatst." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -147,7 +162,8 @@ msgstr "" "Probeer te abonneren op meer gebruikers, [word lid van een groep](%%action." "groups%%) of plaats zelf berichten." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -157,7 +173,7 @@ msgstr "" "bericht voor die gebruiker plaatsen](%%%%action.newnotice%%%%?" "status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -166,7 +182,8 @@ msgstr "" "U kunt een [gebruiker aanmaken](%%%%action.register%%%%) en %s dan porren of " "een bericht sturen." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "U en vrienden" @@ -184,20 +201,20 @@ msgstr "Updates van %1$s en vrienden op %2$s." #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "De API-functie is niet aangetroffen." @@ -231,8 +248,9 @@ msgstr "Het was niet mogelijk de gebruiker bij te werken." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Deze gebruiker heeft geen profiel." @@ -258,7 +276,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -373,7 +391,7 @@ msgstr "Het was niet mogelijk de brongebruiker te bepalen." msgid "Could not find target user." msgstr "Het was niet mogelijk de doelgebruiker te vinden." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -381,63 +399,63 @@ msgstr "" "De gebruikersnaam mag alleen kleine letters en cijfers bevatten. Spaties " "zijn niet toegestaan." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "" "De opgegeven gebruikersnaam is al in gebruik. Kies een andere gebruikersnaam." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Ongeldige gebruikersnaam!" -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "De thuispagina is geen geldige URL." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "De volledige naam is te lang (maximaal 255 tekens)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "De beschrijving is te lang (maximaal %d tekens)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Locatie is te lang (maximaal 255 tekens)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Te veel aliassen! Het maximale aantal is %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Ongeldige alias: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "De alias \"%s\" wordt al gebruikt. Geef een andere alias op." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Een alias kan niet hetzelfde zijn als de gebruikersnaam." @@ -448,15 +466,15 @@ msgstr "Een alias kan niet hetzelfde zijn als de gebruikersnaam." msgid "Group not found!" msgstr "De groep is niet aangetroffen!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "U bent al lid van die groep." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Een beheerder heeft ingesteld dat u geen lid mag worden van die groep." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Het was niet mogelijk gebruiker %1$s toe te voegen aan de groep %2$s." @@ -465,7 +483,7 @@ msgstr "Het was niet mogelijk gebruiker %1$s toe te voegen aan de groep %2$s." msgid "You are not a member of this group." msgstr "U bent geen lid van deze groep." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Het was niet mogelijk gebruiker %1$s uit de group %2$s te verwijderen." @@ -496,7 +514,7 @@ msgstr "Ongeldig token." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -545,7 +563,7 @@ msgstr "Het verzoektoken %s is geweigerd en ingetrokken." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -571,13 +589,13 @@ msgstr "" "van het type \"%3$s tot uw gebruikersgegevens. Geef alleen " "toegang tot uw gebruiker bij %4$s aan derde partijen die u vertrouwt." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Gebruiker" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -661,12 +679,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s updates op de favorietenlijst geplaatst door %2$s / %3$s" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s tijdlijn" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -702,7 +720,7 @@ msgstr "Herhaald naar %s" msgid "Repeats of %s" msgstr "Herhaald van %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Mededelingen met het label %s" @@ -723,8 +741,7 @@ msgstr "Deze bijlage bestaat niet." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Geen gebruikersnaam." @@ -736,7 +753,7 @@ msgstr "Geen afmeting." msgid "Invalid size." msgstr "Ongeldige afmetingen." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -754,30 +771,30 @@ msgid "User without matching profile" msgstr "Gebruiker zonder bijbehorend profiel" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Avatarinstellingen" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Origineel" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Voorvertoning" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Verwijderen" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Uploaden" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Uitsnijden" @@ -786,7 +803,7 @@ msgid "Pick a square area of the image to be your avatar" msgstr "" "Selecteer een vierkant in de afbeelding om deze als uw avatar in te stellen" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Ons bestand is verloren gegaan." @@ -821,22 +838,22 @@ msgstr "" "van deze gebruiker." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Nee" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Gebruiker niet blokkeren" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Ja" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Deze gebruiker blokkeren" @@ -844,39 +861,43 @@ msgstr "Deze gebruiker blokkeren" msgid "Failed to save block information." msgstr "Het was niet mogelijk om de blokkadeinformatie op te slaan." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "De opgegeven groep bestaat niet." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s geblokkeerde profielen" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s geblokkeerde profielen, pagina %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Een lijst met voor deze groep geblokkeerde gebruikers." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Deze gebruiker weer toegang geven tot de groep" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Deblokkeer" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Deblokkeer deze gebruiker." @@ -951,7 +972,7 @@ msgstr "U bent niet de eigenaar van deze applicatie." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Er is een probleem met uw sessietoken." @@ -977,12 +998,13 @@ msgstr "Deze applicatie niet verwijderen" msgid "Delete this application" msgstr "Deze applicatie verwijderen" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Niet aangemeld." @@ -1011,7 +1033,7 @@ msgstr "Weet u zeker dat u deze aankondiging wilt verwijderen?" msgid "Do not delete this notice" msgstr "Deze mededeling niet verwijderen" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Deze mededeling verwijderen" @@ -1027,7 +1049,7 @@ msgstr "U kunt alleen lokale gebruikers verwijderen." msgid "Delete user" msgstr "Gebruiker verwijderen" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1036,12 +1058,12 @@ msgstr "" "worden alle gegevens van deze gebruiker uit de database verwijderd. Het is " "niet mogelijk ze terug te zetten." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Gebruiker verwijderen" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Uiterlijk" @@ -1144,6 +1166,17 @@ msgstr "Standaardontwerp toepassen" msgid "Reset back to default" msgstr "Standaardinstellingen toepassen" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Opslaan" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Ontwerp opslaan" @@ -1235,29 +1268,29 @@ msgstr "Groep %s bewerken" msgid "You must be logged in to create a group." msgstr "U moet aangemeld zijn om een groep aan te kunnen maken." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "U moet beheerder zijn om de groep te kunnen bewerken." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Gebruik dit formulier om de groep te bewerken." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "de beschrijving is te lang (maximaal %d tekens)" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Het was niet mogelijk de groep bij te werken." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Het was niet mogelijk de aliassen aan te maken." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "De instellingen zijn opgeslagen." @@ -1604,7 +1637,7 @@ msgstr "Deze gebruiker is al de toegang tot de groep ontzegd." msgid "User is not a member of group." msgstr "De gebruiker is geen lid van de groep." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Gebruiker toegang tot de groep blokkeren" @@ -1641,11 +1674,11 @@ msgstr "Geen ID." msgid "You must be logged in to edit a group." msgstr "U moet aangemeld zijn om een groep te kunnen bewerken." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Groepsontwerp" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1653,20 +1686,20 @@ msgstr "" "De vormgeving van uw groep aanpassen met een achtergrondafbeelding en een " "kleurenpalet van uw keuze." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Het was niet mogelijk uw ontwerp bij te werken." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "De ontwerpvoorkeuren zijn opgeslagen." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Groepslogo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1674,57 +1707,57 @@ msgstr "" "Hier kunt u een logo voor uw groep uploaden. De maximale bestandsgrootte is %" "s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Gebruiker zonder bijbehorend profiel." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Selecteer een vierkant uit de afbeelding die het logo wordt." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo geactualiseerd." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Het bijwerken van het logo is mislukt." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "leden van de groep %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "%1$s groeps leden, pagina %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Ledenlijst van deze groep" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Beheerder" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Blokkeren" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Deze gebruiker groepsbeheerder maken" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Beheerder maken" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Deze gebruiker beheerder maken" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Updates voor leden van %1$s op %2$s." @@ -1992,16 +2025,19 @@ msgstr "Persoonlijk bericht" msgid "Optionally add a personal message to the invitation." msgstr "Persoonlijk bericht bij de uitnodiging (optioneel)." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Verzenden" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s heeft u uitgenodigd voor %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2062,7 +2098,11 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "U moet aangemeld zijn om lid te worden van een groep." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "Geen gebruikersnaam of ID." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s is lid geworden van de groep %2$s" @@ -2071,11 +2111,11 @@ msgstr "%1$s is lid geworden van de groep %2$s" msgid "You must be logged in to leave a group." msgstr "U moet aangemeld zijn om een groep te kunnen verlaten." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "U bent geen lid van deze groep" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s heeft de groep %2$s verlaten" @@ -2094,8 +2134,7 @@ msgstr "" "Er is een fout opgetreden bij het maken van de instellingen. U hebt " "waarschijnlijk niet de juiste rechten." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Aanmelden" @@ -2353,8 +2392,8 @@ msgstr "inhoudstype " msgid "Only " msgstr "Alleen " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Geen ondersteund gegevensformaat." @@ -2493,7 +2532,7 @@ msgstr "Het was niet mogelijk het nieuwe wachtwoord op te slaan." msgid "Password saved." msgstr "Het wachtwoord is opgeslagen." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Paden" @@ -2526,7 +2565,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "De SSL-server is ongeldig. De maximale lengte is 255 tekens." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Website" @@ -2701,7 +2739,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 kleine letters of cijfers, geen leestekens of spaties" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Volledige naam" @@ -2729,7 +2767,7 @@ msgid "Bio" msgstr "Beschrijving" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2815,7 +2853,8 @@ msgstr "Het profiel kon niet opgeslagen worden." msgid "Couldn't save tags." msgstr "Het was niet mogelijk de labels op te slaan." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "De instellingen zijn opgeslagen." @@ -2828,28 +2867,28 @@ msgstr "Meer dan de paginalimiet (%s)" msgid "Could not retrieve public stream." msgstr "Het was niet mogelijk de publieke stream op te halen." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Openbare tijdlijn, pagina %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Openbare tijdlijn" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Publieke streamfeed (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Publieke streamfeed (RSS 1.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Publieke streamfeed (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2858,11 +2897,11 @@ msgstr "" "Dit is de publieke tijdlijn voor %%site.name%%, maar niemand heeft nog " "berichten geplaatst." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "U kunt de eerste zijn die een bericht plaatst!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2870,7 +2909,7 @@ msgstr "" "Waarom [registreert u geen gebruiker](%%action.register%%) en plaatst u als " "eerste een bericht?" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2883,7 +2922,7 @@ msgstr "" "net/). [Registreer nu](%%action.register%%) om mededelingen over uzelf te " "delen met vrienden, familie en collega's! [Meer lezen...](%%doc.help%%)" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3067,8 +3106,7 @@ msgstr "Sorry. De uitnodigingscode is ongeldig." msgid "Registration successful" msgstr "De registratie is voltooid" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Registreren" @@ -3254,7 +3292,7 @@ msgstr "U kunt uw eigen mededeling niet herhalen." msgid "You already repeated that notice." msgstr "U hent die mededeling al herhaald." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Herhaald" @@ -3262,33 +3300,33 @@ msgstr "Herhaald" msgid "Repeated!" msgstr "Herhaald!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Antwoorden aan %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Antwoorden aan %1$s, pagina %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Antwoordenfeed voor %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Antwoordenfeed voor %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Antwoordenfeed voor %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3297,7 +3335,7 @@ msgstr "" "Dit is de tijdlijn met de antwoorden aan %1$s, maar %2$s heeft nog geen " "antwoorden ontvangen." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3306,7 +3344,7 @@ msgstr "" "U kunt gesprekken aanknopen met andere gebruikers, op meer gebruikers " "abonneren of [lid worden van groepen](%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3333,7 +3371,6 @@ msgid "User is already sandboxed." msgstr "Deze gebruiker is al in de zandbak geplaatst." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Sessies" @@ -3358,7 +3395,7 @@ msgid "Turn on debugging output for sessions." msgstr "Debuguitvoer voor sessies inschakelen." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Websiteinstellingen opslaan" @@ -3388,7 +3425,7 @@ msgstr "Organisatie" msgid "Description" msgstr "Beschrijving" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statistieken" @@ -3452,22 +3489,22 @@ msgstr "Favoriete mededelingen van %1$s, pagina %2$d" msgid "Could not retrieve favorite notices." msgstr "Het was niet mogelijk de favoriete mededelingen op te halen." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Favorietenfeed van %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Favorietenfeed van %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Favorietenfeed van %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3476,7 +3513,7 @@ msgstr "" "toevoegen\" bij mededelingen die u aanstaan om ze op een lijst te bewaren en " "ze uit te lichten." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3486,7 +3523,7 @@ msgstr "" "een interessant bericht, en dan komt u misschien wel op de " "favorietenlijst. :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3497,7 +3534,7 @@ msgstr "" "action.register%%%%) en dan interessante mededelingen plaatsten die " "misschien aan favorietenlijsten zijn toe te voegen. :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Dit is de manier om dat te delen wat u wilt." @@ -3511,67 +3548,67 @@ msgstr "%s groep" msgid "%1$s group, page %2$d" msgstr "Groep %1$s, pagina %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Groepsprofiel" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Opmerking" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Aliassen" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Groepshandelingen" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Mededelingenfeed voor groep %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Mededelingenfeed voor groep %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Mededelingenfeed voor groep %s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "Vriend van een vriend voor de groep %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Leden" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(geen)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Alle leden" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Aangemaakt" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3587,7 +3624,7 @@ msgstr "" "lid te worden van deze groep en nog veel meer! [Meer lezen...](%%%%doc.help%%" "%%)" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3600,7 +3637,7 @@ msgstr "" "[StatusNet](http://status.net/). De leden wisselen korte mededelingen uit " "over hun ervaringen en interesses. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Beheerders" @@ -3981,17 +4018,17 @@ msgstr "Het was niet mogelijk het abonnement op te slaan." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." -msgstr "" +msgstr "Deze handeling accepteert alleen POST-verzoeken." #: actions/subscribe.php:107 -#, fuzzy msgid "No such profile." -msgstr "Het bestand bestaat niet." +msgstr "Het profiel 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." +msgstr "" +"U kunt niet abonneren op een OMB 1.0 profiel van een andere omgeving via " +"deze handeling." #: actions/subscribe.php:145 msgid "Subscribed" @@ -4086,22 +4123,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Mededelingen met het label %1$s, pagina %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Mededelingenfeed voor label %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Mededelingenfeed voor label %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Mededelingenfeed voor label %s (Atom)" @@ -4157,7 +4194,7 @@ msgstr "" msgid "No such tag." msgstr "Onbekend label." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "De API-functie is in bewerking." @@ -4189,70 +4226,72 @@ msgstr "" "De licentie \"%1$s\" voor de stream die u wilt volgen is niet compatibel met " "de sitelicentie \"%2$s\"." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Gebruiker" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Gebruikersinstellingen voor deze StatusNet-website." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Ongeldige beschrijvingslimiet. Het moet een getal zijn." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "Ongeldige welkomsttekst. De maximale lengte is 255 tekens." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Ongeldig standaardabonnement: \"%1$s\" is geen gebruiker." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profiel" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Profiellimiet" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "De maximale lengte van de profieltekst in tekens." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Nieuwe gebruikers" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Welkom voor nieuwe gebruikers" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Welkomsttekst voor nieuwe gebruikers. Maximaal 255 tekens." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Standaardabonnement" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Nieuwe gebruikers automatisch op deze gebruiker abonneren" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Uitnodigingen" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Uitnodigingen ingeschakeld" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "Of gebruikers nieuwe gebruikers kunnen uitnodigen." @@ -4450,7 +4489,7 @@ msgstr "" msgid "Plugins" msgstr "Plug-ins" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Versie" @@ -4491,6 +4530,10 @@ msgstr "Geen lid van groep." msgid "Group leave failed." msgstr "Groepslidmaatschap opzeggen is mislukt." +#: classes/Local_group.php:41 +msgid "Could not update local group." +msgstr "Het was niet mogelijk de lokale groep bij te werken." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4508,31 +4551,31 @@ msgstr "Het was niet mogelijk het bericht in te voegen." msgid "Could not update message with new URI." msgstr "Het was niet mogelijk het bericht bij te werken met de nieuwe URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Er is een databasefout opgetreden bij de invoer van de hashtag: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "" "Er is een probleem opgetreden bij het opslaan van de mededeling. Deze is te " "lang." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "" "Er was een probleem bij het opslaan van de mededeling. De gebruiker is " "onbekend." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "U hebt te snel te veel mededelingen verstuurd. Kom even op adem en probeer " "het over enige tijd weer." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4540,22 +4583,22 @@ msgstr "" "Te veel duplicaatberichten te snel achter elkaar. Neem een adempauze en " "plaats over een aantal minuten pas weer een bericht." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" "U bent geblokkeerd en mag geen mededelingen meer achterlaten op deze site." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Er is een probleem opgetreden bij het opslaan van de mededeling." -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "" "Er is een probleem opgetreden bij het opslaan van het Postvak IN van de " "groep." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4584,19 +4627,27 @@ msgstr "Het was niet mogelijk het abonnement op uzelf te verwijderen." msgid "Couldn't delete subscription." msgstr "Kon abonnement niet verwijderen." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Welkom bij %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Het was niet mogelijk de groep aan te maken." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +msgid "Could not set group URI." +msgstr "Het was niet mogelijk de groeps-URI in te stellen." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Het was niet mogelijk het groepslidmaatschap in te stellen." +#: classes/User_group.php:506 +msgid "Could not save local group info." +msgstr "Het was niet mogelijk de lokale groepsinformatie op te slaan." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Uw profielgegevens wijzigen" @@ -4638,120 +4689,190 @@ msgstr "Naamloze pagina" msgid "Primary site navigation" msgstr "Primaire sitenavigatie" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Start" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Persoonlijk profiel en tijdlijn van vrienden" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Persoonlijk" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Uw e-mailadres, avatar, wachtwoord of profiel wijzigen" -#: lib/action.php:444 -msgid "Connect" -msgstr "Koppelen" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Gebruiker" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Met diensten verbinden" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Koppelen" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Websiteinstellingen wijzigen" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Uitnodigen" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Beheerder" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Vrienden en collega's uitnodigen om u te vergezellen op %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Afmelden" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Uitnodigen" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Van de site afmelden" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Afmelden" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Gebruiker aanmaken" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registreren" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Bij de site aanmelden" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Help" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Aanmelden" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Help me!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Zoeken" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Help" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Naar gebruikers of tekst zoeken" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Zoeken" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Mededeling van de website" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Lokale weergaven" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Mededeling van de pagina" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Secundaire sitenavigatie" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Help" + +#: lib/action.php:765 msgid "About" msgstr "Over" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "Veel gestelde vragen" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "Gebruiksvoorwaarden" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Privacy" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Broncode" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Contact" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Widget" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Licentie van de StatusNet-software" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4760,12 +4881,12 @@ msgstr "" "**%%site.name%%** is een microblogdienst van [%%site.broughtby%%](%%site." "broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** is een microblogdienst. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4776,111 +4897,164 @@ msgstr "" "versie %s, beschikbaar onder de [GNU Affero General Public License](http://" "www.fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Licentie voor siteinhoud" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "Inhoud en gegevens van %1$s zijn persoonlijk en vertrouwelijk." -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" "Auteursrechten op inhoud en gegevens rusten bij %1$s. Alle rechten " "voorbehouden." -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "Auteursrechten op inhoud en gegevens rusten bij de respectievelijke " "gebruikers. Alle rechten voorbehouden." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Alle " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "licentie." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Paginering" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Later" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Eerder" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." -msgstr "" +msgstr "Het is nog niet mogelijk inhoud uit andere omgevingen te verwerken." -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." -msgstr "" +msgstr "Het is nog niet mogelijk ingebedde XML-inhoud te verwerken" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." -msgstr "" +msgstr "Het is nog niet mogelijk ingebedde Base64-inhoud te verwerken" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "U mag geen wijzigingen maken aan deze website." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Wijzigingen aan dat venster zijn niet toegestaan." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() is niet geïmplementeerd." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() is nog niet geïmplementeerd." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Het was niet mogelijk om de ontwerpinstellingen te verwijderen." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Basisinstellingen voor de website" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Website" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Instellingen vormgeving" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Uiterlijk" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Gebruikersinstellingen" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Gebruiker" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Toegangsinstellingen" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Toegang" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Padinstellingen" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Paden" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Sessieinstellingen" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Sessies" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "Het API-programma heeft lezen-en-schrijventoegang nodig, maar u hebt alleen " "maar leestoegang." -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4972,11 +5146,11 @@ msgstr "Mededelingen die deze bijlage bevatten" msgid "Tags for this attachment" msgstr "Labels voor deze bijlage" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Wachtwoord wijzigen is mislukt" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "Wachtwoord wijzigen is niet toegestaan" @@ -5182,9 +5356,9 @@ msgstr "" "geldig: %s" #: lib/command.php:692 -#, fuzzy, php-format +#, php-format msgid "Unsubscribed %s" -msgstr "Uw abonnement op %s is opgezegd" +msgstr "Het abonnement van %s is opgeheven" #: lib/command.php:709 msgid "You are not subscribed to anyone." @@ -5217,7 +5391,6 @@ msgstr[0] "U bent lid van deze groep:" msgstr[1] "U bent lid van deze groepen:" #: lib/command.php:769 -#, fuzzy msgid "" "Commands:\n" "on - turn on notifications\n" @@ -5270,6 +5443,7 @@ msgstr "" "d - direct bericht aan gebruiker\n" "get - laatste mededeling van gebruiker opvragen\n" "whois - profielinformatie van gebruiker opvragen\n" +"lose - zorgt ervoor dat de gebruiker u niet meer volgt\n" "fav - laatste mededeling van gebruiker op favorietenlijst " "zetten\n" "fav # - mededelingen met aangegeven ID op favorietenlijst " @@ -5298,20 +5472,20 @@ msgstr "" "tracks - nog niet beschikbaar\n" "tracking - nog niet beschikbaar\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Er is geen instellingenbestand aangetroffen. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "Er is gezocht naar instellingenbestanden op de volgende plaatsen: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" "U kunt proberen de installer uit te voeren om dit probleem op te lossen." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Naar het installatieprogramma gaan." @@ -5501,23 +5675,23 @@ msgstr "Er is een systeemfout opgetreden tijdens het uploaden van het bestand." msgid "Not an image or corrupt file." msgstr "Het bestand is geen afbeelding of het bestand is beschadigd." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Niet ondersteund beeldbestandsformaat." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Het bestand is zoekgeraakt." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Onbekend bestandstype" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "kB" @@ -5903,6 +6077,11 @@ msgstr "Aan" msgid "Available characters" msgstr "Beschikbare tekens" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "OK" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Mededeling verzenden" @@ -5961,23 +6140,23 @@ msgstr "W" msgid "at" msgstr "op" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "in context" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Herhaald door" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Op deze mededeling antwoorden" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Antwoorden" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Mededeling herhaald" @@ -6026,6 +6205,10 @@ msgstr "Antwoorden" msgid "Favorites" msgstr "Favorieten" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Gebruiker" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Postvak IN" @@ -6115,7 +6298,7 @@ msgstr "Deze mededeling herhalen?" msgid "Repeat this notice" msgstr "Deze mededeling herhalen" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "Er is geen gebruiker gedefinieerd voor single-usermodus." @@ -6135,6 +6318,10 @@ msgstr "Site doorzoeken" msgid "Keyword(s)" msgstr "Term(en)" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Zoeken" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Hulp bij zoeken" @@ -6186,6 +6373,15 @@ msgstr "Gebruikers met een abonnement op %s" msgid "Groups %s is a member of" msgstr "Groepen waar %s lid van is" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Uitnodigen" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Vrienden en collega's uitnodigen om u te vergezellen op %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6256,47 +6452,47 @@ msgstr "Bericht" msgid "Moderate" msgstr "Modereren" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "een paar seconden geleden" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "ongeveer een minuut geleden" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "ongeveer %d minuten geleden" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "ongeveer een uur geleden" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "ongeveer %d uur geleden" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "ongeveer een dag geleden" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "ongeveer %d dagen geleden" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "ongeveer een maand geleden" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "ongeveer %d maanden geleden" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "ongeveer een jaar geleden" diff --git a/locale/nn/LC_MESSAGES/statusnet.po b/locale/nn/LC_MESSAGES/statusnet.po index 55918d880..ddd183e87 100644 --- a/locale/nn/LC_MESSAGES/statusnet.po +++ b/locale/nn/LC_MESSAGES/statusnet.po @@ -7,83 +7,89 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:25+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:22+0000\n" "Language-Team: Norwegian Nynorsk\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nn\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "Godta" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Avatar-innstillingar" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Registrér" -#: actions/accessadminpanel.php:161 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 #, fuzzy +msgctxt "LABEL" msgid "Private" msgstr "Personvern" -#: actions/accessadminpanel.php:163 -msgid "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:167 +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 #, fuzzy msgid "Invite only" msgstr "Invitér" -#: actions/accessadminpanel.php:169 -msgid "Make registration invitation only." +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:173 +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 #, fuzzy msgid "Closed" msgstr "Blokkér" -#: actions/accessadminpanel.php:175 -msgid "Disable new registrations." -msgstr "" - -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Lagra" - -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Avatar-innstillingar" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Lagra" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page" msgstr "Dette emneord finst ikkje." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -97,72 +103,82 @@ msgstr "Dette emneord finst ikkje." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Brukaren finst ikkje." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s med vener, side %d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s med vener" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Straum for vener av %s" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Straum for vener av %s" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, fuzzy, php-format msgid "Feed for friends of %s (Atom)" msgstr "Straum for vener av %s" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 #, fuzzy msgid "You and friends" msgstr "%s med vener" @@ -181,20 +197,20 @@ msgstr "Oppdateringar frå %1$s og vener på %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Fann ikkje API-metode." @@ -228,8 +244,9 @@ msgstr "Kan ikkje oppdatera brukar." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Brukaren har inga profil." @@ -254,7 +271,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 #, fuzzy @@ -373,68 +390,68 @@ msgstr "Kan ikkje hente offentleg straum." msgid "Could not find target user." msgstr "Kan ikkje finna einkvan status." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Kallenamn må berre ha små bokstavar og nummer, ingen mellomrom." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Kallenamnet er allereie i bruk. Prøv eit anna." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Ikkje eit gyldig brukarnamn." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Heimesida er ikkje ei gyldig internettadresse." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Ditt fulle namn er for langt (maksimalt 255 teikn)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." msgstr "skildringa er for lang (maks 140 teikn)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Plassering er for lang (maksimalt 255 teikn)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, fuzzy, php-format msgid "Invalid alias: \"%s\"" msgstr "Ugyldig merkelapp: %s" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Kallenamnet er allereie i bruk. Prøv eit anna." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -446,16 +463,16 @@ msgstr "" msgid "Group not found!" msgstr "Fann ikkje API-metode." -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 #, fuzzy msgid "You are already a member of that group." msgstr "Du er allereie medlem av den gruppa" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Kunne ikkje melde brukaren %s inn i gruppa %s" @@ -465,7 +482,7 @@ msgstr "Kunne ikkje melde brukaren %s inn i gruppa %s" msgid "You are not a member of this group." msgstr "Du er ikkje medlem av den gruppa." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Kunne ikkje fjerne %s fra %s gruppa " @@ -497,7 +514,7 @@ msgstr "Ugyldig storleik." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -541,7 +558,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -564,13 +581,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Konto" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -657,12 +674,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s oppdateringar favorisert av %s / %s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s tidsline" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -698,7 +715,7 @@ msgstr "Svar til %s" msgid "Repeats of %s" msgstr "Svar til %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Notisar merka med %s" @@ -720,8 +737,7 @@ msgstr "Slikt dokument finst ikkje." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Ingen kallenamn." @@ -733,7 +749,7 @@ msgstr "Ingen storleik." msgid "Invalid size." msgstr "Ugyldig storleik." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Brukarbilete" @@ -750,30 +766,30 @@ msgid "User without matching profile" msgstr "Kan ikkje finne brukar" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Avatar-innstillingar" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Original" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Forhandsvis" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Slett" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Last opp" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Skaler" @@ -781,7 +797,7 @@ msgstr "Skaler" msgid "Pick a square area of the image to be your avatar" msgstr "Velg eit utvalg av bildet som vil blir din avatar." -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Fant ikkje igjen fil data." @@ -815,23 +831,23 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Nei" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "Lås opp brukaren" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Jau" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Blokkér denne brukaren" @@ -839,41 +855,45 @@ msgstr "Blokkér denne brukaren" msgid "Failed to save block information." msgstr "Lagring av informasjon feila." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Denne gruppa finst ikkje." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "Brukarprofil" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s med vener, side %d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 #, fuzzy msgid "A list of the users blocked from joining this group." msgstr "Ei liste over brukarane i denne gruppa." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 #, fuzzy msgid "Unblock user from group" msgstr "De-blokkering av brukar feila." -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Lås opp" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Lås opp brukaren" @@ -954,7 +974,7 @@ msgstr "Du er ikkje medlem av den gruppa." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Det var eit problem med sesjons billetten din." @@ -980,12 +1000,13 @@ msgstr "Kan ikkje sletta notisen." msgid "Delete this application" msgstr "Slett denne notisen" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Ikkje logga inn" @@ -1016,7 +1037,7 @@ msgstr "Sikker på at du vil sletta notisen?" msgid "Do not delete this notice" msgstr "Kan ikkje sletta notisen." -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Slett denne notisen" @@ -1035,19 +1056,19 @@ msgstr "Du kan ikkje sletta statusen til ein annan brukar." msgid "Delete user" msgstr "Slett" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" msgstr "Slett denne notisen" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1158,6 +1179,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Lagra" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1260,31 +1292,31 @@ msgstr "Rediger %s gruppa" msgid "You must be logged in to create a group." msgstr "Du må være logga inn for å lage ei gruppe." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "Du må være administrator for å redigere gruppa" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Bruk dette skjemaet for å redigere gruppa" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." msgstr "skildringa er for lang (maks 140 teikn)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Kann ikkje oppdatera gruppa." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "Kunne ikkje lagre favoritt." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Lagra innstillingar." @@ -1634,7 +1666,7 @@ msgstr "Brukar har blokkert deg." msgid "User is not a member of group." msgstr "Du er ikkje medlem av den gruppa." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 #, fuzzy msgid "Block user from group" msgstr "Blokker brukaren" @@ -1671,93 +1703,93 @@ msgstr "Ingen ID" msgid "You must be logged in to edit a group." msgstr "Du må være logga inn for å lage ei gruppe." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 #, fuzzy msgid "Group design" msgstr "Grupper" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "Kan ikkje oppdatera brukar." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "Synkroniserings innstillingar blei lagra." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Logo åt gruppa" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, fuzzy, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "Du kan lasta opp ein logo for gruppa." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Kan ikkje finne brukar" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 #, fuzzy msgid "Pick a square area of the image to be the logo." msgstr "Velg eit utvalg av bildet som vil blir din avatar." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logo oppdatert." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Feil ved oppdatering av logo." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "%s medlemmar i gruppa" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" msgstr "%s medlemmar i gruppa, side %d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Ei liste over brukarane i denne gruppa." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Administrator" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Blokkér" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 #, fuzzy msgid "Make user an admin of the group" msgstr "Du må være administrator for å redigere gruppa" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 #, fuzzy msgid "Make Admin" msgstr "Administrator" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Oppdateringar frå %1$s på %2$s!" @@ -2013,16 +2045,19 @@ msgstr "Personleg melding" msgid "Optionally add a personal message to the invitation." msgstr "Eventuelt legg til ei personleg melding til invitasjonen." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Send" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s har invitert deg til %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2078,7 +2113,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Du må være logga inn for å bli med i ei gruppe." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Ingen kallenamn." + +#: actions/joingroup.php:141 #, fuzzy, php-format msgid "%1$s joined group %2$s" msgstr "%s blei medlem av gruppe %s" @@ -2087,11 +2127,11 @@ msgstr "%s blei medlem av gruppe %s" msgid "You must be logged in to leave a group." msgstr "Du må være innlogga for å melde deg ut av ei gruppe." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Du er ikkje medlem av den gruppa." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%s forlot %s gruppa" @@ -2109,8 +2149,7 @@ msgstr "Feil brukarnamn eller passord" msgid "Error setting user. You are probably not authorized." msgstr "Ikkje autorisert." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Logg inn" @@ -2369,8 +2408,8 @@ msgstr "Kopla til" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Ikkje eit støtta dataformat." @@ -2516,7 +2555,7 @@ msgstr "Klarar ikkje lagra nytt passord." msgid "Password saved." msgstr "Lagra passord." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2549,7 +2588,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 #, fuzzy msgid "Site" msgstr "Invitér" @@ -2734,7 +2772,7 @@ msgstr "" "1-64 små bokstavar eller tal, ingen punktum (og liknande) eller mellomrom" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Fullt namn" @@ -2763,7 +2801,7 @@ msgid "Bio" msgstr "Om meg" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2847,7 +2885,8 @@ msgstr "Kan ikkje lagra profil." msgid "Couldn't save tags." msgstr "Kan ikkje lagra merkelapp." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Lagra innstillingar." @@ -2860,48 +2899,48 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "Kan ikkje hente offentleg straum." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Offentleg tidsline, side %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Offentleg tidsline" -#: actions/public.php:159 +#: actions/public.php:160 #, fuzzy msgid "Public Stream Feed (RSS 1.0)" msgstr "Offentleg straum" -#: actions/public.php:163 +#: actions/public.php:164 #, fuzzy msgid "Public Stream Feed (RSS 2.0)" msgstr "Offentleg straum" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "Offentleg straum" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2910,7 +2949,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, fuzzy, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3084,8 +3123,7 @@ msgstr "Feil med stadfestingskode." msgid "Registration successful" msgstr "Registreringa gikk bra" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Registrér" @@ -3277,7 +3315,7 @@ msgstr "Du kan ikkje registrera deg om du ikkje godtek vilkåra i lisensen." msgid "You already repeated that notice." msgstr "Du har allereie blokkert denne brukaren." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "Lag" @@ -3287,47 +3325,47 @@ msgstr "Lag" msgid "Repeated!" msgstr "Lag" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Svar til %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "Melding til %1$s på %2$s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Notisstraum for %s" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Notisstraum for %s" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Notisstraum for %s" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3355,7 +3393,6 @@ msgid "User is already sandboxed." msgstr "Brukar har blokkert deg." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3380,7 +3417,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "Avatar-innstillingar" @@ -3415,7 +3452,7 @@ msgstr "Paginering" msgid "Description" msgstr "Beskriving" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statistikk" @@ -3477,35 +3514,35 @@ msgstr "%s's favoritt meldingar" msgid "Could not retrieve favorite notices." msgstr "Kunne ikkje hente fram favorittane." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Straum for vener av %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Straum for vener av %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Straum for vener av %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3513,7 +3550,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3527,68 +3564,68 @@ msgstr "%s gruppe" msgid "%1$s group, page %2$d" msgstr "%s medlemmar i gruppa, side %d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Gruppe profil" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Merknad" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Gruppe handlingar" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Notisstraum for %s gruppa" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Notisstraum for %s gruppa" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "Notisstraum for %s gruppa" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "Utboks for %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Medlemmar" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Ingen)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Alle medlemmar" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 #, fuzzy msgid "Created" msgstr "Lag" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3598,7 +3635,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, fuzzy, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3609,7 +3646,7 @@ msgstr "" "**%s** er ei brukargruppe på %%%%site.name%%%%, ei [mikroblogging](http://en." "wikipedia.org/wiki/Micro-blogging)-teneste" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 #, fuzzy msgid "Admins" msgstr "Administrator" @@ -4078,22 +4115,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Brukarar sjølv-merka med %s, side %d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Notisstraum for %s" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Notisstraum for %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Notisstraum for %s" @@ -4150,7 +4187,7 @@ msgstr "" msgid "No such tag." msgstr "Dette emneord finst ikkje." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API-metoden er ikkje ferdig enno." @@ -4183,76 +4220,78 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Brukar" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 #, fuzzy msgid "New users" msgstr "Invitér nye brukarar" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "Alle tingingar" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "" "Automatisk ting notisane til dei som tingar mine (best for ikkje-menneskje)" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "Invitasjon(er) sendt" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 #, fuzzy msgid "Invitations enabled" msgstr "Invitasjon(er) sendt" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4439,7 +4478,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Personleg" @@ -4480,6 +4519,11 @@ msgstr "Kann ikkje oppdatera gruppa." msgid "Group leave failed." msgstr "Gruppe profil" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Kann ikkje oppdatera gruppa." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4498,27 +4542,27 @@ msgstr "Kunne ikkje lagre melding." msgid "Could not update message with new URI." msgstr "Kunne ikkje oppdatere melding med ny URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "databasefeil ved innsetjing av skigardmerkelapp (#merkelapp): %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "Eit problem oppstod ved lagring av notis." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Feil ved lagring av notis. Ukjend brukar." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "For mange notisar for raskt; tek ei pause, og prøv igjen om eit par minutt." -#: classes/Notice.php:237 +#: classes/Notice.php:254 #, fuzzy msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " @@ -4526,20 +4570,20 @@ msgid "" msgstr "" "For mange notisar for raskt; tek ei pause, og prøv igjen om eit par minutt." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Du kan ikkje lengre legge inn notisar på denne sida." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Eit problem oppstod ved lagring av notis." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Eit problem oppstod ved lagring av notis." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -4571,19 +4615,29 @@ msgstr "Kan ikkje sletta tinging." msgid "Couldn't delete subscription." msgstr "Kan ikkje sletta tinging." -#: classes/User.php:372 +#: classes/User.php:373 #, fuzzy, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Melding til %1$s på %2$s" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Kunne ikkje laga gruppa." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Kunne ikkje bli med i gruppa." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Kunne ikkje bli med i gruppa." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Kunne ikkje lagra abonnement." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Endra profilinnstillingane dine" @@ -4626,123 +4680,191 @@ msgstr "Ingen tittel" msgid "Primary site navigation" msgstr "Navigasjon for hovudsida" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Heim" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Personleg profil og oversyn over vener" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Personleg" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Endra e-posten, avataren, passordet eller profilen" -#: lib/action.php:444 -msgid "Connect" -msgstr "Kopla til" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Konto" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Klarte ikkje å omdirigera til tenaren: %s" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Kopla til" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 #, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Navigasjon for hovudsida" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Invitér" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Administrator" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Inviter vennar og kollega til å bli med deg på %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Logg ut" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Invitér" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Logg ut or sida" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Logg ut" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Opprett ny konto" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registrér" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Logg inn or sida" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Hjelp" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Logg inn" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Hjelp meg!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Søk" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Hjelp" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Søk etter folk eller innhald" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Søk" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Statusmelding" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Lokale syningar" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Sidenotis" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Andrenivås side navigasjon" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Hjelp" + +#: lib/action.php:765 msgid "About" msgstr "Om" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "OSS" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Personvern" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Kjeldekode" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Kontakt" -#: lib/action.php:751 +#: lib/action.php:782 #, fuzzy msgid "Badge" msgstr "Dult" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "StatusNets programvarelisens" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4751,12 +4873,12 @@ msgstr "" "**%%site.name%%** er ei mikrobloggingteneste av [%%site.broughtby%%](%%site." "broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** er ei mikrobloggingteneste. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4767,117 +4889,169 @@ msgstr "" "%s, tilgjengeleg under [GNU Affero General Public License](http://www.fsf." "org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "StatusNets programvarelisens" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Alle" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "lisens." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Paginering" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "« Etter" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Før »" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 #, fuzzy msgid "You cannot make changes to this site." msgstr "Du kan ikkje sende melding til denne brukaren." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "Registrering ikkje tillatt." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 #, fuzzy msgid "showForm() not implemented." msgstr "Kommando ikkje implementert." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 #, fuzzy msgid "saveSettings() not implemented." msgstr "Kommando ikkje implementert." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 #, fuzzy msgid "Unable to delete design setting." msgstr "Klarte ikkje å lagra Twitter-innstillingane dine!" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "Stadfesting av epostadresse" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Invitér" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "SMS bekreftelse" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Personleg" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "SMS bekreftelse" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Brukar" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "SMS bekreftelse" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Godta" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "SMS bekreftelse" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "SMS bekreftelse" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Personleg" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4973,12 +5147,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Endra passord" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Endra passord" @@ -5259,20 +5433,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "Ingen stadfestingskode." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 #, fuzzy msgid "Go to the installer." msgstr "Logg inn or sida" @@ -5465,23 +5639,23 @@ msgstr "Systemfeil ved opplasting av fil." msgid "Not an image or corrupt file." msgstr "Korrupt bilete." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Støttar ikkje bileteformatet." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Mista fila vår." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Ukjend fil type" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5791,6 +5965,12 @@ msgstr "Til" msgid "Available characters" msgstr "Tilgjenglege teikn" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Send" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Send ei melding" @@ -5850,25 +6030,25 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 #, fuzzy msgid "in context" msgstr "Ingen innhald." -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "Lag" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Svar på denne notisen" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Svar" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Melding lagra" @@ -5918,6 +6098,10 @@ msgstr "Svar" msgid "Favorites" msgstr "Favorittar" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Brukar" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Innboks" @@ -6012,7 +6196,7 @@ msgstr "Svar på denne notisen" msgid "Repeat this notice" msgstr "Svar på denne notisen" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -6035,6 +6219,10 @@ msgstr "Søk" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Søk" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -6089,6 +6277,15 @@ msgstr "Mennesker som tingar %s" msgid "Groups %s is a member of" msgstr "Grupper %s er medlem av" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Invitér" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Inviter vennar og kollega til å bli med deg på %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6163,47 +6360,47 @@ msgstr "Melding" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "eit par sekund sidan" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "omtrent eitt minutt sidan" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "~%d minutt sidan" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "omtrent ein time sidan" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "~%d timar sidan" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "omtrent ein dag sidan" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "~%d dagar sidan" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "omtrent ein månad sidan" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "~%d månadar sidan" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "omtrent eitt år sidan" diff --git a/locale/pl/LC_MESSAGES/statusnet.po b/locale/pl/LC_MESSAGES/statusnet.po index 79b37a5e4..a8cef8d36 100644 --- a/locale/pl/LC_MESSAGES/statusnet.po +++ b/locale/pl/LC_MESSAGES/statusnet.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:31+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:35+0000\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" @@ -19,69 +19,76 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pl\n" "X-Message-Group: out-statusnet\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Dostęp" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Ustawienia dostępu witryny" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Rejestracja" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Prywatna" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "Zabronić anonimowym użytkownikom (niezalogowanym) przeglądać witrynę?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Tylko zaproszeni" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Prywatna" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Rejestracja tylko za zaproszeniem." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Zamknięte" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Tylko zaproszeni" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Wyłączenie nowych rejestracji." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Zapisz" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Zamknięte" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Zapisz ustawienia dostępu" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Zapisz" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Nie ma takiej strony" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -95,45 +102,53 @@ msgstr "Nie ma takiej strony" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Brak takiego użytkownika." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s i przyjaciele, strona %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "Użytkownik %s i przyjaciele" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Kanał dla znajomych użytkownika %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Kanał dla znajomych użytkownika %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Kanał dla znajomych użytkownika %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." @@ -141,7 +156,7 @@ msgstr "" "To jest oś czasu użytkownika %s i przyjaciół, ale nikt jeszcze nic nie " "wysłał." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -150,7 +165,8 @@ msgstr "" "Spróbuj subskrybować więcej osób, [dołączyć do grupy](%%action.groups%%) lub " "wysłać coś samemu." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -160,7 +176,7 @@ msgstr "" "[wysłać coś wymagającego jego uwagi](%%%%action.newnotice%%%%?" "status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -169,7 +185,8 @@ msgstr "" "Dlaczego nie [zarejestrujesz konta](%%%%action.register%%%%) i wtedy " "szturchniesz użytkownika %s lub wyślesz wpis wymagającego jego uwagi." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Ty i przyjaciele" @@ -187,20 +204,20 @@ msgstr "Aktualizacje z %1$s i przyjaciół na %2$s." #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "Nie odnaleziono metody API." @@ -233,8 +250,9 @@ msgstr "Nie można zaktualizować użytkownika." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Użytkownik nie posiada profilu." @@ -260,7 +278,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -373,68 +391,68 @@ msgstr "Nie można określić użytkownika źródłowego." msgid "Could not find target user." msgstr "Nie można odnaleźć użytkownika docelowego." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Pseudonim może zawierać tylko małe litery i cyfry, bez spacji." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Pseudonim jest już używany. Spróbuj innego." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "To nie jest prawidłowy pseudonim." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Strona domowa nie jest prawidłowym adresem URL." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Imię i nazwisko jest za długie (maksymalnie 255 znaków)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Opis jest za długi (maksymalnie %d znaków)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Położenie jest za długie (maksymalnie 255 znaków)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Za dużo aliasów. Maksymalnie %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Nieprawidłowy alias: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Alias \"%s\" jest już używany. Spróbuj innego." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Alias nie może być taki sam jak pseudonim." @@ -445,15 +463,15 @@ msgstr "Alias nie może być taki sam jak pseudonim." msgid "Group not found!" msgstr "Nie odnaleziono grupy." -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Jesteś już członkiem tej grupy." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Zostałeś zablokowany w tej grupie przez administratora." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Nie można dołączyć użytkownika %1$s do grupy %2$s." @@ -462,7 +480,7 @@ msgstr "Nie można dołączyć użytkownika %1$s do grupy %2$s." msgid "You are not a member of this group." msgstr "Nie jesteś członkiem tej grupy." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Nie można usunąć użytkownika %1$s z grupy %2$s." @@ -493,7 +511,7 @@ msgstr "Nieprawidłowy token." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -535,7 +553,7 @@ msgstr "Token żądania %s został odrzucony lub unieważniony." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -561,13 +579,13 @@ msgstr "" "uzyskać możliwość %3$s danych konta %4$s. Dostęp do konta %4" "$s powinien być udostępniany tylko zaufanym osobom trzecim." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Konto" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -649,12 +667,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "Użytkownik %1$s aktualizuje ulubione według %2$s/%2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Oś czasu użytkownika %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -690,7 +708,7 @@ msgstr "Powtórzone dla %s" msgid "Repeats of %s" msgstr "Powtórzenia %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Wpisy ze znacznikiem %s" @@ -711,8 +729,7 @@ msgstr "Nie ma takiego załącznika." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Brak pseudonimu." @@ -724,7 +741,7 @@ msgstr "Brak rozmiaru." msgid "Invalid size." msgstr "Nieprawidłowy rozmiar." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Awatar" @@ -741,30 +758,30 @@ msgid "User without matching profile" msgstr "Użytkownik bez odpowiadającego profilu" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Ustawienia awatara" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Oryginał" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Podgląd" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Usuń" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Wyślij" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Przytnij" @@ -772,7 +789,7 @@ msgstr "Przytnij" msgid "Pick a square area of the image to be your avatar" msgstr "Wybierz kwadratowy obszar obrazu do awatara" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Utracono dane pliku." @@ -807,22 +824,22 @@ msgstr "" "i nie będziesz powiadamiany o żadnych odpowiedziach @ od niego." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Nie" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Nie blokuj tego użytkownika" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Tak" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Zablokuj tego użytkownika" @@ -830,39 +847,43 @@ msgstr "Zablokuj tego użytkownika" msgid "Failed to save block information." msgstr "Zapisanie informacji o blokadzie nie powiodło się." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Nie ma takiej grupy." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s zablokowane profile" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s zablokowane profile, strona %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Lista użytkowników zablokowanych w tej grupie." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Odblokuj użytkownika w tej grupie" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Odblokuj" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Odblokuj tego użytkownika" @@ -937,7 +958,7 @@ msgstr "Nie jesteś właścicielem tej aplikacji." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Wystąpił problem z tokenem sesji." @@ -962,12 +983,13 @@ msgstr "Nie usuwaj tej aplikacji" msgid "Delete this application" msgstr "Usuń tę aplikację" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Niezalogowany." @@ -996,7 +1018,7 @@ msgstr "Jesteś pewien, że chcesz usunąć ten wpis?" msgid "Do not delete this notice" msgstr "Nie usuwaj tego wpisu" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Usuń ten wpis" @@ -1012,7 +1034,7 @@ msgstr "Nie można usuwać lokalnych użytkowników." msgid "Delete user" msgstr "Usuń użytkownika" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1020,12 +1042,12 @@ msgstr "" "Na pewno usunąć tego użytkownika? Wyczyści to wszystkie dane o użytkowniku z " "bazy danych, bez utworzenia kopii zapasowej." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Usuń tego użytkownika" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Wygląd" @@ -1100,7 +1122,7 @@ msgstr "Zmień kolory" #: actions/designadminpanel.php:510 lib/designsettings.php:191 msgid "Content" -msgstr "Zawartość" +msgstr "Treść" #: actions/designadminpanel.php:523 lib/designsettings.php:204 msgid "Sidebar" @@ -1126,6 +1148,17 @@ msgstr "Przywróć domyślny wygląd" msgid "Reset back to default" msgstr "Przywróć domyślne ustawienia" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Zapisz" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Zapisz wygląd" @@ -1217,29 +1250,29 @@ msgstr "Zmodyfikuj grupę %s" msgid "You must be logged in to create a group." msgstr "Musisz być zalogowany, aby utworzyć grupę." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Musisz być administratorem, aby zmodyfikować grupę." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Użyj tego formularza, aby zmodyfikować grupę." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "opis jest za długi (maksymalnie %d znaków)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Nie można zaktualizować grupy." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Nie można utworzyć aliasów." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Zapisano opcje." @@ -1580,7 +1613,7 @@ msgstr "Użytkownik został już zablokował w grupie." msgid "User is not a member of group." msgstr "Użytkownik nie jest członkiem grupy." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Zablokuj użytkownika w grupie" @@ -1615,86 +1648,86 @@ msgstr "Brak identyfikatora." msgid "You must be logged in to edit a group." msgstr "Musisz być zalogowany, aby zmodyfikować grupę." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Wygląd grupy" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "Dostosuj wygląd grupy za pomocą wybranego obrazu tła i palety kolorów." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Nie można zaktualizować wyglądu." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Zapisano preferencje wyglądu." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Logo grupy" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "Można wysłać obraz logo grupy. Maksymalny rozmiar pliku to %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Użytkownik bez odpowiadającego profilu." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Wybierz kwadratowy obszar obrazu, który będzie logo." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Zaktualizowano logo." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Zaktualizowanie logo nie powiodło się." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Członkowie grupy %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "Członkowie grupy %1$s, strona %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Lista użytkowników znajdujących się w tej grupie." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Administrator" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Zablokuj" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Uczyń użytkownika administratorem grupy" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Uczyń administratorem" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Uczyń tego użytkownika administratorem" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Aktualizacje od członków %1$s na %2$s." @@ -1958,16 +1991,19 @@ msgstr "Osobista wiadomość" msgid "Optionally add a personal message to the invitation." msgstr "Opcjonalnie dodaj osobistą wiadomość do zaproszenia." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Wyślij" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s zapraszają cię, abyś dołączył do nich w %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2028,7 +2064,11 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Musisz być zalogowany, aby dołączyć do grupy." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "Brak pseudonimu lub identyfikatora." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "Użytkownik %1$s dołączył do grupy %2$s" @@ -2037,11 +2077,11 @@ msgstr "Użytkownik %1$s dołączył do grupy %2$s" msgid "You must be logged in to leave a group." msgstr "Musisz być zalogowany, aby opuścić grupę." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Nie jesteś członkiem tej grupy." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "Użytkownik %1$s opuścił grupę %2$s" @@ -2058,8 +2098,7 @@ msgstr "Niepoprawna nazwa użytkownika lub hasło." msgid "Error setting user. You are probably not authorized." msgstr "Błąd podczas ustawiania użytkownika. Prawdopodobnie brak upoważnienia." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Zaloguj się" @@ -2160,7 +2199,7 @@ msgstr "Nie można wysłać wiadomości do tego użytkownika." #: actions/newmessage.php:144 actions/newnotice.php:136 lib/command.php:342 #: lib/command.php:475 msgid "No content!" -msgstr "Brak zawartości." +msgstr "Brak treści." #: actions/newmessage.php:158 msgid "No recipient specified." @@ -2198,7 +2237,7 @@ msgid "" "Search for notices on %%site.name%% by their contents. Separate search terms " "by spaces; they must be 3 characters or more." msgstr "" -"Wyszukaj wpisy na %%site.name%% według ich zawartości. Oddziel wyszukiwane " +"Wyszukaj wpisy na %%site.name%% według ich treści. Oddziel wyszukiwane " "terminy spacjami. Terminy muszą mieć trzy znaki lub więcej." #: actions/noticesearch.php:78 @@ -2313,8 +2352,8 @@ msgstr "typ zawartości " msgid "Only " msgstr "Tylko " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "To nie jest obsługiwany format danych." @@ -2453,7 +2492,7 @@ msgstr "Nie można zapisać nowego hasła." msgid "Password saved." msgstr "Zapisano hasło." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Ścieżki" @@ -2486,7 +2525,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Nieprawidłowy serwer SSL. Maksymalna długość to 255 znaków." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Witryny" @@ -2661,7 +2699,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 małe litery lub liczby, bez spacji i znaków przestankowych" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Imię i nazwisko" @@ -2689,7 +2727,7 @@ msgid "Bio" msgstr "O mnie" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2772,7 +2810,8 @@ msgstr "Nie można zapisać profilu." msgid "Couldn't save tags." msgstr "Nie można zapisać znaczników." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Zapisano ustawienia." @@ -2785,28 +2824,28 @@ msgstr "Poza ograniczeniem strony (%s)" msgid "Could not retrieve public stream." msgstr "Nie można pobrać publicznego strumienia." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Publiczna oś czasu, strona %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Publiczna oś czasu" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Kanał publicznego strumienia (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Kanał publicznego strumienia (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Kanał publicznego strumienia (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2815,11 +2854,11 @@ msgstr "" "To jest publiczna oś czasu dla %%site.name%%, ale nikt jeszcze nic nie " "wysłał." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Zostań pierwszym, który coś wyśle." -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2827,7 +2866,7 @@ msgstr "" "Dlaczego nie [zarejestrujesz konta](%%action.register%%) i zostaniesz " "pierwszym, który coś wyśle." -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2840,7 +2879,7 @@ msgstr "" "[Dołącz teraz](%%action.register%%), aby dzielić się wpisami o sobie z " "przyjaciółmi, rodziną i kolegami. ([Przeczytaj więcej](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3018,8 +3057,7 @@ msgstr "Nieprawidłowy kod zaproszenia." msgid "Registration successful" msgstr "Rejestracja powiodła się" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Zarejestruj się" @@ -3206,7 +3244,7 @@ msgstr "Nie można powtórzyć własnego wpisu." msgid "You already repeated that notice." msgstr "Już powtórzono ten wpis." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Powtórzono" @@ -3214,33 +3252,33 @@ msgstr "Powtórzono" msgid "Repeated!" msgstr "Powtórzono." -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Odpowiedzi na %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "odpowiedzi dla użytkownika %1$s, strona %2$s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Kanał odpowiedzi dla użytkownika %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Kanał odpowiedzi dla użytkownika %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Kanał odpowiedzi dla użytkownika %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3249,7 +3287,7 @@ msgstr "" "To jest oś czasu wyświetlająca odpowiedzi na wpisy użytkownika %1$s, ale %2" "$s nie otrzymał jeszcze wpisów wymagających jego uwagi." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3258,7 +3296,7 @@ msgstr "" "Można nawiązać rozmowę z innymi użytkownikami, subskrybować więcej osób lub " "[dołączyć do grup](%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3285,7 +3323,6 @@ msgid "User is already sandboxed." msgstr "Użytkownik jest już ograniczony." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Sesje" @@ -3310,7 +3347,7 @@ msgid "Turn on debugging output for sessions." msgstr "Włącza wyjście debugowania dla sesji." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Zapisz ustawienia witryny" @@ -3340,7 +3377,7 @@ msgstr "Organizacja" msgid "Description" msgstr "Opis" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statystyki" @@ -3403,22 +3440,22 @@ msgstr "Ulubione wpisy użytkownika %1$s, strona %2$d" msgid "Could not retrieve favorite notices." msgstr "Nie można odebrać ulubionych wpisów." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Kanał dla ulubionych wpisów użytkownika %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Kanał dla ulubionych wpisów użytkownika %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Kanał dla ulubionych wpisów użytkownika %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3427,7 +3464,7 @@ msgstr "" "na wpisach, które chciałbyś dodać do zakładek na później lub rzucić na nie " "trochę światła." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3436,7 +3473,7 @@ msgstr "" "Użytkownik %s nie dodał jeszcze żadnych wpisów do ulubionych. Wyślij coś " "interesującego, aby chcieli dodać to do swoich ulubionych. :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3447,7 +3484,7 @@ msgstr "" "[zarejestrujesz konta](%%%%action.register%%%%) i wyślesz coś " "interesującego, aby chcieli dodać to do swoich ulubionych. :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "To jest sposób na współdzielenie tego, co chcesz." @@ -3461,67 +3498,67 @@ msgstr "Grupa %s" msgid "%1$s group, page %2$d" msgstr "Grupa %1$s, strona %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Profil grupy" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "Adres URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Wpis" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Aliasy" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Działania grupy" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Kanał wpisów dla grupy %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Kanał wpisów dla grupy %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Kanał wpisów dla grupy %s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "FOAF dla grupy %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Członkowie" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Brak)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Wszyscy członkowie" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Utworzono" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3537,7 +3574,7 @@ msgstr "" "action.register%%%%), aby stać się częścią tej grupy i wiele więcej. " "([Przeczytaj więcej](%%%%doc.help%%%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3550,7 +3587,7 @@ msgstr "" "narzędziu [StatusNet](http://status.net/). Jej członkowie dzielą się " "krótkimi wiadomościami o swoim życiu i zainteresowaniach. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Administratorzy" @@ -3925,17 +3962,17 @@ msgstr "Nie można zapisać subskrypcji." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." -msgstr "" +msgstr "Ta czynność przyjmuje tylko żądania POST." #: actions/subscribe.php:107 -#, fuzzy msgid "No such profile." -msgstr "Nie ma takiego pliku." +msgstr "Nie ma takiego profilu." #: 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." +msgstr "" +"Nie można subskrybować zdalnego profilu profilu OMB 0.1 za pomocą tej " +"czynności." #: actions/subscribe.php:145 msgid "Subscribed" @@ -4030,22 +4067,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Wpisy ze znacznikiem %1$s, strona %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Kanał wpisów dla znacznika %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Kanał wpisów dla znacznika %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Kanał wpisów dla znacznika %s (Atom)" @@ -4100,7 +4137,7 @@ msgstr "" msgid "No such tag." msgstr "Nie ma takiego znacznika." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Metoda API jest w trakcie tworzenia." @@ -4132,70 +4169,72 @@ msgstr "" "Licencja nasłuchiwanego strumienia \"%1$s\" nie jest zgodna z licencją " "witryny \"%2$s\"." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Użytkownik" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Ustawienia użytkownika dla tej witryny StatusNet." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Nieprawidłowe ograniczenie informacji o sobie. Musi być liczbowa." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "Nieprawidłowy tekst powitania. Maksymalna długość to 255 znaków." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Nieprawidłowa domyślna subskrypcja: \"%1$s\" nie jest użytkownikiem." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Ograniczenie informacji o sobie" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Maksymalna długość informacji o sobie jako liczba znaków." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Nowi użytkownicy" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Powitanie nowego użytkownika" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Tekst powitania nowych użytkowników (maksymalnie 255 znaków)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Domyślna subskrypcja" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Automatyczne subskrybowanie nowych użytkowników do tego użytkownika." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Zaproszenia" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Zaproszenia są włączone" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "Czy zezwolić użytkownikom zapraszanie nowych użytkowników." @@ -4390,7 +4429,7 @@ msgstr "" msgid "Plugins" msgstr "Wtyczki" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Wersja" @@ -4432,6 +4471,10 @@ msgstr "Nie jest częścią grupy." msgid "Group leave failed." msgstr "Opuszczenie grupy nie powiodło się." +#: classes/Local_group.php:41 +msgid "Could not update local group." +msgstr "Nie można zaktualizować lokalnej grupy." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4449,27 +4492,27 @@ msgstr "Nie można wprowadzić wiadomości." msgid "Could not update message with new URI." msgstr "Nie można zaktualizować wiadomości za pomocą nowego adresu URL." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Błąd bazy danych podczas wprowadzania znacznika mieszania: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Problem podczas zapisywania wpisu. Za długi." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Problem podczas zapisywania wpisu. Nieznany użytkownik." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Za dużo wpisów w za krótkim czasie, weź głęboki oddech i wyślij ponownie za " "kilka minut." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4477,19 +4520,19 @@ msgstr "" "Za dużo takich samych wiadomości w za krótkim czasie, weź głęboki oddech i " "wyślij ponownie za kilka minut." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Zabroniono ci wysyłania wpisów na tej witrynie." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problem podczas zapisywania wpisu." -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "Problem podczas zapisywania skrzynki odbiorczej grupy." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4518,19 +4561,27 @@ msgstr "Nie można usunąć autosubskrypcji." msgid "Couldn't delete subscription." msgstr "Nie można usunąć subskrypcji." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Witaj w %1$s, @%2$s." -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Nie można utworzyć grupy." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +msgid "Could not set group URI." +msgstr "Nie można ustawić adresu URI grupy." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Nie można ustawić członkostwa w grupie." +#: classes/User_group.php:506 +msgid "Could not save local group info." +msgstr "Nie można zapisać informacji o lokalnej grupie." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Zmień ustawienia profilu" @@ -4572,120 +4623,190 @@ msgstr "Strona bez nazwy" msgid "Primary site navigation" msgstr "Główna nawigacja witryny" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Strona domowa" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Profil osobisty i oś czasu przyjaciół" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Osobiste" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Zmień adres e-mail, awatar, hasło, profil" -#: lib/action.php:444 -msgid "Connect" -msgstr "Połącz" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Konto" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Połącz z serwisami" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Połącz" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Zmień konfigurację witryny" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Zaproś" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Administrator" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Zaproś przyjaciół i kolegów do dołączenia do ciebie na %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Wyloguj się" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Zaproś" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Wyloguj się z witryny" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Wyloguj się" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Utwórz konto" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Zarejestruj się" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Zaloguj się na witrynie" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Pomoc" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Zaloguj się" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Pomóż mi." -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Wyszukaj" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Pomoc" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Wyszukaj osoby lub tekst" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Wyszukaj" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Wpis witryny" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Lokalne widoki" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Wpis strony" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Druga nawigacja witryny" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Pomoc" + +#: lib/action.php:765 msgid "About" msgstr "O usłudze" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "TOS" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Prywatność" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Kod źródłowy" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Kontakt" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Odznaka" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Licencja oprogramowania StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4694,12 +4815,12 @@ msgstr "" "**%%site.name%%** jest usługą mikroblogowania prowadzoną przez [%%site." "broughtby%%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** jest usługą mikroblogowania. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4710,111 +4831,164 @@ msgstr "" "status.net/) w wersji %s, dostępnego na [Powszechnej Licencji Publicznej GNU " "Affero](http://www.fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Licencja zawartości witryny" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "Treść i dane %1$s są prywatne i poufne." -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" "Prawa autorskie do treści i danych są własnością %1$s. Wszystkie prawa " "zastrzeżone." -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "Prawa autorskie do treści i danych są własnością współtwórców. Wszystkie " "prawa zastrzeżone." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Wszystko " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "licencja." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Paginacja" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Później" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Wcześniej" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." -msgstr "" +msgstr "Nie można jeszcze obsługiwać zdalnej treści." -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." -msgstr "" +msgstr "Nie można jeszcze obsługiwać zagnieżdżonej treści XML." -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." -msgstr "" +msgstr "Nie można jeszcze obsługiwać zagnieżdżonej treści Base64." -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Nie można wprowadzić zmian witryny." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Zmiany w tym panelu nie są dozwolone." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() nie jest zaimplementowane." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() nie jest zaimplementowane." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Nie można usunąć ustawienia wyglądu." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Podstawowa konfiguracja witryny" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Witryny" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Konfiguracja wyglądu" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Wygląd" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Konfiguracja użytkownika" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Użytkownik" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Konfiguracja dostępu" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Dostęp" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Konfiguracja ścieżek" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Ścieżki" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Konfiguracja sesji" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Sesje" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "Zasób API wymaga dostępu do zapisu i do odczytu, ale powiadasz dostęp tylko " "do odczytu." -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4907,11 +5081,11 @@ msgstr "Powiadamia, kiedy pojawia się ten załącznik" msgid "Tags for this attachment" msgstr "Znaczniki dla tego załącznika" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Zmiana hasła nie powiodła się" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "Zmiana hasła nie jest dozwolona" @@ -5112,7 +5286,7 @@ msgstr "" "minuty: %s." #: lib/command.php:692 -#, fuzzy, php-format +#, php-format msgid "Unsubscribed %s" msgstr "Usunięto subskrypcję użytkownika %s" @@ -5150,7 +5324,6 @@ msgstr[1] "Jesteś członkiem tych grup:" msgstr[2] "Jesteś członkiem tych grup:" #: lib/command.php:769 -#, fuzzy msgid "" "Commands:\n" "on - turn on notifications\n" @@ -5195,14 +5368,15 @@ msgstr "" "on - włącza powiadomienia\n" "off - wyłącza powiadomienia\n" "help - wyświetla tę pomoc\n" -"follow - włącza obserwowanie użytkownika\n" +"follow - subskrybuje użytkownika\n" "groups - wyświetla listę grup, do których dołączyłeś\n" "subscriptions - wyświetla listę obserwowanych osób\n" "subscribers - wyświetla listę osób, które cię obserwują\n" -"leave - rezygnuje z obserwowania użytkownika\n" +"leave - usuwa subskrypcję użytkownika\n" "d - bezpośrednia wiadomość do użytkownika\n" "get - zwraca ostatni wpis użytkownika\n" "whois - zwraca informacje o profilu użytkownika\n" +"lose - wymusza użytkownika do zatrzymania obserwowania cię\n" "fav - dodaje ostatni wpis użytkownika jako \"ulubiony\"\n" "fav # - dodaje wpis z podanym identyfikatorem jako " "\"ulubiony\"\n" @@ -5231,19 +5405,19 @@ msgstr "" "tracks - jeszcze nie zaimplementowano\n" "tracking - jeszcze nie zaimplementowano\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Nie odnaleziono pliku konfiguracji." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "Szukano plików konfiguracji w następujących miejscach: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "Należy uruchomić instalator, aby to naprawić." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Przejdź do instalatora." @@ -5433,23 +5607,23 @@ msgstr "Błąd systemu podczas wysyłania pliku." msgid "Not an image or corrupt file." msgstr "To nie jest obraz lub lub plik jest uszkodzony." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Nieobsługiwany format pliku obrazu." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Utracono plik." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Nieznany typ pliku" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "KB" @@ -5830,6 +6004,11 @@ msgstr "Do" msgid "Available characters" msgstr "Dostępne znaki" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Wyślij" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Wyślij wpis" @@ -5888,23 +6067,23 @@ msgstr "Zachód" msgid "at" msgstr "w" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "w rozmowie" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Powtórzone przez" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Odpowiedz na ten wpis" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Odpowiedz" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Powtórzono wpis" @@ -5952,6 +6131,10 @@ msgstr "Odpowiedzi" msgid "Favorites" msgstr "Ulubione" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Użytkownik" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Odebrane" @@ -6041,7 +6224,7 @@ msgstr "Powtórzyć ten wpis?" msgid "Repeat this notice" msgstr "Powtórz ten wpis" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" "Nie określono pojedynczego użytkownika dla trybu pojedynczego użytkownika." @@ -6062,6 +6245,10 @@ msgstr "Przeszukaj witrynę" msgid "Keyword(s)" msgstr "Słowa kluczowe" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Wyszukaj" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Przeszukaj pomoc" @@ -6113,6 +6300,15 @@ msgstr "Osoby subskrybowane do %s" msgid "Groups %s is a member of" msgstr "Grupy %s są członkiem" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Zaproś" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Zaproś przyjaciół i kolegów do dołączenia do ciebie na %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6183,47 +6379,47 @@ msgstr "Wiadomość" msgid "Moderate" msgstr "Moderuj" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "kilka sekund temu" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "około minutę temu" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "około %d minut temu" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "około godzinę temu" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "około %d godzin temu" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "blisko dzień temu" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "około %d dni temu" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "około miesiąc temu" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "około %d miesięcy temu" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "około rok temu" diff --git a/locale/pt/LC_MESSAGES/statusnet.po b/locale/pt/LC_MESSAGES/statusnet.po index e742dda19..2598008d9 100644 --- a/locale/pt/LC_MESSAGES/statusnet.po +++ b/locale/pt/LC_MESSAGES/statusnet.po @@ -9,78 +9,85 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:34+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:38+0000\n" "Language-Team: Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Acesso" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Gravar configurações do site" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Registar" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Privado" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "Proibir utilizadores anónimos (sem sessão iniciada) de ver o site?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Só por convite" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Privado" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Permitir o registo só a convidados." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Fechado" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Só por convite" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Impossibilitar registos novos." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Gravar" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Fechado" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Gravar configurações do site" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Gravar" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Página não encontrada." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -94,52 +101,60 @@ msgstr "Página não encontrada." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Utilizador não encontrado." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "Perfis bloqueados de %1$s, página %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s e amigos" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Fonte para os amigos de %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Fonte para os amigos de %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Fonte para os amigos de %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" "Estas são as notas de %s e dos amigos, mas ainda não publicaram nenhuma." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -148,7 +163,8 @@ msgstr "" "Tente subscrever mais pessoas, [juntar-se a um grupo] (%%action.groups%%) ou " "publicar qualquer coisa." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -157,7 +173,7 @@ msgstr "" "Pode tentar [dar um toque em %1$s](../%2$s) a partir do perfil ou [publicar " "qualquer coisa à sua atenção](%%%%action.newnotice%%%%?status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -166,7 +182,8 @@ msgstr "" "Podia [registar uma conta](%%action.register%%) e depois tocar %s ou " "publicar uma nota à sua atenção." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Você e seus amigos" @@ -184,20 +201,20 @@ msgstr "Actualizações de %1$s e amigos no %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "Método da API não encontrado." @@ -230,8 +247,9 @@ msgstr "Não foi possível actualizar o utilizador." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Utilizador não tem perfil." @@ -257,7 +275,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -369,68 +387,68 @@ msgstr "Não foi possível determinar o utilizador de origem." msgid "Could not find target user." msgstr "Não foi possível encontrar o utilizador de destino." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Utilizador só deve conter letras minúsculas e números. Sem espaços." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Utilizador já é usado. Tente outro." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Utilizador não é válido." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Página de ínicio não é uma URL válida." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Nome completo demasiado longo (máx. 255 caracteres)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Descrição demasiado longa (máx. 140 caracteres)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Localidade demasiado longa (máx. 255 caracteres)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Demasiados sinónimos (máx. %d)." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Sinónimo inválido: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Sinónimo \"%s\" já em uso. Tente outro." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Os sinónimos não podem ser iguais ao nome do utilizador." @@ -441,15 +459,15 @@ msgstr "Os sinónimos não podem ser iguais ao nome do utilizador." msgid "Group not found!" msgstr "Grupo não foi encontrado!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Já é membro desse grupo." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Foi bloqueado desse grupo pelo gestor." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Não foi possível adicionar %1$s ao grupo %2$s." @@ -458,7 +476,7 @@ msgstr "Não foi possível adicionar %1$s ao grupo %2$s." msgid "You are not a member of this group." msgstr "Não é membro deste grupo." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Não foi possível remover %1$s do grupo %2$s." @@ -490,7 +508,7 @@ msgstr "Tamanho inválido." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -534,7 +552,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -557,13 +575,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Conta" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -647,12 +665,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s actualizações preferidas por %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Notas de %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -688,7 +706,7 @@ msgstr "Repetida para %s" msgid "Repeats of %s" msgstr "Repetências de %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Notas categorizadas com %s" @@ -709,8 +727,7 @@ msgstr "Anexo não encontrado." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Nenhuma utilizador." @@ -722,7 +739,7 @@ msgstr "Tamanho não definido." msgid "Invalid size." msgstr "Tamanho inválido." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -739,30 +756,30 @@ msgid "User without matching profile" msgstr "Utilizador sem perfil correspondente" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Configurações do avatar" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Original" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Antevisão" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Apagar" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Carregar" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Cortar" @@ -770,7 +787,7 @@ msgstr "Cortar" msgid "Pick a square area of the image to be your avatar" msgstr "Escolha uma área quadrada da imagem para ser o seu avatar" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Perdi os dados do nosso ficheiro." @@ -805,22 +822,22 @@ msgstr "" "de futuro e você não receberá notificações das @-respostas dele." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Não" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Não bloquear este utilizador" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Sim" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Bloquear este utilizador" @@ -828,39 +845,43 @@ msgstr "Bloquear este utilizador" msgid "Failed to save block information." msgstr "Não foi possível gravar informação do bloqueio." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Grupo não foi encontrado." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s perfis bloqueados" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "Perfis bloqueados de %1$s, página %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Uma lista dos utilizadores com entrada bloqueada neste grupo." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Desbloquear utilizador do grupo" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Desbloquear" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Desbloquear este utilizador" @@ -939,7 +960,7 @@ msgstr "Não é membro deste grupo." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Ocorreu um problema com a sua sessão." @@ -968,12 +989,13 @@ msgstr "Não apagar esta nota" msgid "Delete this application" msgstr "Apagar esta nota" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Não iniciou sessão." @@ -1002,7 +1024,7 @@ msgstr "Tem a certeza de que quer apagar esta nota?" msgid "Do not delete this notice" msgstr "Não apagar esta nota" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Apagar esta nota" @@ -1018,7 +1040,7 @@ msgstr "Só pode apagar utilizadores locais." msgid "Delete user" msgstr "Apagar utilizador" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1026,12 +1048,12 @@ msgstr "" "Tem a certeza de que quer apagar este utilizador? Todos os dados do " "utilizador serão eliminados da base de dados, sem haver cópias." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Apagar este utilizador" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Estilo" @@ -1134,6 +1156,17 @@ msgstr "Repor estilos predefinidos" msgid "Reset back to default" msgstr "Repor predefinição" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Gravar" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Gravar o estilo" @@ -1237,29 +1270,29 @@ msgstr "Editar grupo %s" msgid "You must be logged in to create a group." msgstr "Tem de iniciar uma sessão para criar o grupo." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Tem de ser administrador para editar o grupo." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Use este formulário para editar o grupo." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "descrição é demasiada extensa (máx. %d caracteres)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Não foi possível actualizar o grupo." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Não foi possível criar sinónimos." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Opções gravadas." @@ -1603,7 +1636,7 @@ msgstr "Acesso do utilizador ao grupo já foi bloqueado." msgid "User is not a member of group." msgstr "Utilizador não é membro do grupo." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Bloquear acesso do utilizador ao grupo" @@ -1638,11 +1671,11 @@ msgstr "Sem ID." msgid "You must be logged in to edit a group." msgstr "Precisa de iniciar sessão para editar um grupo." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Estilo do grupo" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1650,20 +1683,20 @@ msgstr "" "Personalize o aspecto do seu grupo com uma imagem de fundo e uma paleta de " "cores à sua escolha." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Não foi possível actualizar o estilo." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Preferências de estilo foram gravadas." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Logotipo do grupo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1671,57 +1704,57 @@ msgstr "" "Pode carregar uma imagem para logotipo do seu grupo. O tamanho máximo do " "ficheiro é %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Utilizador sem perfil correspondente." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Escolha uma área quadrada da imagem para ser o logotipo." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logotipo actualizado." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Não foi possível actualizar o logotipo." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Membros do grupo %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "Membros do grupo %1$s, página %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Uma lista dos utilizadores neste grupo." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Gestor" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Bloquear" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Tornar utilizador o gestor do grupo" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Tornar Gestor" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Tornar este utilizador um gestor" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Actualizações dos membros de %1$s em %2$s!" @@ -1986,16 +2019,19 @@ msgstr "Mensagem pessoal" msgid "Optionally add a personal message to the invitation." msgstr "Pode optar por acrescentar uma mensagem pessoal ao convite" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Enviar" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s convidou-o a juntar-se a ele no %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2055,7 +2091,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Precisa de iniciar uma sessão para se juntar a um grupo." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Nenhuma utilizador." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s juntou-se ao grupo %2$s" @@ -2064,11 +2105,11 @@ msgstr "%1$s juntou-se ao grupo %2$s" msgid "You must be logged in to leave a group." msgstr "Precisa de iniciar uma sessão para deixar um grupo." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Não é um membro desse grupo." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s deixou o grupo %2$s" @@ -2085,8 +2126,7 @@ msgstr "Nome de utilizador ou senha incorrectos." msgid "Error setting user. You are probably not authorized." msgstr "Erro ao preparar o utilizador. Provavelmente não está autorizado." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Entrar" @@ -2346,8 +2386,8 @@ msgstr "tipo de conteúdo " msgid "Only " msgstr "Apenas " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Formato de dados não suportado." @@ -2493,7 +2533,7 @@ msgstr "Não é possível guardar a nova senha." msgid "Password saved." msgstr "Senha gravada." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Localizações" @@ -2526,7 +2566,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Servidor SSL inválido. O tamanho máximo é 255 caracteres." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Site" @@ -2700,7 +2739,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 letras minúsculas ou números, sem pontuação ou espaços" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Nome completo" @@ -2728,7 +2767,7 @@ msgid "Bio" msgstr "Biografia" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2810,7 +2849,8 @@ msgstr "Não foi possível gravar o perfil." msgid "Couldn't save tags." msgstr "Não foi possível gravar as categorias." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Configurações gravadas." @@ -2823,28 +2863,28 @@ msgstr "Além do limite de página (%s)" msgid "Could not retrieve public stream." msgstr "Não foi possível importar as notas públicas." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Notas públicas, página %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Notas públicas" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Fonte de Notas Públicas (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Fonte de Notas Públicas (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Fonte de Notas Públicas (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2853,11 +2893,11 @@ msgstr "" "Estas são as notas públicas do site %%site.name%% mas ninguém publicou nada " "ainda." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Seja a primeira pessoa a publicar!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2865,7 +2905,7 @@ msgstr "" "Podia [registar uma conta](%%action.register%%) e ser a primeira pessoa a " "publicar!" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2878,7 +2918,7 @@ msgstr "" "[StatusNet](http://status.net/). [Registe-se agora](%%action.register%%) " "para partilhar notas sobre si, família e amigos! ([Saber mais](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3060,8 +3100,7 @@ msgstr "Desculpe, código de convite inválido." msgid "Registration successful" msgstr "Registo efectuado" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Registar" @@ -3247,7 +3286,7 @@ msgstr "Não pode repetir a sua própria nota." msgid "You already repeated that notice." msgstr "Já repetiu essa nota." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Repetida" @@ -3255,33 +3294,33 @@ msgstr "Repetida" msgid "Repeated!" msgstr "Repetida!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Respostas a %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "Respostas a %1$s em %2$s!" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Fonte de respostas a %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Fonte de respostas a %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Fonte de respostas a %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3290,7 +3329,7 @@ msgstr "" "Estas são as notas de resposta a %1$s, mas %2$s ainda não recebeu nenhuma " "resposta." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3299,7 +3338,7 @@ msgstr "" "Pode meter conversa com outros utilizadores, subscrever mais pessoas ou " "[juntar-se a grupos](%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3326,7 +3365,6 @@ msgid "User is already sandboxed." msgstr "Utilizador já está impedido de criar notas públicas." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Sessões" @@ -3352,7 +3390,7 @@ msgid "Turn on debugging output for sessions." msgstr "Ligar a impressão de dados de depuração, para sessões." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Gravar configurações do site" @@ -3385,7 +3423,7 @@ msgstr "Paginação" msgid "Description" msgstr "Descrição" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Estatísticas" @@ -3448,22 +3486,22 @@ msgstr "Notas favoritas de %s" msgid "Could not retrieve favorite notices." msgstr "Não foi possível importar notas favoritas." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Fonte dos favoritos de %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Fonte dos favoritos de %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Fonte dos favoritos de %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3472,7 +3510,7 @@ msgstr "" "notas de que goste, para marcá-las para mais tarde ou para lhes dar " "relevância." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3481,7 +3519,7 @@ msgstr "" "%s ainda não adicionou nenhuma nota às favoritas. Publique algo interessante " "que mude este estado de coisas :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3492,7 +3530,7 @@ msgstr "" "conta](%%action.register%%) e publicar algo interessante que mude este " "estado de coisas :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Esta é uma forma de partilhar aquilo de que gosta." @@ -3506,67 +3544,67 @@ msgstr "Grupo %s" msgid "%1$s group, page %2$d" msgstr "Membros do grupo %1$s, página %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Perfil do grupo" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Anotação" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Sinónimos" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Acções do grupo" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Fonte de notas do grupo %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Fonte de notas do grupo %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Fonte de notas do grupo %s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "FOAF do grupo %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Membros" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Nenhum)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Todos os membros" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Criado" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3582,7 +3620,7 @@ msgstr "" "[Registe-se agora](%%action.register%%) para se juntar a este grupo e a " "muitos mais! ([Saber mais](%%doc.help%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3595,7 +3633,7 @@ msgstr "" "programa de Software Livre [StatusNet](http://status.net/). Os membros deste " "grupo partilham mensagens curtas acerca das suas vidas e interesses. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Gestores" @@ -4075,22 +4113,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Utilizadores auto-categorizados com %1$s - página %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Fonte de notas para a categoria %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Fonte de notas para a categoria %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Fonte de notas para a categoria %s (Atom)" @@ -4144,7 +4182,7 @@ msgstr "" msgid "No such tag." msgstr "Categoria não existe." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Método da API em desenvolvimento." @@ -4176,70 +4214,72 @@ msgstr "" "Licença ‘%1$s’ da listenee stream não é compatível com a licença ‘%2$s’ do " "site." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Utilizador" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Configurações do utilizador para este site StatusNet." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Limite da biografia inválido. Tem de ser numérico." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "Texto de boas-vindas inválido. Tamanho máx. é 255 caracteres." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Subscrição predefinida é inválida: '%1$s' não é utilizador." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Perfil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Limite da Biografia" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Tamanho máximo de uma biografia em caracteres." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Utilizadores novos" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Boas-vindas a utilizadores novos" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Texto de boas-vindas a utilizadores novos (máx. 255 caracteres)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Subscrição predefinida" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Novos utilizadores subscrevem automaticamente este utilizador." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Convites" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Convites habilitados" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "Permitir, ou não, que utilizadores convidem utilizadores novos." @@ -4434,7 +4474,7 @@ msgstr "" msgid "Plugins" msgstr "Plugins" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Versão" @@ -4477,6 +4517,11 @@ msgstr "Não foi possível actualizar o grupo." msgid "Group leave failed." msgstr "Perfil do grupo" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Não foi possível actualizar o grupo." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4494,27 +4539,27 @@ msgstr "Não foi possível inserir a mensagem." msgid "Could not update message with new URI." msgstr "Não foi possível actualizar a mensagem com a nova URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Erro na base de dados ao inserir a marca: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Problema na gravação da nota. Demasiado longa." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Problema na gravação da nota. Utilizador desconhecido." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Demasiadas notas, demasiado rápido; descanse e volte a publicar daqui a " "alguns minutos." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4522,20 +4567,20 @@ msgstr "" "Demasiadas mensagens duplicadas, demasiado rápido; descanse e volte a " "publicar daqui a alguns minutos." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Está proibido de publicar notas neste site." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problema na gravação da nota." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Problema na gravação da nota." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4564,19 +4609,29 @@ msgstr "Não foi possível apagar a auto-subscrição." msgid "Couldn't delete subscription." msgstr "Não foi possível apagar a subscrição." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "%1$s dá-lhe as boas-vindas, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Não foi possível criar o grupo." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Não foi possível configurar membros do grupo." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Não foi possível configurar membros do grupo." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Não foi possível gravar a subscrição." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Modificar as suas definições de perfil" @@ -4618,120 +4673,190 @@ msgstr "Página sem título" msgid "Primary site navigation" msgstr "Navegação primária deste site" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Início" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Perfil pessoal e notas dos amigos" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Pessoal" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Altere o seu endereço electrónico, avatar, senha, perfil" -#: lib/action.php:444 -msgid "Connect" -msgstr "Ligar" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Conta" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Ligar aos serviços" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Ligar" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Alterar a configuração do site" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Convidar" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Gestor" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Convidar amigos e colegas para se juntarem a si em %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Sair" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Convidar" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Terminar esta sessão" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Sair" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Criar uma conta" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registar" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Iniciar uma sessão" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Ajuda" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Entrar" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Ajudem-me!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Pesquisa" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Ajuda" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Procurar pessoas ou pesquisar texto" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Pesquisa" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Aviso do site" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Vistas locais" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Aviso da página" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Navegação secundária deste site" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Ajuda" + +#: lib/action.php:765 msgid "About" msgstr "Sobre" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "Termos" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Privacidade" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Código" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Contacto" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Emblema" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Licença de software do StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4740,12 +4865,12 @@ msgstr "" "**%%site.name%%** é um serviço de microblogues disponibilizado por [%%site." "broughtby%%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** é um serviço de microblogues. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4756,108 +4881,161 @@ msgstr "" "disponibilizado nos termos da [GNU Affero General Public License](http://www." "fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Licença de conteúdos do site" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Tudo " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "licença." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Paginação" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Posteriores" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Anteriores" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Não pode fazer alterações a este site." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Não são permitidas alterações a esse painel." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() não implementado." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() não implementado." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Não foi possível apagar a configuração do estilo." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Configuração básica do site" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Site" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Configuração do estilo" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Estilo" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "Configuração das localizações" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Utilizador" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "Configuração do estilo" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Acesso" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Configuração das localizações" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Localizações" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "Configuração do estilo" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Sessões" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4952,11 +5130,11 @@ msgstr "Notas em que este anexo aparece" msgid "Tags for this attachment" msgstr "Categorias para este anexo" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Não foi possível mudar a palavra-chave" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "Não é permitido mudar a palavra-chave" @@ -5272,19 +5450,19 @@ msgstr "" "tracks - ainda não implementado.\n" "tracking - ainda não implementado.\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Ficheiro de configuração não encontrado. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "Procurei ficheiros de configuração nos seguintes sítios: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "Talvez queira correr o instalador para resolver esta questão." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Ir para o instalador." @@ -5474,23 +5652,23 @@ msgstr "Ocorreu um erro de sistema ao transferir o ficheiro." msgid "Not an image or corrupt file." msgstr "Ficheiro não é uma imagem ou está corrompido." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Formato do ficheiro da imagem não é suportado." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Perdi o nosso ficheiro." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Tipo do ficheiro é desconhecido" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "kB" @@ -5873,6 +6051,12 @@ msgstr "Para" msgid "Available characters" msgstr "Caracteres disponíveis" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Enviar" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Enviar uma nota" @@ -5930,23 +6114,23 @@ msgstr "O" msgid "at" msgstr "coords." -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "no contexto" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Repetida por" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Responder a esta nota" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Responder" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Nota repetida" @@ -5994,6 +6178,10 @@ msgstr "Respostas" msgid "Favorites" msgstr "Favoritas" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Utilizador" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Recebidas" @@ -6083,7 +6271,7 @@ msgstr "Repetir esta nota?" msgid "Repeat this notice" msgstr "Repetir esta nota" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -6103,6 +6291,10 @@ msgstr "Pesquisar site" msgid "Keyword(s)" msgstr "Categorias" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Pesquisa" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Pesquisar ajuda" @@ -6154,6 +6346,15 @@ msgstr "Pessoas que subscrevem %s" msgid "Groups %s is a member of" msgstr "Grupos de que %s é membro" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Convidar" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Convidar amigos e colegas para se juntarem a si em %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6224,47 +6425,47 @@ msgstr "Mensagem" msgid "Moderate" msgstr "Moderar" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "há alguns segundos" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "há cerca de um minuto" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "há cerca de %d minutos" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "há cerca de uma hora" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "há cerca de %d horas" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "há cerca de um dia" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "há cerca de %d dias" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "há cerca de um mês" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "há cerca de %d meses" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "há cerca de um ano" diff --git a/locale/pt_BR/LC_MESSAGES/statusnet.po b/locale/pt_BR/LC_MESSAGES/statusnet.po index 18659cecf..041a2d4a3 100644 --- a/locale/pt_BR/LC_MESSAGES/statusnet.po +++ b/locale/pt_BR/LC_MESSAGES/statusnet.po @@ -11,75 +11,82 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:37+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:41+0000\n" "Language-Team: Brazilian Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt-br\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Acesso" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Configurações de acesso ao site" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Registro" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Particular" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "Impedir usuários anônimos (não autenticados) de visualizar o site?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Somente convidados" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Particular" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Cadastro liberado somente para convidados." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Fechado" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Somente convidados" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Desabilita novos registros." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Salvar" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Fechado" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Salvar as configurações de acesso" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Salvar" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Esta página não existe." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -93,45 +100,53 @@ msgstr "Esta página não existe." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Este usuário não existe." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s e amigos, pág. %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s e amigos" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Fonte de mensagens dos amigos de %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Fonte de mensagens dos amigos de %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Fonte de mensagens dos amigos de %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." @@ -139,7 +154,7 @@ msgstr "" "Esse é o fluxo de mensagens de %s e seus amigos, mas ninguém publicou nada " "ainda." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -148,7 +163,8 @@ msgstr "" "Tente assinar mais pessoas, [unir-ser a um grupo](%%action.groups%%) ou " "publicar algo." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -158,7 +174,7 @@ msgstr "" "[publicar alguma coisa que desperte seu interesse](%%%%action.newnotice%%%%?" "status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -167,7 +183,8 @@ msgstr "" "Por que não [registrar uma conta](%%%%action.register%%%%) e então chamar a " "atenção de %s ou publicar uma mensagem para sua atenção." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Você e amigos" @@ -185,20 +202,20 @@ msgstr "Atualizações de %1$s e amigos no %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "O método da API não foi encontrado!" @@ -232,8 +249,9 @@ msgstr "Não foi possível atualizar o usuário." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "O usuário não tem perfil." @@ -259,7 +277,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -371,7 +389,7 @@ msgstr "Não foi possível determinar o usuário de origem." msgid "Could not find target user." msgstr "Não foi possível encontrar usuário de destino." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -379,62 +397,62 @@ msgstr "" "A identificação deve conter apenas letras minúsculas e números e não pode " "ter e espaços." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Esta identificação já está em uso. Tente outro." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Não é uma identificação válida." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "A URL informada não é válida." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Nome completo muito extenso (máx. 255 caracteres)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Descrição muito extensa (máximo %d caracteres)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Localização muito extensa (máx. 255 caracteres)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Muitos apelidos! O máximo são %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Apelido inválido: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "O apelido \"%s\" já está em uso. Tente outro." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "O apelido não pode ser igual à identificação." @@ -445,15 +463,15 @@ msgstr "O apelido não pode ser igual à identificação." msgid "Group not found!" msgstr "O grupo não foi encontrado!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Você já é membro desse grupo." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "O administrador desse grupo bloqueou sua inscrição." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Não foi possível associar o usuário %1$s ao grupo %2$s." @@ -462,7 +480,7 @@ msgstr "Não foi possível associar o usuário %1$s ao grupo %2$s." msgid "You are not a member of this group." msgstr "Você não é membro deste grupo." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Não foi possível remover o usuário %1$s do grupo %2$s." @@ -493,7 +511,7 @@ msgstr "Token inválido." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -539,7 +557,7 @@ msgstr "O token %s solicitado foi negado e revogado." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -566,13 +584,13 @@ msgstr "" "fornecer acesso à sua conta %4$s somente para terceiros nos quais você " "confia." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Conta" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -654,12 +672,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s marcadas como favoritas por %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Mensagens de %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -695,7 +713,7 @@ msgstr "Repetida para %s" msgid "Repeats of %s" msgstr "Repetições de %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Mensagens etiquetadas como %s" @@ -716,8 +734,7 @@ msgstr "Este anexo não existe." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Nenhuma identificação." @@ -729,7 +746,7 @@ msgstr "Sem tamanho definido." msgid "Invalid size." msgstr "Tamanho inválido." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -747,30 +764,30 @@ msgid "User without matching profile" msgstr "Usuário sem um perfil correspondente" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Configurações do avatar" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Original" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Visualização" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Excluir" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Enviar" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Cortar" @@ -778,7 +795,7 @@ msgstr "Cortar" msgid "Pick a square area of the image to be your avatar" msgstr "Selecione uma área quadrada da imagem para ser seu avatar" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Os dados do nosso arquivo foram perdidos." @@ -814,22 +831,22 @@ msgstr "" "você." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Não" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Não bloquear este usuário" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Sim" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Bloquear este usuário" @@ -837,39 +854,43 @@ msgstr "Bloquear este usuário" msgid "Failed to save block information." msgstr "Não foi possível salvar a informação de bloqueio." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Esse grupo não existe." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "Perfis bloqueados no %s" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "Perfis bloqueados no %1$s, pág. %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Uma lista dos usuários proibidos de se associarem a este grupo." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Desbloquear o usuário do grupo" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Desbloquear" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Desbloquear este usuário" @@ -944,7 +965,7 @@ msgstr "Você não é o dono desta aplicação." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Ocorreu um problema com o seu token de sessão." @@ -970,12 +991,13 @@ msgstr "Não excluir esta aplicação" msgid "Delete this application" msgstr "Excluir esta aplicação" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Você não está autenticado." @@ -1004,7 +1026,7 @@ msgstr "Tem certeza que deseja excluir esta mensagem?" msgid "Do not delete this notice" msgstr "Não excluir esta mensagem." -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Excluir esta mensagem" @@ -1020,7 +1042,7 @@ msgstr "Você só pode excluir usuários locais." msgid "Delete user" msgstr "Excluir usuário" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1028,12 +1050,12 @@ msgstr "" "Tem certeza que deseja excluir este usuário? Isso eliminará todos os dados " "deste usuário do banco de dados, sem cópia de segurança." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Excluir este usuário" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Aparência" @@ -1136,6 +1158,17 @@ msgstr "Restaura a aparência padrão" msgid "Reset back to default" msgstr "Restaura de volta ao padrão" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Salvar" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Salvar a aparência" @@ -1227,29 +1260,29 @@ msgstr "Editar o grupo %s" msgid "You must be logged in to create a group." msgstr "Você deve estar autenticado para criar um grupo." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Você deve ser um administrador para editar o grupo." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Use esse formulário para editar o grupo." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "descrição muito extensa (máximo %d caracteres)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Não foi possível atualizar o grupo." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Não foi possível criar os apelidos." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "As configurações foram salvas." @@ -1594,7 +1627,7 @@ msgstr "O usuário já está bloqueado no grupo." msgid "User is not a member of group." msgstr "O usuário não é um membro do grupo" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Bloquear o usuário no grupo" @@ -1630,11 +1663,11 @@ msgstr "Nenhuma ID." msgid "You must be logged in to edit a group." msgstr "Você precisa estar autenticado para editar um grupo." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Aparência do grupo" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1642,20 +1675,20 @@ msgstr "" "Personalize a aparência do grupo com uma imagem de fundo e uma paleta de " "cores à sua escolha." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Não foi possível atualizar a aparência." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "As configurações da aparência foram salvas." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Logo do grupo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1663,57 +1696,57 @@ msgstr "" "Você pode enviar uma imagem de logo para o seu grupo. O tamanho máximo do " "arquivo é %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Usuário sem um perfil correspondente" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Selecione uma área quadrada da imagem para definir a logo" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "A logo foi atualizada." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Não foi possível atualizar a logo." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Membros do grupo %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "Membros do grupo %1$s, pág. %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Uma lista dos usuários deste grupo." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Admin" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Bloquear" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Tornar o usuário um administrador do grupo" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Tornar administrador" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Torna este usuário um administrador" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Atualizações dos membros de %1$s no %2$s!" @@ -1979,16 +2012,19 @@ msgstr "Mensagem pessoal" msgid "Optionally add a personal message to the invitation." msgstr "Você pode, opcionalmente, adicionar uma mensagem pessoal ao convite." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Enviar" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s convidou você para se juntar a %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2049,7 +2085,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Você deve estar autenticado para se associar a um grupo." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Nenhuma identificação." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s associou-se ao grupo %2$s" @@ -2058,11 +2099,11 @@ msgstr "%1$s associou-se ao grupo %2$s" msgid "You must be logged in to leave a group." msgstr "Você deve estar autenticado para sair de um grupo." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Você não é um membro desse grupo." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s deixou o grupo %2$s" @@ -2080,8 +2121,7 @@ msgid "Error setting user. You are probably not authorized." msgstr "" "Erro na configuração do usuário. Você provavelmente não tem autorização." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Entrar" @@ -2341,8 +2381,8 @@ msgstr "tipo de conteúdo " msgid "Only " msgstr "Apenas " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Não é um formato de dados suportado." @@ -2483,7 +2523,7 @@ msgstr "Não é possível salvar a nova senha." msgid "Password saved." msgstr "A senha foi salva." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Caminhos" @@ -2517,7 +2557,6 @@ msgstr "" "Servidor SSL inválido. O comprimento máximo deve ser de 255 caracteres." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Site" @@ -2690,7 +2729,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 letras minúsculas ou números, sem pontuações ou espaços" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Nome completo" @@ -2718,7 +2757,7 @@ msgid "Bio" msgstr "Descrição" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2801,7 +2840,8 @@ msgstr "Não foi possível salvar o perfil." msgid "Couldn't save tags." msgstr "Não foi possível salvar as etiquetas." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "As configurações foram salvas." @@ -2814,28 +2854,28 @@ msgstr "Além do limite da página (%s)" msgid "Could not retrieve public stream." msgstr "Não foi possível recuperar o fluxo público." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Mensagens públicas, pág. %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Mensagens públicas" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Fonte de mensagens públicas (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Fonte de mensagens públicas (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Fonte de mensagens públicas (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2844,11 +2884,11 @@ msgstr "" "Esse é o fluxo de mensagens públicas de %%site.name%%, mas ninguém publicou " "nada ainda." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Seja o primeiro a publicar!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2856,7 +2896,7 @@ msgstr "" "Por que você não [registra uma conta](%%action.register%%) pra ser o " "primeiro a publicar?" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2869,7 +2909,7 @@ msgstr "" "[Cadastre-se agora](%%action.register%%) para compartilhar notícias sobre " "você com seus amigos, família e colegas! ([Saiba mais](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3052,8 +3092,7 @@ msgstr "Desculpe, mas o código do convite é inválido." msgid "Registration successful" msgstr "Registro realizado com sucesso" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Registrar-se" @@ -3238,7 +3277,7 @@ msgstr "Você não pode repetir sua própria mensagem." msgid "You already repeated that notice." msgstr "Você já repetiu essa mensagem." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Repetida" @@ -3246,33 +3285,33 @@ msgstr "Repetida" msgid "Repeated!" msgstr "Repetida!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Respostas para %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Respostas para %1$s, pág. %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Fonte de respostas para %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Fonte de respostas para %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Fonte de respostas para %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3281,7 +3320,7 @@ msgstr "" "Esse é o fluxo de mensagens de resposta para %1$s, mas %2$s ainda não " "recebeu nenhuma mensagem direcionada a ele(a)." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3290,7 +3329,7 @@ msgstr "" "Você pode envolver outros usuários na conversa. Pra isso, assine mais " "pessoas ou [associe-se a grupos](%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3318,7 +3357,6 @@ msgid "User is already sandboxed." msgstr "O usuário já está em isolamento." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Sessões" @@ -3343,7 +3381,7 @@ msgid "Turn on debugging output for sessions." msgstr "Ativa a saída de depuração para as sessões." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Salvar as configurações do site" @@ -3373,7 +3411,7 @@ msgstr "Organização" msgid "Description" msgstr "Descrição" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Estatísticas" @@ -3436,22 +3474,22 @@ msgstr "Mensagens favoritas de %1$s, pág. %2$d" msgid "Could not retrieve favorite notices." msgstr "Não foi possível recuperar as mensagens favoritas." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Fonte para favoritas de %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Fonte para favoritas de %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Fonte para favoritas de %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3460,7 +3498,7 @@ msgstr "" "\"Favorita\" nas mensagens que você quer guardar para referência futura ou " "para destacar." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3469,7 +3507,7 @@ msgstr "" "%s não adicionou nenhuma mensagem às suas favoritas. Publique alguma coisa " "interessante para para as pessoas marcarem como favorita. :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3480,7 +3518,7 @@ msgstr "" "[registra uma conta](%%%%action.register%%%%) e publica alguma coisa " "interessante para as pessoas marcarem como favorita? :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Esta é uma forma de compartilhar o que você gosta." @@ -3494,67 +3532,67 @@ msgstr "Grupo %s" msgid "%1$s group, page %2$d" msgstr "Grupo %1$s, pág. %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Perfil do grupo" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "Site" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Mensagem" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Apelidos" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Ações do grupo" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Fonte de mensagens do grupo %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Fonte de mensagens do grupo %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Fonte de mensagens do grupo %s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "FOAF para o grupo %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Membros" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Nenhum)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Todos os membros" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Criado" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3570,7 +3608,7 @@ msgstr "" "para se tornar parte deste grupo e muito mais! ([Saiba mais](%%%%doc.help%%%" "%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3583,7 +3621,7 @@ msgstr "" "[StatusNet](http://status.net/). Seus membros compartilham mensagens curtas " "sobre suas vidas e interesses. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Administradores" @@ -4063,22 +4101,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Mensagens etiquetadas com %1$s, pág. %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Fonte de mensagens de %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Fonte de mensagens de %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Fonte de mensagens de %s (Atom)" @@ -4132,7 +4170,7 @@ msgstr "" msgid "No such tag." msgstr "Esta etiqueta não existe." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "O método da API está em construção." @@ -4164,71 +4202,73 @@ msgstr "" "A licença '%1$s' do fluxo do usuário não é compatível com a licença '%2$s' " "do site." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Usuário" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Configurações de usuário para este site StatusNet." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Limite da descrição inválido. Seu valor deve ser numérico." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" "Mensagem de boas vindas inválida. O comprimento máximo é de 255 caracteres." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Assinatura padrão inválida: '%1$s' não é um usuário." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Perfil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Limite da descrição" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Comprimento máximo da descrição do perfil, em caracteres." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Novos usuários" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Boas vindas aos novos usuários" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Texto de boas vindas para os novos usuários (máx. 255 caracteres)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Assinatura padrão" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Os novos usuários assinam esse usuário automaticamente." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Convites" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Convites habilitados" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "Define se os usuários podem ou não convidar novos usuários." @@ -4426,7 +4466,7 @@ msgstr "" msgid "Plugins" msgstr "Plugins" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Versão" @@ -4465,6 +4505,11 @@ msgstr "Não é parte de um grupo." msgid "Group leave failed." msgstr "Não foi possível deixar o grupo." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Não foi possível atualizar o grupo." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4482,27 +4527,27 @@ msgstr "Não foi possível inserir a mensagem." msgid "Could not update message with new URI." msgstr "Não foi possível atualizar a mensagem com a nova URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Erro no banco de dados durante a inserção da hashtag: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Problema no salvamento da mensagem. Ela é muito extensa." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Problema no salvamento da mensagem. Usuário desconhecido." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Muitas mensagens em um período curto de tempo; dê uma respirada e publique " "novamente daqui a alguns minutos." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4510,19 +4555,19 @@ msgstr "" "Muitas mensagens duplicadas em um período curto de tempo; dê uma respirada e " "publique novamente daqui a alguns minutos." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Você está proibido de publicar mensagens neste site." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problema no salvamento da mensagem." -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "Problema no salvamento das mensagens recebidas do grupo." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4551,19 +4596,29 @@ msgstr "Não foi possível excluir a auto-assinatura." msgid "Couldn't delete subscription." msgstr "Não foi possível excluir a assinatura." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Bem vindo(a) a %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Não foi possível criar o grupo." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Não foi possível configurar a associação ao grupo." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Não foi possível configurar a associação ao grupo." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Não foi possível salvar a assinatura." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Alterar as suas configurações de perfil" @@ -4605,120 +4660,190 @@ msgstr "Página sem título" msgid "Primary site navigation" msgstr "Navegação primária no site" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Início" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Perfil pessoal e fluxo de mensagens dos amigos" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Pessoal" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Mude seu e-mail, avatar, senha, perfil" -#: lib/action.php:444 -msgid "Connect" -msgstr "Conectar" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Conta" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Conecte-se a outros serviços" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Conectar" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Mude as configurações do site" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Convidar" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Admin" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Convide seus amigos e colegas para unir-se a você no %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Sair" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Convidar" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Sai do site" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Sair" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Cria uma conta" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registrar-se" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Autentique-se no site" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Ajuda" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Entrar" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Ajudem-me!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Procurar" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Ajuda" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Procura por pessoas ou textos" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Procurar" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Mensagem do site" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Visualizações locais" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Notícia da página" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Navegação secundária no site" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Ajuda" + +#: lib/action.php:765 msgid "About" msgstr "Sobre" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "Termos de uso" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Privacidade" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Fonte" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Contato" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Mini-aplicativo" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Licença do software StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4727,12 +4852,12 @@ msgstr "" "**%%site.name%%** é um serviço de microblog disponibilizado por [%%site." "broughtby%%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** é um serviço de microblog. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4743,109 +4868,162 @@ msgstr "" "versão %s, disponível sob a [GNU Affero General Public License] (http://www." "fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Licença do conteúdo do site" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "O conteúdo e os dados de %1$s são privados e confidenciais." -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "Conteúdo e dados licenciados sob %1$s. Todos os direitos reservados." -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "Conteúdo e dados licenciados pelos colaboradores. Todos os direitos " "reservados." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Todas " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "licença." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Paginação" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Próximo" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Anterior" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Você não pode fazer alterações neste site." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Não são permitidas alterações a esse painel." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() não implementado." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() não implementado." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Não foi possível excluir as configurações da aparência." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Configuração básica do site" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Site" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Configuração da aparência" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Aparência" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Configuração do usuário" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Usuário" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Configuração do acesso" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Acesso" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Configuração dos caminhos" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Caminhos" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Configuração das sessões" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Sessões" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "Os recursos de API exigem acesso de leitura e escrita, mas você possui " "somente acesso de leitura." -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4938,11 +5116,11 @@ msgstr "Mensagens onde este anexo aparece" msgid "Tags for this attachment" msgstr "Etiquetas para este anexo" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Não foi possível alterar a senha" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "Não é permitido alterar a senha" @@ -5260,19 +5438,19 @@ msgstr "" "tracks - não implementado ainda\n" "tracking - não implementado ainda\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Não foi encontrado nenhum arquivo de configuração. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "Eu procurei pelos arquivos de configuração nos seguintes lugares: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "Você pode querer executar o instalador para corrigir isto." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Ir para o instalador." @@ -5462,23 +5640,23 @@ msgstr "Erro no sistema durante o envio do arquivo." msgid "Not an image or corrupt file." msgstr "Imagem inválida ou arquivo corrompido." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Formato de imagem não suportado." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Nosso arquivo foi perdido." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Tipo de arquivo desconhecido" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "Mb" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "Kb" @@ -5862,6 +6040,12 @@ msgstr "Para" msgid "Available characters" msgstr "Caracteres disponíveis" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Enviar" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Enviar uma mensagem" @@ -5920,23 +6104,23 @@ msgstr "O" msgid "at" msgstr "em" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "no contexto" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Repetida por" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Responder a esta mensagem" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Responder" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Mensagem repetida" @@ -5984,6 +6168,10 @@ msgstr "Respostas" msgid "Favorites" msgstr "Favoritas" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Usuário" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Recebidas" @@ -6073,7 +6261,7 @@ msgstr "Repetir esta mensagem?" msgid "Repeat this notice" msgstr "Repetir esta mensagem" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "Nenhum usuário definido para o modo de usuário único." @@ -6093,6 +6281,10 @@ msgstr "Procurar no site" msgid "Keyword(s)" msgstr "Palavra(s)-chave" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Procurar" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Ajuda da procura" @@ -6144,6 +6336,15 @@ msgstr "Assinantes de %s" msgid "Groups %s is a member of" msgstr "Grupos dos quais %s é membro" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Convidar" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Convide seus amigos e colegas para unir-se a você no %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6214,47 +6415,47 @@ msgstr "Mensagem" msgid "Moderate" msgstr "Moderar" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "alguns segundos atrás" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "cerca de 1 minuto atrás" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "cerca de %d minutos atrás" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "cerca de 1 hora atrás" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "cerca de %d horas atrás" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "cerca de 1 dia atrás" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "cerca de %d dias atrás" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "cerca de 1 mês atrás" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "cerca de %d meses atrás" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "cerca de 1 ano atrás" diff --git a/locale/ru/LC_MESSAGES/statusnet.po b/locale/ru/LC_MESSAGES/statusnet.po index d4df1a654..4db3b0684 100644 --- a/locale/ru/LC_MESSAGES/statusnet.po +++ b/locale/ru/LC_MESSAGES/statusnet.po @@ -12,77 +12,84 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:41+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:44+0000\n" "Language-Team: Russian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ru\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10< =4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Принять" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Настройки доступа к сайту" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Регистрация" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Личное" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" "Запретить анонимным (не авторизовавшимся) пользователям просматривать сайт?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Только по приглашениям" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Личное" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Разрешить регистрацию только по приглашениям." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Закрыта" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Только по приглашениям" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Отключить новые регистрации." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Сохранить" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Закрыта" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Сохранить настройки доступа" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Сохранить" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Нет такой страницы" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -96,51 +103,59 @@ msgstr "Нет такой страницы" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Нет такого пользователя." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s и друзья, страница %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s и друзья" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Лента друзей %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Лента друзей %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Лента друзей %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "Это лента %s и друзей, однако пока никто ничего не отправил." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -149,7 +164,8 @@ msgstr "" "Попробуйте подписаться на большее число людей, [присоединитесь к группе](%%" "action.groups%%) или отправьте что-нибудь сами." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -159,7 +175,7 @@ msgstr "" "что-нибудь для привлечения его или её внимания](%%%%action.newnotice%%%%?" "status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -168,7 +184,8 @@ msgstr "" "Почему бы не [зарегистрироваться](%%action.register%%), чтобы «подтолкнуть» %" "s или отправить запись для привлечения его или её внимания?" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Вы и друзья" @@ -186,20 +203,20 @@ msgstr "Обновлено от %1$s и его друзей на %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "Метод API не найден." @@ -231,8 +248,9 @@ msgstr "Не удаётся обновить пользователя." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "У пользователя нет профиля." @@ -258,7 +276,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -374,69 +392,69 @@ msgstr "Не удаётся определить исходного пользо msgid "Could not find target user." msgstr "Не удаётся найти целевого пользователя." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "" "Имя должно состоять только из прописных букв и цифр и не иметь пробелов." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Такое имя уже используется. Попробуйте какое-нибудь другое." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Неверное имя." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "URL Главной страницы неверен." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Полное имя слишком длинное (не больше 255 знаков)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Слишком длинное описание (максимум %d символов)" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Слишком длинное месторасположение (максимум 255 знаков)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Слишком много алиасов! Максимальное число — %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Неверный алиас: «%s»" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Алиас «%s» уже используется. Попробуйте какой-нибудь другой." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Алиас не может совпадать с именем." @@ -447,15 +465,15 @@ msgstr "Алиас не может совпадать с именем." msgid "Group not found!" msgstr "Группа не найдена!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Вы уже являетесь членом этой группы." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Вы заблокированы из этой группы администратором." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Не удаётся присоединить пользователя %1$s к группе %2$s." @@ -464,7 +482,7 @@ msgstr "Не удаётся присоединить пользователя %1 msgid "You are not a member of this group." msgstr "Вы не являетесь членом этой группы." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Не удаётся удалить пользователя %1$s из группы %2$s." @@ -495,7 +513,7 @@ msgstr "Неправильный токен" #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -537,7 +555,7 @@ msgstr "Запрос токена %s был запрещен и аннулиро #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -564,13 +582,13 @@ msgstr "" "предоставлять разрешение на доступ к вашей учётной записи %4$s только тем " "сторонним приложениям, которым вы доверяете." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Настройки" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -652,12 +670,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "Обновления %1$s, отмеченные как любимые %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "Лента %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -693,7 +711,7 @@ msgstr "Повторено для %s" msgid "Repeats of %s" msgstr "Повторы за %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Записи с тегом %s" @@ -714,8 +732,7 @@ msgstr "Нет такого вложения." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Нет имени." @@ -727,7 +744,7 @@ msgstr "Нет размера." msgid "Invalid size." msgstr "Неверный размер." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Аватара" @@ -745,30 +762,30 @@ msgid "User without matching profile" msgstr "Пользователь без соответствующего профиля" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Настройки аватары" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Оригинал" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Просмотр" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Удалить" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Загрузить" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Обрезать" @@ -776,7 +793,7 @@ msgstr "Обрезать" msgid "Pick a square area of the image to be your avatar" msgstr "Подберите нужный квадратный участок для вашей аватары" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Потеряна информация о файле." @@ -811,22 +828,22 @@ msgstr "" "приходить уведомления об @-ответах от него." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Нет" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Не блокировать этого пользователя" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Да" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Заблокировать пользователя." @@ -834,39 +851,43 @@ msgstr "Заблокировать пользователя." msgid "Failed to save block information." msgstr "Не удаётся сохранить информацию о блокировании." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Нет такой группы." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "Заблокированные профили %s" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "Заблокированные профили %1$s, страница %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Список пользователей, заблокированных от присоединения к этой группе." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Разблокировать пользователя в группе." -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Разблокировать" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Разблокировать пользователя." @@ -941,7 +962,7 @@ msgstr "Вы не являетесь владельцем этого прило #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Проблема с Вашей сессией. Попробуйте ещё раз, пожалуйста." @@ -967,12 +988,13 @@ msgstr "Не удаляйте это приложение" msgid "Delete this application" msgstr "Удалить это приложение" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Не авторизован." @@ -1001,7 +1023,7 @@ msgstr "Вы уверены, что хотите удалить эту запи msgid "Do not delete this notice" msgstr "Не удалять эту запись" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Удалить эту запись" @@ -1017,7 +1039,7 @@ msgstr "Вы можете удалять только внутренних по msgid "Delete user" msgstr "Удалить пользователя" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1025,12 +1047,12 @@ msgstr "" "Вы действительно хотите удалить этого пользователя? Это повлечёт удаление " "всех данных о пользователе из базы данных без возможности восстановления." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Удалить этого пользователя" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Оформление" @@ -1133,6 +1155,17 @@ msgstr "Восстановить оформление по умолчанию" msgid "Reset back to default" msgstr "Восстановить значения по умолчанию" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Сохранить" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Сохранить оформление" @@ -1224,29 +1257,29 @@ msgstr "Изменить информацию о группе %s" msgid "You must be logged in to create a group." msgstr "Вы должны авторизоваться, чтобы создать новую группу." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Вы должны быть администратором, чтобы изменять информацию о группе." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Заполните информацию о группе в следующие поля" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "Слишком длинное описание (максимум %d символов)" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Не удаётся обновить информацию о группе." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Не удаётся создать алиасы." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Настройки сохранены." @@ -1596,7 +1629,7 @@ msgstr "Пользователь уже заблокирован из групп msgid "User is not a member of group." msgstr "Пользователь не является членом этой группы." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Заблокировать пользователя из группы." @@ -1631,11 +1664,11 @@ msgstr "Нет ID." msgid "You must be logged in to edit a group." msgstr "Вы должны авторизоваться, чтобы изменить группу." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Оформление группы" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1643,20 +1676,20 @@ msgstr "" "Настройте внешний вид группы, установив фоновое изображение и цветовую гамму " "на ваш выбор." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Не удаётся обновить ваше оформление." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Настройки оформления сохранены." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Логотип группы" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1664,57 +1697,57 @@ msgstr "" "Здесь вы можете загрузить логотип для группы. Максимальный размер файла " "составляет %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Пользователь без соответствующего профиля." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Подберите нужный квадратный участок для вашего логотипа." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Логотип обновлён." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Неудача при обновлении логотипа." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Участники группы %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "Участники группы %1$s, страница %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Список пользователей, являющихся членами этой группы." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Настройки" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Блокировать" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Сделать пользователя администратором группы" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Сделать администратором" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Сделать этого пользователя администратором" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Обновления участников %1$s на %2$s!" @@ -1980,16 +2013,19 @@ msgstr "Личное сообщение" msgid "Optionally add a personal message to the invitation." msgstr "Можно добавить к приглашению личное сообщение." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" -msgstr "ОК" +msgstr "Отправить" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s пригласил вас присоединиться к нему на %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2050,7 +2086,11 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Вы должны авторизоваться для вступления в группу." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "Нет имени или ID." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s вступил в группу %2$s" @@ -2059,11 +2099,11 @@ msgstr "%1$s вступил в группу %2$s" msgid "You must be logged in to leave a group." msgstr "Вы должны авторизоваться, чтобы покинуть группу." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Вы не являетесь членом этой группы." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s покинул группу %2$s" @@ -2080,8 +2120,7 @@ msgstr "Некорректное имя или пароль." msgid "Error setting user. You are probably not authorized." msgstr "Ошибка установки пользователя. Вы, вероятно, не авторизованы." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Вход" @@ -2333,8 +2372,8 @@ msgstr "тип содержимого " msgid "Only " msgstr "Только " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Неподдерживаемый формат данных." @@ -2475,7 +2514,7 @@ msgstr "Не удаётся сохранить новый пароль." msgid "Password saved." msgstr "Пароль сохранён." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Пути" @@ -2508,7 +2547,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Неверный SSL-сервер. Максимальная длина составляет 255 символов." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Сайт" @@ -2680,7 +2718,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 латинских строчных буквы или цифры, без пробелов" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Полное имя" @@ -2708,7 +2746,7 @@ msgid "Bio" msgstr "Биография" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2790,7 +2828,8 @@ msgstr "Не удаётся сохранить профиль." msgid "Couldn't save tags." msgstr "Не удаётся сохранить теги." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Настройки сохранены." @@ -2803,39 +2842,39 @@ msgstr "Превышен предел страницы (%s)" msgid "Could not retrieve public stream." msgstr "Не удаётся вернуть публичный поток." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Общая лента, страница %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Общая лента" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Лента публичного потока (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Лента публичного потока (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Лента публичного потока (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "Это общая лента %%site.name%%, однако пока никто ничего не отправил." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Создайте первую запись!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2843,7 +2882,7 @@ msgstr "" "Почему бы не [зарегистрироваться](%%action.register%%), чтобы стать первым " "отправителем?" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2857,7 +2896,7 @@ msgstr "" "register%%), чтобы держать в курсе своих событий поклонников, друзей, " "родственников и коллег! ([Читать далее](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3035,8 +3074,7 @@ msgstr "Извините, неверный пригласительный код msgid "Registration successful" msgstr "Регистрация успешна!" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Регистрация" @@ -3223,7 +3261,7 @@ msgstr "Вы не можете повторить собственную зап msgid "You already repeated that notice." msgstr "Вы уже повторили эту запись." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Повторено" @@ -3231,33 +3269,33 @@ msgstr "Повторено" msgid "Repeated!" msgstr "Повторено!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Ответы для %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Ответы для %1$s, страница %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Лента записей для %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Лента записей для %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Лента записей для %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3265,7 +3303,7 @@ msgid "" msgstr "" "Эта лента содержит ответы на записи %1$s, однако %2$s пока не получал их." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3274,7 +3312,7 @@ msgstr "" "Вы можете вовлечь других пользователей в разговор, подписавшись на большее " "число людей или [присоединившись к группам](%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3303,7 +3341,6 @@ msgid "User is already sandboxed." msgstr "Пользователь уже в режиме песочницы." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Сессии" @@ -3328,7 +3365,7 @@ msgid "Turn on debugging output for sessions." msgstr "Включить отладочный вывод для сессий." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Сохранить настройки сайта" @@ -3358,7 +3395,7 @@ msgstr "Организация" msgid "Description" msgstr "Описание" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Статистика" @@ -3422,22 +3459,22 @@ msgstr "Любимые записи %1$s, страница %2$d" msgid "Could not retrieve favorite notices." msgstr "Не удаётся восстановить любимые записи." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Лента друзей %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Лента друзей %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Лента друзей %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3445,7 +3482,7 @@ msgstr "" "Вы пока не выбрали ни одной любимой записи. Нажмите на кнопку добавления в " "любимые рядом с понравившейся записью, чтобы позже уделить ей внимание." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3454,7 +3491,7 @@ msgstr "" "%s пока не выбрал ни одной любимой записи. Напишите такую интересную запись, " "которую он добавит её в число любимых :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3465,7 +3502,7 @@ msgstr "" "[зарегистрироваться](%%%%action.register%%%%) и не написать что-нибудь " "интересное, что понравилось бы этому пользователю? :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Это способ разделить то, что вам нравится." @@ -3479,67 +3516,67 @@ msgstr "Группа %s" msgid "%1$s group, page %2$d" msgstr "Группа %1$s, страница %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Профиль группы" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Запись" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Алиасы" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Действия группы" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Лента записей группы %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Лента записей группы %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Лента записей группы %s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "FOAF для группы %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Участники" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(пока ничего нет)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Все участники" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Создано" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3555,7 +3592,7 @@ msgstr "" "action.register%%%%), чтобы стать участником группы и получить множество " "других возможностей! ([Читать далее](%%%%doc.help%%%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3568,7 +3605,7 @@ msgstr "" "обеспечении [StatusNet](http://status.net/). Участники обмениваются " "короткими сообщениями о своей жизни и интересах. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Администраторы" @@ -3948,17 +3985,17 @@ msgstr "Не удаётся сохранить подписку." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." -msgstr "" +msgstr "Это действие принимает только POST-запросы." #: actions/subscribe.php:107 -#, fuzzy msgid "No such profile." -msgstr "Нет такого файла." +msgstr "Нет такого профиля." #: actions/subscribe.php:117 -#, fuzzy msgid "You cannot subscribe to an OMB 0.1 remote profile with this action." -msgstr "Вы не подписаны на этот профиль." +msgstr "" +"Вы не можете подписаться на удалённый профиль OMB 0.1 с помощью этого " +"действия." #: actions/subscribe.php:145 msgid "Subscribed" @@ -4053,22 +4090,22 @@ msgstr "Jabber" msgid "SMS" msgstr "СМС" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Записи с тегом %1$s, страница %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Лента записей для тега %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Лента записей для тега %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Лента записей для тега %s (Atom)" @@ -4123,7 +4160,7 @@ msgstr "" msgid "No such tag." msgstr "Нет такого тега." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Метод API реконструируется." @@ -4154,71 +4191,73 @@ msgid "" msgstr "" "Лицензия просматриваемого потока «%1$s» несовместима с лицензией сайта «%2$s»." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Пользователь" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Пользовательские настройки для этого сайта StatusNet." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Неверное ограничение биографии. Должно быть числом." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" "Неверный текст приветствия. Максимальная длина составляет 255 символов." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Неверная подписка по умолчанию: «%1$s» не является пользователем." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Профиль" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Ограничение биографии" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Максимальная длина биографии профиля в символах." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Новые пользователи" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Приветствие новым пользователям" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Текст приветствия для новых пользователей (максимум 255 символов)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Подписка по умолчанию" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Автоматически подписывать новых пользователей на этого пользователя." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Приглашения" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Приглашения включены" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "Разрешать ли пользователям приглашать новых пользователей." @@ -4413,7 +4452,7 @@ msgstr "" msgid "Plugins" msgstr "Плагины" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Версия" @@ -4452,6 +4491,10 @@ msgstr "Не является частью группы." msgid "Group leave failed." msgstr "Не удаётся покинуть группу." +#: classes/Local_group.php:41 +msgid "Could not update local group." +msgstr "Не удаётся обновить локальную группу." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4469,27 +4512,27 @@ msgstr "Не удаётся вставить сообщение." msgid "Could not update message with new URI." msgstr "Не удаётся обновить сообщение с новым URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Ошибка баз данных при вставке хеш-тегов для %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Проблемы с сохранением записи. Слишком длинно." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Проблема при сохранении записи. Неизвестный пользователь." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Слишком много записей за столь короткий срок; передохните немного и " "попробуйте вновь через пару минут." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4497,19 +4540,19 @@ msgstr "" "Слишком много одинаковых записей за столь короткий срок; передохните немного " "и попробуйте вновь через пару минут." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Вам запрещено поститься на этом сайте (бан)" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Проблемы с сохранением записи." -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "Проблемы с сохранением входящих сообщений группы." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4538,19 +4581,27 @@ msgstr "Невозможно удалить самоподписку." msgid "Couldn't delete subscription." msgstr "Не удаётся удалить подписку." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Добро пожаловать на %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Не удаётся создать группу." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +msgid "Could not set group URI." +msgstr "Не удаётся назначить URI группы." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Не удаётся назначить членство в группе." +#: classes/User_group.php:506 +msgid "Could not save local group info." +msgstr "Не удаётся сохранить информацию о локальной группе." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Изменить ваши настройки профиля" @@ -4592,120 +4643,190 @@ msgstr "Страница без названия" msgid "Primary site navigation" msgstr "Главная навигация" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Моё" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Личный профиль и лента друзей" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Личное" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Изменить ваш email, аватару, пароль, профиль" -#: lib/action.php:444 -msgid "Connect" -msgstr "Соединить" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Настройки" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Соединить с сервисами" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Соединить" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Изменить конфигурацию сайта" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Пригласить" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Настройки" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Пригласите друзей и коллег стать такими же как вы участниками %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Выход" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Пригласить" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Выйти" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Выход" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Создать новый аккаунт" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Регистрация" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Войти" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Помощь" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Вход" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Помощь" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Поиск" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Помощь" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Искать людей или текст" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Поиск" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Новая запись" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Локальные виды" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Новая запись" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Навигация по подпискам" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Помощь" + +#: lib/action.php:765 msgid "About" msgstr "О проекте" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "ЧаВо" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "TOS" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Пользовательское соглашение" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Исходный код" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Контактная информация" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Бедж" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "StatusNet лицензия" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4714,12 +4835,12 @@ msgstr "" "**%%site.name%%** — это сервис микроблогинга, созданный для вас при помощи [%" "%site.broughtby%%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** — сервис микроблогинга. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4731,110 +4852,163 @@ msgstr "" "лицензией [GNU Affero General Public License](http://www.fsf.org/licensing/" "licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Лицензия содержимого сайта" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "Содержание и данные %1$s являются личными и конфиденциальными." -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" "Авторские права на содержание и данные принадлежат %1$s. Все права защищены." -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "Авторские права на содержание и данные принадлежат разработчикам. Все права " "защищены." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "All " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "license." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Разбиение на страницы" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Сюда" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Туда" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." -msgstr "" +msgstr "Пока ещё нельзя обрабатывать удалённое содержимое." -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." -msgstr "" +msgstr "Пока ещё нельзя обрабатывать встроенный XML." -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." -msgstr "" +msgstr "Пока ещё нельзя обрабатывать встроенное содержание Base64." -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Вы не можете изменять этот сайт." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Изменения для этой панели недопустимы." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() не реализована." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() не реализована." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Не удаётся удалить настройки оформления." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Основная конфигурация сайта" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Сайт" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Конфигурация оформления" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Оформление" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Конфигурация пользователя" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Пользователь" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Конфигурация доступа" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Принять" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Конфигурация путей" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Пути" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Конфигурация сессий" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Сессии" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "API ресурса требует доступ для чтения и записи, но у вас есть только доступ " "для чтения." -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4927,11 +5101,11 @@ msgstr "Сообщает, где появляется это вложение" msgid "Tags for this attachment" msgstr "Теги для этого вложения" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Изменение пароля не удалось" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "Смена пароля не разрешена" @@ -5130,9 +5304,9 @@ msgid "This link is useable only once, and is good for only 2 minutes: %s" msgstr "Эта ссылка действительна только один раз в течение 2 минут: %s" #: lib/command.php:692 -#, fuzzy, php-format +#, php-format msgid "Unsubscribed %s" -msgstr "Отписано от %s" +msgstr "Отписано %s" #: lib/command.php:709 msgid "You are not subscribed to anyone." @@ -5168,7 +5342,6 @@ msgstr[1] "Вы являетесь участником следующих гр msgstr[2] "Вы являетесь участником следующих групп:" #: lib/command.php:769 -#, fuzzy msgid "" "Commands:\n" "on - turn on notifications\n" @@ -5221,6 +5394,7 @@ msgstr "" "d — прямое сообщение пользователю\n" "get — получить последнюю запись от пользователя\n" "whois — получить информацию из профиля пользователя\n" +"lose — отменить подписку пользователя на вас\n" "fav — добавить последнюю запись пользователя в число любимых\n" "fav # — добавить запись с заданным id в число любимых\n" "repeat # — повторить уведомление с заданным id\n" @@ -5247,19 +5421,19 @@ msgstr "" "tracks — пока не реализовано.\n" "tracking — пока не реализовано.\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Конфигурационный файл не найден. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "Конфигурационные файлы искались в следующих местах: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "Возможно, вы решите запустить установщик для исправления этого." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Перейти к установщику" @@ -5449,23 +5623,23 @@ msgstr "Системная ошибка при загрузке файла." msgid "Not an image or corrupt file." msgstr "Не является изображением или повреждённый файл." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Неподдерживаемый формат файла изображения." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Потерян файл." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Неподдерживаемый тип файла" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "МБ" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "КБ" @@ -5847,6 +6021,11 @@ msgstr "Для" msgid "Available characters" msgstr "6 или больше знаков" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Отправить" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Послать запись" @@ -5905,23 +6084,23 @@ msgstr "з. д." msgid "at" msgstr "на" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "в контексте" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Повторено" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Ответить на эту запись" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Ответить" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Запись повторена" @@ -5969,6 +6148,10 @@ msgstr "Ответы" msgid "Favorites" msgstr "Любимое" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Пользователь" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Входящие" @@ -6058,7 +6241,7 @@ msgstr "Повторить эту запись?" msgid "Repeat this notice" msgstr "Повторить эту запись" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "Ни задан пользователь для однопользовательского режима." @@ -6078,6 +6261,10 @@ msgstr "Поиск по сайту" msgid "Keyword(s)" msgstr "Ключевые слова" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Поиск" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Справка по поиску" @@ -6129,6 +6316,15 @@ msgstr "Люди подписанные на %s" msgid "Groups %s is a member of" msgstr "Группы, в которых состоит %s" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Пригласить" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Пригласите друзей и коллег стать такими же как вы участниками %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6199,47 +6395,47 @@ msgstr "Сообщение" msgid "Moderate" msgstr "Модерировать" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "пару секунд назад" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "около минуты назад" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "около %d минут(ы) назад" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "около часа назад" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "около %d часа(ов) назад" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "около дня назад" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "около %d дня(ей) назад" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "около месяца назад" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "около %d месяца(ев) назад" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "около года назад" diff --git a/locale/statusnet.po b/locale/statusnet.po index 8e1434497..3f4ad499f 100644 --- a/locale/statusnet.po +++ b/locale/statusnet.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-03-01 14:08+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -17,64 +17,69 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:337 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "" -#: actions/accessadminpanel.php:158 -msgid "Registration" -msgstr "" - +#. TRANS: Form legend for registration form. #: actions/accessadminpanel.php:161 -msgid "Private" +msgid "Registration" msgstr "" -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" +msgctxt "LABEL" +msgid "Private" msgstr "" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:173 -msgid "Closed" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" msgstr "" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" msgstr "" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +msgctxt "BUTTON" +msgid "Save" +msgstr "" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -100,61 +105,70 @@ msgstr "" msgid "No such user." msgstr "" -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "" @@ -176,9 +190,9 @@ msgstr "" #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 -#: actions/apigroupshow.php:105 actions/apihelptest.php:88 +#: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:131 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 #: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 @@ -421,7 +435,7 @@ msgstr "" #: actions/apigroupismember.php:95 actions/apigroupjoin.php:104 #: actions/apigroupleave.php:104 actions/apigroupmembership.php:91 -#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91 +#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91 msgid "Group not found!" msgstr "" @@ -493,11 +507,11 @@ msgid "Invalid nickname / password!" msgstr "" #: actions/apioauthauthorize.php:159 -msgid "DB error deleting OAuth app user." +msgid "Database error deleting OAuth application user." msgstr "" #: actions/apioauthauthorize.php:185 -msgid "DB error inserting OAuth app user." +msgid "Database error inserting OAuth application user." msgstr "" #: actions/apioauthauthorize.php:214 @@ -537,7 +551,7 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "" @@ -666,7 +680,7 @@ msgstr "" msgid "Repeats of %s" msgstr "" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "" @@ -881,7 +895,7 @@ msgid "Couldn't delete email confirmation." msgstr "" #: actions/confirmaddress.php:144 -msgid "Confirm Address" +msgid "Confirm address" msgstr "" #: actions/confirmaddress.php:159 @@ -913,7 +927,7 @@ msgstr "" #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -936,12 +950,13 @@ msgstr "" msgid "Delete this application" msgstr "" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "" @@ -995,7 +1010,7 @@ msgid "Delete this user" msgstr "" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:327 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1096,6 +1111,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1629,7 +1655,7 @@ msgstr "" msgid "A list of the users in this group." msgstr "" -#: actions/groupmembers.php:182 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "" @@ -1885,16 +1911,18 @@ msgstr "" msgid "Optionally add a personal message to the invitation." msgstr "" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +msgctxt "BUTTON" msgid "Send" msgstr "" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -1963,8 +1991,7 @@ msgstr "" msgid "Error setting user. You are probably not authorized." msgstr "" -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "" @@ -2203,8 +2230,8 @@ msgstr "" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1039 -#: lib/apiaction.php:1067 lib/apiaction.php:1176 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "" @@ -2217,7 +2244,7 @@ msgid "Notice Search" msgstr "" #: actions/othersettings.php:60 -msgid "Other Settings" +msgid "Other settings" msgstr "" #: actions/othersettings.php:71 @@ -2343,7 +2370,7 @@ msgstr "" msgid "Password saved." msgstr "" -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:342 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2376,7 +2403,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:322 msgid "Site" msgstr "" @@ -2652,7 +2678,8 @@ msgstr "" msgid "Couldn't save tags." msgstr "" -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "" @@ -2665,45 +2692,45 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2712,7 +2739,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2881,8 +2908,7 @@ msgstr "" msgid "Registration successful" msgstr "" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "" @@ -3049,47 +3075,47 @@ msgstr "" msgid "Repeated!" msgstr "" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3114,7 +3140,6 @@ msgid "User is already sandboxed." msgstr "" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:347 msgid "Sessions" msgstr "" @@ -3139,7 +3164,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "" @@ -3230,35 +3255,35 @@ msgstr "" msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3266,7 +3291,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3805,22 +3830,22 @@ msgstr "" msgid "SMS" msgstr "" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "" @@ -3900,70 +3925,71 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:332 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +msgctxt "TITLE" msgid "User" msgstr "" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4136,7 +4162,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "" @@ -4255,11 +4281,11 @@ msgstr "" msgid "Couldn't delete self-subscription." msgstr "" -#: classes/Subscription.php:179 +#: classes/Subscription.php:179 lib/subs.php:69 msgid "Couldn't delete subscription." msgstr "" -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "" @@ -4269,7 +4295,7 @@ msgid "Could not create group." msgstr "" #: classes/User_group.php:471 -msgid "Could not set group uri." +msgid "Could not set group URI." msgstr "" #: classes/User_group.php:492 @@ -4321,132 +4347,183 @@ msgstr "" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" +msgctxt "TOOLTIP" +msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:439 -msgid "Personal profile and friends timeline" +#: lib/action.php:442 +msgctxt "MENU" +msgid "Personal" msgstr "" -#: lib/action.php:441 +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "" -#: lib/action.php:444 -msgid "Connect" +#: lib/action.php:447 +msgctxt "MENU" +msgid "Account" msgstr "" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "" -#: lib/action.php:448 +#: lib/action.php:453 +msgctxt "MENU" +msgid "Connect" +msgstr "" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" +#: lib/action.php:460 +msgctxt "MENU" +msgid "Admin" msgstr "" -#: lib/action.php:453 lib/subgroupnav.php:106 +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 #, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "" -#: lib/action.php:458 -msgid "Logout" +#: lib/action.php:467 +msgctxt "MENU" +msgid "Invite" msgstr "" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "" -#: lib/action.php:463 +#: lib/action.php:476 +msgctxt "MENU" +msgid "Logout" +msgstr "" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +msgctxt "TOOLTIP" msgid "Create an account" msgstr "" -#: lib/action.php:466 +#: lib/action.php:484 +msgctxt "MENU" +msgid "Register" +msgstr "" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" +#: lib/action.php:490 +msgctxt "MENU" +msgid "Login" msgstr "" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +msgctxt "TOOLTIP" msgid "Help me!" msgstr "" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" +#: lib/action.php:496 +msgctxt "MENU" +msgid "Help" msgstr "" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "" -#: lib/action.php:493 +#: lib/action.php:502 +msgctxt "MENU" +msgid "Search" +msgstr "" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "" + +#: lib/action.php:765 msgid "About" msgstr "" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." "broughtby%%](%%site.broughtbyurl%%). " msgstr "" -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "" -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4454,41 +4531,41 @@ msgid "" "org/licensing/licenses/agpl-3.0.html)." msgstr "" -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "" @@ -4504,50 +4581,97 @@ msgstr "" msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "" -#: lib/adminpanelaction.php:323 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "" -#: lib/adminpanelaction.php:328 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +msgctxt "MENU" +msgid "Site" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "" -#: lib/adminpanelaction.php:333 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +msgctxt "MENU" +msgid "Design" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "" -#: lib/adminpanelaction.php:338 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +msgctxt "MENU" +msgid "User" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "" -#: lib/adminpanelaction.php:343 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +msgctxt "MENU" +msgid "Access" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "" -#: lib/adminpanelaction.php:348 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "" +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +msgctxt "MENU" +msgid "Sessions" +msgstr "" + #: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" @@ -4642,11 +4766,11 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:182 lib/authenticationplugin.php:187 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "" -#: lib/authenticationplugin.php:197 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "" @@ -4803,7 +4927,7 @@ msgstr "" msgid "Subscribed to %s" msgstr "" -#: lib/command.php:582 +#: lib/command.php:582 lib/command.php:685 msgid "Specify the name of the user to unsubscribe from" msgstr "" @@ -4841,37 +4965,42 @@ msgstr "" msgid "This link is useable only once, and is good for only 2 minutes: %s" msgstr "" -#: lib/command.php:681 +#: 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:683 +#: 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:703 +#: lib/command.php:731 msgid "No one is subscribed to you." msgstr "" -#: lib/command.php:705 +#: 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:725 +#: lib/command.php:753 msgid "You are not a member of any groups." msgstr "" -#: lib/command.php:727 +#: 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:741 +#: lib/command.php:769 msgid "" "Commands:\n" "on - turn on notifications\n" @@ -4885,6 +5014,7 @@ msgid "" "d - direct message to user\n" "get - get last notice from user\n" "whois - get profile info on user\n" +"lose - force user to stop following you\n" "fav - add user's last notice as a 'fave'\n" "fav # - add notice with the given id as a 'fave'\n" "repeat # - repeat a notice with a given id\n" @@ -4912,19 +5042,19 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "" -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5110,23 +5240,23 @@ msgstr "" msgid "Not an image or corrupt file." msgstr "" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "" -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "" -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5419,6 +5549,11 @@ msgstr "" msgid "Available characters" msgstr "" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "" @@ -5539,6 +5674,10 @@ msgstr "" msgid "Favorites" msgstr "" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "" @@ -5648,6 +5787,10 @@ msgstr "" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "" + #: lib/searchaction.php:162 msgid "Search help" msgstr "" @@ -5699,6 +5842,15 @@ msgstr "" msgid "Groups %s is a member of" msgstr "" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -5769,47 +5921,47 @@ msgstr "" msgid "Moderate" msgstr "" -#: lib/util.php:1000 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "" -#: lib/util.php:1002 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "" -#: lib/util.php:1004 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:1006 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "" -#: lib/util.php:1008 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:1010 +#: lib/util.php:1023 msgid "about a day ago" msgstr "" -#: lib/util.php:1012 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:1014 +#: lib/util.php:1027 msgid "about a month ago" msgstr "" -#: lib/util.php:1016 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:1018 +#: lib/util.php:1031 msgid "about a year ago" msgstr "" diff --git a/locale/sv/LC_MESSAGES/statusnet.po b/locale/sv/LC_MESSAGES/statusnet.po index b09823e6b..b1ac66f65 100644 --- a/locale/sv/LC_MESSAGES/statusnet.po +++ b/locale/sv/LC_MESSAGES/statusnet.po @@ -9,76 +9,83 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:44+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:47+0000\n" "Language-Team: Swedish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: sv\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Åtkomst" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Inställningar för webbplatsåtkomst" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Registrering" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Privat" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" "Skall anonyma användare (inte inloggade) förhindras från att se webbplatsen?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Endast inbjudan" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Privat" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Gör så att registrering endast sker genom inbjudan." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Stängd" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Endast inbjudan" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Inaktivera nya registreringar." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Spara" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Stängd" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Spara inställningar för åtkomst" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Spara" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Ingen sådan sida" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -92,51 +99,59 @@ msgstr "Ingen sådan sida" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Ingen sådan användare." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s och vänner, sida %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s och vänner" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Flöden för %ss vänner (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Flöden för %ss vänner (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Flöden för %ss vänner (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "Detta är tidslinjen för %s och vänner, men ingen har skrivit något än." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -145,7 +160,8 @@ msgstr "" "Prova att prenumerera på fler personer, [gå med i en grupp](%%action.groups%" "%) eller skriv något själv." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -155,7 +171,7 @@ msgstr "" "någonting för hans eller hennes uppmärksamhet](%%%%action.newnotice%%%%?" "status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -164,7 +180,8 @@ msgstr "" "Varför inte [registrera ett konto](%%%%action.register%%%%) och sedan knuffa " "%s eller skriva en notis för hans eller hennes uppmärksamhet." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Du och vänner" @@ -182,20 +199,20 @@ msgstr "Uppdateringar från %1$s och vänner på %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "API-metod hittades inte." @@ -227,8 +244,9 @@ msgstr "Kunde inte uppdatera användare." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Användaren har ingen profil." @@ -254,7 +272,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -364,69 +382,69 @@ msgstr "Kunde inte fastställa användare hos källan." msgid "Could not find target user." msgstr "Kunde inte hitta målanvändare." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "" "Smeknamnet får endast innehålla små bokstäver eller siffror, inga mellanslag." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Smeknamnet används redan. Försök med ett annat." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Inte ett giltigt smeknamn." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Hemsida är inte en giltig URL." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Fullständigt namn är för långt (max 255 tecken)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Beskrivning är för lång (max 140 tecken)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Beskrivning av plats är för lång (max 255 tecken)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "För många alias! Maximum %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Ogiltigt alias: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Alias \"%s\" används redan. Försök med ett annat." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Alias kan inte vara samma som smeknamn." @@ -437,15 +455,15 @@ msgstr "Alias kan inte vara samma som smeknamn." msgid "Group not found!" msgstr "Grupp hittades inte!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Du är redan en medlem i denna grupp." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Du har blivit blockerad från denna grupp av administratören." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Kunde inte ansluta användare %1$s till grupp %2$s." @@ -454,7 +472,7 @@ msgstr "Kunde inte ansluta användare %1$s till grupp %2$s." msgid "You are not a member of this group." msgstr "Du är inte en medlem i denna grupp." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Kunde inte ta bort användare %1$s från grupp %2$s." @@ -485,7 +503,7 @@ msgstr "Ogiltig token." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -526,7 +544,7 @@ msgstr "Begäran-token %s har nekats och återkallats." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -552,13 +570,13 @@ msgstr "" "möjligheten att %3$s din %4$s kontoinformation. Du bör bara " "ge tillgång till ditt %4$s-konto till tredje-parter du litar på." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Konto" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -640,12 +658,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s uppdateringar markerade som favorit av %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s tidslinje" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -681,7 +699,7 @@ msgstr "Upprepat till %s" msgid "Repeats of %s" msgstr "Upprepningar av %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Notiser taggade med %s" @@ -702,8 +720,7 @@ msgstr "Ingen sådan bilaga." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Inget smeknamn." @@ -715,7 +732,7 @@ msgstr "Ingen storlek." msgid "Invalid size." msgstr "Ogiltig storlek." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -733,30 +750,30 @@ msgid "User without matching profile" msgstr "Användare utan matchande profil" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Avatarinställningar" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Orginal" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Förhandsgranska" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Ta bort" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Ladda upp" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Beskär" @@ -764,7 +781,7 @@ msgstr "Beskär" msgid "Pick a square area of the image to be your avatar" msgstr "Välj ett kvadratiskt område i bilden som din avatar" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Förlorade vår fildata." @@ -799,22 +816,22 @@ msgstr "" "framtiden och du kommer inte bli underrättad om några @-svar från dem." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Nej" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Blockera inte denna användare" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Ja" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Blockera denna användare" @@ -822,40 +839,44 @@ msgstr "Blockera denna användare" msgid "Failed to save block information." msgstr "Misslyckades att spara blockeringsinformation." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Ingen sådan grupp." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "%s blockerade profiler" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%1$s blockerade profiler, sida %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" "En lista med de användare som blockerats från att gå med i denna grupp." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Häv blockering av användare från grupp" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Häv blockering" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Häv blockering av denna användare" @@ -930,7 +951,7 @@ msgstr "Du är inte ägaren av denna applikation." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Det var ett problem med din sessions-token." @@ -956,12 +977,13 @@ msgstr "Ta inte bort denna applikation" msgid "Delete this application" msgstr "Ta bort denna applikation" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Inte inloggad." @@ -990,7 +1012,7 @@ msgstr "Är du säker på att du vill ta bort denna notis?" msgid "Do not delete this notice" msgstr "Ta inte bort denna notis" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Ta bort denna notis" @@ -1006,7 +1028,7 @@ msgstr "Du kan bara ta bort lokala användare." msgid "Delete user" msgstr "Ta bort användare" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1014,12 +1036,12 @@ msgstr "" "Är du säker på att du vill ta bort denna användare? Det kommer rensa all " "data om användaren från databasen, utan en säkerhetskopia." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Ta bort denna användare" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Utseende" @@ -1122,6 +1144,17 @@ msgstr "Återställ standardutseende" msgid "Reset back to default" msgstr "Återställ till standardvärde" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Spara" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Spara utseende" @@ -1213,29 +1246,29 @@ msgstr "Redigera %s grupp" msgid "You must be logged in to create a group." msgstr "Du måste vara inloggad för att skapa en grupp." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Du måste vara en administratör för att redigera gruppen." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Använd detta formulär för att redigera gruppen." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "beskrivning är för lång (max %d tecken)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Kunde inte uppdatera grupp." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Kunde inte skapa alias." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Alternativ sparade." @@ -1576,7 +1609,7 @@ msgstr "Användaren är redan blockerad från grupp." msgid "User is not a member of group." msgstr "Användare är inte en gruppmedlem." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Blockera användare från grupp" @@ -1611,31 +1644,31 @@ msgstr "Ingen ID." msgid "You must be logged in to edit a group." msgstr "Du måste vara inloggad för att redigera en grupp." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Gruppens utseende" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" "Anpassa hur din grupp ser ut genom att välja bakgrundbild och färgpalett." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Kunde inte uppdatera dina utseendeinställningar." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Utseendeinställningar sparade." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Gruppens logotyp" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1643,57 +1676,57 @@ msgstr "" "Du kan ladda upp en logotypbild för din grupp. Den maximala filstorleken är %" "s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Användare utan matchande profil." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Välj ett kvadratiskt område i bilden som logotyp" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Logtyp uppdaterad." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Misslyckades uppdatera logtyp." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "%s gruppmedlemmar" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "%1$s gruppmedlemmar, sida %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "En lista av användarna i denna grupp." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Administratör" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Blockera" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Gör användare till en administratör för gruppen" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Gör till administratör" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Gör denna användare till administratör" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Uppdateringar från medlemmar i %1$s på %2$s!" @@ -1958,16 +1991,19 @@ msgstr "Personligt meddelande" msgid "Optionally add a personal message to the invitation." msgstr "Om du vill, skriv ett personligt meddelande till inbjudan." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Skicka" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s har bjudit in dig att gå med dem på %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2028,7 +2064,11 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Du måste vara inloggad för att kunna gå med i en grupp." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "Inget smeknamn eller ID." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s gick med i grupp %2$s" @@ -2037,11 +2077,11 @@ msgstr "%1$s gick med i grupp %2$s" msgid "You must be logged in to leave a group." msgstr "Du måste vara inloggad för att lämna en grupp." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Du är inte en medlem i den gruppen." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s lämnade grupp %2$s" @@ -2058,8 +2098,7 @@ msgstr "Felaktigt användarnamn eller lösenord." msgid "Error setting user. You are probably not authorized." msgstr "Fel vid inställning av användare. Du har sannolikt inte tillstånd." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Logga in" @@ -2313,8 +2352,8 @@ msgstr "innehållstyp " msgid "Only " msgstr "Bara " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Ett dataformat som inte stödjs" @@ -2453,7 +2492,7 @@ msgstr "Kan inte spara nytt lösenord." msgid "Password saved." msgstr "Lösenord sparat." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Sökvägar" @@ -2486,7 +2525,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Ogiltigt SSL-servernamn. Den maximala längden är 255 tecken." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Webbplats" @@ -2659,7 +2697,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 små bokstäver eller nummer, inga punkter eller mellanslag" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Fullständigt namn" @@ -2687,7 +2725,7 @@ msgid "Bio" msgstr "Biografi" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2771,7 +2809,8 @@ msgstr "Kunde inte spara profil." msgid "Couldn't save tags." msgstr "Kunde inte spara taggar." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Inställningar sparade." @@ -2784,28 +2823,28 @@ msgstr "Bortom sidbegränsningen (%s)" msgid "Could not retrieve public stream." msgstr "Kunde inte hämta publik ström." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Publik tidslinje, sida %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Publik tidslinje" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Publikt flöde av ström (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Publikt flöde av ström (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Publikt flöde av ström (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2814,11 +2853,11 @@ msgstr "" "Detta är den publika tidslinjen för %%site.name%% men ingen har postat något " "än." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Bli först att posta!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2826,7 +2865,7 @@ msgstr "" "Varför inte [registrera ett konto](%%action.register%%) och bli först att " "posta!" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2839,7 +2878,7 @@ msgstr "" "net/). [Gå med nu](%%action.register%%) för att dela notiser om dig själv " "med vänner, familj och kollegor! ([Läs mer](%%doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3018,8 +3057,7 @@ msgstr "Tyvärr, ogiltig inbjudningskod." msgid "Registration successful" msgstr "Registreringen genomförd" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Registrera" @@ -3208,7 +3246,7 @@ msgstr "Du kan inte upprepa din egna notis." msgid "You already repeated that notice." msgstr "Du har redan upprepat denna notis." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Upprepad" @@ -3216,33 +3254,33 @@ msgstr "Upprepad" msgid "Repeated!" msgstr "Upprepad!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Svarat till %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Svar till %1$s, sida %2$s" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Flöde med svar för %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Flöde med svar för %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Flöde med svar för %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3251,7 +3289,7 @@ msgstr "" "Detta är tidslinjen som visar svar till %s1$ men %2$s har inte tagit emot en " "notis för dennes uppmärksamhet än." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3260,7 +3298,7 @@ msgstr "" "Du kan engagera andra användare i en konversation, prenumerera på fler " "personer eller [gå med i grupper](%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3287,7 +3325,6 @@ msgid "User is already sandboxed." msgstr "Användare är redan flyttad till sandlådan." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Sessioner" @@ -3312,7 +3349,7 @@ msgid "Turn on debugging output for sessions." msgstr "Sätt på felsökningsutdata för sessioner." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Spara webbplatsinställningar" @@ -3342,7 +3379,7 @@ msgstr "Organisation" msgid "Description" msgstr "Beskrivning" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Statistik" @@ -3406,22 +3443,22 @@ msgstr "%1$ss favoritnotiser, sida %2$d" msgid "Could not retrieve favorite notices." msgstr "Kunde inte hämta favoritnotiser." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Flöde för %ss favoriter (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Flöde för %ss favoriter (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Flöde för %ss favoriter (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3430,7 +3467,7 @@ msgstr "" "bredvid någon notis du skulle vilja bokmärka för senare tillfälle eller för " "att sätta strålkastarljuset på." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3439,7 +3476,7 @@ msgstr "" "%s har inte lagt till några notiser till sina favoriter ännu. Posta något " "intressant de skulle lägga till sina favoriter :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3450,7 +3487,7 @@ msgstr "" "[registrera ett konto](%%%%action.register%%%%) och posta något intressant " "de skulle lägga till sina favoriter :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Detta är ett sätt att dela med av det du gillar." @@ -3464,67 +3501,67 @@ msgstr "%s grupp" msgid "%1$s group, page %2$d" msgstr "%1$s grupp, sida %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Grupprofil" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Notis" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Alias" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Åtgärder för grupp" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Flöde av notiser för %s grupp (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Flöde av notiser för %s grupp (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Flöde av notiser för %s grupp (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "FOAF för %s grupp" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Medlemmar" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Ingen)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Alla medlemmar" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Skapad" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3539,7 +3576,7 @@ msgstr "" "sina liv och intressen. [Gå med nu](%%%%action.register%%%%) för att bli en " "del av denna grupp och många fler! ([Läs mer](%%%%doc.help%%%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3552,7 +3589,7 @@ msgstr "" "[StatusNet](http://status.net/). Dess medlemmar delar korta meddelande om " "sina liv och intressen. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Administratörer" @@ -3924,17 +3961,15 @@ msgstr "Kunde inte spara prenumeration." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." -msgstr "" +msgstr "Denna åtgärd accepterar endast POST-begäran." #: actions/subscribe.php:107 -#, fuzzy msgid "No such profile." -msgstr "Ingen sådan fil." +msgstr "Ingen sådan profil." #: 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." +msgstr "Du kan inte prenumerera på en 0MB 0.1-fjärrprofil med denna åtgärd." #: actions/subscribe.php:145 msgid "Subscribed" @@ -4029,22 +4064,22 @@ msgstr "Jabber" msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Notiser taggade med %1$s, sida %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Flöde av notiser för tagg %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Flöde av notiser för tagg %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Flöde av notiser för tagg %s (Atom)" @@ -4099,7 +4134,7 @@ msgstr "" msgid "No such tag." msgstr "Ingen sådan tagg." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API-metoden är under uppbyggnad." @@ -4131,72 +4166,74 @@ msgstr "" "Licensen för lyssnarströmmen '%1$s' är inte förenlig med webbplatslicensen '%" "2$s'." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Användare" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Användarinställningar för denna StatusNet-webbplats" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Ogiltig begränsning av biografi. Måste vara numerisk." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "Ogiltig välkomsttext. Maximal längd är 255 tecken." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Ogiltig standardprenumeration: '%1$s' är inte användare." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Begränsning av biografi" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Maximal teckenlängd av profilbiografi." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Nya användare" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Välkomnande av ny användare" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Välkomsttext för nya användare (max 255 tecken)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Standardprenumerationer" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "" "Lägg automatiskt till en prenumeration på denna användare för alla nya " "användare." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Inbjudningar" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Inbjudningar aktiverade" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "Hurvida användare skall tillåtas bjuda in nya användare." @@ -4392,7 +4429,7 @@ msgstr "" msgid "Plugins" msgstr "Insticksmoduler" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Version" @@ -4431,6 +4468,10 @@ msgstr "Inte med i grupp." msgid "Group leave failed." msgstr "Grupputträde misslyckades." +#: classes/Local_group.php:41 +msgid "Could not update local group." +msgstr "Kunde inte uppdatera lokal grupp." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4448,27 +4489,27 @@ msgstr "Kunde inte infoga meddelande." msgid "Could not update message with new URI." msgstr "Kunde inte uppdatera meddelande med ny URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Databasfel vid infogning av hashtag: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Problem vid sparande av notis. För långt." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Problem vid sparande av notis. Okänd användare." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "För många notiser för snabbt; ta en vilopaus och posta igen om ett par " "minuter." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4476,19 +4517,19 @@ msgstr "" "För många duplicerade meddelanden för snabbt; ta en vilopaus och posta igen " "om ett par minuter." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Du är utestängd från att posta notiser på denna webbplats." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Problem med att spara notis." -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "Problem med att spara gruppinkorg." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4517,19 +4558,27 @@ msgstr "Kunde inte ta bort själv-prenumeration." msgid "Couldn't delete subscription." msgstr "Kunde inte ta bort prenumeration." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Välkommen till %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Kunde inte skapa grupp." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +msgid "Could not set group URI." +msgstr "Kunde inte ställa in grupp-URI." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Kunde inte ställa in gruppmedlemskap." +#: classes/User_group.php:506 +msgid "Could not save local group info." +msgstr "Kunde inte spara lokal gruppinformation." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Ändra dina profilinställningar" @@ -4571,120 +4620,190 @@ msgstr "Namnlös sida" msgid "Primary site navigation" msgstr "Primär webbplatsnavigation" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Hem" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Personlig profil och vänners tidslinje" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Personligt" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Ändra din e-post, avatar, lösenord, profil" -#: lib/action.php:444 -msgid "Connect" -msgstr "Anslut" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Konto" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Anslut till tjänster" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Anslut" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Ändra webbplatskonfiguration" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Bjud in" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Administratör" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Bjud in vänner och kollegor att gå med dig på %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Logga ut" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Bjud in" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Logga ut från webbplatsen" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Logga ut" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Skapa ett konto" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Registrera" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Logga in på webbplatsen" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Hjälp" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Logga in" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Hjälp mig!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Sök" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Hjälp" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Sök efter personer eller text" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Sök" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Webbplatsnotis" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Lokala vyer" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Sidnotis" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Sekundär webbplatsnavigation" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Hjälp" + +#: lib/action.php:765 msgid "About" msgstr "Om" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "Frågor & svar" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "Användarvillkor" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Sekretess" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Källa" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Kontakt" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Emblem" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Programvarulicens för StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4693,12 +4812,12 @@ msgstr "" "**%%site.name%%** är en mikrobloggtjänst tillhandahållen av [%%site.broughtby" "%%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** är en mikrobloggtjänst. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4709,107 +4828,160 @@ msgstr "" "version %s, tillgänglig under [GNU Affero General Public License](http://www." "fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Licens för webbplatsinnehåll" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "Innehåll och data av %1$s är privat och konfidensiell." -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "Innehåll och data copyright av %1$s. Alla rättigheter reserverade." -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "Innehåll och data copyright av medarbetare. Alla rättigheter reserverade." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Alla " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "licens." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Numrering av sidor" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Senare" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Tidigare" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." -msgstr "" +msgstr "Kan inte hantera fjärrinnehåll ännu." -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." -msgstr "" +msgstr "Kan inte hantera inbäddat XML-innehåll ännu." -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." -msgstr "" +msgstr "Kan inte hantera inbäddat Base64-innehåll ännu." -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Du kan inte göra förändringar av denna webbplats." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Ändringar av den panelen tillåts inte." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() är inte implementerat." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSetting() är inte implementerat." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Kunde inte ta bort utseendeinställning." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Grundläggande webbplatskonfiguration" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Webbplats" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Konfiguration av utseende" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Utseende" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Konfiguration av användare" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Användare" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Konfiguration av åtkomst" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Åtkomst" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Konfiguration av sökvägar" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Sökvägar" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Konfiguration av sessioner" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Sessioner" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "API-resursen kräver läs- och skrivrättigheter, men du har bara läsrättighet." -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4902,11 +5074,11 @@ msgstr "Notiser där denna bilaga förekommer" msgid "Tags for this attachment" msgstr "Taggar för denna billaga" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Byte av lösenord misslyckades" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "Byte av lösenord är inte tillåtet" @@ -5106,9 +5278,9 @@ msgstr "" "Denna länk är endast användbar en gång, och gäller bara i 2 minuter: %s" #: lib/command.php:692 -#, fuzzy, php-format +#, php-format msgid "Unsubscribed %s" -msgstr "Prenumeration hos %s avslutad" +msgstr "Prenumeration avslutad %s" #: lib/command.php:709 msgid "You are not subscribed to anyone." @@ -5141,7 +5313,6 @@ msgstr[0] "Du är en medlem i denna grupp:" msgstr[1] "Du är en medlem i dessa grupper:" #: lib/command.php:769 -#, fuzzy msgid "" "Commands:\n" "on - turn on notifications\n" @@ -5194,6 +5365,7 @@ msgstr "" "d - direktmeddelande till användare\n" "get - hämta senaste notis från användare\n" "whois - hämta profilinformation om användare\n" +"lose - tvinga användare att sluta följa dig\n" "fav - lägg till användarens senaste notis som favorit\n" "fav # - lägg till notis med given id som favorit\n" "repeat # - upprepa en notis med en given id\n" @@ -5220,19 +5392,19 @@ msgstr "" "tracks - inte implementerat än.\n" "tracking - inte implementerat än.\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Ingen konfigurationsfil hittades. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "Jag letade efter konfigurationsfiler på följande platser: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "Du kanske vill köra installeraren för att åtgärda detta." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Gå till installeraren." @@ -5420,23 +5592,23 @@ msgstr "Systemfel vid uppladdning av fil." msgid "Not an image or corrupt file." msgstr "Inte en bildfil eller så är filen korrupt." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Bildfilens format stödjs inte." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Förlorade vår fil." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Okänd filtyp" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "MB" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "kB" @@ -5818,6 +5990,11 @@ msgstr "Till" msgid "Available characters" msgstr "Tillgängliga tecken" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Skicka" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Skicka en notis" @@ -5876,23 +6053,23 @@ msgstr "V" msgid "at" msgstr "på" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "i sammanhang" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Upprepad av" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Svara på denna notis" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Svara" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Notis upprepad" @@ -5940,6 +6117,10 @@ msgstr "Svar" msgid "Favorites" msgstr "Favoriter" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Användare" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Inkorg" @@ -6029,7 +6210,7 @@ msgstr "Upprepa denna notis?" msgid "Repeat this notice" msgstr "Upprepa denna notis" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "Ingen enskild användare definierad för enanvändarläge." @@ -6049,6 +6230,10 @@ msgstr "Sök webbplats" msgid "Keyword(s)" msgstr "Nyckelord" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Sök" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Sök hjälp" @@ -6100,6 +6285,15 @@ msgstr "Personer som prenumererar på %s" msgid "Groups %s is a member of" msgstr "Grupper %s är en medlem i" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Bjud in" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Bjud in vänner och kollegor att gå med dig på %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6170,47 +6364,47 @@ msgstr "Meddelande" msgid "Moderate" msgstr "Moderera" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "ett par sekunder sedan" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "för nån minut sedan" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "för %d minuter sedan" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "för en timma sedan" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "för %d timmar sedan" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "för en dag sedan" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "för %d dagar sedan" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "för en månad sedan" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "för %d månader sedan" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "för ett år sedan" diff --git a/locale/te/LC_MESSAGES/statusnet.po b/locale/te/LC_MESSAGES/statusnet.po index 09ede3d86..f0527f3fa 100644 --- a/locale/te/LC_MESSAGES/statusnet.po +++ b/locale/te/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Telugu # +# Author@translatewiki.net: Brion # Author@translatewiki.net: Veeven # -- # This file is distributed under the same license as the StatusNet package. @@ -8,78 +9,85 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:47+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:50+0000\n" "Language-Team: Telugu\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: te\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "అంగీకరించు" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "సైటు అందుబాటు అమరికలు" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "నమోదు" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "అంతరంగికం" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "అజ్ఞాత (ప్రవేశించని) వాడుకరులని సైటుని చూడకుండా నిషేధించాలా?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "ఆహ్వానితులకు మాత్రమే" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "అంతరంగికం" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "ఆహ్వానితులు మాత్రమే నమోదు అవ్వగలిగేలా చెయ్యి." -#: actions/accessadminpanel.php:173 -#, fuzzy -msgid "Closed" -msgstr "అటువంటి వాడుకరి లేరు." +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "ఆహ్వానితులకు మాత్రమే" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "కొత్త నమోదులను అచేతనంచేయి." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "భద్రపరచు" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +#, fuzzy +msgid "Closed" +msgstr "అటువంటి వాడుకరి లేరు." -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "సైటు అమరికలను భద్రపరచు" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "భద్రపరచు" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "అటువంటి పేజీ లేదు" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -93,72 +101,82 @@ msgstr "అటువంటి పేజీ లేదు" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "అటువంటి వాడుకరి లేరు." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s మరియు మిత్రులు, పేజీ %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s మరియు మిత్రులు" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "%s యొక్క మిత్రుల ఫీడు (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "%s యొక్క మిత్రుల ఫీడు (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "%s యొక్క మిత్రుల ఫీడు (ఆటమ్)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "ఇది %s మరియు మిత్రుల కాలరేఖ కానీ ఇంకా ఎవరూ ఏమీ రాయలేదు." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "ఇతరులకి చందా చేరండి, [ఏదైనా గుంపులో చేరండి](%%action.groups%%) లేదా మీరే ఏదైనా వ్రాయండి." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "మీరు మరియు మీ స్నేహితులు" @@ -176,20 +194,20 @@ msgstr "" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "నిర్ధారణ సంకేతం కనబడలేదు." @@ -223,8 +241,9 @@ msgstr "వాడుకరిని తాజాకరించలేకున #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "వాడుకరికి ప్రొఫైలు లేదు." @@ -249,7 +268,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -363,68 +382,68 @@ msgstr "వాడుకరిని తాజాకరించలేకున msgid "Could not find target user." msgstr "లక్ష్యిత వాడుకరిని కనుగొనలేకపోయాం." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "పేరులో చిన్నబడి అక్షరాలు మరియు అంకెలు మాత్రమే ఖాళీలు లేకుండా ఉండాలి." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "ఆ పేరుని ఇప్పటికే వాడుతున్నారు. మరోటి ప్రయత్నించండి." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "సరైన పేరు కాదు." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "హోమ్ పేజీ URL సరైనది కాదు." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "పూర్తి పేరు చాలా పెద్దగా ఉంది (గరిష్ఠంగా 255 అక్షరాలు)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "వివరణ చాలా పెద్దగా ఉంది (%d అక్షరాలు గరిష్ఠం)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "ప్రాంతం పేరు మరీ పెద్దగా ఉంది (255 అక్షరాలు గరిష్ఠం)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "చాలా మారుపేర్లు! %d గరిష్ఠం." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "తప్పుడు మారుపేరు: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "\"%s\" అన్న మారుపేరుని ఇప్పటికే వాడుతున్నారు. మరొకటి ప్రయత్నించండి." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "మారుపేరు పేరుతో సమానంగా ఉండకూడదు." @@ -435,15 +454,15 @@ msgstr "మారుపేరు పేరుతో సమానంగా ఉం msgid "Group not found!" msgstr "గుంపు దొరకలేదు!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "మీరు ఇప్పటికే ఆ గుంపులో సభ్యులు." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "నిర్వాహకులు ఆ గుంపు నుండి మిమ్మల్ని నిరోధించారు." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "ఓపెన్ఐడీ ఫారమును సృష్టించలేకపోయాం: %s" @@ -452,7 +471,7 @@ msgstr "ఓపెన్ఐడీ ఫారమును సృష్టించ msgid "You are not a member of this group." msgstr "మీరు ఈ గుంపులో సభ్యులు కాదు." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "వాడుకరి %sని %s గుంపు నుండి తొలగించలేకపోయాం." @@ -484,7 +503,7 @@ msgstr "తప్పుడు పరిమాణం." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -527,7 +546,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -550,13 +569,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "ఖాతా" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -638,12 +657,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s యొక్క మైక్రోబ్లాగు" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s కాలరేఖ" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -679,7 +698,7 @@ msgstr "%sకి స్పందనలు" msgid "Repeats of %s" msgstr "%s యొక్క పునరావృతాలు" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "" @@ -700,8 +719,7 @@ msgstr "అటువంటి జోడింపు లేదు." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 #, fuzzy msgid "No nickname." msgstr "పేరు లేదు." @@ -714,7 +732,7 @@ msgstr "పరిమాణం లేదు." msgid "Invalid size." msgstr "తప్పుడు పరిమాణం." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "అవతారం" @@ -731,30 +749,30 @@ msgid "User without matching profile" msgstr "" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "అవతారపు అమరికలు" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "అసలు" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "మునుజూపు" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "తొలగించు" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "ఎగుమతించు" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "కత్తిరించు" @@ -762,7 +780,7 @@ msgstr "కత్తిరించు" msgid "Pick a square area of the image to be your avatar" msgstr "మీ అవతారానికి గానూ ఈ చిత్రం నుండి ఒక చతురస్రపు ప్రదేశాన్ని ఎంచుకోండి" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -794,22 +812,22 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "కాదు" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "ఈ వాడుకరిని నిరోధించకు" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "అవును" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "ఈ వాడుకరిని నిరోధించు" @@ -817,40 +835,44 @@ msgstr "ఈ వాడుకరిని నిరోధించు" msgid "Failed to save block information." msgstr "నిరోధపు సమాచారాన్ని భద్రపరచడంలో విఫలమయ్యాం." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "అటువంటి గుంపు లేదు." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "వాడుకరికి ప్రొఫైలు లేదు." -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s మరియు మిత్రులు" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "ఈ గుంపు లోనికి చేరకుండా నిరోధించిన వాడుకరుల యొక్క జాబితా." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 #, fuzzy msgid "Unblock user from group" msgstr "అటువంటి వాడుకరి లేరు." -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 #, fuzzy msgid "Unblock this user" msgstr "అటువంటి వాడుకరి లేరు." @@ -926,7 +948,7 @@ msgstr "మీరు ఈ ఉపకరణం యొక్క యజమాని #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -951,12 +973,13 @@ msgstr "ఈ ఉపకరణాన్ని తొలగించకు" msgid "Delete this application" msgstr "ఈ ఉపకరణాన్ని తొలగించు" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "లోనికి ప్రవేశించలేదు." @@ -983,7 +1006,7 @@ msgstr "మీరు నిజంగానే ఈ నోటీసుని త msgid "Do not delete this notice" msgstr "ఈ నోటీసుని తొలగించకు" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "ఈ నోటీసుని తొలగించు" @@ -999,7 +1022,7 @@ msgstr "మీరు స్థానిక వాడుకరులను మా msgid "Delete user" msgstr "వాడుకరిని తొలగించు" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1007,12 +1030,12 @@ msgstr "" "మీరు నిజంగానే ఈ వాడుకరిని తొలగించాలనుకుంటున్నారా? ఇది ఆ వాడుకరి భోగట్టాని డాటాబేసు నుండి తొలగిస్తుంది, " "వెనక్కి తేలేకుండా." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "ఈ వాడుకరిని తొలగించు" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "రూపురేఖలు" @@ -1113,6 +1136,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "భద్రపరచు" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "రూపురేఖలని భద్రపరచు" @@ -1208,29 +1242,29 @@ msgstr "%s గుంపుని మార్చు" msgid "You must be logged in to create a group." msgstr "గుంపుని సృష్టించడానికి మీరు లోనికి ప్రవేశించాలి." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "గుంపుని మార్చడానికి మీరు నిర్వాహకులయి ఉండాలి." -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "గుంపుని మార్చడానికి ఈ ఫారాన్ని ఉపయోగించండి." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "వివరణ చాలా పెద్దదిగా ఉంది (140 అక్షరాలు గరిష్ఠం)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "గుంపుని తాజాకరించలేకున్నాం." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "మారుపేర్లని సృష్టించలేకపోయాం." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "ఎంపికలు భద్రమయ్యాయి." @@ -1560,7 +1594,7 @@ msgstr "వాడుకరిని ఇప్పటికే గుంపున msgid "User is not a member of group." msgstr "వాడుకరి ఈ గుంపులో సభ్యులు కాదు." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "వాడుకరిని గుంపు నుండి నిరోధించు" @@ -1595,88 +1629,88 @@ msgstr "ఐడీ లేదు." msgid "You must be logged in to edit a group." msgstr "గుంపుని మార్చడానికి మీరు ప్రవేశించి ఉండాలి." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "గుంపు అలంకారం" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "మీ రూపురేఖలని తాజాకరించలేకపోయాం." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "అభిరుచులు భద్రమయ్యాయి." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "గుంపు చిహ్నం" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "మీ గుంపుకి మీరు ఒక చిహ్నాన్ని ఎక్కించవచ్చు. ఆ ఫైలు యొక్క గరిష్ఠ పరిమాణం %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "వాడుకరికి ప్రొఫైలు లేదు." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "చిహ్నంగా ఉండాల్సిన చతురస్త్ర ప్రదేశాన్ని బొమ్మ నుండి ఎంచుకోండి." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "చిహ్నాన్ని తాజాకరించాం." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "చిహ్నపు తాజాకరణ విఫలమైంది." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "%s గుంపు సభ్యులు" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "%1$s గుంపు సభ్యులు, పేజీ %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "ఈ గుంపులో వాడుకరులు జాబితా." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "నిరోధించు" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "వాడుకరిని గుంపుకి ఒక నిర్వాహకునిగా చేయి" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "నిర్వాహకున్ని చేయి" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "ఈ వాడుకరిని నిర్వాహకున్ని చేయి" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "%s యొక్క మైక్రోబ్లాగు" @@ -1921,16 +1955,19 @@ msgstr "వ్యక్తిగత సందేశం" msgid "Optionally add a personal message to the invitation." msgstr "ఐచ్ఛికంగా ఆహ్వానానికి వ్యక్తిగత సందేశం చేర్చండి." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "పంపించు" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%2$sలో చేరమని %1$s మిమ్మల్ని ఆహ్వానించారు" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -1965,7 +2002,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "గుంపుల్లో చేరడానికి మీరు ప్రవేశించి ఉండాలి." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "పేరు లేదు." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s %2$s గుంపులో చేరారు" @@ -1974,11 +2016,11 @@ msgstr "%1$s %2$s గుంపులో చేరారు" msgid "You must be logged in to leave a group." msgstr "గుంపుని వదిలివెళ్ళడానికి మీరు ప్రవేశించి ఉండాలి." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "మీరు ఆ గుంపులో సభ్యులు కాదు." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%2$s గుంపు నుండి %1$s వైదొలిగారు" @@ -1995,8 +2037,7 @@ msgstr "వాడుకరిపేరు లేదా సంకేతపదం msgid "Error setting user. You are probably not authorized." msgstr "" -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "ప్రవేశించండి" @@ -2190,9 +2231,8 @@ msgid "You must be logged in to list your applications." msgstr "మీ ఉపకరణాలను చూడడానికి మీరు ప్రవేశించి ఉండాలి." #: actions/oauthappssettings.php:74 -#, fuzzy msgid "OAuth applications" -msgstr "ఇతర ఎంపికలు" +msgstr "OAuth ఉపకరణాలు" #: actions/oauthappssettings.php:85 msgid "Applications you have registered" @@ -2245,8 +2285,8 @@ msgstr "విషయ రకం " msgid "Only " msgstr "మాత్రమే " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "" @@ -2390,7 +2430,7 @@ msgstr "కొత్త సంకేతపదాన్ని భద్రపర msgid "Password saved." msgstr "సంకేతపదం భద్రమయ్యింది." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2423,7 +2463,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "సైటు" @@ -2601,7 +2640,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 చిన్నబడి అక్షరాలు లేదా అంకెలు, విరామచిహ్నాలు మరియు ఖాళీలు తప్ప" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "పూర్తి పేరు" @@ -2629,7 +2668,7 @@ msgid "Bio" msgstr "స్వపరిచయం" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2710,7 +2749,8 @@ msgstr "ప్రొఫైలుని భద్రపరచలేకున్ msgid "Couldn't save tags." msgstr "ట్యాగులని భద్రపరచలేకున్నాం." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "అమరికలు భద్రమయ్యాయి." @@ -2723,48 +2763,48 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "ప్రజా కాలరేఖ, పేజీ %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "ప్రజా కాలరేఖ" -#: actions/public.php:159 +#: actions/public.php:160 #, fuzzy msgid "Public Stream Feed (RSS 1.0)" msgstr "ప్రజా వాహిని ఫీడు" -#: actions/public.php:163 +#: actions/public.php:164 #, fuzzy msgid "Public Stream Feed (RSS 2.0)" msgstr "ప్రజా వాహిని ఫీడు" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "ప్రజా వాహిని ఫీడు" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2773,7 +2813,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2946,8 +2986,7 @@ msgstr "క్షమించండి, తప్పు ఆహ్వాన స msgid "Registration successful" msgstr "నమోదు విజయవంతం" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "నమోదు" @@ -3122,7 +3161,7 @@ msgstr "ఈ లైసెన్సుకి అంగీకరించకపో msgid "You already repeated that notice." msgstr "మీరు ఇప్పటికే ఆ వాడుకరిని నిరోధించారు." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "సృష్టితం" @@ -3132,40 +3171,40 @@ msgstr "సృష్టితం" msgid "Repeated!" msgstr "సృష్టితం" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "%sకి స్పందనలు" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "%sకి స్పందనలు" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "%s యొక్క సందేశముల ఫీడు" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "%s యొక్క సందేశముల ఫీడు" -#: actions/replies.php:158 +#: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" msgstr "%s యొక్క సందేశముల ఫీడు" -#: actions/replies.php:198 +#: actions/replies.php:199 #, fuzzy, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "ఇది %s మరియు మిత్రుల కాలరేఖ కానీ ఇంకా ఎవరూ ఏమీ రాయలేదు." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3174,7 +3213,7 @@ msgstr "" "మీరు ఇతర వాడుకరులతో సంభాషించవచ్చు, మరింత మంది వ్యక్తులకు చందాచేరవచ్చు లేదా [గుంపులలో చేరవచ్చు]" "(%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3201,7 +3240,6 @@ msgid "User is already sandboxed." msgstr "వాడుకరిని ఇప్పటికే గుంపునుండి నిరోధించారు." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3227,7 +3265,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "సైటు అమరికలను భద్రపరచు" @@ -3258,7 +3296,7 @@ msgstr "సంస్ధ" msgid "Description" msgstr "వివరణ" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "గణాంకాలు" @@ -3321,35 +3359,35 @@ msgstr "%1$sకి ఇష్టమైన నోటీసులు, పేజీ msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "%s యొక్క మిత్రుల ఫీడు" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "%s యొక్క మిత్రుల ఫీడు" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "%s యొక్క ఇష్టాంశాల ఫీడు (ఆటమ్)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3357,7 +3395,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "మీకు నచ్చినవి పంచుకోడానికి ఇదొక మార్గం." @@ -3371,67 +3409,67 @@ msgstr "%s గుంపు" msgid "%1$s group, page %2$d" msgstr "%1$s గుంపు సభ్యులు, పేజీ %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "గుంపు ప్రొఫైలు" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "గమనిక" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "మారుపేర్లు" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "గుంపు చర్యలు" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "%s యొక్క సందేశముల ఫీడు" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "%s యొక్క సందేశముల ఫీడు" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "%s యొక్క సందేశముల ఫీడు" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "%s గుంపు" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "సభ్యులు" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(ఏమీలేదు)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "అందరు సభ్యులూ" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "సృష్టితం" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3441,7 +3479,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3450,7 +3488,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "నిర్వాహకులు" @@ -3905,22 +3943,22 @@ msgstr "జాబర్" msgid "SMS" msgstr "" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "%s యొక్క మైక్రోబ్లాగు" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "%s యొక్క సందేశముల ఫీడు" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "%s యొక్క సందేశముల ఫీడు" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "%s యొక్క సందేశముల ఫీడు" @@ -3971,7 +4009,7 @@ msgstr "" msgid "No such tag." msgstr "అటువంటి ట్యాగు లేదు." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "" @@ -4004,71 +4042,73 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "వాడుకరి" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "ఈ స్టేటస్‌నెట్ సైటుకి వాడుకరి అమరికలు." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "ప్రొఫైలు" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "స్వపరిచయ పరిమితి" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "స్వపరిచయం యొక్క గరిష్ఠ పొడవు, అక్షరాలలో." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "కొత్త వాడుకరులు" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "కొత్త వాడుకరి స్వాగతం" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "కొత్త వాడుకరులకై స్వాగత సందేశం (255 అక్షరాలు గరిష్ఠం)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "అప్రమేయ చందా" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "ఉపయోగించాల్సిన యాంత్రిక కుదింపు సేవ." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "ఆహ్వానాలు" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "ఆహ్వానాలని చేతనంచేసాం" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "వాడుకరులను కొత్త వారిని ఆహ్వానించడానికి అనుమతించాలా వద్దా." @@ -4241,7 +4281,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "సంచిక" @@ -4278,6 +4318,11 @@ msgstr "గుంపులో భాగం కాదు." msgid "Group leave failed." msgstr "గుంపు నుండి వైదొలగడం విఫలమైంది." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "గుంపుని తాజాకరించలేకున్నాం." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4295,46 +4340,46 @@ msgstr "" msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు." -#: classes/Notice.php:226 +#: classes/Notice.php:243 #, fuzzy msgid "Problem saving notice. Unknown user." msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "ఈ సైటులో నోటీసులు రాయడం నుండి మిమ్మల్ని నిషేధించారు." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -4365,19 +4410,29 @@ msgstr "చందాని తొలగించలేకపోయాం." msgid "Couldn't delete subscription." msgstr "చందాని తొలగించలేకపోయాం." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "@%2$s, %1$sకి స్వాగతం!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "గుంపుని సృష్టించలేకపోయాం." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "గుంపు సభ్యత్వాన్ని అమర్చలేకపోయాం." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "గుంపు సభ్యత్వాన్ని అమర్చలేకపోయాం." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "చందాని సృష్టించలేకపోయాం." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "" @@ -4420,122 +4475,190 @@ msgstr "" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "ముంగిలి" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "వ్యక్తిగత" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "మీ ఈమెయిలు, అవతారం, సంకేతపదం మరియు ప్రౌఫైళ్ళను మార్చుకోండి" -#: lib/action.php:444 -msgid "Connect" -msgstr "అనుసంధానించు" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "ఖాతా" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" -msgstr "" +msgstr "అనుసంధానాలు" + +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "అనుసంధానించు" -#: lib/action.php:448 +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 #, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "చందాలు" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "ఆహ్వానించు" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "నిర్వాహకులు" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" -msgstr "" +msgstr "ఈ ఫారాన్ని ఉపయోగించి మీ స్నేహితులను మరియు సహోద్యోగులను ఈ సేవను వినియోగించుకోమని ఆహ్వానించండి." -#: lib/action.php:458 -msgid "Logout" -msgstr "నిష్క్రమించు" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "ఆహ్వానించు" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "సైటు నుండి నిష్క్రమించు" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "నిష్క్రమించు" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "కొత్త ఖాతా సృష్టించు" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "నమోదు" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "సైటులోని ప్రవేశించు" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "సహాయం" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "ప్రవేశించండి" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "సహాయం కావాలి!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "వెతుకు" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "సహాయం" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" -msgstr "" +msgstr "మరిన్ని గుంపులకై వెతుకు" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "వెతుకు" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "సైటు గమనిక" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "స్థానిక వీక్షణలు" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "పేజీ గమనిక" -#: lib/action.php:727 +#: lib/action.php:758 #, fuzzy msgid "Secondary site navigation" msgstr "చందాలు" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "సహాయం" + +#: lib/action.php:765 msgid "About" msgstr "గురించి" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "ప్రశ్నలు" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "సేవా నియమాలు" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "అంతరంగికత" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "మూలము" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "సంప్రదించు" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "బాడ్జి" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "స్టేటస్‌నెట్ మృదూపకరణ లైసెన్సు" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4544,12 +4667,12 @@ msgstr "" "**%%site.name%%** అనేది [%%site.broughtby%%](%%site.broughtbyurl%%) వారు " "అందిస్తున్న మైక్రో బ్లాగింగు సదుపాయం. " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** అనేది మైక్రో బ్లాగింగు సదుపాయం." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4560,109 +4683,161 @@ msgstr "" "html) కింద లభ్యమయ్యే [స్టేటస్‌నెట్](http://status.net/) మైక్రోబ్లాగింగ్ ఉపకరణం సంచిక %s " "పై నడుస్తుంది." -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "కొత్త సందేశం" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "అన్నీ " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "పేజీకరణ" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "తర్వాత" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "ఇంతక్రితం" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "ఈ సైటుకి మీరు మార్పులు చేయలేరు." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "ప్రాథమిక సైటు స్వరూపణం" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "సైటు" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "రూపకల్పన స్వరూపణం" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "రూపురేఖలు" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "వాడుకరి స్వరూపణం" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "వాడుకరి" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "SMS నిర్ధారణ" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "అంగీకరించు" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "SMS నిర్ధారణ" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "రూపకల్పన స్వరూపణం" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "సంచిక" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4720,11 +4895,11 @@ msgstr "" #: lib/applicationeditform.php:297 msgid "Read-only" -msgstr "" +msgstr "చదవడం-మాత్రమే" #: lib/applicationeditform.php:315 msgid "Read-write" -msgstr "" +msgstr "చదవడం-వ్రాయడం" #: lib/applicationeditform.php:316 msgid "Default access for this application: read-only, or read-write" @@ -4756,12 +4931,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "సంకేతపదం మార్పు" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "సంకేతపదం మార్పు" @@ -5041,20 +5216,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "నిర్ధారణ సంకేతం లేదు." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5244,24 +5419,24 @@ msgstr "" msgid "Not an image or corrupt file." msgstr "బొమ్మ కాదు లేదా పాడైపోయిన ఫైలు." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "" -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "అటువంటి సందేశమేమీ లేదు." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "తెలియని ఫైలు రకం" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "మెబై" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "కిబై" @@ -5576,6 +5751,12 @@ msgstr "" msgid "Available characters" msgstr "అందుబాటులో ఉన్న అక్షరాలు" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "పంపించు" + #: lib/noticeform.php:160 #, fuzzy msgid "Send a notice" @@ -5635,24 +5816,24 @@ msgstr "ప" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "సందర్భంలో" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "సృష్టితం" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "ఈ నోటీసుపై స్పందించండి" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "స్పందించండి" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "నోటీసుని తొలగించాం." @@ -5703,6 +5884,10 @@ msgstr "స్పందనలు" msgid "Favorites" msgstr "ఇష్టాంశాలు" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "వాడుకరి" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "వచ్చినవి" @@ -5786,16 +5971,14 @@ msgid "Popular" msgstr "ప్రాచుర్యం" #: lib/repeatform.php:107 -#, fuzzy msgid "Repeat this notice?" -msgstr "ఈ నోటీసుపై స్పందించండి" +msgstr "ఈ నోటీసుని పునరావృతించాలా?" #: lib/repeatform.php:132 -#, fuzzy msgid "Repeat this notice" -msgstr "ఈ నోటీసుపై స్పందించండి" +msgstr "ఈ నోటీసుని పునరావృతించు" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5816,6 +5999,10 @@ msgstr "సైటుని వెతుకు" msgid "Keyword(s)" msgstr "కీపదము(లు)" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "వెతుకు" + #: lib/searchaction.php:162 msgid "Search help" msgstr "సహాయంలో వెతుకు" @@ -5869,6 +6056,15 @@ msgstr "%sకి చందాచేరిన వ్యక్తులు" msgid "Groups %s is a member of" msgstr "%s సభ్యులుగా ఉన్న గుంపులు" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "ఆహ్వానించు" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -5942,47 +6138,47 @@ msgstr "సందేశం" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "కొన్ని క్షణాల క్రితం" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "ఓ నిమిషం క్రితం" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "%d నిమిషాల క్రితం" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "ఒక గంట క్రితం" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "%d గంటల క్రితం" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "ఓ రోజు క్రితం" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "%d రోజుల క్రితం" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "ఓ నెల క్రితం" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "%d నెలల క్రితం" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "ఒక సంవత్సరం క్రితం" diff --git a/locale/tr/LC_MESSAGES/statusnet.po b/locale/tr/LC_MESSAGES/statusnet.po index 149b21292..71aaa6813 100644 --- a/locale/tr/LC_MESSAGES/statusnet.po +++ b/locale/tr/LC_MESSAGES/statusnet.po @@ -9,82 +9,88 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:50+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:53+0000\n" "Language-Team: Turkish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: tr\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "Kabul et" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Ayarlar" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Kayıt" -#: actions/accessadminpanel.php:161 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 #, fuzzy +msgctxt "LABEL" msgid "Private" msgstr "Gizlilik" -#: actions/accessadminpanel.php:163 -msgid "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:167 +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 msgid "Invite only" msgstr "" -#: actions/accessadminpanel.php:169 -msgid "Make registration invitation only." +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:173 +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 #, fuzzy msgid "Closed" msgstr "Böyle bir kullanıcı yok." -#: actions/accessadminpanel.php:175 -msgid "Disable new registrations." -msgstr "" - -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Kaydet" - -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Ayarlar" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Kaydet" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page" msgstr "Böyle bir durum mesajı yok." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -98,72 +104,82 @@ msgstr "Böyle bir durum mesajı yok." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Böyle bir kullanıcı yok." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s ve arkadaşları" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s ve arkadaşları" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "%s için arkadaş güncellemeleri RSS beslemesi" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "%s için arkadaş güncellemeleri RSS beslemesi" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, fuzzy, php-format msgid "Feed for friends of %s (Atom)" msgstr "%s için arkadaş güncellemeleri RSS beslemesi" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 #, fuzzy msgid "You and friends" msgstr "%s ve arkadaşları" @@ -182,20 +198,20 @@ msgstr "" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Onay kodu bulunamadı." @@ -229,8 +245,9 @@ msgstr "Kullanıcı güncellenemedi." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Kullanıcının profili yok." @@ -255,7 +272,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -373,7 +390,7 @@ msgstr "Kullanıcı güncellenemedi." msgid "Could not find target user." msgstr "Kullanıcı güncellenemedi." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -381,62 +398,62 @@ msgstr "" "Takma ad sadece küçük harflerden ve rakamlardan oluşabilir, boşluk " "kullanılamaz. " -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Takma ad kullanımda. Başka bir tane deneyin." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Geçersiz bir takma ad." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Başlangıç sayfası adresi geçerli bir URL değil." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Tam isim çok uzun (azm: 255 karakter)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." msgstr "Hakkında bölümü çok uzun (azm 140 karakter)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Yer bilgisi çok uzun (azm: 255 karakter)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, fuzzy, php-format msgid "Invalid alias: \"%s\"" msgstr "%s Geçersiz başlangıç sayfası" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Takma ad kullanımda. Başka bir tane deneyin." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -448,16 +465,16 @@ msgstr "" msgid "Group not found!" msgstr "İstek bulunamadı!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 #, fuzzy msgid "You are already a member of that group." msgstr "Zaten giriş yapmış durumdasıznız!" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Sunucuya yönlendirme yapılamadı: %s" @@ -467,7 +484,7 @@ msgstr "Sunucuya yönlendirme yapılamadı: %s" msgid "You are not a member of this group." msgstr "Bize o profili yollamadınız" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "OpenID formu yaratılamadı: %s" @@ -499,7 +516,7 @@ msgstr "Geçersiz büyüklük." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -543,7 +560,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -566,14 +583,14 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 #, fuzzy msgid "Account" msgstr "Hakkında" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -660,12 +677,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s adli kullanicinin durum mesajlari" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -701,7 +718,7 @@ msgstr "%s için cevaplar" msgid "Repeats of %s" msgstr "%s için cevaplar" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "" @@ -724,8 +741,7 @@ msgstr "Böyle bir belge yok." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Takma ad yok" @@ -737,7 +753,7 @@ msgstr "" msgid "Invalid size." msgstr "Geçersiz büyüklük." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Avatar" @@ -754,31 +770,31 @@ msgid "User without matching profile" msgstr "" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 #, fuzzy msgid "Avatar settings" msgstr "Ayarlar" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Yükle" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "" @@ -786,7 +802,7 @@ msgstr "" msgid "Pick a square area of the image to be your avatar" msgstr "" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -821,23 +837,23 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "Böyle bir kullanıcı yok." #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "Böyle bir kullanıcı yok." @@ -846,41 +862,45 @@ msgstr "Böyle bir kullanıcı yok." msgid "Failed to save block information." msgstr "" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 #, fuzzy msgid "No such group." msgstr "Böyle bir durum mesajı yok." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "Kullanıcının profili yok." -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s ve arkadaşları" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 #, fuzzy msgid "Unblock user from group" msgstr "Böyle bir kullanıcı yok." -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 #, fuzzy msgid "Unblock this user" msgstr "Böyle bir kullanıcı yok." @@ -961,7 +981,7 @@ msgstr "Bize o profili yollamadınız" #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -987,12 +1007,13 @@ msgstr "Böyle bir durum mesajı yok." msgid "Delete this application" msgstr "Kendinizi ve ilgi alanlarınızı 140 karakter ile anlatın" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Giriş yapılmadı." @@ -1020,7 +1041,7 @@ msgstr "" msgid "Do not delete this notice" msgstr "Böyle bir durum mesajı yok." -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "" @@ -1038,19 +1059,19 @@ msgstr "Yerel aboneliği kullanabilirsiniz!" msgid "Delete user" msgstr "" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" msgstr "Böyle bir kullanıcı yok." #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1161,6 +1182,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Kaydet" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1260,31 +1292,31 @@ msgstr "" msgid "You must be logged in to create a group." msgstr "" -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." msgstr "Hakkında bölümü çok uzun (azm 140 karakter)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 #, fuzzy msgid "Could not update group." msgstr "Kullanıcı güncellenemedi." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "Avatar bilgisi kaydedilemedi" -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 #, fuzzy msgid "Options saved." msgstr "Ayarlar kaydedildi." @@ -1627,7 +1659,7 @@ msgstr "Kullanıcının profili yok." msgid "User is not a member of group." msgstr "Bize o profili yollamadınız" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 #, fuzzy msgid "Block user from group" msgstr "Böyle bir kullanıcı yok." @@ -1663,91 +1695,91 @@ msgstr "Kullanıcı numarası yok" msgid "You must be logged in to edit a group." msgstr "" -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "Kullanıcı güncellenemedi." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "Tercihler kaydedildi." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Kullanıcının profili yok." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 #, fuzzy msgid "Logo updated." msgstr "Avatar güncellendi." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 #, fuzzy msgid "Failed updating logo." msgstr "Avatar güncellemede hata." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "%s adli kullanicinin durum mesajlari" @@ -2003,16 +2035,19 @@ msgstr "" msgid "Optionally add a personal message to the invitation." msgstr "" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Gönder" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2047,7 +2082,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "" -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Takma ad yok" + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "" @@ -2056,12 +2096,12 @@ msgstr "" msgid "You must be logged in to leave a group." msgstr "" -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 #, fuzzy msgid "You are not a member of that group." msgstr "Bize o profili yollamadınız" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%1$s'in %2$s'deki durum mesajları " @@ -2079,8 +2119,7 @@ msgstr "Yanlış kullanıcı adı veya parola." msgid "Error setting user. You are probably not authorized." msgstr "Yetkilendirilmemiş." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Giriş" @@ -2332,8 +2371,8 @@ msgstr "Bağlan" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "" @@ -2481,7 +2520,7 @@ msgstr "Yeni parola kaydedilemedi." msgid "Password saved." msgstr "Parola kaydedildi." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2514,7 +2553,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "" @@ -2699,7 +2737,7 @@ msgstr "" "verilmez" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Tam İsim" @@ -2729,7 +2767,7 @@ msgid "Bio" msgstr "Hakkında" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2811,7 +2849,8 @@ msgstr "Profil kaydedilemedi." msgid "Couldn't save tags." msgstr "Profil kaydedilemedi." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Ayarlar kaydedildi." @@ -2824,48 +2863,48 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, fuzzy, php-format msgid "Public timeline, page %d" msgstr "Genel zaman çizgisi" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Genel zaman çizgisi" -#: actions/public.php:159 +#: actions/public.php:160 #, fuzzy msgid "Public Stream Feed (RSS 1.0)" msgstr "Genel Durum Akış RSS Beslemesi" -#: actions/public.php:163 +#: actions/public.php:164 #, fuzzy msgid "Public Stream Feed (RSS 2.0)" msgstr "Genel Durum Akış RSS Beslemesi" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "Genel Durum Akış RSS Beslemesi" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2874,7 +2913,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3047,8 +3086,7 @@ msgstr "Onay kodu hatası." msgid "Registration successful" msgstr "" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Kayıt" @@ -3216,7 +3254,7 @@ msgstr "Eğer lisansı kabul etmezseniz kayıt olamazsınız." msgid "You already repeated that notice." msgstr "Zaten giriş yapmış durumdasıznız!" -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "Yarat" @@ -3226,47 +3264,47 @@ msgstr "Yarat" msgid "Repeated!" msgstr "Yarat" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "%s için cevaplar" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "%s için cevaplar" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "%s için durum RSS beslemesi" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "%s için durum RSS beslemesi" -#: actions/replies.php:158 +#: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" msgstr "%s için durum RSS beslemesi" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3294,7 +3332,6 @@ msgid "User is already sandboxed." msgstr "Kullanıcının profili yok." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3319,7 +3356,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "Ayarlar" @@ -3354,7 +3391,7 @@ msgstr "Yer" msgid "Description" msgstr "Abonelikler" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "İstatistikler" @@ -3415,35 +3452,35 @@ msgstr "%s ve arkadaşları" msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "%s için arkadaş güncellemeleri RSS beslemesi" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "%s için arkadaş güncellemeleri RSS beslemesi" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, fuzzy, php-format msgid "Feed for favorites of %s (Atom)" msgstr "%s için arkadaş güncellemeleri RSS beslemesi" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3451,7 +3488,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3465,71 +3502,71 @@ msgstr "" msgid "%1$s group, page %2$d" msgstr "Bütün abonelikler" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 #, fuzzy msgid "Group profile" msgstr "Böyle bir durum mesajı yok." -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 #, fuzzy msgid "Note" msgstr "Durum mesajları" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "%s için durum RSS beslemesi" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "%s için durum RSS beslemesi" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "%s için durum RSS beslemesi" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, fuzzy, php-format msgid "FOAF for %s group" msgstr "%s için durum RSS beslemesi" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 #, fuzzy msgid "Members" msgstr "Üyelik başlangıcı" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 #, fuzzy msgid "Created" msgstr "Yarat" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3539,7 +3576,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3548,7 +3585,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "" @@ -4009,22 +4046,22 @@ msgstr "JabberID yok." msgid "SMS" msgstr "" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "%s adli kullanicinin durum mesajlari" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "%s için durum RSS beslemesi" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "%s için durum RSS beslemesi" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "%s için durum RSS beslemesi" @@ -4078,7 +4115,7 @@ msgstr "" msgid "No such tag." msgstr "Böyle bir durum mesajı yok." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "" @@ -4113,73 +4150,74 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +msgctxt "TITLE" msgid "User" msgstr "" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Profil" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "Bütün abonelikler" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "Takip talebine izin verildi" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "Yer" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4359,7 +4397,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Kişisel" @@ -4400,6 +4438,11 @@ msgstr "Kullanıcı güncellenemedi." msgid "Group leave failed." msgstr "Böyle bir durum mesajı yok." +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Kullanıcı güncellenemedi." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4417,46 +4460,46 @@ msgstr "" msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "Durum mesajını kaydederken hata oluştu." -#: classes/Notice.php:226 +#: classes/Notice.php:243 #, fuzzy msgid "Problem saving notice. Unknown user." msgstr "Durum mesajını kaydederken hata oluştu." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Durum mesajını kaydederken hata oluştu." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Durum mesajını kaydederken hata oluştu." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4488,21 +4531,31 @@ msgstr "Abonelik silinemedi." msgid "Couldn't delete subscription." msgstr "Abonelik silinemedi." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "" -#: classes/User_group.php:423 +#: classes/User_group.php:462 #, fuzzy msgid "Could not create group." msgstr "Avatar bilgisi kaydedilemedi" -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Abonelik oluşturulamadı." + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "Abonelik oluşturulamadı." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Abonelik oluşturulamadı." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "" @@ -4546,127 +4599,188 @@ msgstr "" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Başlangıç" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 -msgid "Change your email, avatar, password, profile" -msgstr "" +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Kişisel" +#. TRANS: Tooltip for main menu option "Account" #: lib/action.php:444 -msgid "Connect" -msgstr "Bağlan" +#, fuzzy +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "Parolayı değiştir" -#: lib/action.php:444 +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Hakkında" + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Sunucuya yönlendirme yapılamadı: %s" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Bağlan" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 #, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Abonelikler" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" +#: lib/action.php:460 +msgctxt "MENU" +msgid "Admin" msgstr "" -#: lib/action.php:453 lib/subgroupnav.php:106 +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 #, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "" -#: lib/action.php:458 -msgid "Logout" -msgstr "Çıkış" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Geçersiz büyüklük." -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Çıkış" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 #, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Yeni hesap oluştur" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Kayıt" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Yardım" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Giriş" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 #, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Yardım" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Ara" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Yardım" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Ara" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 #, fuzzy msgid "Site notice" msgstr "Yeni durum mesajı" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 #, fuzzy msgid "Page notice" msgstr "Yeni durum mesajı" -#: lib/action.php:727 +#: lib/action.php:758 #, fuzzy msgid "Secondary site navigation" msgstr "Abonelikler" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Yardım" + +#: lib/action.php:765 msgid "About" msgstr "Hakkında" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "SSS" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Gizlilik" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Kaynak" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "İletişim" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4675,12 +4789,12 @@ msgstr "" "**%%site.name%%** [%%site.broughtby%%](%%site.broughtbyurl%%)\" tarafından " "hazırlanan anında mesajlaşma ağıdır. " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** bir aninda mesajlaşma sosyal ağıdır." -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4691,114 +4805,165 @@ msgstr "" "licenses/agpl-3.0.html) lisansı ile korunan [StatusNet](http://status.net/) " "microbloglama yazılımının %s. versiyonunu kullanmaktadır." -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "Yeni durum mesajı" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 #, fuzzy msgid "After" msgstr "« Sonra" -#: lib/action.php:1149 +#: lib/action.php:1180 #, fuzzy msgid "Before" msgstr "Önce »" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "Eposta adresi onayı" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Yeni durum mesajı" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "Eposta adresi onayı" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Kişisel" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "Eposta adresi onayı" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +msgctxt "MENU" +msgid "User" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "Eposta adresi onayı" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Kabul et" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "Eposta adresi onayı" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "Eposta adresi onayı" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Kişisel" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4896,12 +5061,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Parola kaydedildi." -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Parola kaydedildi." @@ -5181,20 +5346,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "Onay kodu yok." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5392,24 +5557,24 @@ msgstr "Dosya yüklemede sistem hatası." msgid "Not an image or corrupt file." msgstr "Bu bir resim dosyası değil ya da dosyada hata var" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Desteklenmeyen görüntü dosyası biçemi." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "Böyle bir durum mesajı yok." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5714,6 +5879,12 @@ msgstr "" msgid "Available characters" msgstr "6 veya daha fazla karakter" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Gönder" + #: lib/noticeform.php:160 #, fuzzy msgid "Send a notice" @@ -5773,26 +5944,26 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 #, fuzzy msgid "in context" msgstr "İçerik yok!" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "Yarat" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 #, fuzzy msgid "Reply" msgstr "cevapla" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Durum mesajları" @@ -5842,6 +6013,10 @@ msgstr "Cevaplar" msgid "Favorites" msgstr "" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "" @@ -5936,7 +6111,7 @@ msgstr "Böyle bir durum mesajı yok." msgid "Repeat this notice" msgstr "Böyle bir durum mesajı yok." -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5958,6 +6133,10 @@ msgstr "Ara" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Ara" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -6012,6 +6191,15 @@ msgstr "Uzaktan abonelik" msgid "Groups %s is a member of" msgstr "" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6086,47 +6274,47 @@ msgstr "" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "birkaç saniye önce" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "yaklaşık bir dakika önce" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "yaklaşık %d dakika önce" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "yaklaşık bir saat önce" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "yaklaşık %d saat önce" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "yaklaşık bir gün önce" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "yaklaşık %d gün önce" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "yaklaşık bir ay önce" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "yaklaşık %d ay önce" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "yaklaşık bir yıl önce" diff --git a/locale/uk/LC_MESSAGES/statusnet.po b/locale/uk/LC_MESSAGES/statusnet.po index c261c310d..fd168ba50 100644 --- a/locale/uk/LC_MESSAGES/statusnet.po +++ b/locale/uk/LC_MESSAGES/statusnet.po @@ -10,78 +10,85 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:53+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:56+0000\n" "Language-Team: Ukrainian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" "10< =4 && (n%100<10 or n%100>=20) ? 1 : 2);\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 msgid "Access" msgstr "Погодитись" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 msgid "Site access settings" msgstr "Параметри доступу на сайт" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 msgid "Registration" msgstr "Реєстрація" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "Приватно" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" "Заборонити анонімним відвідувачам (ті, що не увійшли до системи) переглядати " "сайт?" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" -msgstr "Лише за запрошеннями" +#, fuzzy +msgctxt "LABEL" +msgid "Private" +msgstr "Приватно" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "Зробити регістрацію лише за запрошеннями." -#: actions/accessadminpanel.php:173 -msgid "Closed" -msgstr "Закрито" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Лише за запрошеннями" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "Скасувати подальшу регістрацію." -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Зберегти" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Закрито" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 msgid "Save access settings" msgstr "Зберегти параметри доступу" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Зберегти" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "Немає такої сторінки" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -95,51 +102,59 @@ msgstr "Немає такої сторінки" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Такого користувача немає." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, php-format msgid "%1$s and friends, page %2$d" msgstr "%1$s та друзі, сторінка %2$d" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s з друзями" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Стрічка дописів для друзів %s (RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Стрічка дописів для друзів %s (RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "Стрічка дописів для друзів %s (Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "Це стрічка дописів %s і друзів, але вона поки що порожня." -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " @@ -148,7 +163,8 @@ msgstr "" "Спробуйте до когось підписатись, [приєднатись до групи](%%action.groups%%) " "або напишіть щось самі." -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " @@ -157,7 +173,7 @@ msgstr "" "Ви можете [«розштовхати» %1$s](../%2$s) зі сторінки його профілю або [щось " "йому написати](%%%%action.newnotice%%%%?status_textarea=%3$s)." -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " @@ -166,7 +182,8 @@ msgstr "" "Чому б не [зареєструватись](%%%%action.register%%%%) і не спробувати " "«розштовхати» %s або щось йому написати." -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 msgid "You and friends" msgstr "Ви з друзями" @@ -184,20 +201,20 @@ msgstr "Оновлення від %1$s та друзів на %2$s!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 msgid "API method not found." msgstr "API метод не знайдено." @@ -230,8 +247,9 @@ msgstr "Не вдалося оновити користувача." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Користувач не має профілю." @@ -257,7 +275,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -368,7 +386,7 @@ msgstr "Не вдалось встановити джерело користув msgid "Could not find target user." msgstr "Не вдалося знайти цільового користувача." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." @@ -376,62 +394,62 @@ msgstr "" "Ім’я користувача повинно складатись з літер нижнього регістру і цифр, ніяких " "інтервалів." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Це ім’я вже використовується. Спробуйте інше." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Це недійсне ім’я користувача." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Веб-сторінка має недійсну URL-адресу." -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Повне ім’я задовге (255 знаків максимум)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, php-format msgid "Description is too long (max %d chars)." msgstr "Опис надто довгий (%d знаків максимум)." -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Локація надто довга (255 знаків максимум)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "Забагато додаткових імен! Максимум становить %d." -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, php-format msgid "Invalid alias: \"%s\"" msgstr "Помилкове додаткове ім’я: \"%s\"" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Додаткове ім’я \"%s\" вже використовується. Спробуйте інше." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "Додаткове ім’я не може бути таким самим що й основне." @@ -442,15 +460,15 @@ msgstr "Додаткове ім’я не може бути таким сами msgid "Group not found!" msgstr "Групу не знайдено!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "Ви вже є учасником цієї групи." -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "Адмін цієї групи заблокував Вашу присутність в ній." -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Не вдалось долучити користувача %1$s до групи %2$s." @@ -459,7 +477,7 @@ msgstr "Не вдалось долучити користувача %1$s до г msgid "You are not a member of this group." msgstr "Ви не є учасником цієї групи." -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Не вдалось видалити користувача %1$s з групи %2$s." @@ -490,7 +508,7 @@ msgstr "Невірний токен." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -534,7 +552,7 @@ msgstr "Токен запиту %s було скасовано і відхиле #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -561,13 +579,13 @@ msgstr "" "на доступ до Вашого акаунту %4$s лише тим стороннім додаткам, яким Ви " "довіряєте." -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "Акаунт" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -651,12 +669,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s оновлення обраних від %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s стрічка" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -692,7 +710,7 @@ msgstr "Вторування за %s" msgid "Repeats of %s" msgstr "Вторування %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Дописи позначені з %s" @@ -713,8 +731,7 @@ msgstr "Такого вкладення немає." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Немає імені." @@ -726,7 +743,7 @@ msgstr "Немає розміру." msgid "Invalid size." msgstr "Недійсний розмір." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Аватара" @@ -743,30 +760,30 @@ msgid "User without matching profile" msgstr "Користувач з невідповідним профілем" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Налаштування аватари" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "Оригінал" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Перегляд" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "Видалити" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Завантажити" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "Втяти" @@ -774,7 +791,7 @@ msgstr "Втяти" msgid "Pick a square area of the image to be your avatar" msgstr "Оберіть квадратну ділянку зображення, яка й буде Вашою автарою." -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "Дані Вашого файлу десь загубились." @@ -809,22 +826,22 @@ msgstr "" "більше не отримуватимете жодних дописів від нього." #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Ні" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 msgid "Do not block this user" msgstr "Не блокувати цього користувача" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Так" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 msgid "Block this user" msgstr "Блокувати користувача" @@ -832,39 +849,43 @@ msgstr "Блокувати користувача" msgid "Failed to save block information." msgstr "Збереження інформації про блокування завершилось невдачею." -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "Такої групи немає." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, php-format msgid "%s blocked profiles" msgstr "Заблоковані профілі %s" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "Заблоковані профілі %1$s, сторінка %2$d" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "Список користувачів блокованих в цій групі." -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 msgid "Unblock user from group" msgstr "Розблокувати користувача" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Розблокувати" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Розблокувати цього користувача" @@ -939,7 +960,7 @@ msgstr "Ви не є власником цього додатку." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "Виникли певні проблеми з токеном поточної сесії." @@ -965,12 +986,13 @@ msgstr "Не видаляти додаток" msgid "Delete this application" msgstr "Видалити додаток" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Не увійшли." @@ -997,7 +1019,7 @@ msgstr "Ви впевненні, що бажаєте видалити цей д msgid "Do not delete this notice" msgstr "Не видаляти цей допис" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "Видалити допис" @@ -1013,7 +1035,7 @@ msgstr "Ви можете видаляти лише локальних кори msgid "Delete user" msgstr "Видалити користувача" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." @@ -1021,12 +1043,12 @@ msgstr "" "Впевнені, що бажаєте видалити цього користувача? Усі дані буде знищено без " "можливості відновлення." -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 msgid "Delete this user" msgstr "Видалити цього користувача" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "Дизайн" @@ -1129,6 +1151,17 @@ msgstr "Оновити налаштування за замовчуванням" msgid "Reset back to default" msgstr "Повернутись до початкових налаштувань" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Зберегти" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "Зберегти дизайн" @@ -1220,29 +1253,29 @@ msgstr "Редагувати групу %s" msgid "You must be logged in to create a group." msgstr "Ви маєте спочатку увійти, аби мати змогу створити групу." -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "Ви маєте бути наділені правами адмінистратора, аби редагувати групу" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "Скористайтесь цією формою, щоб відредагувати групу." -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, php-format msgid "description is too long (max %d chars)." msgstr "опис надто довгий (%d знаків максимум)." -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "Не вдалося оновити групу." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 msgid "Could not create aliases." msgstr "Неможна призначити додаткові імена." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "Опції збережено." @@ -1580,7 +1613,7 @@ msgstr "Користувача заблоковано в цій групі." msgid "User is not a member of group." msgstr "Користувач не є учасником групи." -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 msgid "Block user from group" msgstr "Блокувати користувача в групі" @@ -1615,11 +1648,11 @@ msgstr "Немає ID." msgid "You must be logged in to edit a group." msgstr "Ви маєте спочатку увійти, аби мати змогу редагувати групу." -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "Дизайн групи" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." @@ -1627,20 +1660,20 @@ msgstr "" "Налаштуйте вигляд сторінки групи, використовуючи фонове зображення і кольори " "на свій смак." -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 msgid "Couldn't update your design." msgstr "Не вдалося оновити дизайн." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "Преференції дизайну збережно." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "Логотип групи" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." @@ -1648,57 +1681,57 @@ msgstr "" "Ви маєте можливість завантажити логотип для Вашої группи. Максимальний " "розмір файлу %s." -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "Користувач без відповідного профілю." -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "Оберіть квадратну ділянку зображення, яка й буде логотипом групи." -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "Логотип оновлено." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 msgid "Failed updating logo." msgstr "Оновлення логотипу завершилось невдачею." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "Учасники групи %s" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "Учасники групи %1$s, сторінка %2$d" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "Список учасників цієї групи." -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "Адмін" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "Блок" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "Надати користувачеві права адміністратора" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "Зробити адміном" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "Надати цьому користувачеві права адміністратора" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Оновлення членів %1$s на %2$s!" @@ -1964,16 +1997,19 @@ msgstr "Особисті повідомлення" msgid "Optionally add a personal message to the invitation." msgstr "Можна додати персональне повідомлення до запрошення (опціонально)." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" -msgstr "Так!" +msgstr "Надіслати" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s запросив(ла) Вас приєднатися до нього(неї) на %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2035,7 +2071,11 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Ви повинні спочатку увійти на сайт, аби приєднатися до групи." -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "Немає імені або ІД." + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "%1$s приєднався до групи %2$s" @@ -2044,11 +2084,11 @@ msgstr "%1$s приєднався до групи %2$s" msgid "You must be logged in to leave a group." msgstr "Ви повинні спочатку увійти на сайт, аби залишити групу." -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "Ви не є учасником цієї групи." -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, php-format msgid "%1$s left group %2$s" msgstr "%1$s залишив групу %2$s" @@ -2065,8 +2105,7 @@ msgstr "Неточне ім’я або пароль." msgid "Error setting user. You are probably not authorized." msgstr "Помилка. Можливо, Ви не авторизовані." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Увійти" @@ -2322,8 +2361,8 @@ msgstr "тип змісту " msgid "Only " msgstr "Лише " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Такий формат даних не підтримується." @@ -2464,7 +2503,7 @@ msgstr "Неможна зберегти новий пароль." msgid "Password saved." msgstr "Пароль збережено." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "Шлях" @@ -2497,7 +2536,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "Помилковий SSL-сервер. Максимальна довжина 255 знаків." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "Сайт" @@ -2670,7 +2708,7 @@ msgstr "" "1-64 літери нижнього регістру і цифри, ніякої пунктуації або інтервалів" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Повне ім’я" @@ -2698,7 +2736,7 @@ msgid "Bio" msgstr "Про себе" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2781,7 +2819,8 @@ msgstr "Не вдалося зберегти профіль." msgid "Couldn't save tags." msgstr "Не вдалося зберегти теґи." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Налаштування збережено." @@ -2794,28 +2833,28 @@ msgstr "Досягнуто ліміту сторінки (%s)" msgid "Could not retrieve public stream." msgstr "Не вдається відновити загальну стрічку." -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "Загальний стрічка, сторінка %d" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Загальна стрічка" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "Стрічка публічних дописів (RSS 1.0)" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "Стрічка публічних дописів (RSS 2.0)" -#: actions/public.php:167 +#: actions/public.php:168 msgid "Public Stream Feed (Atom)" msgstr "Стрічка публічних дописів (Atom)" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " @@ -2823,11 +2862,11 @@ msgid "" msgstr "" "Це публічна стрічка дописів сайту %%site.name%%, але вона поки що порожня." -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "Станьте першим! Напишіть щось!" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" @@ -2835,7 +2874,7 @@ msgstr "" "Чому б не [зареєструватись](%%action.register%%) і не зробити свій перший " "допис!" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2849,7 +2888,7 @@ msgstr "" "розділити своє життя з друзями, родиною і колегами! ([Дізнатися більше](%%" "doc.help%%))" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3029,8 +3068,7 @@ msgstr "Даруйте, помилка у коді запрошення." msgid "Registration successful" msgstr "Реєстрація успішна" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Реєстрація" @@ -3215,7 +3253,7 @@ msgstr "Ви не можете вторувати своїм власним до msgid "You already repeated that notice." msgstr "Ви вже вторували цьому допису." -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 msgid "Repeated" msgstr "Вторування" @@ -3223,33 +3261,33 @@ msgstr "Вторування" msgid "Repeated!" msgstr "Вторувати!" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Відповіді до %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, php-format msgid "Replies to %1$s, page %2$d" msgstr "Відповіді до %1$s, сторінка %2$d" -#: actions/replies.php:144 +#: actions/replies.php:145 #, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Стрічка відповідей до %s (RSS 1.0)" -#: actions/replies.php:151 +#: actions/replies.php:152 #, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Стрічка відповідей до %s (RSS 2.0)" -#: actions/replies.php:158 +#: actions/replies.php:159 #, php-format msgid "Replies feed for %s (Atom)" msgstr "Стрічка відповідей до %s (Atom)" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " @@ -3258,7 +3296,7 @@ msgstr "" "Ця стрічка дописів містить відповіді для %1$s, але %2$s поки що нічого не " "отримав у відповідь." -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " @@ -3267,7 +3305,7 @@ msgstr "" "Ви можете долучити інших користувачів до спілкування, підписавшись до " "більшої кількості людей або [приєднавшись до груп](%%action.groups%%)." -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3294,7 +3332,6 @@ msgid "User is already sandboxed." msgstr "Користувача ізольовано доки набереться уму-розуму." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "Сесії" @@ -3319,7 +3356,7 @@ msgid "Turn on debugging output for sessions." msgstr "Виводити дані сесії наладки." #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 msgid "Save site settings" msgstr "Зберегти налаштування сайту" @@ -3349,7 +3386,7 @@ msgstr "Організація" msgid "Description" msgstr "Опис" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Статистика" @@ -3412,22 +3449,22 @@ msgstr "Обрані дописи %1$s, сторінка %2$d" msgid "Could not retrieve favorite notices." msgstr "Не можна відновити обрані дописи." -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Стрічка обраних дописів %s (RSS 1.0)" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Стрічка обраних дописів %s (RSS 2.0)" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Стрічка обраних дописів %s (Atom)" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." @@ -3436,7 +3473,7 @@ msgstr "" "дописі який Ви вподобали, аби повернутись до нього пізніше, або звернути на " "нього увагу інших." -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " @@ -3445,7 +3482,7 @@ msgstr "" "%s поки що не вподобав жодних дописів. Може Ви б написали йому щось " "цікаве? :)" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3456,7 +3493,7 @@ msgstr "" "action.register%%%%) і не написати щось цікаве, що мало б сподобатись цьому " "користувачеві :)" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "Це спосіб поділитись з усіма тим, що вам подобається." @@ -3470,67 +3507,67 @@ msgstr "Група %s" msgid "%1$s group, page %2$d" msgstr "Група %1$s, сторінка %2$d" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 msgid "Group profile" msgstr "Профіль групи" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "Зауваження" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "Додаткові імена" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "Діяльність групи" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Стрічка дописів групи %s (RSS 1.0)" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Стрічка дописів групи %s (RSS 2.0)" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "Стрічка дописів групи %s (Atom)" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "FOAF для групи %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Учасники" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(Пусто)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "Всі учасники" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 msgid "Created" msgstr "Створено" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3545,7 +3582,7 @@ msgstr "" "короткі дописи про своє життя та інтереси. [Приєднуйтесь](%%action.register%" "%) зараз і долучіться до спілкування! ([Дізнатися більше](%%doc.help%%))" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3558,7 +3595,7 @@ msgstr "" "забезпеченні [StatusNet](http://status.net/). Члени цієї групи роблять " "короткі дописи про своє життя та інтереси. " -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "Адміни" @@ -3934,17 +3971,15 @@ msgstr "Не вдалося зберегти підписку." #: actions/subscribe.php:77 msgid "This action only accepts POST requests." -msgstr "" +msgstr "Ця дія приймає лише запити POST." #: actions/subscribe.php:107 -#, fuzzy msgid "No such profile." -msgstr "Такого файлу немає." +msgstr "Немає такого профілю." #: actions/subscribe.php:117 -#, fuzzy msgid "You cannot subscribe to an OMB 0.1 remote profile with this action." -msgstr "Ви не підписані до цього профілю." +msgstr "Цією дією Ви не зможете підписатися до віддаленого профілю OMB 0.1." #: actions/subscribe.php:145 msgid "Subscribed" @@ -4039,22 +4074,22 @@ msgstr "Jabber" msgid "SMS" msgstr "СМС" -#: actions/tag.php:68 +#: actions/tag.php:69 #, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Дописи з теґом %1$s, сторінка %2$d" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Стрічка дописів для теґу %s (RSS 1.0)" -#: actions/tag.php:92 +#: actions/tag.php:93 #, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Стрічка дописів для теґу %s (RSS 2.0)" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Стрічка дописів для теґу %s (Atom)" @@ -4108,7 +4143,7 @@ msgstr "Скористайтесь цією формою, щоб додати т msgid "No such tag." msgstr "Такого теґу немає." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API метод наразі знаходиться у розробці." @@ -4138,70 +4173,72 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "Ліцензія «%1$s» не відповідає ліцензії сайту «%2$s»." -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "Користувач" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "Власні налаштування користувача для цього сайту StatusNet." -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "Помилкове обмеження біо. Це мають бути цифри." -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "Помилковий текст привітання. Максимальна довжина 255 знаків." -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "Помилкова підписка за замовчуванням: '%1$s' не є користувачем." -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Профіль" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "Обмеження біо" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "Максимальна довжина біо користувача в знаках." -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "Нові користувачі" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "Привітання нового користувача" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "Текст привітання нових користувачів (255 знаків)." -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 msgid "Default subscription" msgstr "Підписка за замовчуванням" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "Автоматично підписувати нових користувачів до цього користувача." -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 msgid "Invitations" msgstr "Запрошення" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "Запрошення скасовано" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" "В той чи інший спосіб дозволити користувачам вітати нових користувачів." @@ -4399,7 +4436,7 @@ msgstr "" msgid "Plugins" msgstr "Додатки" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 msgid "Version" msgstr "Версія" @@ -4438,6 +4475,10 @@ msgstr "Не є частиною групи." msgid "Group leave failed." msgstr "Не вдалося залишити групу." +#: classes/Local_group.php:41 +msgid "Could not update local group." +msgstr "Не вдається оновити локальну групу." + #: classes/Login_token.php:76 #, php-format msgid "Could not create login token for %s" @@ -4455,27 +4496,27 @@ msgstr "Не можна долучити повідомлення." msgid "Could not update message with new URI." msgstr "Не можна оновити повідомлення з новим URI." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "Помилка бази даних при додаванні теґу: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 msgid "Problem saving notice. Too long." msgstr "Проблема при збереженні допису. Надто довге." -#: classes/Notice.php:226 +#: classes/Notice.php:243 msgid "Problem saving notice. Unknown user." msgstr "Проблема при збереженні допису. Невідомий користувач." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" "Дуже багато дописів за короткий термін; ходіть подихайте повітрям і " "повертайтесь за кілька хвилин." -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." @@ -4483,19 +4524,19 @@ msgstr "" "Дуже багато повідомлень за короткий термін; ходіть подихайте повітрям і " "повертайтесь за кілька хвилин." -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "Вам заборонено надсилати дописи до цього сайту." -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Проблема при збереженні допису." -#: classes/Notice.php:882 +#: classes/Notice.php:911 msgid "Problem saving group inbox." msgstr "Проблема при збереженні вхідних дописів для групи." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4524,19 +4565,27 @@ msgstr "Не можу видалити самопідписку." msgid "Couldn't delete subscription." msgstr "Не вдалося видалити підписку." -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "Вітаємо на %1$s, @%2$s!" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "Не вдалося створити нову групу." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +msgid "Could not set group URI." +msgstr "Не вдалося встановити URI групи." + +#: classes/User_group.php:492 msgid "Could not set group membership." msgstr "Не вдалося встановити членство." +#: classes/User_group.php:506 +msgid "Could not save local group info." +msgstr "Не вдалося зберегти інформацію про локальну групу." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Змінити налаштування профілю" @@ -4578,120 +4627,190 @@ msgstr "Сторінка без заголовку" msgid "Primary site navigation" msgstr "Відправна навігація по сайту" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Дім" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "Персональний профіль і стрічка друзів" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Особисте" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Змінити електронну адресу, аватару, пароль, профіль" -#: lib/action.php:444 -msgid "Connect" -msgstr "З’єднання" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Акаунт" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "З’єднання з сервісами" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "З’єднання" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Змінити конфігурацію сайту" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Запросити" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "Адмін" -#: lib/action.php:453 lib/subgroupnav.php:106 -#, php-format +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 +#, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "Запросіть друзів та колег приєднатись до Вас на %s" -#: lib/action.php:458 -msgid "Logout" -msgstr "Вийти" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Запросити" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "Вийти з сайту" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Вийти" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 +#, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Створити новий акаунт" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Реєстрація" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "Увійти на сайт" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Допомога" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Увійти" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 +#, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Допоможіть!" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Пошук" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Допомога" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "Пошук людей або текстів" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Пошук" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 msgid "Site notice" msgstr "Зауваження сайту" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "Огляд" -#: lib/action.php:625 +#: lib/action.php:656 msgid "Page notice" msgstr "Зауваження сторінки" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "Другорядна навігація по сайту" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Допомога" + +#: lib/action.php:765 msgid "About" msgstr "Про" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "ЧаПи" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "Умови" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Конфіденційність" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Джерело" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Контакт" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "Бедж" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "Ліцензія програмного забезпечення StatusNet" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4700,12 +4819,12 @@ msgstr "" "**%%site.name%%** — це сервіс мікроблоґів наданий вам [%%site.broughtby%%](%%" "site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** — це сервіс мікроблоґів. " -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4716,108 +4835,161 @@ msgstr "" "для мікроблоґів, версія %s, доступному під [GNU Affero General Public " "License](http://www.fsf.org/licensing/licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 msgid "Site content license" msgstr "Ліцензія змісту сайту" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "Зміст і дані %1$s є приватними і конфіденційними." -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "Авторські права на зміст і дані належать %1$s. Всі права захищено." -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" "Авторські права на зміст і дані належать розробникам. Всі права захищено." -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "Всі " -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "ліцензія." -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "Нумерація сторінок" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "Вперед" -#: lib/action.php:1149 +#: lib/action.php:1180 msgid "Before" msgstr "Назад" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." -msgstr "" +msgstr "Поки що не можу обробити віддалений контент." -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." -msgstr "" +msgstr "Поки що не можу обробити вбудований XML контент." -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." -msgstr "" +msgstr "Поки що не можу обробити вбудований контент Base64." -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "Ви не можете щось змінювати на цьому сайті." -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "Для цієї панелі зміни не припустимі." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "showForm() не виконано." -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "saveSettings() не виконано." -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "Немає можливості видалити налаштування дизайну." -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 msgid "Basic site configuration" msgstr "Основна конфігурація сайту" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Сайт" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 msgid "Design configuration" msgstr "Конфігурація дизайну" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Дизайн" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 msgid "User configuration" msgstr "Конфігурація користувача" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "Користувач" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 msgid "Access configuration" msgstr "Прийняти конфігурацію" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Погодитись" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 msgid "Paths configuration" msgstr "Конфігурація шляху" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +#, fuzzy +msgctxt "MENU" +msgid "Paths" +msgstr "Шлях" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 msgid "Sessions configuration" msgstr "Конфігурація сесій" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Сесії" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" "API-ресурс вимагає дозвіл типу «читання-запис», але у вас є лише доступ для " "читання." -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4909,11 +5081,11 @@ msgstr "Дописи, до яких прикріплено це вкладенн msgid "Tags for this attachment" msgstr "Теґи для цього вкладення" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "Не вдалося змінити пароль" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "Змінювати пароль не дозволено" @@ -5113,9 +5285,9 @@ msgstr "" "Це посилання можна використати лише раз, воно дійсне протягом 2 хвилин: %s" #: lib/command.php:692 -#, fuzzy, php-format +#, php-format msgid "Unsubscribed %s" -msgstr "Відписано від %s" +msgstr "Відписано %s" #: lib/command.php:709 msgid "You are not subscribed to anyone." @@ -5151,7 +5323,6 @@ msgstr[1] "Ви є учасником таких груп:" msgstr[2] "Ви є учасником таких груп:" #: lib/command.php:769 -#, fuzzy msgid "" "Commands:\n" "on - turn on notifications\n" @@ -5228,19 +5399,19 @@ msgstr "" "tracks — наразі не виконується\n" "tracking — наразі не виконується\n" -#: lib/common.php:136 +#: lib/common.php:148 msgid "No configuration file found. " msgstr "Файлу конфігурації не знайдено. " -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "Шукав файли конфігурації в цих місцях: " -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "Запустіть файл інсталяції, аби полагодити це." -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "Іти до файлу інсталяції." @@ -5429,23 +5600,23 @@ msgstr "Система відповіла помилкою при заванта msgid "Not an image or corrupt file." msgstr "Це не зображення, або файл зіпсовано." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Формат зображення не підтримується." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 msgid "Lost our file." msgstr "Файл втрачено." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "Тип файлу не підтримується" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "Мб" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "кб" @@ -5827,6 +5998,11 @@ msgstr "До" msgid "Available characters" msgstr "Лишилось знаків" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Так!" + #: lib/noticeform.php:160 msgid "Send a notice" msgstr "Надіслати допис" @@ -5885,23 +6061,23 @@ msgstr "Зах." msgid "at" msgstr "в" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 msgid "in context" msgstr "в контексті" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 msgid "Repeated by" msgstr "Вторуванні" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "Відповісти на цей допис" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Відповісти" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 msgid "Notice repeated" msgstr "Допис вторували" @@ -5949,6 +6125,10 @@ msgstr "Відповіді" msgid "Favorites" msgstr "Обрані" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "Користувач" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Вхідні" @@ -6038,7 +6218,7 @@ msgstr "Повторити цей допис?" msgid "Repeat this notice" msgstr "Вторувати цьому допису" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "Користувача для однокористувацького режиму не визначено." @@ -6058,6 +6238,10 @@ msgstr "Пошук" msgid "Keyword(s)" msgstr "Ключові слова" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Пошук" + #: lib/searchaction.php:162 msgid "Search help" msgstr "Пошук" @@ -6109,6 +6293,15 @@ msgstr "Люди підписані до %s" msgid "Groups %s is a member of" msgstr "%s бере участь в цих групах" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Запросити" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "Запросіть друзів та колег приєднатись до Вас на %s" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6179,47 +6372,47 @@ msgstr "Повідомлення" msgid "Moderate" msgstr "Модерувати" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "мить тому" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "хвилину тому" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "близько %d хвилин тому" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "годину тому" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "близько %d годин тому" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "день тому" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "близько %d днів тому" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "місяць тому" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "близько %d місяців тому" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "рік тому" diff --git a/locale/vi/LC_MESSAGES/statusnet.po b/locale/vi/LC_MESSAGES/statusnet.po index 4dcc58488..d64fae91d 100644 --- a/locale/vi/LC_MESSAGES/statusnet.po +++ b/locale/vi/LC_MESSAGES/statusnet.po @@ -7,83 +7,89 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:51:57+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:03:59+0000\n" "Language-Team: Vietnamese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: vi\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "Chấp nhận" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "Thay đổi hình đại diện" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "Đăng ký" -#: actions/accessadminpanel.php:161 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 #, fuzzy +msgctxt "LABEL" msgid "Private" msgstr "Riêng tư" -#: actions/accessadminpanel.php:163 -msgid "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:167 +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 #, fuzzy msgid "Invite only" msgstr "Thư mời" -#: actions/accessadminpanel.php:169 -msgid "Make registration invitation only." +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:173 +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 #, fuzzy msgid "Closed" msgstr "Ban user" -#: actions/accessadminpanel.php:175 -msgid "Disable new registrations." -msgstr "" - -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "Lưu" - -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "Thay đổi hình đại diện" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "Lưu" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page" msgstr "Không có tin nhắn nào." -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -97,72 +103,82 @@ msgstr "Không có tin nhắn nào." #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "Không có user nào." -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s và bạn bè" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s và bạn bè" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "Chọn những người bạn của %s" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "Chọn những người bạn của %s" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, fuzzy, php-format msgid "Feed for friends of %s (Atom)" msgstr "Chọn những người bạn của %s" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 #, fuzzy msgid "You and friends" msgstr "%s và bạn bè" @@ -181,20 +197,20 @@ msgstr "" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Phương thức API không tìm thấy!" @@ -228,8 +244,9 @@ msgstr "Không thể cập nhật thành viên." #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "Người dùng không có thông tin." @@ -254,7 +271,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 #, fuzzy @@ -377,68 +394,68 @@ msgstr "Không thể lấy lại các tin nhắn ưa thích" msgid "Could not find target user." msgstr "Không tìm thấy bất kỳ trạng thái nào." -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "Biệt hiệu phải là chữ viết thường hoặc số và không có khoảng trắng." -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "Biệt hiệu này đã dùng rồi. Hãy nhập biệt hiệu khác." -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "Biệt hiệu không hợp lệ." -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "Trang chủ không phải là URL" -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "Tên đầy đủ quá dài (tối đa là 255 ký tự)." -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." msgstr "Lý lịch quá dài (không quá 140 ký tự)" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "Tên khu vực quá dài (không quá 255 ký tự)." -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, fuzzy, php-format msgid "Invalid alias: \"%s\"" msgstr "Trang chủ '%s' không hợp lệ" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "Biệt hiệu này đã dùng rồi. Hãy nhập biệt hiệu khác." -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -450,16 +467,16 @@ msgstr "" msgid "Group not found!" msgstr "Phương thức API không tìm thấy!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 #, fuzzy msgid "You are already a member of that group." msgstr "Bạn đã theo những người này:" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "Không thể theo bạn này: %s đã có trong danh sách bạn bè của bạn rồi." @@ -469,7 +486,7 @@ msgstr "Không thể theo bạn này: %s đã có trong danh sách bạn bè c msgid "You are not a member of this group." msgstr "Bạn chưa cập nhật thông tin riêng" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "Không thể theo bạn này: %s đã có trong danh sách bạn bè của bạn rồi." @@ -501,7 +518,7 @@ msgstr "Kích thước không hợp lệ." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -545,7 +562,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -568,14 +585,14 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 #, fuzzy msgid "Account" msgstr "Giới thiệu" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -661,12 +678,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "Tất cả các cập nhật của %s" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, fuzzy, php-format msgid "%s timeline" msgstr "Dòng tin nhắn của %s" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -702,7 +719,7 @@ msgstr "Trả lời cho %s" msgid "Repeats of %s" msgstr "Trả lời cho %s" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "Thông báo được gắn thẻ %s" @@ -725,8 +742,7 @@ msgstr "Không có tài liệu nào." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "Không có biệt hiệu." @@ -738,7 +754,7 @@ msgstr "Không có kích thước." msgid "Invalid size." msgstr "Kích thước không hợp lệ." -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "Hình đại diện" @@ -758,31 +774,31 @@ msgid "User without matching profile" msgstr "Hồ sơ ở nơi khác không khớp với hồ sơ này của bạn" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "Thay đổi hình đại diện" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "Xem trước" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 #, fuzzy msgid "Delete" msgstr "Xóa tin nhắn" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "Tải file" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 #, fuzzy msgid "Crop" msgstr "Nhóm" @@ -791,7 +807,7 @@ msgstr "Nhóm" msgid "Pick a square area of the image to be your avatar" msgstr "" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -826,23 +842,23 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "Không" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "Bỏ chặn người dùng này" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "Có" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "Ban user" @@ -851,41 +867,45 @@ msgstr "Ban user" msgid "Failed to save block information." msgstr "" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 #, fuzzy msgid "No such group." msgstr "Không có tin nhắn nào." -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "Hồ sơ" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s và bạn bè" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 #, fuzzy msgid "Unblock user from group" msgstr "Bỏ chặn người dùng này" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "Bỏ chặn" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 msgid "Unblock this user" msgstr "Bỏ chặn người dùng này" @@ -965,7 +985,7 @@ msgstr "Bạn chưa cập nhật thông tin riêng" #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 #, fuzzy msgid "There was a problem with your session token." msgstr "Có lỗi xảy ra khi thao tác. Hãy thử lại lần nữa." @@ -992,12 +1012,13 @@ msgstr "Không thể xóa tin nhắn này." msgid "Delete this application" msgstr "Xóa tin nhắn" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "Chưa đăng nhập." @@ -1026,7 +1047,7 @@ msgstr "Bạn có chắc chắn là muốn xóa tin nhắn này không?" msgid "Do not delete this notice" msgstr "Không thể xóa tin nhắn này." -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 #, fuzzy msgid "Delete this notice" msgstr "Xóa tin nhắn" @@ -1046,19 +1067,19 @@ msgstr "Bạn đã không xóa trạng thái của những người khác." msgid "Delete user" msgstr "Xóa tin nhắn" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" msgstr "Xóa tin nhắn" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1173,6 +1194,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Lưu" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 #, fuzzy msgid "Save design" @@ -1278,32 +1310,32 @@ msgstr "%s và nhóm" msgid "You must be logged in to create a group." msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những " -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những " -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." msgstr "Lý lịch quá dài (không quá 140 ký tự)" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 #, fuzzy msgid "Could not update group." msgstr "Không thể cập nhật thành viên." -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "Không thể tạo favorite." -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 #, fuzzy msgid "Options saved." msgstr "Đã lưu các điều chỉnh." @@ -1667,7 +1699,7 @@ msgstr "Người dùng không có thông tin." msgid "User is not a member of group." msgstr "Bạn chưa cập nhật thông tin riêng" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 #, fuzzy msgid "Block user from group" msgstr "Ban user" @@ -1704,95 +1736,95 @@ msgstr "Không có id." msgid "You must be logged in to edit a group." msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những " -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 #, fuzzy msgid "Group design" msgstr "Nhóm" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "Không thể cập nhật thành viên." -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "Các tính năng đã được lưu." -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 #, fuzzy msgid "Group logo" msgstr "Mã nhóm" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "Hồ sơ ở nơi khác không khớp với hồ sơ này của bạn" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 #, fuzzy msgid "Logo updated." msgstr "Hình đại diện đã được cập nhật." -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 #, fuzzy msgid "Failed updating logo." msgstr "Cập nhật hình đại diện không thành công." -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, fuzzy, php-format msgid "%s group members" msgstr "Thành viên" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" msgstr "Thành viên" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 #, fuzzy msgid "Make user an admin of the group" msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những " -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 #, fuzzy msgid "Make this user an admin" msgstr "Kênh mà bạn tham gia" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "Dòng tin nhắn cho %s" @@ -2056,16 +2088,19 @@ msgstr "Tin nhắn cá nhân" msgid "Optionally add a personal message to the invitation." msgstr "Không bắt buộc phải thêm thông điệp vào thư mời." -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "Gửi" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s moi ban tham gia vao %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2127,7 +2162,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những " -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "Không có biệt hiệu." + +#: actions/joingroup.php:141 #, fuzzy, php-format msgid "%1$s joined group %2$s" msgstr "%s và nhóm" @@ -2137,12 +2177,12 @@ msgstr "%s và nhóm" msgid "You must be logged in to leave a group." msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những " -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 #, fuzzy msgid "You are not a member of that group." msgstr "Bạn chưa cập nhật thông tin riêng" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%s và nhóm" @@ -2160,8 +2200,7 @@ msgstr "Sai tên đăng nhập hoặc mật khẩu." msgid "Error setting user. You are probably not authorized." msgstr "Chưa được phép." -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "Đăng nhập" @@ -2421,8 +2460,8 @@ msgstr "Kết nối" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "Không hỗ trợ định dạng dữ liệu này." @@ -2574,7 +2613,7 @@ msgstr "Không thể lưu mật khẩu mới" msgid "Password saved." msgstr "Đã lưu mật khẩu." -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2607,7 +2646,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 #, fuzzy msgid "Site" msgstr "Thư mời" @@ -2796,7 +2834,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64 chữ cái thường hoặc là chữ số, không có dấu chấm hay " #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "Tên đầy đủ" @@ -2825,7 +2863,7 @@ msgid "Bio" msgstr "Lý lịch" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2909,7 +2947,8 @@ msgstr "Không thể lưu hồ sơ cá nhân." msgid "Couldn't save tags." msgstr "Không thể lưu hồ sơ cá nhân." -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "Đã lưu các điều chỉnh." @@ -2923,48 +2962,48 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "Không thể lấy lại các tin nhắn ưa thích" -#: actions/public.php:129 +#: actions/public.php:130 #, fuzzy, php-format msgid "Public timeline, page %d" msgstr "Dòng tin công cộng" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Dòng tin công cộng" -#: actions/public.php:159 +#: actions/public.php:160 #, fuzzy msgid "Public Stream Feed (RSS 1.0)" msgstr "Dòng tin công cộng" -#: actions/public.php:163 +#: actions/public.php:164 #, fuzzy msgid "Public Stream Feed (RSS 2.0)" msgstr "Dòng tin công cộng" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "Dòng tin công cộng" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2973,7 +3012,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3147,8 +3186,7 @@ msgstr "Lỗi xảy ra với mã xác nhận." msgid "Registration successful" msgstr "Đăng ký thành công" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "Đăng ký" @@ -3335,7 +3373,7 @@ msgstr "Bạn không thể đăng ký nếu không đồng ý các điều kho msgid "You already repeated that notice." msgstr "Bạn đã theo những người này:" -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "Tạo" @@ -3345,47 +3383,47 @@ msgstr "Tạo" msgid "Repeated!" msgstr "Tạo" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "Trả lời cho %s" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "%s chào mừng bạn " -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "Dòng tin nhắn cho %s" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "Dòng tin nhắn cho %s" -#: actions/replies.php:158 +#: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" msgstr "Dòng tin nhắn cho %s" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3413,7 +3451,6 @@ msgid "User is already sandboxed." msgstr "Người dùng không có thông tin." #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3438,7 +3475,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "Thay đổi hình đại diện" @@ -3473,7 +3510,7 @@ msgstr "Thư mời đã gửi" msgid "Description" msgstr "Mô tả" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "Số liệu thống kê" @@ -3535,35 +3572,35 @@ msgstr "Những tin nhắn ưa thích của %s" msgid "Could not retrieve favorite notices." msgstr "Không thể lấy lại các tin nhắn ưa thích" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "Chọn những người bạn của %s" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "Chọn những người bạn của %s" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "Chọn những người bạn của %s" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3571,7 +3608,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3585,72 +3622,72 @@ msgstr "%s và nhóm" msgid "%1$s group, page %2$d" msgstr "Thành viên" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 #, fuzzy msgid "Group profile" msgstr "Thông tin nhóm" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 #, fuzzy msgid "Note" msgstr "Tin nhắn" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 #, fuzzy msgid "Group actions" msgstr "Mã nhóm" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "Dòng tin nhắn cho %s" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "Dòng tin nhắn cho %s" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "Dòng tin nhắn cho %s" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "Hộp thư đi của %s" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 msgid "Members" msgstr "Thành viên" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 #, fuzzy msgid "All members" msgstr "Thành viên" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 #, fuzzy msgid "Created" msgstr "Tạo" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3660,7 +3697,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3669,7 +3706,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "" @@ -4148,22 +4185,22 @@ msgstr "Không có Jabber ID." msgid "SMS" msgstr "SMS" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "Dòng tin nhắn cho %s" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "Dòng tin nhắn cho %s" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "Dòng tin nhắn cho %s" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "Dòng tin nhắn cho %s" @@ -4218,7 +4255,7 @@ msgstr "" msgid "No such tag." msgstr "Không có tin nhắn nào." -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "Phương thức API dưới cấu trúc có sẵn." @@ -4253,75 +4290,76 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +msgctxt "TITLE" msgid "User" msgstr "" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "Hồ sơ " -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 #, fuzzy msgid "New users" msgstr "Gửi thư mời đến những người chưa có tài khoản" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "Tất cả đăng nhận" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "Tự động theo những người nào đăng ký theo tôi" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "Thư mời đã gửi" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 #, fuzzy msgid "Invitations enabled" msgstr "Thư mời đã gửi" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4508,7 +4546,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "Cá nhân" @@ -4549,6 +4587,11 @@ msgstr "Không thể cập nhật thành viên." msgid "Group leave failed." msgstr "Thông tin nhóm" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "Không thể cập nhật thành viên." + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4569,46 +4612,46 @@ msgstr "Không thể chèn thêm vào đăng nhận." msgid "Could not update message with new URI." msgstr "Không thể cập nhật thông tin user với địa chỉ email đã được xác nhận." -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, fuzzy, php-format msgid "DB error inserting hashtag: %s" msgstr "Lỗi cơ sở dữ liệu khi chèn trả lời: %s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "Có lỗi xảy ra khi lưu tin nhắn." -#: classes/Notice.php:226 +#: classes/Notice.php:243 #, fuzzy msgid "Problem saving notice. Unknown user." msgstr "Có lỗi xảy ra khi lưu tin nhắn." -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "Có lỗi xảy ra khi lưu tin nhắn." -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "Có lỗi xảy ra khi lưu tin nhắn." -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%s (%s)" @@ -4640,21 +4683,31 @@ msgstr "Không thể xóa đăng nhận." msgid "Couldn't delete subscription." msgstr "Không thể xóa đăng nhận." -#: classes/User.php:372 +#: classes/User.php:373 #, fuzzy, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "%s chào mừng bạn " -#: classes/User_group.php:423 +#: classes/User_group.php:462 #, fuzzy msgid "Could not create group." msgstr "Không thể tạo favorite." -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "Không thể tạo đăng nhận." + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "Không thể tạo đăng nhận." +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "Không thể tạo đăng nhận." + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "Thay đổi các thiết lập trong hồ sơ cá nhân của bạn" @@ -4699,131 +4752,191 @@ msgstr "" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "Trang chủ" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 +#: lib/action.php:442 #, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "Cá nhân" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "Thay đổi mật khẩu của bạn" -#: lib/action.php:444 -msgid "Connect" -msgstr "Kết nối" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "Giới thiệu" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "Không thể chuyển đến máy chủ: %s" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "Kết nối" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 #, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "Tôi theo" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "Thư mời" +#: lib/action.php:460 +msgctxt "MENU" +msgid "Admin" +msgstr "" -#: lib/action.php:453 lib/subgroupnav.php:106 +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 #, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "" "Điền địa chỉ email và nội dung tin nhắn để gửi thư mời bạn bè và đồng nghiệp " "của bạn tham gia vào dịch vụ này." -#: lib/action.php:458 -msgid "Logout" -msgstr "Thoát" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "Thư mời" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "Thoát" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 #, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "Tạo tài khoản mới" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "Đăng ký" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "Hướng dẫn" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "Đăng nhập" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 #, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "Hướng dẫn" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "Tìm kiếm" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "Hướng dẫn" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "Tìm kiếm" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 #, fuzzy msgid "Site notice" msgstr "Thông báo mới" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 #, fuzzy msgid "Page notice" msgstr "Thông báo mới" -#: lib/action.php:727 +#: lib/action.php:758 #, fuzzy msgid "Secondary site navigation" msgstr "Tôi theo" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "Hướng dẫn" + +#: lib/action.php:765 msgid "About" msgstr "Giới thiệu" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "Riêng tư" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "Nguồn" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "Liên hệ" -#: lib/action.php:751 +#: lib/action.php:782 #, fuzzy msgid "Badge" msgstr "Tin đã gửi" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4832,12 +4945,12 @@ msgstr "" "**%%site.name%%** là dịch vụ gửi tin nhắn được cung cấp từ [%%site.broughtby%" "%](%%site.broughtbyurl%%). " -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** là dịch vụ gửi tin nhắn. " -#: lib/action.php:786 +#: lib/action.php:817 #, fuzzy, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4848,117 +4961,168 @@ msgstr "" "quyền [GNU Affero General Public License](http://www.fsf.org/licensing/" "licenses/agpl-3.0.html)." -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "Tìm theo nội dung của tin nhắn" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 #, fuzzy msgid "After" msgstr "Sau" -#: lib/action.php:1149 +#: lib/action.php:1180 #, fuzzy msgid "Before" msgstr "Trước" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 #, fuzzy msgid "You cannot make changes to this site." msgstr "Bạn đã theo những người này:" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "Biệt hiệu không được cho phép." -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 #, fuzzy msgid "Unable to delete design setting." msgstr "Không thể lưu thông tin Twitter của bạn!" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "Xac nhan dia chi email" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "Thư mời" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "Xác nhận SMS" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "Cá nhân" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "Xác nhận SMS" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +msgctxt "MENU" +msgid "User" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "Xác nhận SMS" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "Chấp nhận" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "Xác nhận SMS" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "Xác nhận SMS" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "Cá nhân" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -5054,12 +5218,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "Đã lưu mật khẩu." -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "Đã lưu mật khẩu." @@ -5346,20 +5510,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "Không có mã số xác nhận." -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5563,25 +5727,25 @@ msgstr "Hệ thống xảy ra lỗi trong khi tải file." msgid "Not an image or corrupt file." msgstr "File hỏng hoặc không phải là file ảnh." -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "Không hỗ trợ kiểu file ảnh này." -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "Không có tin nhắn nào." -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 #, fuzzy msgid "Unknown file type" msgstr "Không hỗ trợ kiểu file ảnh này." -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5939,6 +6103,12 @@ msgstr "" msgid "Available characters" msgstr "Nhiều hơn 6 ký tự" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "Gửi" + #: lib/noticeform.php:160 #, fuzzy msgid "Send a notice" @@ -5999,26 +6169,26 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 #, fuzzy msgid "in context" msgstr "Không có nội dung!" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "Tạo" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 #, fuzzy msgid "Reply to this notice" msgstr "Trả lời tin nhắn này" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "Trả lời" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "Tin đã gửi" @@ -6071,6 +6241,10 @@ msgstr "Trả lời" msgid "Favorites" msgstr "Ưa thích" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "Hộp thư đến" @@ -6169,7 +6343,7 @@ msgstr "Trả lời tin nhắn này" msgid "Repeat this notice" msgstr "Trả lời tin nhắn này" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -6192,6 +6366,10 @@ msgstr "Tìm kiếm" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "Tìm kiếm" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -6247,6 +6425,17 @@ msgstr "Theo nhóm này" msgid "Groups %s is a member of" msgstr "" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "Thư mời" + +#: lib/subgroupnav.php:106 +#, fuzzy, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" +"Điền địa chỉ email và nội dung tin nhắn để gửi thư mời bạn bè và đồng nghiệp " +"của bạn tham gia vào dịch vụ này." + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6326,47 +6515,47 @@ msgstr "Tin mới nhất" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "vài giây trước" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "1 phút trước" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "%d phút trước" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "1 giờ trước" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "%d giờ trước" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "1 ngày trước" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "%d ngày trước" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "1 tháng trước" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "%d tháng trước" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "1 năm trước" diff --git a/locale/zh_CN/LC_MESSAGES/statusnet.po b/locale/zh_CN/LC_MESSAGES/statusnet.po index 60ca89d66..45fdfe6dc 100644 --- a/locale/zh_CN/LC_MESSAGES/statusnet.po +++ b/locale/zh_CN/LC_MESSAGES/statusnet.po @@ -10,82 +10,88 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:52:00+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:04:02+0000\n" "Language-Team: Simplified Chinese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hans\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "接受" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "头像设置" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "注册" -#: actions/accessadminpanel.php:161 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 #, fuzzy +msgctxt "LABEL" msgid "Private" msgstr "隐私" -#: actions/accessadminpanel.php:163 -msgid "Prohibit anonymous users (not logged in) from viewing site?" +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:167 +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 #, fuzzy msgid "Invite only" msgstr "邀请" -#: actions/accessadminpanel.php:169 -msgid "Make registration invitation only." +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:173 +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 #, fuzzy msgid "Closed" msgstr "阻止" -#: actions/accessadminpanel.php:175 -msgid "Disable new registrations." -msgstr "" - -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "保存" - -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "头像设置" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +#, fuzzy +msgctxt "BUTTON" +msgid "Save" +msgstr "保存" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 msgid "No such page" msgstr "没有该页面" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -99,72 +105,82 @@ msgstr "没有该页面" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "没有这个用户。" -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s 及好友" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s 及好友" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "%s 好友的聚合(RSS 1.0)" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "%s 好友的聚合(RSS 2.0)" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, php-format msgid "Feed for friends of %s (Atom)" msgstr "%s 好友的聚合(Atom)" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "这是 %s 和好友的时间线,但是没有任何人发布内容。" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 #, fuzzy msgid "You and friends" msgstr "%s 及好友" @@ -183,20 +199,20 @@ msgstr "来自%2$s 上 %1$s 和好友的更新!" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "API 方法未实现!" @@ -230,8 +246,9 @@ msgstr "无法更新用户。" #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "用户没有个人信息。" @@ -256,7 +273,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 #, fuzzy @@ -375,68 +392,68 @@ msgstr "无法获取收藏的通告。" msgid "Could not find target user." msgstr "找不到任何信息。" -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "昵称只能使用小写字母和数字,不包含空格。" -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "昵称已被使用,换一个吧。" -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "不是有效的昵称。" -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "主页的URL不正确。" -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "全名过长(不能超过 255 个字符)。" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." msgstr "描述过长(不能超过140字符)。" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "位置过长(不能超过255个字符)。" -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, fuzzy, php-format msgid "Invalid alias: \"%s\"" msgstr "主页'%s'不正确" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "昵称已被使用,换一个吧。" -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -448,16 +465,16 @@ msgstr "" msgid "Group not found!" msgstr "API 方法未实现!" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 #, fuzzy msgid "You are already a member of that group." msgstr "您已经是该组成员" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "无法把 %s 用户添加到 %s 组" @@ -467,7 +484,7 @@ msgstr "无法把 %s 用户添加到 %s 组" msgid "You are not a member of this group." msgstr "您未告知此个人信息" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "无法订阅用户:未找到。" @@ -499,7 +516,7 @@ msgstr "大小不正确。" #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -543,7 +560,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -566,13 +583,13 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 msgid "Account" msgstr "帐号" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -659,12 +676,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%s 收藏了 %s 的 %s 通告。" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "%s 时间表" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -700,7 +717,7 @@ msgstr "%s 的回复" msgid "Repeats of %s" msgstr "%s 的回复" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "带 %s 标签的通告" @@ -723,8 +740,7 @@ msgstr "没有这份文档。" #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "没有昵称。" @@ -736,7 +752,7 @@ msgstr "没有大小。" msgid "Invalid size." msgstr "大小不正确。" -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "头像" @@ -753,31 +769,31 @@ msgid "User without matching profile" msgstr "找不到匹配的用户。" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 msgid "Avatar settings" msgstr "头像设置" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "原来的" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "预览" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 #, fuzzy msgid "Delete" msgstr "删除" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "上传" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "剪裁" @@ -785,7 +801,7 @@ msgstr "剪裁" msgid "Pick a square area of the image to be your avatar" msgstr "请选择一块方形区域作为你的头像" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "文件数据丢失" @@ -820,23 +836,23 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "否" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "取消阻止次用户" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "是" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "阻止该用户" @@ -845,41 +861,45 @@ msgstr "阻止该用户" msgid "Failed to save block information." msgstr "保存阻止信息失败。" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 msgid "No such group." msgstr "没有这个组。" -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "用户没有个人信息。" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s 及好友" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 #, fuzzy msgid "A list of the users blocked from joining this group." msgstr "该组成员列表。" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 #, fuzzy msgid "Unblock user from group" msgstr "取消阻止用户失败。" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "取消阻止" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 #, fuzzy msgid "Unblock this user" msgstr "取消阻止次用户" @@ -961,7 +981,7 @@ msgstr "您未告知此个人信息" #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 #, fuzzy msgid "There was a problem with your session token." msgstr "会话标识有问题,请重试。" @@ -988,12 +1008,13 @@ msgstr "无法删除通告。" msgid "Delete this application" msgstr "删除通告" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "未登录。" @@ -1022,7 +1043,7 @@ msgstr "确定要删除这条消息吗?" msgid "Do not delete this notice" msgstr "无法删除通告。" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 #, fuzzy msgid "Delete this notice" msgstr "删除通告" @@ -1042,19 +1063,19 @@ msgstr "您不能删除其他用户的状态。" msgid "Delete user" msgstr "删除" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" msgstr "删除通告" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1165,6 +1186,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "保存" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1267,31 +1299,31 @@ msgstr "编辑 %s 组" msgid "You must be logged in to create a group." msgstr "您必须登录才能创建小组。" -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 #, fuzzy msgid "You must be an admin to edit the group." msgstr "只有admin才能编辑这个组" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "使用这个表单来编辑组" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." msgstr "描述过长(不能超过140字符)。" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 msgid "Could not update group." msgstr "无法更新组" -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "无法创建收藏。" -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "选项已保存。" @@ -1645,7 +1677,7 @@ msgstr "用户没有个人信息。" msgid "User is not a member of group." msgstr "您未告知此个人信息" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 #, fuzzy msgid "Block user from group" msgstr "阻止用户" @@ -1682,94 +1714,94 @@ msgstr "没有ID" msgid "You must be logged in to edit a group." msgstr "您必须登录才能创建小组。" -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 #, fuzzy msgid "Group design" msgstr "组" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "无法更新用户。" -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 #, fuzzy msgid "Design preferences saved." msgstr "同步选项已保存。" -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "组logo" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, fuzzy, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "你可以给你的组上载一个logo图。" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 #, fuzzy msgid "User without matching profile." msgstr "找不到匹配的用户。" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 #, fuzzy msgid "Pick a square area of the image to be the logo." msgstr "请选择一块方形区域作为你的头像" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 msgid "Logo updated." msgstr "logo已更新。" -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 #, fuzzy msgid "Failed updating logo." msgstr "更新logo失败。" -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "%s 组成员" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, fuzzy, php-format msgid "%1$s group members, page %2$d" msgstr "%s 组成员, 第 %d 页" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "该组成员列表。" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "admin管理员" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "阻止" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 #, fuzzy msgid "Make user an admin of the group" msgstr "只有admin才能编辑这个组" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 #, fuzzy msgid "Make Admin" msgstr "admin管理员" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "%2$s 上 %1$s 的更新!" @@ -2020,16 +2052,19 @@ msgstr "个人消息" msgid "Optionally add a personal message to the invitation." msgstr "在邀请中加几句话(可选)。" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +#, fuzzy +msgctxt "BUTTON" msgid "Send" msgstr "发送" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s 邀请您加入 %2$s" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2085,7 +2120,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "您必须登录才能加入组。" -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "没有昵称。" + +#: actions/joingroup.php:141 #, fuzzy, php-format msgid "%1$s joined group %2$s" msgstr "%s 加入 %s 组" @@ -2095,12 +2135,12 @@ msgstr "%s 加入 %s 组" msgid "You must be logged in to leave a group." msgstr "您必须登录才能邀请其他人使用 %s" -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 #, fuzzy msgid "You are not a member of that group." msgstr "您未告知此个人信息" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%s 离开群 %s" @@ -2118,8 +2158,7 @@ msgstr "用户名或密码不正确。" msgid "Error setting user. You are probably not authorized." msgstr "未认证。" -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "登录" @@ -2371,8 +2410,8 @@ msgstr "连接" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "不支持的数据格式。" @@ -2521,7 +2560,7 @@ msgstr "无法保存新密码。" msgid "Password saved." msgstr "密码已保存。" -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2554,7 +2593,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 #, fuzzy msgid "Site" msgstr "邀请" @@ -2737,7 +2775,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1 到 64 个小写字母或数字,不包含标点及空白" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "全名" @@ -2766,7 +2804,7 @@ msgid "Bio" msgstr "自述" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2848,7 +2886,8 @@ msgstr "无法保存个人信息。" msgid "Couldn't save tags." msgstr "无法保存个人信息。" -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "设置已保存。" @@ -2862,48 +2901,48 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "无法获取收藏的通告。" -#: actions/public.php:129 +#: actions/public.php:130 #, fuzzy, php-format msgid "Public timeline, page %d" msgstr "公开的时间表" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "公开的时间表" -#: actions/public.php:159 +#: actions/public.php:160 #, fuzzy msgid "Public Stream Feed (RSS 1.0)" msgstr "公开的聚合" -#: actions/public.php:163 +#: actions/public.php:164 #, fuzzy msgid "Public Stream Feed (RSS 2.0)" msgstr "公开的聚合" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "公开的聚合" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2912,7 +2951,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, fuzzy, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -3085,8 +3124,7 @@ msgstr "验证码出错。" msgid "Registration successful" msgstr "注册成功。" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "注册" @@ -3269,7 +3307,7 @@ msgstr "您必须同意此授权方可注册。" msgid "You already repeated that notice." msgstr "您已成功阻止该用户:" -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "创建" @@ -3279,47 +3317,47 @@ msgstr "创建" msgid "Repeated!" msgstr "创建" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "%s 的回复" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "发送给 %1$s 的 %2$s 消息" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "%s 的通告聚合" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "%s 的通告聚合" -#: actions/replies.php:158 +#: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" msgstr "%s 的通告聚合" -#: actions/replies.php:198 +#: actions/replies.php:199 #, fuzzy, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "这是 %s 和好友的时间线,但是没有任何人发布内容。" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3347,7 +3385,6 @@ msgid "User is already sandboxed." msgstr "用户没有个人信息。" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3372,7 +3409,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "头像设置" @@ -3408,7 +3445,7 @@ msgstr "分页" msgid "Description" msgstr "描述" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "统计" @@ -3470,35 +3507,35 @@ msgstr "%s 收藏的通告" msgid "Could not retrieve favorite notices." msgstr "无法获取收藏的通告。" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "%s 好友的聚合" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "%s 好友的聚合" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, php-format msgid "Feed for favorites of %s (Atom)" msgstr "%s 好友的聚合" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3506,7 +3543,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3520,71 +3557,71 @@ msgstr "%s 组" msgid "%1$s group, page %2$d" msgstr "%s 组成员, 第 %d 页" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 #, fuzzy msgid "Group profile" msgstr "组资料" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "URL 互联网地址" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 #, fuzzy msgid "Note" msgstr "通告" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "组动作" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "%s 的通告聚合" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, fuzzy, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "%s 的通告聚合" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, fuzzy, php-format msgid "Notice feed for %s group (Atom)" msgstr "%s 的通告聚合" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, php-format msgid "FOAF for %s group" msgstr "%s 的发件箱" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 #, fuzzy msgid "Members" msgstr "注册于" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "(没有)" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "所有成员" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 #, fuzzy msgid "Created" msgstr "创建" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3594,7 +3631,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, fuzzy, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3605,7 +3642,7 @@ msgstr "" "**%s** 是一个 %%%%site.name%%%% 的用户组,一个微博客服务 [micro-blogging]" "(http://en.wikipedia.org/wiki/Micro-blogging)" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 #, fuzzy msgid "Admins" msgstr "admin管理员" @@ -4077,22 +4114,22 @@ msgstr "没有 Jabber ID。" msgid "SMS" msgstr "SMS短信" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "用户自加标签 %s - 第 %d 页" -#: actions/tag.php:86 +#: actions/tag.php:87 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "%s 的通告聚合" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "%s 的通告聚合" -#: actions/tag.php:98 +#: actions/tag.php:99 #, fuzzy, php-format msgid "Notice feed for tag %s (Atom)" msgstr "%s 的通告聚合" @@ -4148,7 +4185,7 @@ msgstr "使用这个表格给你的关注者或你的订阅加注标签。" msgid "No such tag." msgstr "未找到此消息。" -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "API 方法尚未实现。" @@ -4183,75 +4220,77 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +#, fuzzy +msgctxt "TITLE" msgid "User" msgstr "用户" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "个人信息" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 #, fuzzy msgid "New users" msgstr "邀请新用户" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "所有订阅" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 #, fuzzy msgid "Automatically subscribe new users to this user." msgstr "自动订阅任何订阅我的更新的人(这个选项最适合机器人)" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "已发送邀请" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 #, fuzzy msgid "Invitations enabled" msgstr "已发送邀请" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4435,7 +4474,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "个人" @@ -4476,6 +4515,11 @@ msgstr "无法更新组" msgid "Group leave failed." msgstr "组资料" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "无法更新组" + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4494,47 +4538,47 @@ msgstr "无法添加信息。" msgid "Could not update message with new URI." msgstr "无法添加新URI的信息。" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "添加标签时数据库出错:%s" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "保存通告时出错。" -#: classes/Notice.php:226 +#: classes/Notice.php:243 #, fuzzy msgid "Problem saving notice. Unknown user." msgstr "保存通告时出错。" -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "你在短时间里发布了过多的消息,请深呼吸,过几分钟再发消息。" -#: classes/Notice.php:237 +#: classes/Notice.php:254 #, fuzzy msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "你在短时间里发布了过多的消息,请深呼吸,过几分钟再发消息。" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "在这个网站你被禁止发布消息。" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "保存通告时出错。" -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "保存通告时出错。" -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -4567,20 +4611,30 @@ msgstr "无法删除订阅。" msgid "Couldn't delete subscription." msgstr "无法删除订阅。" -#: classes/User.php:372 +#: classes/User.php:373 #, fuzzy, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "发送给 %1$s 的 %2$s 消息" -#: classes/User_group.php:423 +#: classes/User_group.php:462 msgid "Could not create group." msgstr "无法创建组。" -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "无法删除订阅。" + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "无法删除订阅。" +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "无法删除订阅。" + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "修改您的个人信息" @@ -4623,129 +4677,194 @@ msgstr "无标题页" msgid "Primary site navigation" msgstr "主站导航" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "主页" - -#: lib/action.php:439 +#, fuzzy +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "个人资料及朋友年表" -#: lib/action.php:441 +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "个人" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:444 #, fuzzy +msgctxt "TOOLTIP" msgid "Change your email, avatar, password, profile" msgstr "修改资料" -#: lib/action.php:444 -msgid "Connect" -msgstr "连接" +#: lib/action.php:447 +#, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "帐号" -#: lib/action.php:444 +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 #, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "无法重定向到服务器:%s" -#: lib/action.php:448 +#: lib/action.php:453 #, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "连接" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" msgstr "主站导航" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" -msgstr "邀请" +#: lib/action.php:460 +#, fuzzy +msgctxt "MENU" +msgid "Admin" +msgstr "admin管理员" -#: lib/action.php:453 lib/subgroupnav.php:106 +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 #, fuzzy, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "使用这个表单来邀请好友和同事加入。" -#: lib/action.php:458 -msgid "Logout" -msgstr "登出" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "邀请" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +#, fuzzy +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "登出本站" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "登出" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 #, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "创建新帐号" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "注册" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +#, fuzzy +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "登入本站" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "帮助" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "登录" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 #, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "帮助" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "搜索" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "帮助" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +#, fuzzy +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "检索人或文字" -#: lib/action.php:493 +#: lib/action.php:502 +#, fuzzy +msgctxt "MENU" +msgid "Search" +msgstr "搜索" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 #, fuzzy msgid "Site notice" msgstr "新通告" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "本地显示" -#: lib/action.php:625 +#: lib/action.php:656 #, fuzzy msgid "Page notice" msgstr "新通告" -#: lib/action.php:727 +#: lib/action.php:758 #, fuzzy msgid "Secondary site navigation" msgstr "次项站导航" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "帮助" + +#: lib/action.php:765 msgid "About" msgstr "关于" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "常见问题FAQ" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "隐私" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "来源" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "联系人" -#: lib/action.php:751 +#: lib/action.php:782 #, fuzzy msgid "Badge" msgstr "呼叫" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "StatusNet软件注册证" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4754,12 +4873,12 @@ msgstr "" "**%%site.name%%** 是一个微博客服务,提供者为 [%%site.broughtby%%](%%site." "broughtbyurl%%)。" -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%** 是一个微博客服务。" -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4770,119 +4889,171 @@ msgstr "" "General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html)" "授权。" -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "StatusNet软件注册证" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "全部" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "注册证" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "分页" -#: lib/action.php:1141 +#: lib/action.php:1172 #, fuzzy msgid "After" msgstr "« 之后" -#: lib/action.php:1149 +#: lib/action.php:1180 #, fuzzy msgid "Before" msgstr "之前 »" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 #, fuzzy msgid "You cannot make changes to this site." msgstr "无法向此用户发送消息。" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 #, fuzzy msgid "Changes to that panel are not allowed." msgstr "不允许注册。" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 #, fuzzy msgid "showForm() not implemented." msgstr "命令尚未实现。" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 #, fuzzy msgid "saveSettings() not implemented." msgstr "命令尚未实现。" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 #, fuzzy msgid "Unable to delete design setting." msgstr "无法保存 Twitter 设置!" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "电子邮件地址确认" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "邀请" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "SMS短信确认" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "个人" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "SMS短信确认" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +#, fuzzy +msgctxt "MENU" +msgid "User" +msgstr "用户" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "SMS短信确认" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "接受" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "SMS短信确认" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "SMS短信确认" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "个人" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4978,12 +5149,12 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 #, fuzzy msgid "Password changing failed" msgstr "密码已保存。" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 #, fuzzy msgid "Password changing is not allowed" msgstr "密码已保存。" @@ -5261,20 +5432,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "没有验证码" -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 #, fuzzy msgid "Go to the installer." msgstr "登入本站" @@ -5474,24 +5645,24 @@ msgstr "上传文件时出错。" msgid "Not an image or corrupt file." msgstr "不是图片文件或文件已损坏。" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "不支持这种图像格式。" -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "没有这份通告。" -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "未知文件类型" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5806,6 +5977,12 @@ msgstr "到" msgid "Available characters" msgstr "6 个或更多字符" +#: lib/messageform.php:178 lib/noticeform.php:236 +#, fuzzy +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "发送" + #: lib/noticeform.php:160 #, fuzzy msgid "Send a notice" @@ -5866,27 +6043,27 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 #, fuzzy msgid "in context" msgstr "没有内容!" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "创建" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 #, fuzzy msgid "Reply to this notice" msgstr "无法删除通告。" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 #, fuzzy msgid "Reply" msgstr "回复" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "消息已发布。" @@ -5937,6 +6114,10 @@ msgstr "回复" msgid "Favorites" msgstr "收藏夹" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "用户" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "收件箱" @@ -6034,7 +6215,7 @@ msgstr "无法删除通告。" msgid "Repeat this notice" msgstr "无法删除通告。" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -6057,6 +6238,10 @@ msgstr "搜索" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "搜索" + #: lib/searchaction.php:162 #, fuzzy msgid "Search help" @@ -6112,6 +6297,15 @@ msgstr "订阅 %s" msgid "Groups %s is a member of" msgstr "%s 组是成员组成了" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "邀请" + +#: lib/subgroupnav.php:106 +#, fuzzy, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "使用这个表单来邀请好友和同事加入。" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -6192,47 +6386,47 @@ msgstr "新消息" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "几秒前" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "一分钟前" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "%d 分钟前" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "一小时前" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "%d 小时前" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "一天前" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "%d 天前" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "一个月前" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "%d 个月前" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "一年前" diff --git a/locale/zh_TW/LC_MESSAGES/statusnet.po b/locale/zh_TW/LC_MESSAGES/statusnet.po index ff517edec..5cca450ca 100644 --- a/locale/zh_TW/LC_MESSAGES/statusnet.po +++ b/locale/zh_TW/LC_MESSAGES/statusnet.po @@ -7,81 +7,86 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 23:49+0000\n" -"PO-Revision-Date: 2010-02-24 23:52:03+0000\n" +"POT-Creation-Date: 2010-03-02 21:02+0000\n" +"PO-Revision-Date: 2010-03-02 21:04:05+0000\n" "Language-Team: Traditional Chinese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r62925); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.17alpha (r63186); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hant\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 +#. TRANS: Page title +#: actions/accessadminpanel.php:55 #, fuzzy msgid "Access" msgstr "接受" -#: actions/accessadminpanel.php:65 +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 #, fuzzy msgid "Site access settings" msgstr "線上即時通設定" -#: actions/accessadminpanel.php:158 +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 #, fuzzy msgid "Registration" msgstr "所有訂閱" -#: actions/accessadminpanel.php:161 -msgid "Private" -msgstr "" - -#: actions/accessadminpanel.php:163 +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 msgid "Prohibit anonymous users (not logged in) from viewing site?" msgstr "" +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. #: actions/accessadminpanel.php:167 -msgid "Invite only" +msgctxt "LABEL" +msgid "Private" msgstr "" -#: actions/accessadminpanel.php:169 +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 msgid "Make registration invitation only." msgstr "" -#: actions/accessadminpanel.php:173 -#, fuzzy -msgid "Closed" -msgstr "無此使用者" +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "" -#: actions/accessadminpanel.php:175 +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 msgid "Disable new registrations." msgstr "" -#: actions/accessadminpanel.php:189 actions/designadminpanel.php:586 -#: actions/emailsettings.php:195 actions/imsettings.php:163 -#: actions/othersettings.php:126 actions/pathsadminpanel.php:351 -#: actions/profilesettings.php:174 actions/sessionsadminpanel.php:199 -#: actions/siteadminpanel.php:336 actions/smssettings.php:181 -#: actions/subscriptions.php: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 -msgid "Save" -msgstr "" +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +#, fuzzy +msgid "Closed" +msgstr "無此使用者" -#: actions/accessadminpanel.php:189 +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 #, fuzzy msgid "Save access settings" msgstr "線上即時通設定" -#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 -#: actions/showfavorites.php:137 actions/tag.php:51 +#: actions/accessadminpanel.php:203 +msgctxt "BUTTON" +msgid "Save" +msgstr "" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:64 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 #, fuzzy msgid "No such page" msgstr "無此通知" -#: actions/all.php:74 actions/allrss.php:68 +#: actions/all.php:75 actions/allrss.php:68 #: actions/apiaccountupdatedeliverydevice.php:113 #: actions/apiaccountupdateprofile.php:105 #: actions/apiaccountupdateprofilebackgroundimage.php:116 @@ -95,72 +100,82 @@ msgstr "無此通知" #: actions/apitimelinehome.php:79 actions/apitimelinementions.php:79 #: actions/apitimelineuser.php:81 actions/avatarbynickname.php:75 #: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 -#: actions/microsummary.php:62 actions/newmessage.php:116 actions/otp.php:76 -#: actions/remotesubscribe.php:145 actions/remotesubscribe.php:154 -#: actions/replies.php:73 actions/repliesrss.php:38 actions/rsd.php:116 -#: actions/showfavorites.php:105 actions/userbyid.php:74 -#: actions/usergroups.php:91 actions/userrss.php:38 actions/xrds.php:71 -#: lib/command.php:163 lib/command.php:302 lib/command.php:355 -#: lib/command.php:401 lib/command.php:462 lib/command.php:518 -#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:302 +#: lib/command.php:355 lib/command.php:401 lib/command.php:462 +#: lib/command.php:518 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 msgid "No such user." msgstr "無此使用者" -#: actions/all.php:84 +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:86 #, fuzzy, php-format msgid "%1$s and friends, page %2$d" msgstr "%s與好友" -#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#: actions/all.php:89 actions/all.php:177 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 #: lib/personalgroupnav.php:100 #, php-format msgid "%s and friends" msgstr "%s與好友" -#: actions/all.php:99 +#. TRANS: %1$s is user nickname +#: actions/all.php:103 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 1.0)" msgstr "發送給%s好友的訂閱" -#: actions/all.php:107 +#. TRANS: %1$s is user nickname +#: actions/all.php:112 #, fuzzy, php-format msgid "Feed for friends of %s (RSS 2.0)" msgstr "發送給%s好友的訂閱" -#: actions/all.php:115 +#. TRANS: %1$s is user nickname +#: actions/all.php:121 #, fuzzy, php-format msgid "Feed for friends of %s (Atom)" msgstr "發送給%s好友的訂閱" -#: actions/all.php:127 +#. TRANS: %1$s is user nickname +#: actions/all.php:134 #, php-format msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" -#: actions/all.php:132 +#: actions/all.php:139 #, php-format msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" -#: actions/all.php:134 +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:142 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 +#: actions/all.php:145 actions/replies.php:210 actions/showstream.php:211 #, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" -#: actions/all.php:165 +#. TRANS: H1 text +#: actions/all.php:174 #, fuzzy msgid "You and friends" msgstr "%s與好友" @@ -179,20 +194,20 @@ msgstr "" #: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 #: actions/apifavoritecreate.php:99 actions/apifavoritedestroy.php:100 #: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 -#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:136 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:138 #: actions/apigroupismember.php:114 actions/apigroupjoin.php:155 #: actions/apigroupleave.php:141 actions/apigrouplist.php:132 #: actions/apigrouplistall.php:120 actions/apigroupmembership.php:106 #: actions/apigroupshow.php:115 actions/apihelptest.php:88 #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 -#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:135 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 -#: actions/apitimelinegroup.php:195 actions/apitimelinehome.php:184 +#: actions/apitimelinegroup.php:185 actions/apitimelinehome.php:184 #: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 -#: actions/apitimelineuser.php:207 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:196 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "確認碼遺失" @@ -226,8 +241,9 @@ msgstr "無法更新使用者" #: actions/apiaccountupdateprofilebackgroundimage.php:194 #: actions/apiaccountupdateprofilecolors.php:185 #: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 -#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 -#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:98 lib/galleryaction.php:66 +#: lib/profileaction.php:84 msgid "User has no profile." msgstr "" @@ -252,7 +268,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:146 #: actions/apiaccountupdateprofilecolors.php:164 #: actions/apiaccountupdateprofilecolors.php:174 -#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 msgid "Unable to save your design settings." @@ -368,68 +384,68 @@ msgstr "無法更新使用者" msgid "Could not find target user." msgstr "無法更新使用者" -#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/apigroupcreate.php:166 actions/editgroup.php:186 #: actions/newgroup.php:126 actions/profilesettings.php:215 #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "暱稱請用小寫字母或數字,勿加空格。" -#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/apigroupcreate.php:175 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." msgstr "此暱稱已有人使用。再試試看別的吧。" -#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/apigroupcreate.php:182 actions/editgroup.php:193 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." msgstr "" -#: actions/apigroupcreate.php:196 actions/editapplication.php:215 -#: actions/editgroup.php:195 actions/newapplication.php:203 +#: actions/apigroupcreate.php:198 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 #: actions/newgroup.php:139 actions/profilesettings.php:222 #: actions/register.php:217 msgid "Homepage is not a valid URL." msgstr "個人首頁位址錯誤" -#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/apigroupcreate.php:207 actions/editgroup.php:202 #: actions/newgroup.php:142 actions/profilesettings.php:225 #: actions/register.php:220 msgid "Full name is too long (max 255 chars)." msgstr "全名過長(最多255字元)" -#: actions/apigroupcreate.php:213 actions/editapplication.php:190 +#: actions/apigroupcreate.php:215 actions/editapplication.php:190 #: actions/newapplication.php:172 #, fuzzy, php-format msgid "Description is too long (max %d chars)." msgstr "自我介紹過長(共140個字元)" -#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/apigroupcreate.php:226 actions/editgroup.php:208 #: actions/newgroup.php:148 actions/profilesettings.php:232 #: actions/register.php:227 msgid "Location is too long (max 255 chars)." msgstr "地點過長(共255個字)" -#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/apigroupcreate.php:245 actions/editgroup.php:219 #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." msgstr "" -#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/apigroupcreate.php:266 actions/editgroup.php:228 #: actions/newgroup.php:168 #, fuzzy, php-format msgid "Invalid alias: \"%s\"" msgstr "個人首頁連結%s無效" -#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/apigroupcreate.php:275 actions/editgroup.php:232 #: actions/newgroup.php:172 #, fuzzy, php-format msgid "Alias \"%s\" already in use. Try another one." msgstr "此暱稱已有人使用。再試試看別的吧。" -#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/apigroupcreate.php:288 actions/editgroup.php:238 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." msgstr "" @@ -441,15 +457,15 @@ msgstr "" msgid "Group not found!" msgstr "目前無請求" -#: actions/apigroupjoin.php:110 actions/joingroup.php:90 +#: actions/apigroupjoin.php:110 actions/joingroup.php:100 msgid "You are already a member of that group." msgstr "" -#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +#: actions/apigroupjoin.php:119 actions/joingroup.php:105 lib/command.php:221 msgid "You have been blocked from that group by the admin." msgstr "" -#: actions/apigroupjoin.php:138 actions/joingroup.php:124 +#: actions/apigroupjoin.php:138 actions/joingroup.php:134 #, fuzzy, php-format msgid "Could not join user %1$s to group %2$s." msgstr "無法連結到伺服器:%s" @@ -459,7 +475,7 @@ msgstr "無法連結到伺服器:%s" msgid "You are not a member of this group." msgstr "無法連結到伺服器:%s" -#: actions/apigroupleave.php:124 actions/leavegroup.php:119 +#: actions/apigroupleave.php:124 actions/leavegroup.php:129 #, fuzzy, php-format msgid "Could not remove user %1$s from group %2$s." msgstr "無法從 %s 建立OpenID" @@ -491,7 +507,7 @@ msgstr "尺寸錯誤" #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 #: actions/emailsettings.php:238 actions/favor.php:75 actions/geocode.php:54 -#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupblock.php:66 actions/grouplogo.php:312 #: actions/groupunblock.php:66 actions/imsettings.php:206 #: actions/invite.php:56 actions/login.php:115 actions/makeadmin.php:66 #: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 @@ -535,7 +551,7 @@ msgstr "" #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 -#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/emailsettings.php:256 actions/grouplogo.php:322 #: actions/imsettings.php:220 actions/newapplication.php:121 #: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 #: actions/smssettings.php:248 lib/designsettings.php:304 @@ -558,14 +574,14 @@ msgid "" "give access to your %4$s account to third parties you trust." msgstr "" -#: actions/apioauthauthorize.php:310 lib/action.php:441 +#: actions/apioauthauthorize.php:310 #, fuzzy msgid "Account" msgstr "關於" #: actions/apioauthauthorize.php:313 actions/login.php:230 #: actions/profilesettings.php:106 actions/register.php:424 -#: actions/showgroup.php:236 actions/tagother.php:94 +#: actions/showgroup.php:244 actions/tagother.php:94 #: actions/userauthorization.php:145 lib/groupeditform.php:152 #: lib/userprofile.php:131 msgid "Nickname" @@ -650,12 +666,12 @@ msgid "%1$s updates favorited by %2$s / %2$s." msgstr "&s的微型部落格" #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 -#: actions/grouprss.php:131 actions/userrss.php:90 +#: actions/grouprss.php:138 actions/userrss.php:90 #, php-format msgid "%s timeline" msgstr "" -#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:112 actions/apitimelineuser.php:124 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -691,7 +707,7 @@ msgstr "" msgid "Repeats of %s" msgstr "" -#: actions/apitimelinetag.php:102 actions/tag.php:66 +#: actions/apitimelinetag.php:102 actions/tag.php:67 #, php-format msgid "Notices tagged with %s" msgstr "" @@ -714,8 +730,7 @@ msgstr "無此文件" #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 #: actions/grouplogo.php:86 actions/groupmembers.php:76 -#: actions/grouprss.php:91 actions/joingroup.php:76 actions/leavegroup.php:76 -#: actions/showgroup.php:121 +#: actions/grouprss.php:91 actions/showgroup.php:121 msgid "No nickname." msgstr "無暱稱" @@ -727,7 +742,7 @@ msgstr "無尺寸" msgid "Invalid size." msgstr "尺寸錯誤" -#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: actions/avatarsettings.php:67 actions/showgroup.php:229 #: lib/accountsettingsaction.php:112 msgid "Avatar" msgstr "個人圖像" @@ -744,31 +759,31 @@ msgid "User without matching profile" msgstr "" #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 -#: actions/grouplogo.php:251 +#: actions/grouplogo.php:254 #, fuzzy msgid "Avatar settings" msgstr "線上即時通設定" #: actions/avatarsettings.php:127 actions/avatarsettings.php:205 -#: actions/grouplogo.php:199 actions/grouplogo.php:259 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 msgid "Original" msgstr "" #: actions/avatarsettings.php:142 actions/avatarsettings.php:217 -#: actions/grouplogo.php:210 actions/grouplogo.php:271 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 msgid "Preview" msgstr "" #: actions/avatarsettings.php:149 actions/showapplication.php:252 -#: lib/deleteuserform.php:66 lib/noticelist.php:637 +#: lib/deleteuserform.php:66 lib/noticelist.php:655 msgid "Delete" msgstr "" -#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 msgid "Upload" msgstr "" -#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 msgid "Crop" msgstr "" @@ -776,7 +791,7 @@ msgstr "" msgid "Pick a square area of the image to be your avatar" msgstr "" -#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +#: actions/avatarsettings.php:343 actions/grouplogo.php:380 msgid "Lost our file data." msgstr "" @@ -811,23 +826,23 @@ msgid "" msgstr "" #: actions/block.php:143 actions/deleteapplication.php:153 -#: actions/deletenotice.php:145 actions/deleteuser.php:147 +#: actions/deletenotice.php:145 actions/deleteuser.php:150 #: actions/groupblock.php:178 msgid "No" msgstr "" -#: actions/block.php:143 actions/deleteuser.php:147 +#: actions/block.php:143 actions/deleteuser.php:150 #, fuzzy msgid "Do not block this user" msgstr "無此使用者" #: actions/block.php:144 actions/deleteapplication.php:158 -#: actions/deletenotice.php:146 actions/deleteuser.php:148 +#: actions/deletenotice.php:146 actions/deleteuser.php:151 #: actions/groupblock.php:179 lib/repeatform.php:132 msgid "Yes" msgstr "" -#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:355 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "無此使用者" @@ -836,41 +851,45 @@ msgstr "無此使用者" msgid "Failed to save block information." msgstr "" -#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 -#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 -#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 -#: actions/grouplogo.php:99 actions/groupmembers.php:83 -#: actions/grouprss.php:98 actions/groupunblock.php:86 -#: actions/joingroup.php:83 actions/leavegroup.php:83 actions/makeadmin.php:86 -#: actions/showgroup.php:137 lib/command.php:212 lib/command.php:260 +#: actions/blockedfromgroup.php:80 actions/blockedfromgroup.php:87 +#: actions/editgroup.php:100 actions/foafgroup.php:44 actions/foafgroup.php:62 +#: actions/foafgroup.php:69 actions/groupblock.php:86 actions/groupbyid.php:83 +#: actions/groupdesignsettings.php:100 actions/grouplogo.php:102 +#: actions/groupmembers.php:83 actions/groupmembers.php:90 +#: actions/grouprss.php:98 actions/grouprss.php:105 +#: actions/groupunblock.php:86 actions/joingroup.php:82 +#: actions/joingroup.php:93 actions/leavegroup.php:82 +#: actions/leavegroup.php:93 actions/makeadmin.php:86 +#: actions/showgroup.php:138 actions/showgroup.php:146 lib/command.php:212 +#: lib/command.php:260 #, fuzzy msgid "No such group." msgstr "無此通知" -#: actions/blockedfromgroup.php:90 +#: actions/blockedfromgroup.php:97 #, fuzzy, php-format msgid "%s blocked profiles" msgstr "無此通知" -#: actions/blockedfromgroup.php:93 +#: actions/blockedfromgroup.php:100 #, fuzzy, php-format msgid "%1$s blocked profiles, page %2$d" msgstr "%s與好友" -#: actions/blockedfromgroup.php:108 +#: actions/blockedfromgroup.php:115 msgid "A list of the users blocked from joining this group." msgstr "" -#: actions/blockedfromgroup.php:281 +#: actions/blockedfromgroup.php:288 #, fuzzy msgid "Unblock user from group" msgstr "無此使用者" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 msgid "Unblock" msgstr "" -#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 #, fuzzy msgid "Unblock this user" msgstr "無此使用者" @@ -951,7 +970,7 @@ msgstr "無法連結到伺服器:%s" #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 -#: lib/action.php:1197 +#: lib/action.php:1228 msgid "There was a problem with your session token." msgstr "" @@ -977,12 +996,13 @@ msgstr "無此通知" msgid "Delete this application" msgstr "請在140個字以內描述你自己與你的興趣" +#. TRANS: Client error message #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 #: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 #: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 #: actions/tagother.php:33 actions/unsubscribe.php:52 -#: lib/adminpanelaction.php:72 lib/profileformaction.php:63 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:63 #: lib/settingsaction.php:72 msgid "Not logged in." msgstr "" @@ -1010,7 +1030,7 @@ msgstr "" msgid "Do not delete this notice" msgstr "無此通知" -#: actions/deletenotice.php:146 lib/noticelist.php:637 +#: actions/deletenotice.php:146 lib/noticelist.php:655 msgid "Delete this notice" msgstr "" @@ -1028,19 +1048,19 @@ msgstr "無此使用者" msgid "Delete user" msgstr "" -#: actions/deleteuser.php:135 +#: actions/deleteuser.php:136 msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +#: actions/deleteuser.php:151 lib/deleteuserform.php:77 #, fuzzy msgid "Delete this user" msgstr "無此使用者" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 -#: lib/adminpanelaction.php:316 lib/groupnav.php:119 +#: lib/groupnav.php:119 msgid "Design" msgstr "" @@ -1149,6 +1169,17 @@ msgstr "" msgid "Reset back to default" msgstr "" +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 +#: actions/smssettings.php:181 actions/subscriptions.php:208 +#: actions/tagother.php:154 actions/useradminpanel.php:294 +#: lib/applicationeditform.php:333 lib/applicationeditform.php:334 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "" + #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" msgstr "" @@ -1248,31 +1279,31 @@ msgstr "" msgid "You must be logged in to create a group." msgstr "" -#: actions/editgroup.php:103 actions/editgroup.php:168 -#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +#: actions/editgroup.php:107 actions/editgroup.php:172 +#: actions/groupdesignsettings.php:107 actions/grouplogo.php:109 msgid "You must be an admin to edit the group." msgstr "" -#: actions/editgroup.php:154 +#: actions/editgroup.php:158 msgid "Use this form to edit the group." msgstr "" -#: actions/editgroup.php:201 actions/newgroup.php:145 +#: actions/editgroup.php:205 actions/newgroup.php:145 #, fuzzy, php-format msgid "description is too long (max %d chars)." msgstr "自我介紹過長(共140個字元)" -#: actions/editgroup.php:253 +#: actions/editgroup.php:258 #, fuzzy msgid "Could not update group." msgstr "無法更新使用者" -#: actions/editgroup.php:259 classes/User_group.php:433 +#: actions/editgroup.php:264 classes/User_group.php:478 #, fuzzy msgid "Could not create aliases." msgstr "無法存取個人圖像資料" -#: actions/editgroup.php:269 +#: actions/editgroup.php:280 msgid "Options saved." msgstr "" @@ -1611,7 +1642,7 @@ msgstr "" msgid "User is not a member of group." msgstr "" -#: actions/groupblock.php:136 actions/groupmembers.php:316 +#: actions/groupblock.php:136 actions/groupmembers.php:323 #, fuzzy msgid "Block user from group" msgstr "無此使用者" @@ -1647,89 +1678,89 @@ msgstr "查無此Jabber ID" msgid "You must be logged in to edit a group." msgstr "" -#: actions/groupdesignsettings.php:141 +#: actions/groupdesignsettings.php:144 msgid "Group design" msgstr "" -#: actions/groupdesignsettings.php:152 +#: actions/groupdesignsettings.php:155 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" -#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 #, fuzzy msgid "Couldn't update your design." msgstr "無法更新使用者" -#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 msgid "Design preferences saved." msgstr "" -#: actions/grouplogo.php:139 actions/grouplogo.php:192 +#: actions/grouplogo.php:142 actions/grouplogo.php:195 msgid "Group logo" msgstr "" -#: actions/grouplogo.php:150 +#: actions/grouplogo.php:153 #, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -#: actions/grouplogo.php:178 +#: actions/grouplogo.php:181 msgid "User without matching profile." msgstr "" -#: actions/grouplogo.php:362 +#: actions/grouplogo.php:365 msgid "Pick a square area of the image to be the logo." msgstr "" -#: actions/grouplogo.php:396 +#: actions/grouplogo.php:399 #, fuzzy msgid "Logo updated." msgstr "更新個人圖像" -#: actions/grouplogo.php:398 +#: actions/grouplogo.php:401 #, fuzzy msgid "Failed updating logo." msgstr "無法上傳個人圖像" -#: actions/groupmembers.php:93 lib/groupnav.php:92 +#: actions/groupmembers.php:100 lib/groupnav.php:92 #, php-format msgid "%s group members" msgstr "" -#: actions/groupmembers.php:96 +#: actions/groupmembers.php:103 #, php-format msgid "%1$s group members, page %2$d" msgstr "" -#: actions/groupmembers.php:111 +#: actions/groupmembers.php:118 msgid "A list of the users in this group." msgstr "" -#: actions/groupmembers.php:175 lib/action.php:448 lib/groupnav.php:107 +#: actions/groupmembers.php:182 lib/groupnav.php:107 msgid "Admin" msgstr "" -#: actions/groupmembers.php:348 lib/blockform.php:69 +#: actions/groupmembers.php:355 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:443 +#: actions/groupmembers.php:450 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:475 +#: actions/groupmembers.php:482 msgid "Make this user an admin" msgstr "" -#: actions/grouprss.php:133 +#: actions/grouprss.php:140 #, fuzzy, php-format msgid "Updates from members of %1$s on %2$s!" msgstr "&s的微型部落格" @@ -1973,16 +2004,18 @@ msgstr "" msgid "Optionally add a personal message to the invitation." msgstr "" -#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:236 +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +msgctxt "BUTTON" msgid "Send" msgstr "" -#: actions/invite.php:226 +#: actions/invite.php:227 #, php-format msgid "%1$s has invited you to join them on %2$s" msgstr "" -#: actions/invite.php:228 +#: actions/invite.php:229 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -2017,7 +2050,12 @@ msgstr "" msgid "You must be logged in to join a group." msgstr "" -#: actions/joingroup.php:131 +#: actions/joingroup.php:88 actions/leavegroup.php:88 +#, fuzzy +msgid "No nickname or ID." +msgstr "無暱稱" + +#: actions/joingroup.php:141 #, php-format msgid "%1$s joined group %2$s" msgstr "" @@ -2026,11 +2064,11 @@ msgstr "" msgid "You must be logged in to leave a group." msgstr "" -#: actions/leavegroup.php:90 lib/command.php:265 +#: actions/leavegroup.php:100 lib/command.php:265 msgid "You are not a member of that group." msgstr "" -#: actions/leavegroup.php:127 +#: actions/leavegroup.php:137 #, fuzzy, php-format msgid "%1$s left group %2$s" msgstr "%1$s的狀態是%2$s" @@ -2047,8 +2085,7 @@ msgstr "使用者名稱或密碼錯誤" msgid "Error setting user. You are probably not authorized." msgstr "" -#: actions/login.php:188 actions/login.php:241 lib/action.php:466 -#: lib/logingroupnav.php:79 +#: actions/login.php:188 actions/login.php:241 lib/logingroupnav.php:79 msgid "Login" msgstr "登入" @@ -2291,8 +2328,8 @@ msgstr "連結" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 -#: lib/api.php:1068 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/apiaction.php:1040 +#: lib/apiaction.php:1068 lib/apiaction.php:1177 msgid "Not a supported data format." msgstr "" @@ -2438,7 +2475,7 @@ msgstr "無法存取新密碼" msgid "Password saved." msgstr "" -#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:331 +#: actions/pathsadminpanel.php:59 msgid "Paths" msgstr "" @@ -2471,7 +2508,6 @@ msgid "Invalid SSL server. The maximum length is 255 characters." msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 -#: lib/adminpanelaction.php:311 msgid "Site" msgstr "" @@ -2646,7 +2682,7 @@ msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "1-64個小寫英文字母或數字,勿加標點符號或空格" #: actions/profilesettings.php:111 actions/register.php:448 -#: actions/showgroup.php:247 actions/tagother.php:104 +#: actions/showgroup.php:255 actions/tagother.php:104 #: lib/groupeditform.php:157 lib/userprofile.php:149 msgid "Full name" msgstr "全名" @@ -2675,7 +2711,7 @@ msgid "Bio" msgstr "自我介紹" #: actions/profilesettings.php:132 actions/register.php:471 -#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/showgroup.php:264 actions/tagother.php:112 #: actions/userauthorization.php:166 lib/groupeditform.php:177 #: lib/userprofile.php:164 msgid "Location" @@ -2757,7 +2793,8 @@ msgstr "無法儲存個人資料" msgid "Couldn't save tags." msgstr "無法儲存個人資料" -#: actions/profilesettings.php:391 lib/adminpanelaction.php:137 +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 msgid "Settings saved." msgstr "" @@ -2770,46 +2807,46 @@ msgstr "" msgid "Could not retrieve public stream." msgstr "" -#: actions/public.php:129 +#: actions/public.php:130 #, php-format msgid "Public timeline, page %d" msgstr "" -#: actions/public.php:131 lib/publicgroupnav.php:79 +#: actions/public.php:132 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "" -#: actions/public.php:159 +#: actions/public.php:160 msgid "Public Stream Feed (RSS 1.0)" msgstr "" -#: actions/public.php:163 +#: actions/public.php:164 msgid "Public Stream Feed (RSS 2.0)" msgstr "" -#: actions/public.php:167 +#: actions/public.php:168 #, fuzzy msgid "Public Stream Feed (Atom)" msgstr "%s的公開內容" -#: actions/public.php:187 +#: actions/public.php:188 #, php-format msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" -#: actions/public.php:190 +#: actions/public.php:191 msgid "Be the first to post!" msgstr "" -#: actions/public.php:194 +#: actions/public.php:195 #, php-format msgid "" "Why not [register an account](%%action.register%%) and be the first to post!" msgstr "" -#: actions/public.php:241 +#: actions/public.php:242 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2818,7 +2855,7 @@ msgid "" "friends, family, and colleagues! ([Read more](%%doc.help%%))" msgstr "" -#: actions/public.php:246 +#: actions/public.php:247 #, php-format msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" @@ -2988,8 +3025,7 @@ msgstr "確認碼發生錯誤" msgid "Registration successful" msgstr "" -#: actions/register.php:114 actions/register.php:503 lib/action.php:463 -#: lib/logingroupnav.php:85 +#: actions/register.php:114 actions/register.php:503 lib/logingroupnav.php:85 msgid "Register" msgstr "" @@ -3152,7 +3188,7 @@ msgstr "" msgid "You already repeated that notice." msgstr "無此使用者" -#: actions/repeat.php:114 lib/noticelist.php:656 +#: actions/repeat.php:114 lib/noticelist.php:674 #, fuzzy msgid "Repeated" msgstr "新增" @@ -3162,47 +3198,47 @@ msgstr "新增" msgid "Repeated!" msgstr "新增" -#: actions/replies.php:125 actions/repliesrss.php:68 +#: actions/replies.php:126 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 #, php-format msgid "Replies to %s" msgstr "" -#: actions/replies.php:127 +#: actions/replies.php:128 #, fuzzy, php-format msgid "Replies to %1$s, page %2$d" msgstr "&s的微型部落格" -#: actions/replies.php:144 +#: actions/replies.php:145 #, fuzzy, php-format msgid "Replies feed for %s (RSS 1.0)" msgstr "發送給%s好友的訂閱" -#: actions/replies.php:151 +#: actions/replies.php:152 #, fuzzy, php-format msgid "Replies feed for %s (RSS 2.0)" msgstr "發送給%s好友的訂閱" -#: actions/replies.php:158 +#: actions/replies.php:159 #, fuzzy, php-format msgid "Replies feed for %s (Atom)" msgstr "發送給%s好友的訂閱" -#: actions/replies.php:198 +#: actions/replies.php:199 #, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to his attention yet." msgstr "" -#: actions/replies.php:203 +#: actions/replies.php:204 #, php-format msgid "" "You can engage other users in a conversation, subscribe to more people or " "[join groups](%%action.groups%%)." msgstr "" -#: actions/replies.php:205 +#: actions/replies.php:206 #, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to his or her " @@ -3229,7 +3265,6 @@ msgid "User is already sandboxed." msgstr "" #: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 -#: lib/adminpanelaction.php:336 msgid "Sessions" msgstr "" @@ -3254,7 +3289,7 @@ msgid "Turn on debugging output for sessions." msgstr "" #: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:336 -#: actions/useradminpanel.php:293 +#: actions/useradminpanel.php:294 #, fuzzy msgid "Save site settings" msgstr "線上即時通設定" @@ -3288,7 +3323,7 @@ msgstr "地點" msgid "Description" msgstr "所有訂閱" -#: actions/showapplication.php:192 actions/showgroup.php:429 +#: actions/showapplication.php:192 actions/showgroup.php:437 #: lib/profileaction.php:174 msgid "Statistics" msgstr "" @@ -3349,35 +3384,35 @@ msgstr "%s與好友" msgid "Could not retrieve favorite notices." msgstr "" -#: actions/showfavorites.php:170 +#: actions/showfavorites.php:171 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 1.0)" msgstr "發送給%s好友的訂閱" -#: actions/showfavorites.php:177 +#: actions/showfavorites.php:178 #, fuzzy, php-format msgid "Feed for favorites of %s (RSS 2.0)" msgstr "發送給%s好友的訂閱" -#: actions/showfavorites.php:184 +#: actions/showfavorites.php:185 #, fuzzy, php-format msgid "Feed for favorites of %s (Atom)" msgstr "發送給%s好友的訂閱" -#: actions/showfavorites.php:205 +#: actions/showfavorites.php:206 msgid "" "You haven't chosen any favorite notices yet. Click the fave button on " "notices you like to bookmark them for later or shed a spotlight on them." msgstr "" -#: actions/showfavorites.php:207 +#: actions/showfavorites.php:208 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Post something interesting " "they would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:211 +#: actions/showfavorites.php:212 #, php-format msgid "" "%s hasn't added any notices to his favorites yet. Why not [register an " @@ -3385,7 +3420,7 @@ msgid "" "would add to their favorites :)" msgstr "" -#: actions/showfavorites.php:242 +#: actions/showfavorites.php:243 msgid "This is a way to share what you like." msgstr "" @@ -3399,70 +3434,70 @@ msgstr "" msgid "%1$s group, page %2$d" msgstr "所有訂閱" -#: actions/showgroup.php:218 +#: actions/showgroup.php:226 #, fuzzy msgid "Group profile" msgstr "無此通知" -#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/showgroup.php:271 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" msgstr "" -#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/showgroup.php:282 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 msgid "Note" msgstr "" -#: actions/showgroup.php:284 lib/groupeditform.php:184 +#: actions/showgroup.php:292 lib/groupeditform.php:184 msgid "Aliases" msgstr "" -#: actions/showgroup.php:293 +#: actions/showgroup.php:301 msgid "Group actions" msgstr "" -#: actions/showgroup.php:328 +#: actions/showgroup.php:336 #, php-format msgid "Notice feed for %s group (RSS 1.0)" msgstr "" -#: actions/showgroup.php:334 +#: actions/showgroup.php:342 #, php-format msgid "Notice feed for %s group (RSS 2.0)" msgstr "" -#: actions/showgroup.php:340 +#: actions/showgroup.php:348 #, php-format msgid "Notice feed for %s group (Atom)" msgstr "" -#: actions/showgroup.php:345 +#: actions/showgroup.php:353 #, fuzzy, php-format msgid "FOAF for %s group" msgstr "無此通知" -#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +#: actions/showgroup.php:389 actions/showgroup.php:446 lib/groupnav.php:91 #, fuzzy msgid "Members" msgstr "何時加入會員的呢?" -#: actions/showgroup.php:386 lib/profileaction.php:117 +#: actions/showgroup.php:394 lib/profileaction.php:117 #: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 #: lib/subscriptionlist.php:126 lib/tagcloudsection.php:71 msgid "(None)" msgstr "" -#: actions/showgroup.php:392 +#: actions/showgroup.php:400 msgid "All members" msgstr "" -#: actions/showgroup.php:432 +#: actions/showgroup.php:440 #, fuzzy msgid "Created" msgstr "新增" -#: actions/showgroup.php:448 +#: actions/showgroup.php:456 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3472,7 +3507,7 @@ msgid "" "of this group and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -#: actions/showgroup.php:454 +#: actions/showgroup.php:462 #, php-format msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." @@ -3481,7 +3516,7 @@ msgid "" "their life and interests. " msgstr "" -#: actions/showgroup.php:482 +#: actions/showgroup.php:490 msgid "Admins" msgstr "" @@ -3939,22 +3974,22 @@ msgstr "查無此Jabber ID" msgid "SMS" msgstr "" -#: actions/tag.php:68 +#: actions/tag.php:69 #, fuzzy, php-format msgid "Notices tagged with %1$s, page %2$d" msgstr "&s的微型部落格" -#: actions/tag.php:86 +#: actions/tag.php:87 #, php-format msgid "Notice feed for tag %s (RSS 1.0)" msgstr "" -#: actions/tag.php:92 +#: actions/tag.php:93 #, fuzzy, php-format msgid "Notice feed for tag %s (RSS 2.0)" msgstr "發送給%s好友的訂閱" -#: actions/tag.php:98 +#: actions/tag.php:99 #, php-format msgid "Notice feed for tag %s (Atom)" msgstr "" @@ -4008,7 +4043,7 @@ msgstr "" msgid "No such tag." msgstr "無此通知" -#: actions/twitapitrends.php:87 +#: actions/twitapitrends.php:85 msgid "API method under construction." msgstr "" @@ -4041,72 +4076,73 @@ msgid "" "Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." msgstr "" -#: actions/useradminpanel.php:58 lib/adminpanelaction.php:321 -#: lib/personalgroupnav.php:115 +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +msgctxt "TITLE" msgid "User" msgstr "" -#: actions/useradminpanel.php:69 +#: actions/useradminpanel.php:70 msgid "User settings for this StatusNet site." msgstr "" -#: actions/useradminpanel.php:148 +#: actions/useradminpanel.php:149 msgid "Invalid bio limit. Must be numeric." msgstr "" -#: actions/useradminpanel.php:154 +#: actions/useradminpanel.php:155 msgid "Invalid welcome text. Max length is 255 characters." msgstr "" -#: actions/useradminpanel.php:164 +#: actions/useradminpanel.php:165 #, php-format msgid "Invalid default subscripton: '%1$s' is not user." msgstr "" -#: actions/useradminpanel.php:217 lib/accountsettingsaction.php:108 +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 #: lib/personalgroupnav.php:109 msgid "Profile" msgstr "" -#: actions/useradminpanel.php:221 +#: actions/useradminpanel.php:222 msgid "Bio Limit" msgstr "" -#: actions/useradminpanel.php:222 +#: actions/useradminpanel.php:223 msgid "Maximum length of a profile bio in characters." msgstr "" -#: actions/useradminpanel.php:230 +#: actions/useradminpanel.php:231 msgid "New users" msgstr "" -#: actions/useradminpanel.php:234 +#: actions/useradminpanel.php:235 msgid "New user welcome" msgstr "" -#: actions/useradminpanel.php:235 +#: actions/useradminpanel.php:236 msgid "Welcome text for new users (Max 255 chars)." msgstr "" -#: actions/useradminpanel.php:240 +#: actions/useradminpanel.php:241 #, fuzzy msgid "Default subscription" msgstr "所有訂閱" -#: actions/useradminpanel.php:241 +#: actions/useradminpanel.php:242 msgid "Automatically subscribe new users to this user." msgstr "" -#: actions/useradminpanel.php:250 +#: actions/useradminpanel.php:251 #, fuzzy msgid "Invitations" msgstr "地點" -#: actions/useradminpanel.php:255 +#: actions/useradminpanel.php:256 msgid "Invitations enabled" msgstr "" -#: actions/useradminpanel.php:257 +#: actions/useradminpanel.php:258 msgid "Whether to allow users to invite new users." msgstr "" @@ -4280,7 +4316,7 @@ msgstr "" msgid "Plugins" msgstr "" -#: actions/version.php:196 lib/action.php:747 +#: actions/version.php:196 lib/action.php:778 #, fuzzy msgid "Version" msgstr "地點" @@ -4321,6 +4357,11 @@ msgstr "無法更新使用者" msgid "Group leave failed." msgstr "無此通知" +#: classes/Local_group.php:41 +#, fuzzy +msgid "Could not update local group." +msgstr "無法更新使用者" + #: classes/Login_token.php:76 #, fuzzy, php-format msgid "Could not create login token for %s" @@ -4338,46 +4379,46 @@ msgstr "" msgid "Could not update message with new URI." msgstr "" -#: classes/Notice.php:157 +#: classes/Notice.php:172 #, php-format msgid "DB error inserting hashtag: %s" msgstr "" -#: classes/Notice.php:222 +#: classes/Notice.php:239 #, fuzzy msgid "Problem saving notice. Too long." msgstr "儲存使用者發生錯誤" -#: classes/Notice.php:226 +#: classes/Notice.php:243 #, fuzzy msgid "Problem saving notice. Unknown user." msgstr "儲存使用者發生錯誤" -#: classes/Notice.php:231 +#: classes/Notice.php:248 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" -#: classes/Notice.php:237 +#: classes/Notice.php:254 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" -#: classes/Notice.php:243 +#: classes/Notice.php:260 msgid "You are banned from posting notices on this site." msgstr "" -#: classes/Notice.php:309 classes/Notice.php:335 +#: classes/Notice.php:326 classes/Notice.php:352 msgid "Problem saving notice." msgstr "" -#: classes/Notice.php:882 +#: classes/Notice.php:911 #, fuzzy msgid "Problem saving group inbox." msgstr "儲存使用者發生錯誤" -#: classes/Notice.php:1407 +#: classes/Notice.php:1442 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4408,21 +4449,31 @@ msgstr "無法刪除帳號" msgid "Couldn't delete subscription." msgstr "無法刪除帳號" -#: classes/User.php:372 +#: classes/User.php:373 #, php-format msgid "Welcome to %1$s, @%2$s!" msgstr "" -#: classes/User_group.php:423 +#: classes/User_group.php:462 #, fuzzy msgid "Could not create group." msgstr "無法存取個人圖像資料" -#: classes/User_group.php:452 +#: classes/User_group.php:471 +#, fuzzy +msgid "Could not set group URI." +msgstr "註冊失敗" + +#: classes/User_group.php:492 #, fuzzy msgid "Could not set group membership." msgstr "註冊失敗" +#: classes/User_group.php:506 +#, fuzzy +msgid "Could not save local group info." +msgstr "註冊失敗" + #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" msgstr "" @@ -4466,125 +4517,186 @@ msgstr "" msgid "Primary site navigation" msgstr "" +#. TRANS: Tooltip for main menu option "Personal" #: lib/action.php:439 -msgid "Home" -msgstr "主頁" - -#: lib/action.php:439 +msgctxt "TOOLTIP" msgid "Personal profile and friends timeline" msgstr "" -#: lib/action.php:441 -msgid "Change your email, avatar, password, profile" -msgstr "" +#: lib/action.php:442 +#, fuzzy +msgctxt "MENU" +msgid "Personal" +msgstr "地點" +#. TRANS: Tooltip for main menu option "Account" #: lib/action.php:444 -msgid "Connect" -msgstr "連結" +#, fuzzy +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "更改密碼" -#: lib/action.php:444 +#: lib/action.php:447 #, fuzzy +msgctxt "MENU" +msgid "Account" +msgstr "關於" + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:450 +#, fuzzy +msgctxt "TOOLTIP" msgid "Connect to services" msgstr "無法連結到伺服器:%s" -#: lib/action.php:448 +#: lib/action.php:453 +#, fuzzy +msgctxt "MENU" +msgid "Connect" +msgstr "連結" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:457 +#, fuzzy +msgctxt "TOOLTIP" msgid "Change site configuration" -msgstr "" +msgstr "確認信箱" -#: lib/action.php:452 lib/subgroupnav.php:105 -msgid "Invite" +#: lib/action.php:460 +msgctxt "MENU" +msgid "Admin" msgstr "" -#: lib/action.php:453 lib/subgroupnav.php:106 +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:464 #, php-format +msgctxt "TOOLTIP" msgid "Invite friends and colleagues to join you on %s" msgstr "" -#: lib/action.php:458 -msgid "Logout" -msgstr "登出" +#: lib/action.php:467 +#, fuzzy +msgctxt "MENU" +msgid "Invite" +msgstr "尺寸錯誤" -#: lib/action.php:458 +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:473 +msgctxt "TOOLTIP" msgid "Logout from the site" msgstr "" -#: lib/action.php:463 +#: lib/action.php:476 +#, fuzzy +msgctxt "MENU" +msgid "Logout" +msgstr "登出" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:481 #, fuzzy +msgctxt "TOOLTIP" msgid "Create an account" msgstr "新增帳號" -#: lib/action.php:466 +#: lib/action.php:484 +#, fuzzy +msgctxt "MENU" +msgid "Register" +msgstr "所有訂閱" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:487 +msgctxt "TOOLTIP" msgid "Login to the site" msgstr "" -#: lib/action.php:469 lib/action.php:732 -msgid "Help" -msgstr "求救" +#: lib/action.php:490 +#, fuzzy +msgctxt "MENU" +msgid "Login" +msgstr "登入" -#: lib/action.php:469 +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:493 #, fuzzy +msgctxt "TOOLTIP" msgid "Help me!" msgstr "求救" -#: lib/action.php:472 lib/searchaction.php:127 -msgid "Search" -msgstr "" +#: lib/action.php:496 +#, fuzzy +msgctxt "MENU" +msgid "Help" +msgstr "求救" -#: lib/action.php:472 +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:499 +msgctxt "TOOLTIP" msgid "Search for people or text" msgstr "" -#: lib/action.php:493 +#: lib/action.php:502 +msgctxt "MENU" +msgid "Search" +msgstr "" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#: lib/action.php:524 #, fuzzy msgid "Site notice" msgstr "新訊息" -#: lib/action.php:559 +#: lib/action.php:590 msgid "Local views" msgstr "" -#: lib/action.php:625 +#: lib/action.php:656 #, fuzzy msgid "Page notice" msgstr "新訊息" -#: lib/action.php:727 +#: lib/action.php:758 msgid "Secondary site navigation" msgstr "" -#: lib/action.php:734 +#: lib/action.php:763 +msgid "Help" +msgstr "求救" + +#: lib/action.php:765 msgid "About" msgstr "關於" -#: lib/action.php:736 +#: lib/action.php:767 msgid "FAQ" msgstr "常見問題" -#: lib/action.php:740 +#: lib/action.php:771 msgid "TOS" msgstr "" -#: lib/action.php:743 +#: lib/action.php:774 msgid "Privacy" msgstr "" -#: lib/action.php:745 +#: lib/action.php:776 msgid "Source" msgstr "" -#: lib/action.php:749 +#: lib/action.php:780 msgid "Contact" msgstr "好友名單" -#: lib/action.php:751 +#: lib/action.php:782 msgid "Badge" msgstr "" -#: lib/action.php:779 +#: lib/action.php:810 msgid "StatusNet software license" msgstr "" -#: lib/action.php:782 +#: lib/action.php:813 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." @@ -4593,12 +4705,12 @@ msgstr "" "**%%site.name%%**是由[%%site.broughtby%%](%%site.broughtbyurl%%)所提供的微型" "部落格服務" -#: lib/action.php:784 +#: lib/action.php:815 #, php-format msgid "**%%site.name%%** is a microblogging service. " msgstr "**%%site.name%%**是個微型部落格" -#: lib/action.php:786 +#: lib/action.php:817 #, php-format msgid "" "It runs the [StatusNet](http://status.net/) microblogging software, version %" @@ -4606,113 +4718,164 @@ msgid "" "org/licensing/licenses/agpl-3.0.html)." msgstr "" -#: lib/action.php:801 +#: lib/action.php:832 #, fuzzy msgid "Site content license" msgstr "新訊息" -#: lib/action.php:806 +#: lib/action.php:837 #, php-format msgid "Content and data of %1$s are private and confidential." msgstr "" -#: lib/action.php:811 +#: lib/action.php:842 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" -#: lib/action.php:814 +#: lib/action.php:845 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" -#: lib/action.php:827 +#: lib/action.php:858 msgid "All " msgstr "" -#: lib/action.php:833 +#: lib/action.php:864 msgid "license." msgstr "" -#: lib/action.php:1132 +#: lib/action.php:1163 msgid "Pagination" msgstr "" -#: lib/action.php:1141 +#: lib/action.php:1172 msgid "After" msgstr "" -#: lib/action.php:1149 +#: lib/action.php:1180 #, fuzzy msgid "Before" msgstr "之前的內容»" -#: lib/activity.php:382 +#: lib/activity.php:449 msgid "Can't handle remote content yet." msgstr "" -#: lib/activity.php:410 +#: lib/activity.php:477 msgid "Can't handle embedded XML content yet." msgstr "" -#: lib/activity.php:414 +#: lib/activity.php:481 msgid "Can't handle embedded Base64 content yet." msgstr "" -#: lib/adminpanelaction.php:96 +#. TRANS: Client error message +#: lib/adminpanelaction.php:98 msgid "You cannot make changes to this site." msgstr "" -#: lib/adminpanelaction.php:107 +#. TRANS: Client error message +#: lib/adminpanelaction.php:110 msgid "Changes to that panel are not allowed." msgstr "" -#: lib/adminpanelaction.php:206 +#. TRANS: Client error message +#: lib/adminpanelaction.php:211 msgid "showForm() not implemented." msgstr "" -#: lib/adminpanelaction.php:235 +#. TRANS: Client error message +#: lib/adminpanelaction.php:241 msgid "saveSettings() not implemented." msgstr "" -#: lib/adminpanelaction.php:258 +#. TRANS: Client error message +#: lib/adminpanelaction.php:265 msgid "Unable to delete design setting." msgstr "" -#: lib/adminpanelaction.php:312 +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:330 #, fuzzy msgid "Basic site configuration" msgstr "確認信箱" -#: lib/adminpanelaction.php:317 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:332 +#, fuzzy +msgctxt "MENU" +msgid "Site" +msgstr "新訊息" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:338 #, fuzzy msgid "Design configuration" msgstr "確認信箱" -#: lib/adminpanelaction.php:322 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:340 +#, fuzzy +msgctxt "MENU" +msgid "Design" +msgstr "地點" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:346 #, fuzzy msgid "User configuration" msgstr "確認信箱" -#: lib/adminpanelaction.php:327 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:348 +msgctxt "MENU" +msgid "User" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:354 #, fuzzy msgid "Access configuration" msgstr "確認信箱" -#: lib/adminpanelaction.php:332 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:356 +#, fuzzy +msgctxt "MENU" +msgid "Access" +msgstr "接受" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:362 #, fuzzy msgid "Paths configuration" msgstr "確認信箱" -#: lib/adminpanelaction.php:337 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:364 +msgctxt "MENU" +msgid "Paths" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:370 #, fuzzy msgid "Sessions configuration" msgstr "確認信箱" -#: lib/apiauth.php:95 +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:372 +#, fuzzy +msgctxt "MENU" +msgid "Sessions" +msgstr "地點" + +#: lib/apiauth.php:94 msgid "API resource requires read-write access, but you only have read access." msgstr "" -#: lib/apiauth.php:273 +#: lib/apiauth.php:272 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" @@ -4803,11 +4966,11 @@ msgstr "" msgid "Tags for this attachment" msgstr "" -#: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 +#: lib/authenticationplugin.php:220 lib/authenticationplugin.php:225 msgid "Password changing failed" msgstr "" -#: lib/authenticationplugin.php:233 +#: lib/authenticationplugin.php:235 msgid "Password changing is not allowed" msgstr "" @@ -5085,20 +5248,20 @@ msgid "" "tracking - not yet implemented.\n" msgstr "" -#: lib/common.php:136 +#: lib/common.php:148 #, fuzzy msgid "No configuration file found. " msgstr "無確認碼" -#: lib/common.php:137 +#: lib/common.php:149 msgid "I looked for configuration files in the following places: " msgstr "" -#: lib/common.php:139 +#: lib/common.php:151 msgid "You may wish to run the installer to fix this." msgstr "" -#: lib/common.php:140 +#: lib/common.php:152 msgid "Go to the installer." msgstr "" @@ -5290,24 +5453,24 @@ msgstr "" msgid "Not an image or corrupt file." msgstr "" -#: lib/imagefile.php:105 +#: lib/imagefile.php:109 msgid "Unsupported image file format." msgstr "" -#: lib/imagefile.php:118 +#: lib/imagefile.php:122 #, fuzzy msgid "Lost our file." msgstr "無此通知" -#: lib/imagefile.php:150 lib/imagefile.php:197 +#: lib/imagefile.php:166 lib/imagefile.php:231 msgid "Unknown file type" msgstr "" -#: lib/imagefile.php:217 +#: lib/imagefile.php:251 msgid "MB" msgstr "" -#: lib/imagefile.php:219 +#: lib/imagefile.php:253 msgid "kB" msgstr "" @@ -5612,6 +5775,11 @@ msgstr "" msgid "Available characters" msgstr "6個以上字元" +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "" + #: lib/noticeform.php:160 #, fuzzy msgid "Send a notice" @@ -5671,25 +5839,25 @@ msgstr "" msgid "at" msgstr "" -#: lib/noticelist.php:558 +#: lib/noticelist.php:566 #, fuzzy msgid "in context" msgstr "無內容" -#: lib/noticelist.php:583 +#: lib/noticelist.php:601 #, fuzzy msgid "Repeated by" msgstr "新增" -#: lib/noticelist.php:610 +#: lib/noticelist.php:628 msgid "Reply to this notice" msgstr "" -#: lib/noticelist.php:611 +#: lib/noticelist.php:629 msgid "Reply" msgstr "" -#: lib/noticelist.php:655 +#: lib/noticelist.php:673 #, fuzzy msgid "Notice repeated" msgstr "更新個人圖像" @@ -5739,6 +5907,10 @@ msgstr "" msgid "Favorites" msgstr "" +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "" + #: lib/personalgroupnav.php:125 msgid "Inbox" msgstr "" @@ -5832,7 +6004,7 @@ msgstr "無此通知" msgid "Repeat this notice" msgstr "無此通知" -#: lib/router.php:665 +#: lib/router.php:668 msgid "No single user defined for single-user mode." msgstr "" @@ -5853,6 +6025,10 @@ msgstr "" msgid "Keyword(s)" msgstr "" +#: lib/searchaction.php:127 +msgid "Search" +msgstr "" + #: lib/searchaction.php:162 msgid "Search help" msgstr "" @@ -5906,6 +6082,15 @@ msgstr "此帳號已註冊" msgid "Groups %s is a member of" msgstr "" +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" @@ -5980,47 +6165,47 @@ msgstr "" msgid "Moderate" msgstr "" -#: lib/util.php:952 +#: lib/util.php:1013 msgid "a few seconds ago" msgstr "" -#: lib/util.php:954 +#: lib/util.php:1015 msgid "about a minute ago" msgstr "" -#: lib/util.php:956 +#: lib/util.php:1017 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:958 +#: lib/util.php:1019 msgid "about an hour ago" msgstr "" -#: lib/util.php:960 +#: lib/util.php:1021 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:962 +#: lib/util.php:1023 msgid "about a day ago" msgstr "" -#: lib/util.php:964 +#: lib/util.php:1025 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:966 +#: lib/util.php:1027 msgid "about a month ago" msgstr "" -#: lib/util.php:968 +#: lib/util.php:1029 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:970 +#: lib/util.php:1031 msgid "about a year ago" msgstr "" diff --git a/plugins/Facebook/locale/Facebook.po b/plugins/Facebook/locale/Facebook.po index 5b313c8c5..4bc00248c 100644 --- a/plugins/Facebook/locale/Facebook.po +++ b/plugins/Facebook/locale/Facebook.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-07 20:38-0800\n" +"POT-Creation-Date: 2010-03-01 14:58-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -59,63 +59,31 @@ msgstr "" msgid "Lost or forgotten password?" msgstr "" -#: facebookaction.php:386 facebookhome.php:248 +#: facebookaction.php:330 facebookhome.php:248 msgid "Pagination" msgstr "" -#: facebookaction.php:395 facebookhome.php:257 +#: facebookaction.php:339 facebookhome.php:257 msgid "After" msgstr "" -#: facebookaction.php:403 facebookhome.php:265 +#: facebookaction.php:347 facebookhome.php:265 msgid "Before" msgstr "" -#: facebookaction.php:421 +#: facebookaction.php:365 msgid "No notice content!" msgstr "" -#: facebookaction.php:427 +#: facebookaction.php:371 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "" -#: facebookaction.php:523 +#: facebookaction.php:430 msgid "Notices" msgstr "" -#: facebookutil.php:280 -#, php-format -msgid "Your %1$s Facebook application access has been disabled." -msgstr "" - -#: facebookutil.php:283 -#, php-format -msgid "" -"Hi, %1$s. We're sorry to inform you that we are unable to update your " -"Facebook status from %2$s, and have disabled the Facebook application for " -"your account. This may be because you have removed the Facebook " -"application's authorization, or have deleted your Facebook account. You can " -"re-enable the Facebook application and automatic status updating by re-" -"installing the %2$s Facebook application.\n" -"\n" -"Regards,\n" -"\n" -"%2$s" -msgstr "" - -#: FBConnectLogin.php:33 -msgid "Already logged in." -msgstr "" - -#: FBConnectLogin.php:41 -msgid "Login with your Facebook Account" -msgstr "" - -#: FBConnectLogin.php:55 -msgid "Facebook Login" -msgstr "" - #: facebookhome.php:111 msgid "Server error - couldn't get user!" msgstr "" @@ -149,50 +117,6 @@ msgstr "" msgid "Skip" msgstr "" -#: facebooksettings.php:74 -msgid "There was a problem saving your sync preferences!" -msgstr "" - -#: facebooksettings.php:76 -msgid "Sync preferences saved." -msgstr "" - -#: facebooksettings.php:99 -msgid "Automatically update my Facebook status with my notices." -msgstr "" - -#: facebooksettings.php:106 -msgid "Send \"@\" replies to Facebook." -msgstr "" - -#: facebooksettings.php:115 -msgid "Prefix" -msgstr "" - -#: facebooksettings.php:117 -msgid "A string to prefix notices with." -msgstr "" - -#: facebooksettings.php:123 -msgid "Save" -msgstr "" - -#: facebooksettings.php:133 -#, php-format -msgid "" -"If you would like %s to automatically update your Facebook status with your " -"latest notice, you need to give it permission." -msgstr "" - -#: facebooksettings.php:146 -#, php-format -msgid "Allow %s to update my Facebook status" -msgstr "" - -#: facebooksettings.php:156 -msgid "Sync preferences" -msgstr "" - #: facebookinvite.php:72 #, php-format msgid "Thanks for inviting your friends to use %s" @@ -221,61 +145,85 @@ msgstr "" msgid "Send invitations" msgstr "" -#: facebookremove.php:58 -msgid "Couldn't remove Facebook user." +#: FacebookPlugin.php:413 FacebookPlugin.php:433 +msgid "Facebook" msgstr "" -#: FBConnectSettings.php:56 FacebookPlugin.php:430 +#: FacebookPlugin.php:414 +msgid "Login or register using Facebook" +msgstr "" + +#: FacebookPlugin.php:434 FBConnectSettings.php:56 msgid "Facebook Connect Settings" msgstr "" -#: FBConnectSettings.php:67 -msgid "Manage how your account connects to Facebook" +#: FacebookPlugin.php:533 +msgid "" +"The Facebook plugin allows you to integrate your StatusNet instance with Facebook and Facebook Connect." msgstr "" -#: FBConnectSettings.php:92 -msgid "There is no Facebook user connected to this account." +#: facebookremove.php:58 +msgid "Couldn't remove Facebook user." msgstr "" -#: FBConnectSettings.php:100 -msgid "Connected Facebook user" +#: facebooksettings.php:74 +msgid "There was a problem saving your sync preferences!" msgstr "" -#: FBConnectSettings.php:119 -msgid "Disconnect my account from Facebook" +#: facebooksettings.php:76 +msgid "Sync preferences saved." msgstr "" -#: FBConnectSettings.php:124 -msgid "" -"Disconnecting your Faceboook would make it impossible to log in! Please " +#: facebooksettings.php:99 +msgid "Automatically update my Facebook status with my notices." msgstr "" -#: FBConnectSettings.php:128 -msgid "set a password" +#: facebooksettings.php:106 +msgid "Send \"@\" replies to Facebook." msgstr "" -#: FBConnectSettings.php:130 -msgid " first." +#: facebooksettings.php:115 +msgid "Prefix" msgstr "" -#: FBConnectSettings.php:142 -msgid "Disconnect" +#: facebooksettings.php:117 +msgid "A string to prefix notices with." msgstr "" -#: FBConnectSettings.php:164 FBConnectAuth.php:90 -msgid "There was a problem with your session token. Try again, please." +#: facebooksettings.php:123 +msgid "Save" msgstr "" -#: FBConnectSettings.php:178 -msgid "Couldn't delete link to Facebook." +#: facebooksettings.php:133 +#, php-format +msgid "" +"If you would like %s to automatically update your Facebook status with your " +"latest notice, you need to give it permission." msgstr "" -#: FBConnectSettings.php:194 -msgid "You have disconnected from Facebook." +#: facebooksettings.php:146 +#, php-format +msgid "Allow %s to update my Facebook status" msgstr "" -#: FBConnectSettings.php:197 -msgid "Not sure what you're trying to do." +#: facebooksettings.php:156 +msgid "Sync preferences" +msgstr "" + +#: facebookutil.php:285 +#, php-format +msgid "" +"Hi, %1$s. We're sorry to inform you that we are unable to update your " +"Facebook status from %2$s, and have disabled the Facebook application for " +"your account. This may be because you have removed the Facebook " +"application's authorization, or have deleted your Facebook account. You can " +"re-enable the Facebook application and automatic status updating by re-" +"installing the %2$s Facebook application.\n" +"\n" +"Regards,\n" +"\n" +"%2$s" msgstr "" #: FBConnectAuth.php:51 @@ -286,6 +234,10 @@ msgstr "" msgid "There is already a local user linked with this Facebook." msgstr "" +#: FBConnectAuth.php:90 FBConnectSettings.php:164 +msgid "There was a problem with your session token. Try again, please." +msgstr "" + #: FBConnectAuth.php:95 msgid "You can't register if you don't agree to the license." msgstr "" @@ -385,10 +337,59 @@ msgstr "" msgid "Invalid username or password." msgstr "" -#: FacebookPlugin.php:409 FacebookPlugin.php:429 -msgid "Facebook" +#: FBConnectLogin.php:33 +msgid "Already logged in." msgstr "" -#: FacebookPlugin.php:410 -msgid "Login or register using Facebook" +#: FBConnectLogin.php:41 +msgid "Login with your Facebook Account" +msgstr "" + +#: FBConnectLogin.php:55 +msgid "Facebook Login" +msgstr "" + +#: FBConnectSettings.php:67 +msgid "Manage how your account connects to Facebook" +msgstr "" + +#: FBConnectSettings.php:92 +msgid "There is no Facebook user connected to this account." +msgstr "" + +#: FBConnectSettings.php:100 +msgid "Connected Facebook user" +msgstr "" + +#: FBConnectSettings.php:119 +msgid "Disconnect my account from Facebook" +msgstr "" + +#: FBConnectSettings.php:124 +msgid "" +"Disconnecting your Faceboook would make it impossible to log in! Please " +msgstr "" + +#: FBConnectSettings.php:128 +msgid "set a password" +msgstr "" + +#: FBConnectSettings.php:130 +msgid " first." +msgstr "" + +#: FBConnectSettings.php:142 +msgid "Disconnect" +msgstr "" + +#: FBConnectSettings.php:178 +msgid "Couldn't delete link to Facebook." +msgstr "" + +#: FBConnectSettings.php:194 +msgid "You have disconnected from Facebook." +msgstr "" + +#: FBConnectSettings.php:197 +msgid "Not sure what you're trying to do." msgstr "" diff --git a/plugins/Gravatar/locale/Gravatar.po b/plugins/Gravatar/locale/Gravatar.po index 1df62b666..d7275b929 100644 --- a/plugins/Gravatar/locale/Gravatar.po +++ b/plugins/Gravatar/locale/Gravatar.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-11 16:27-0800\n" +"POT-Creation-Date: 2010-03-01 14:58-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -59,3 +59,9 @@ msgstr "" #: GravatarPlugin.php:177 msgid "Gravatar removed." msgstr "" + +#: GravatarPlugin.php:196 +msgid "" +"The Gravatar plugin allows users to use their Gravatar with StatusNet." +msgstr "" diff --git a/plugins/Mapstraction/locale/Mapstraction.po b/plugins/Mapstraction/locale/Mapstraction.po index c1c50bf50..1dd5dbbcc 100644 --- a/plugins/Mapstraction/locale/Mapstraction.po +++ b/plugins/Mapstraction/locale/Mapstraction.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-07 20:38-0800\n" +"POT-Creation-Date: 2010-03-01 14:58-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -34,15 +34,21 @@ msgstr "" msgid "User has no profile." msgstr "" -#: usermap.php:71 -#, php-format -msgid "%s map, page %d" -msgstr "" - -#: MapstractionPlugin.php:180 +#: MapstractionPlugin.php:182 msgid "Map" msgstr "" -#: MapstractionPlugin.php:191 +#: MapstractionPlugin.php:193 msgid "Full size" msgstr "" + +#: MapstractionPlugin.php:205 +msgid "" +"Show maps of users' and friends' notices with Mapstraction JavaScript library." +msgstr "" + +#: usermap.php:71 +#, php-format +msgid "%s map, page %d" +msgstr "" diff --git a/plugins/OStatus/locale/OStatus.po b/plugins/OStatus/locale/OStatus.po index ee19cf3db..7e33a0eed 100644 --- a/plugins/OStatus/locale/OStatus.po +++ b/plugins/OStatus/locale/OStatus.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-03-01 14:08-0800\n" +"POT-Creation-Date: 2010-03-01 14:58-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -223,43 +223,43 @@ msgstr "" msgid "Salmon signature verification failed." msgstr "" -#: lib/salmonaction.php:66 +#: lib/salmonaction.php:67 msgid "Salmon post must be an Atom entry." msgstr "" -#: lib/salmonaction.php:114 +#: lib/salmonaction.php:115 msgid "Unrecognized activity type." msgstr "" -#: lib/salmonaction.php:122 +#: lib/salmonaction.php:123 msgid "This target doesn't understand posts." msgstr "" -#: lib/salmonaction.php:127 +#: lib/salmonaction.php:128 msgid "This target doesn't understand follows." msgstr "" -#: lib/salmonaction.php:132 +#: lib/salmonaction.php:133 msgid "This target doesn't understand unfollows." msgstr "" -#: lib/salmonaction.php:137 +#: lib/salmonaction.php:138 msgid "This target doesn't understand favorites." msgstr "" -#: lib/salmonaction.php:142 +#: lib/salmonaction.php:143 msgid "This target doesn't understand unfavorites." msgstr "" -#: lib/salmonaction.php:147 +#: lib/salmonaction.php:148 msgid "This target doesn't understand share events." msgstr "" -#: lib/salmonaction.php:152 +#: lib/salmonaction.php:153 msgid "This target doesn't understand joins." msgstr "" -#: lib/salmonaction.php:157 +#: lib/salmonaction.php:158 msgid "This target doesn't understand leave events." msgstr "" diff --git a/plugins/OpenID/locale/OpenID.po b/plugins/OpenID/locale/OpenID.po index 34738bc75..7ed879835 100644 --- a/plugins/OpenID/locale/OpenID.po +++ b/plugins/OpenID/locale/OpenID.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-07 20:38-0800\n" +"POT-Creation-Date: 2010-03-01 14:58-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,73 +16,152 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: openidlogin.php:30 finishopenidlogin.php:34 +#: finishaddopenid.php:67 +msgid "Not logged in." +msgstr "" + +#: finishaddopenid.php:88 finishopenidlogin.php:149 +msgid "OpenID authentication cancelled." +msgstr "" + +#: finishaddopenid.php:92 finishopenidlogin.php:153 +#, php-format +msgid "OpenID authentication failed: %s" +msgstr "" + +#: finishaddopenid.php:112 +msgid "You already have this OpenID!" +msgstr "" + +#: finishaddopenid.php:114 +msgid "Someone else already has this OpenID." +msgstr "" + +#: finishaddopenid.php:126 +msgid "Error connecting user." +msgstr "" + +#: finishaddopenid.php:131 +msgid "Error updating profile" +msgstr "" + +#: finishaddopenid.php:170 openidlogin.php:95 +msgid "OpenID Login" +msgstr "" + +#: finishopenidlogin.php:34 openidlogin.php:30 msgid "Already logged in." msgstr "" -#: openidlogin.php:37 openidsettings.php:194 finishopenidlogin.php:38 +#: finishopenidlogin.php:38 openidlogin.php:37 openidsettings.php:194 msgid "There was a problem with your session token. Try again, please." msgstr "" -#: openidlogin.php:66 +#: finishopenidlogin.php:43 +msgid "You can't register if you don't agree to the license." +msgstr "" + +#: finishopenidlogin.php:52 openidsettings.php:208 +msgid "Something weird happened." +msgstr "" + +#: finishopenidlogin.php:66 #, php-format msgid "" -"For security reasons, please re-login with your [OpenID](%%doc.openid%%) " -"before changing your settings." +"This is the first time you've logged into %s so we must connect your OpenID " +"to a local account. You can either create a new account, or connect with " +"your existing account, if you have one." msgstr "" -#: openidlogin.php:70 -#, php-format -msgid "Login with an [OpenID](%%doc.openid%%) account." +#: finishopenidlogin.php:72 +msgid "OpenID Account Setup" msgstr "" -#: openidlogin.php:95 finishaddopenid.php:170 -msgid "OpenID Login" +#: finishopenidlogin.php:97 +msgid "Create new account" msgstr "" -#: openidlogin.php:112 -msgid "OpenID login" +#: finishopenidlogin.php:99 +msgid "Create a new user with this nickname." msgstr "" -#: openidlogin.php:117 openidsettings.php:107 -msgid "OpenID URL" +#: finishopenidlogin.php:102 +msgid "New nickname" msgstr "" -#: openidlogin.php:119 -msgid "Your OpenID URL" +#: finishopenidlogin.php:104 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces" msgstr "" -#: openidlogin.php:122 -msgid "Remember me" +#: finishopenidlogin.php:114 +msgid "My text and files are available under " msgstr "" -#: openidlogin.php:123 -msgid "Automatically login in the future; not for shared computers!" +#: finishopenidlogin.php:117 +msgid "" +" except this private data: password, email address, IM address, phone number." msgstr "" -#: openidlogin.php:127 -msgid "Login" +#: finishopenidlogin.php:121 +msgid "Create" msgstr "" -#: openidserver.php:106 -#, php-format -msgid "You are not authorized to use the identity %s" +#: finishopenidlogin.php:126 +msgid "Connect existing account" msgstr "" -#: openidserver.php:126 -msgid "Just an OpenID provider. Nothing to see here, move along..." +#: finishopenidlogin.php:128 +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your OpenID." msgstr "" -#: OpenIDPlugin.php:123 OpenIDPlugin.php:135 -msgid "OpenID" +#: finishopenidlogin.php:131 +msgid "Existing nickname" msgstr "" -#: OpenIDPlugin.php:124 -msgid "Login or register with OpenID" +#: finishopenidlogin.php:134 +msgid "Password" msgstr "" -#: OpenIDPlugin.php:136 -msgid "Add or remove OpenIDs" +#: finishopenidlogin.php:137 +msgid "Connect" +msgstr "" + +#: finishopenidlogin.php:215 finishopenidlogin.php:224 +msgid "Registration not allowed." +msgstr "" + +#: finishopenidlogin.php:231 +msgid "Not a valid invitation code." +msgstr "" + +#: finishopenidlogin.php:241 +msgid "Nickname must have only lowercase letters and numbers and no spaces." +msgstr "" + +#: finishopenidlogin.php:246 +msgid "Nickname not allowed." +msgstr "" + +#: finishopenidlogin.php:251 +msgid "Nickname already in use. Try another one." +msgstr "" + +#: finishopenidlogin.php:258 finishopenidlogin.php:338 +msgid "Stored OpenID not found." +msgstr "" + +#: finishopenidlogin.php:267 +msgid "Creating new account for OpenID that already has a user." +msgstr "" + +#: finishopenidlogin.php:327 +msgid "Invalid username or password." +msgstr "" + +#: finishopenidlogin.php:345 +msgid "Error connecting user to OpenID." msgstr "" #: openid.php:141 @@ -126,57 +205,65 @@ msgstr "" msgid "OpenID Auto-Submit" msgstr "" -#: openidtrust.php:51 -msgid "OpenID Identity Verification" -msgstr "" - -#: openidtrust.php:69 +#: openidlogin.php:66 +#, php-format msgid "" -"This page should only be reached during OpenID processing, not directly." +"For security reasons, please re-login with your [OpenID](%%doc.openid%%) " +"before changing your settings." msgstr "" -#: openidtrust.php:118 +#: openidlogin.php:70 #, php-format -msgid "" -"%s has asked to verify your identity. Click Continue to verify your " -"identity and login without creating a new password." +msgid "Login with an [OpenID](%%doc.openid%%) account." msgstr "" -#: openidtrust.php:136 -msgid "Continue" +#: openidlogin.php:112 +msgid "OpenID login" msgstr "" -#: openidtrust.php:137 -msgid "Cancel" +#: openidlogin.php:117 openidsettings.php:107 +msgid "OpenID URL" msgstr "" -#: finishaddopenid.php:67 -msgid "Not logged in." +#: openidlogin.php:119 +msgid "Your OpenID URL" msgstr "" -#: finishaddopenid.php:88 finishopenidlogin.php:149 -msgid "OpenID authentication cancelled." +#: openidlogin.php:122 +msgid "Remember me" msgstr "" -#: finishaddopenid.php:92 finishopenidlogin.php:153 -#, php-format -msgid "OpenID authentication failed: %s" +#: openidlogin.php:123 +msgid "Automatically login in the future; not for shared computers!" msgstr "" -#: finishaddopenid.php:112 -msgid "You already have this OpenID!" +#: openidlogin.php:127 +msgid "Login" msgstr "" -#: finishaddopenid.php:114 -msgid "Someone else already has this OpenID." +#: OpenIDPlugin.php:123 OpenIDPlugin.php:135 +msgid "OpenID" msgstr "" -#: finishaddopenid.php:126 -msgid "Error connecting user." +#: OpenIDPlugin.php:124 +msgid "Login or register with OpenID" msgstr "" -#: finishaddopenid.php:131 -msgid "Error updating profile" +#: OpenIDPlugin.php:136 +msgid "Add or remove OpenIDs" +msgstr "" + +#: OpenIDPlugin.php:324 +msgid "Use OpenID to login to the site." +msgstr "" + +#: openidserver.php:106 +#, php-format +msgid "You are not authorized to use the identity %s." +msgstr "" + +#: openidserver.php:126 +msgid "Just an OpenID provider. Nothing to see here, move along..." msgstr "" #: openidsettings.php:59 @@ -224,10 +311,6 @@ msgstr "" msgid "Remove" msgstr "" -#: openidsettings.php:208 finishopenidlogin.php:52 -msgid "Something weird happened." -msgstr "" - #: openidsettings.php:228 msgid "No such OpenID." msgstr "" @@ -240,105 +323,26 @@ msgstr "" msgid "OpenID removed." msgstr "" -#: finishopenidlogin.php:43 -msgid "You can't register if you don't agree to the license." -msgstr "" - -#: finishopenidlogin.php:66 -#, php-format -msgid "" -"This is the first time you've logged into %s so we must connect your OpenID " -"to a local account. You can either create a new account, or connect with " -"your existing account, if you have one." -msgstr "" - -#: finishopenidlogin.php:72 -msgid "OpenID Account Setup" -msgstr "" - -#: finishopenidlogin.php:97 -msgid "Create new account" -msgstr "" - -#: finishopenidlogin.php:99 -msgid "Create a new user with this nickname." -msgstr "" - -#: finishopenidlogin.php:102 -msgid "New nickname" -msgstr "" - -#: finishopenidlogin.php:104 -msgid "1-64 lowercase letters or numbers, no punctuation or spaces" -msgstr "" - -#: finishopenidlogin.php:114 -msgid "My text and files are available under " +#: openidtrust.php:51 +msgid "OpenID Identity Verification" msgstr "" -#: finishopenidlogin.php:117 +#: openidtrust.php:69 msgid "" -" except this private data: password, email address, IM address, phone number." -msgstr "" - -#: finishopenidlogin.php:121 -msgid "Create" -msgstr "" - -#: finishopenidlogin.php:126 -msgid "Connect existing account" +"This page should only be reached during OpenID processing, not directly." msgstr "" -#: finishopenidlogin.php:128 +#: openidtrust.php:118 +#, php-format msgid "" -"If you already have an account, login with your username and password to " -"connect it to your OpenID." -msgstr "" - -#: finishopenidlogin.php:131 -msgid "Existing nickname" -msgstr "" - -#: finishopenidlogin.php:134 -msgid "Password" -msgstr "" - -#: finishopenidlogin.php:137 -msgid "Connect" -msgstr "" - -#: finishopenidlogin.php:215 finishopenidlogin.php:224 -msgid "Registration not allowed." -msgstr "" - -#: finishopenidlogin.php:231 -msgid "Not a valid invitation code." -msgstr "" - -#: finishopenidlogin.php:241 -msgid "Nickname must have only lowercase letters and numbers and no spaces." -msgstr "" - -#: finishopenidlogin.php:246 -msgid "Nickname not allowed." -msgstr "" - -#: finishopenidlogin.php:251 -msgid "Nickname already in use. Try another one." -msgstr "" - -#: finishopenidlogin.php:258 finishopenidlogin.php:338 -msgid "Stored OpenID not found." -msgstr "" - -#: finishopenidlogin.php:267 -msgid "Creating new account for OpenID that already has a user." +"%s has asked to verify your identity. Click Continue to verify your " +"identity and login without creating a new password." msgstr "" -#: finishopenidlogin.php:327 -msgid "Invalid username or password." +#: openidtrust.php:136 +msgid "Continue" msgstr "" -#: finishopenidlogin.php:345 -msgid "Error connecting user to OpenID." +#: openidtrust.php:137 +msgid "Cancel" msgstr "" diff --git a/plugins/PoweredByStatusNet/locale/PoweredByStatusNet.po b/plugins/PoweredByStatusNet/locale/PoweredByStatusNet.po index bd39124ef..8f8434a85 100644 --- a/plugins/PoweredByStatusNet/locale/PoweredByStatusNet.po +++ b/plugins/PoweredByStatusNet/locale/PoweredByStatusNet.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-01-22 15:03-0800\n" +"POT-Creation-Date: 2010-03-01 14:58-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,16 +16,16 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: PoweredByStatusNetPlugin.php:49 +#: PoweredByStatusNetPlugin.php:50 #, php-format msgid "powered by %s" msgstr "" -#: PoweredByStatusNetPlugin.php:51 +#: PoweredByStatusNetPlugin.php:52 msgid "StatusNet" msgstr "" -#: PoweredByStatusNetPlugin.php:64 +#: PoweredByStatusNetPlugin.php:65 msgid "" "Outputs powered by StatusNet after site " "name." diff --git a/plugins/Sample/locale/Sample.po b/plugins/Sample/locale/Sample.po index e0d2aa853..a52c4ec01 100644 --- a/plugins/Sample/locale/Sample.po +++ b/plugins/Sample/locale/Sample.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-24 16:33-0800\n" +"POT-Creation-Date: 2010-03-01 14:58-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/plugins/TwitterBridge/locale/TwitterBridge.po b/plugins/TwitterBridge/locale/TwitterBridge.po index 14c30f1c9..eff125579 100644 --- a/plugins/TwitterBridge/locale/TwitterBridge.po +++ b/plugins/TwitterBridge/locale/TwitterBridge.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-12-07 20:38-0800\n" +"POT-Creation-Date: 2010-03-01 14:58-0800\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,23 +16,48 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: twitterauthorization.php:81 -msgid "Not logged in." +#: twitter.php:320 +msgid "Your Twitter bridge has been disabled." msgstr "" -#: twitterauthorization.php:131 twitterauthorization.php:150 -#: twitterauthorization.php:170 twitterauthorization.php:217 +#: twitter.php:324 +#, php-format +msgid "" +"Hi, %1$s. We're sorry to inform you that your link to Twitter has been " +"disabled. We no longer seem to have permission to update your Twitter " +"status. (Did you revoke %3$s's access?)\n" +"\n" +"You can re-enable your Twitter bridge by visiting your Twitter settings " +"page:\n" +"\n" +"\t%2$s\n" +"\n" +"Regards,\n" +"%3$s\n" +msgstr "" + +#: twitterauthorization.php:181 twitterauthorization.php:229 msgid "Couldn't link your Twitter account." msgstr "" -#: TwitterBridgePlugin.php:89 +#: twitterauthorization.php:201 +msgid "Couldn't link your Twitter account: oauth_token mismatch." +msgstr "" + +#: TwitterBridgePlugin.php:114 msgid "Twitter" msgstr "" -#: TwitterBridgePlugin.php:90 +#: TwitterBridgePlugin.php:115 msgid "Twitter integration options" msgstr "" +#: TwitterBridgePlugin.php:207 +msgid "" +"The Twitter \"bridge\" plugin allows you to integrate your StatusNet " +"instance with Twitter." +msgstr "" + #: twittersettings.php:59 msgid "Twitter settings" msgstr "" @@ -51,78 +76,81 @@ msgstr "" msgid "Connected Twitter account" msgstr "" -#: twittersettings.php:125 -msgid "Remove" +#: twittersettings.php:128 +msgid "Disconnect my account from Twitter" +msgstr "" + +#: twittersettings.php:133 +msgid "Disconnecting your Twitter could make it impossible to log in! Please " +msgstr "" + +#: twittersettings.php:137 +msgid "set a password" msgstr "" -#: twittersettings.php:131 +#: twittersettings.php:139 +msgid " first." +msgstr "" + +#: twittersettings.php:143 +#, php-format +msgid "" +"Keep your %1$s account but disconnect from Twitter. You can use your %1$s " +"password to log in." +msgstr "" + +#: twittersettings.php:151 +msgid "Disconnect" +msgstr "" + +#: twittersettings.php:158 msgid "Preferences" msgstr "" -#: twittersettings.php:135 +#: twittersettings.php:162 msgid "Automatically send my notices to Twitter." msgstr "" -#: twittersettings.php:142 +#: twittersettings.php:169 msgid "Send local \"@\" replies to Twitter." msgstr "" -#: twittersettings.php:149 +#: twittersettings.php:176 msgid "Subscribe to my Twitter friends here." msgstr "" -#: twittersettings.php:158 +#: twittersettings.php:185 msgid "Import my Friends Timeline." msgstr "" -#: twittersettings.php:174 +#: twittersettings.php:201 msgid "Save" msgstr "" -#: twittersettings.php:176 +#: twittersettings.php:203 msgid "Add" msgstr "" -#: twittersettings.php:201 +#: twittersettings.php:228 msgid "There was a problem with your session token. Try again, please." msgstr "" -#: twittersettings.php:211 +#: twittersettings.php:238 msgid "Unexpected form submission." msgstr "" -#: twittersettings.php:230 +#: twittersettings.php:257 msgid "Couldn't remove Twitter user." msgstr "" -#: twittersettings.php:234 -msgid "Twitter account removed." +#: twittersettings.php:261 +msgid "Twitter account disconnected." msgstr "" -#: twittersettings.php:255 twittersettings.php:265 +#: twittersettings.php:282 twittersettings.php:292 msgid "Couldn't save Twitter preferences." msgstr "" -#: twittersettings.php:269 +#: twittersettings.php:296 msgid "Twitter preferences saved." msgstr "" - -#: twitter.php:333 -msgid "Your Twitter bridge has been disabled." -msgstr "" - -#: twitter.php:337 -#, php-format -msgid "" -"Hi, %1$s. We're sorry to inform you that your link to Twitter has been " -"disabled. We no longer seem to have permission to update your Twitter " -"status. (Did you revoke %3$s's access?)\n" -"\n" -"You can re-enable your Twitter bridge by visiting your Twitter settings " -"page:\n" -"\n" -"\t%2$s\n" -"\n" -"Regards,\n" -"%3$s\n" -msgstr "" -- cgit v1.2.3-54-g00ecf From a4ec64ff457f9d4a645e4ecae8b2c696e379c0ab Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Thu, 4 Mar 2010 13:43:28 -0500 Subject: Slight right alignment for remote button in minilists --- plugins/OStatus/theme/base/css/ostatus.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'plugins/OStatus') diff --git a/plugins/OStatus/theme/base/css/ostatus.css b/plugins/OStatus/theme/base/css/ostatus.css index f7d9853cf..c2d724158 100644 --- a/plugins/OStatus/theme/base/css/ostatus.css +++ b/plugins/OStatus/theme/base/css/ostatus.css @@ -46,6 +46,7 @@ position:relative; .section .entity_actions { margin-bottom:0; +margin-right:7px; } #entity_remote_subscribe .dialogbox { @@ -70,5 +71,4 @@ background-color:transparent; background-position:0 -1183px; padding:0 0 0 23px; border:0; - } -- cgit v1.2.3-54-g00ecf