From 77ea02cac3576f395e4548e7e6cbace90ba566ea Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 20 Jan 2010 16:31:48 -0500 Subject: Any object (not just Notice's) can be queued --- lib/dbqueuemanager.php | 95 +++++++++++++++------------------------------- lib/jabberqueuehandler.php | 4 +- lib/ombqueuehandler.php | 2 +- lib/pingqueuehandler.php | 2 +- lib/pluginqueuehandler.php | 2 +- lib/publicqueuehandler.php | 6 +-- lib/queuehandler.php | 95 +++++----------------------------------------- lib/smsqueuehandler.php | 2 +- lib/stompqueuemanager.php | 38 +++++++------------ lib/xmppmanager.php | 24 ++++++++++++ 10 files changed, 86 insertions(+), 184 deletions(-) (limited to 'lib') diff --git a/lib/dbqueuemanager.php b/lib/dbqueuemanager.php index 889365b64..139f50234 100644 --- a/lib/dbqueuemanager.php +++ b/lib/dbqueuemanager.php @@ -31,19 +31,17 @@ class DBQueueManager extends QueueManager { /** - * Saves a notice object reference into the queue item table. + * Saves an object into the queue item table. * @return boolean true on success * @throws ServerException on failure */ public function enqueue($object, $queue) { - $notice = $object; - $qi = new Queue_item(); - $qi->notice_id = $notice->id; + $qi->frame = serialize($object); $qi->transport = $queue; - $qi->created = $notice->created; + $qi->created = common_sql_now(); $result = $qi->insert(); if (!$result) { @@ -73,34 +71,35 @@ class DBQueueManager extends QueueManager */ public function poll() { - $this->_log(LOG_DEBUG, 'Checking for notices...'); - $item = $this->_nextItem(); - if ($item === false) { - $this->_log(LOG_DEBUG, 'No notices waiting; idling.'); + $this->_log(LOG_DEBUG, 'Checking for queued objects...'); + $qi = $this->_nextItem(); + if ($qi === false) { + $this->_log(LOG_DEBUG, 'No queue items waiting; idling.'); return false; } - if ($item === true) { - // We dequeued an entry for a deleted or invalid notice. + if ($qi === true) { + // We dequeued an entry for a deleted or invalid object. // Consider it a hit for poll rate purposes. return true; } - list($queue, $notice) = $item; - $this->_log(LOG_INFO, 'Got notice '. $notice->id . ' for transport ' . $queue); + $queue = $qi->transport; + $object = unserialize($qi->frame); + $this->_log(LOG_INFO, 'Got item id=' . $qi->id . ' for transport ' . $queue); // Yay! Got one! $handler = $this->getHandler($queue); if ($handler) { - if ($handler->handle_notice($notice)) { - $this->_log(LOG_INFO, "[$queue:notice $notice->id] Successfully handled notice"); - $this->_done($notice, $queue); + if ($handler->handle($object)) { + $this->_log(LOG_INFO, "[$queue] Successfully handled object"); + $this->_done($qi); } else { - $this->_log(LOG_INFO, "[$queue:notice $notice->id] Failed to handle notice"); - $this->_fail($notice, $queue); + $this->_log(LOG_INFO, "[$queue] Failed to handle object"); + $this->_fail($qi); } } else { - $this->_log(LOG_INFO, "[$queue:notice $notice->id] No handler for queue $queue; discarding."); - $this->_done($notice, $queue); + $this->_log(LOG_INFO, "[$queue] No handler for queue $queue; discarding."); + $this->_done($qi); } return true; } @@ -108,8 +107,7 @@ class DBQueueManager extends QueueManager /** * Pop the oldest unclaimed item off the queue set and claim it. * - * @return mixed false if no items; true if bogus hit; otherwise array(string, Notice) - * giving the queue transport name. + * @return mixed false if no items; true if bogus hit; otherwise Queue_item */ protected function _nextItem() { @@ -121,70 +119,42 @@ class DBQueueManager extends QueueManager return false; } - $queue = $qi->transport; - $notice = Notice::staticGet('id', $qi->notice_id); - if (empty($notice)) { - $this->_log(LOG_INFO, "[$queue:notice $notice->id] dequeued non-existent notice"); - $qi->delete(); - return true; - } - - $result = $notice; - return array($queue, $notice); + return $qi; } /** * Delete our claimed item from the queue after successful processing. * - * @param Notice $object - * @param string $queue + * @param QueueItem $qi */ - protected function _done($object, $queue) + protected function _done($qi) { - // XXX: right now, we only handle notices - - $notice = $object; - - $qi = Queue_item::pkeyGet(array('notice_id' => $notice->id, - 'transport' => $queue)); - if (empty($qi)) { - $this->_log(LOG_INFO, "[$queue:notice $notice->id] Cannot find queue item"); + $this->_log(LOG_INFO, "_done passed an empty queue item"); } else { if (empty($qi->claimed)) { - $this->_log(LOG_WARNING, "[$queue:notice $notice->id] Reluctantly releasing unclaimed queue item"); + $this->_log(LOG_WARNING, "Reluctantly releasing unclaimed queue item"); } $qi->delete(); $qi->free(); } - $this->_log(LOG_INFO, "[$queue:notice $notice->id] done with item"); - $this->stats('handled', $queue); - - $notice->free(); + $this->_log(LOG_INFO, "done with item"); } /** * Free our claimed queue item for later reprocessing in case of * temporary failure. * - * @param Notice $object - * @param string $queue + * @param QueueItem $qi */ - protected function _fail($object, $queue) + protected function _fail($qi) { - // XXX: right now, we only handle notices - - $notice = $object; - - $qi = Queue_item::pkeyGet(array('notice_id' => $notice->id, - 'transport' => $queue)); - if (empty($qi)) { - $this->_log(LOG_INFO, "[$queue:notice $notice->id] Cannot find queue item"); + $this->_log(LOG_INFO, "_fail passed an empty queue item"); } else { if (empty($qi->claimed)) { - $this->_log(LOG_WARNING, "[$queue:notice $notice->id] Ignoring failure for unclaimed queue item"); + $this->_log(LOG_WARNING, "Ignoring failure for unclaimed queue item"); } else { $orig = clone($qi); $qi->claimed = null; @@ -193,10 +163,7 @@ class DBQueueManager extends QueueManager } } - $this->_log(LOG_INFO, "[$queue:notice $notice->id] done with queue item"); - $this->stats('error', $queue); - - $notice->free(); + $this->_log(LOG_INFO, "done with queue item"); } protected function _log($level, $msg) diff --git a/lib/jabberqueuehandler.php b/lib/jabberqueuehandler.php index b1518866d..83471f2df 100644 --- a/lib/jabberqueuehandler.php +++ b/lib/jabberqueuehandler.php @@ -34,14 +34,14 @@ class JabberQueueHandler extends QueueHandler return 'jabber'; } - function handle_notice($notice) + function handle($notice) { require_once(INSTALLDIR.'/lib/jabber.php'); try { return jabber_broadcast_notice($notice); } catch (XMPPHP_Exception $e) { $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage()); - exit(1); + return false; } } } diff --git a/lib/ombqueuehandler.php b/lib/ombqueuehandler.php index 3ffc1313b..24896c784 100644 --- a/lib/ombqueuehandler.php +++ b/lib/ombqueuehandler.php @@ -36,7 +36,7 @@ class OmbQueueHandler extends QueueHandler * @fixme doesn't currently report failure back to the queue manager * because omb_broadcast_notice() doesn't report it to us */ - function handle_notice($notice) + function handle($notice) { if ($this->is_remote($notice)) { $this->log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id); diff --git a/lib/pingqueuehandler.php b/lib/pingqueuehandler.php index 8bb218078..4e4d74cb1 100644 --- a/lib/pingqueuehandler.php +++ b/lib/pingqueuehandler.php @@ -30,7 +30,7 @@ class PingQueueHandler extends QueueHandler { return 'ping'; } - function handle_notice($notice) { + function handle($notice) { require_once INSTALLDIR . '/lib/ping.php'; return ping_broadcast_notice($notice); } diff --git a/lib/pluginqueuehandler.php b/lib/pluginqueuehandler.php index 24d504699..9653ccad4 100644 --- a/lib/pluginqueuehandler.php +++ b/lib/pluginqueuehandler.php @@ -42,7 +42,7 @@ class PluginQueueHandler extends QueueHandler return 'plugin'; } - function handle_notice($notice) + function handle($notice) { Event::handle('HandleQueuedNotice', array(&$notice)); return true; diff --git a/lib/publicqueuehandler.php b/lib/publicqueuehandler.php index 9ea9ee73a..c9edb8d5d 100644 --- a/lib/publicqueuehandler.php +++ b/lib/publicqueuehandler.php @@ -23,7 +23,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { /** * Queue handler for pushing new notices to public XMPP subscribers. - * @fixme correct this exception handling */ class PublicQueueHandler extends QueueHandler { @@ -33,15 +32,14 @@ class PublicQueueHandler extends QueueHandler return 'public'; } - function handle_notice($notice) + function handle($notice) { require_once(INSTALLDIR.'/lib/jabber.php'); try { return jabber_public_notice($notice); } catch (XMPPHP_Exception $e) { $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage()); - die($e->getMessage()); + return false; } - return true; } } diff --git a/lib/queuehandler.php b/lib/queuehandler.php index 613be6e33..2909cd83b 100644 --- a/lib/queuehandler.php +++ b/lib/queuehandler.php @@ -22,51 +22,20 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } /** * Base class for queue handlers. * - * As extensions of the Daemon class, each queue handler has the ability - * to launch itself in the background, at which point it'll pass control - * to the configured QueueManager class to poll for updates. + * As of 0.9, queue handlers are short-lived for items as they are + * dequeued by a QueueManager running in an IoMaster in a daemon + * such as queuedaemon.php. + * + * Extensions requiring long-running maintenance or polling should + * register an IoManager. * * Subclasses must override at least the following methods: * - transport - * - handle_notice + * - handle */ -#class QueueHandler extends Daemon class QueueHandler { -# function __construct($id=null, $daemonize=true) -# { -# parent::__construct($daemonize); -# -# if ($id) { -# $this->set_id($id); -# } -# } - - /** - * How many seconds a polling-based queue manager should wait between - * checks for new items to handle. - * - * Defaults to 60 seconds; override to speed up or slow down. - * - * @fixme not really compatible with global queue manager - * @return int timeout in seconds - */ -# function timeout() -# { -# return 60; -# } - -# function class_name() -# { -# return ucfirst($this->transport()) . 'Handler'; -# } - -# function name() -# { -# return strtolower($this->class_name().'.'.$this->get_id()); -# } - /** * Return transport keyword which identifies items this queue handler * services; must be defined for all subclasses. @@ -83,61 +52,17 @@ class QueueHandler /** * Here's the meat of your queue handler -- you're handed a Notice - * object, which you may do as you will with. + * or other object, which you may do as you will with. * * If this function indicates failure, a warning will be logged * and the item is placed back in the queue to be re-run. * - * @param Notice $notice - * @return boolean true on success, false on failure - */ - function handle_notice($notice) - { - return true; - } - - /** - * Setup and start of run loop for this queue handler as a daemon. - * Most of the heavy lifting is passed on to the QueueManager's service() - * method, which passes control back to our handle_notice() method for - * each notice that comes in on the queue. - * - * Most of the time this won't need to be overridden in a subclass. - * + * @param mixed $object * @return boolean true on success, false on failure */ - function run() + function handle($object) { - if (!$this->start()) { - $this->log(LOG_WARNING, 'failed to start'); - return false; - } - - $this->log(LOG_INFO, 'checking for queued notices'); - - $queue = $this->transport(); - $timeout = $this->timeout(); - - $qm = QueueManager::get(); - - $qm->service($queue, $this); - - $this->log(LOG_INFO, 'finished servicing the queue'); - - if (!$this->finish()) { - $this->log(LOG_WARNING, 'failed to clean up'); - return false; - } - - $this->log(LOG_INFO, 'terminating normally'); - return true; } - - - function log($level, $msg) - { - common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg); - } } diff --git a/lib/smsqueuehandler.php b/lib/smsqueuehandler.php index 48a96409d..6085d2b4a 100644 --- a/lib/smsqueuehandler.php +++ b/lib/smsqueuehandler.php @@ -31,7 +31,7 @@ class SmsQueueHandler extends QueueHandler return 'sms'; } - function handle_notice($notice) + function handle($notice) { require_once(INSTALLDIR.'/lib/mail.php'); return mail_broadcast_notice_sms($notice); diff --git a/lib/stompqueuemanager.php b/lib/stompqueuemanager.php index 00590fdb6..6496b5cf1 100644 --- a/lib/stompqueuemanager.php +++ b/lib/stompqueuemanager.php @@ -125,28 +125,25 @@ class StompQueueManager extends QueueManager } /** - * Saves a notice object reference into the queue item table. + * Saves an object into the queue item table. * @return boolean true on success */ public function enqueue($object, $queue) { - $notice = $object; + $msg = serialize($object); $this->_connect(); - // XXX: serialize and send entire notice - $result = $this->con->send($this->queueName($queue), - $notice->id, // BODY of the message - array ('created' => $notice->created)); + $msg, // BODY of the message + array ('created' => $timestamp)); if (!$result) { common_log(LOG_ERR, 'Error sending to '.$queue.' queue'); return false; } - common_log(LOG_DEBUG, 'complete remote queueing notice ID = ' - . $notice->id . ' for ' . $queue); + common_log(LOG_DEBUG, "complete remote queueing $log for $queue"); $this->stats('enqueued', $queue); } @@ -174,7 +171,7 @@ class StompQueueManager extends QueueManager $ok = true; $frames = $this->con->readFrames(); foreach ($frames as $frame) { - $ok = $ok && $this->_handleNotice($frame); + $ok = $ok && $this->_handleItem($frame); } return $ok; } @@ -265,10 +262,10 @@ class StompQueueManager extends QueueManager } /** - * Handle and acknowledge a notice event that's come in through a queue. + * Handle and acknowledge an event that's come in through a queue. * * If the queue handler reports failure, the message is requeued for later. - * Missing notices or handler classes will drop the message. + * Missing objects or handler classes will drop the message. * * Side effects: in multi-site mode, may reset site configuration to * match the site that queued the event. @@ -276,24 +273,15 @@ class StompQueueManager extends QueueManager * @param StompFrame $frame * @return bool */ - protected function _handleNotice($frame) + protected function _handleItem($frame) { list($site, $queue) = $this->parseDestination($frame->headers['destination']); if ($site != common_config('site', 'server')) { $this->stats('switch'); StatusNet::init($site); } - - $id = intval($frame->body); - $info = "notice $id posted at {$frame->headers['created']} in queue $queue"; - - $notice = Notice::staticGet('id', $id); - if (empty($notice)) { - $this->_log(LOG_WARNING, "Skipping missing $info"); - $this->con->ack($frame); - $this->stats('badnotice', $queue); - return false; - } + $info = "object posted at {$frame->headers['created']} in queue $queue"; + $item = unserialize($frame->body); $handler = $this->getHandler($queue); if (!$handler) { @@ -303,7 +291,7 @@ class StompQueueManager extends QueueManager return false; } - $ok = $handler->handle_notice($notice); + $ok = $handler->handle($item); if (!$ok) { $this->_log(LOG_WARNING, "Failed handling $info"); @@ -311,7 +299,7 @@ class StompQueueManager extends QueueManager // this kind of queue management ourselves; // if we don't ack, it should resend... $this->con->ack($frame); - $this->enqueue($notice, $queue); + $this->enqueue($item, $queue); $this->stats('requeued', $queue); return false; } diff --git a/lib/xmppmanager.php b/lib/xmppmanager.php index dfff63a30..c49986854 100644 --- a/lib/xmppmanager.php +++ b/lib/xmppmanager.php @@ -175,6 +175,30 @@ class XmppManager extends IoManager } } + /** + * For queue handlers to pass us a message to push out, + * if we're active. + * + * @fixme should this be blocking etc? + * + * @param string $msg XML stanza to send + * @return boolean success + */ + public function send($msg) + { + if ($this->conn && !$this->conn->isDisconnected()) { + $bytes = $this->conn->send($msg); + if ($bytes > 0) { + return true; + } else { + return false; + } + } else { + // Can't send right now... + return false; + } + } + /** * Send a keepalive ping to the XMPP server. */ -- cgit v1.2.3-54-g00ecf From bd72e8b96e1bc360ba46a1864c6121f3b5f11235 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 15 Jan 2010 22:28:43 -0500 Subject: Allow for instances as well as class names to be passed as queue handlers and iomanagers. Introduce IoManager::GLOBAL_SINGLE_ONLY which indicates that only one instance of this iomanager will be run, regardless of how many threads/processes and sites there are. --- lib/iomanager.php | 1 + lib/iomaster.php | 25 ++++++++++++++++++------- lib/queuemanager.php | 6 ++++-- scripts/queuedaemon.php | 13 +++++++++---- 4 files changed, 32 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/iomanager.php b/lib/iomanager.php index ee2ff958b..f9d97d6a9 100644 --- a/lib/iomanager.php +++ b/lib/iomanager.php @@ -31,6 +31,7 @@ abstract class IoManager { + const GLOBAL_SINGLE_ONLY = -1; const SINGLE_ONLY = 0; const INSTANCE_PER_SITE = 1; const INSTANCE_PER_PROCESS = 2; diff --git a/lib/iomaster.php b/lib/iomaster.php index ce77b53b2..979f73e75 100644 --- a/lib/iomaster.php +++ b/lib/iomaster.php @@ -32,6 +32,7 @@ class IoMaster public $id; protected $multiSite = false; + protected $includeGlobalSingletons = true; protected $managers = array(); protected $singletons = array(); @@ -47,8 +48,9 @@ class IoMaster $this->monitor = new QueueMonitor(); } - public function init($multiSite=null) + public function init($multiSite=null, $includeGlobalSingletons = true) { + $this->includeGlobalSingletons = $includeGlobalSingletons; if ($multiSite !== null) { $this->multiSite = $multiSite; } @@ -107,7 +109,7 @@ class IoMaster */ protected function instantiate($class) { - if (isset($this->singletons[$class])) { + if (is_string($class) && isset($this->singletons[$class])) { // Already instantiated a multi-site-capable handler. // Just let it know it should listen to this site too! $this->singletons[$class]->addSite(common_config('site', 'server')); @@ -116,25 +118,34 @@ class IoMaster $manager = $this->getManager($class); + $caps = $manager->multiSite(); if ($this->multiSite) { - $caps = $manager->multiSite(); if ($caps == IoManager::SINGLE_ONLY) { throw new Exception("$class can't run with --all; aborting."); } - if ($caps == IoManager::INSTANCE_PER_PROCESS) { + if ($caps == IoManager::INSTANCE_PER_PROCESS || + ( $this->includeGlobalSingletons && $caps == IoManager::GLOBAL_SINGLE_ONLY )) { // Save this guy for later! // We'll only need the one to cover multiple sites. - $this->singletons[$class] = $manager; + if (is_string($class)){ + $this->singletons[$class] = $manager; + } $manager->addSite(common_config('site', 'server')); } } - $this->managers[] = $manager; + if( $this->includeGlobalSingletons || $caps != IoManager::GLOBAL_SINGLE_ONLY ) { + $this->managers[] = $manager; + } } protected function getManager($class) { - return call_user_func(array($class, 'get')); + if(is_object($class)){ + return $class; + }else{ + return call_user_func(array($class, 'get')); + } } /** diff --git a/lib/queuemanager.php b/lib/queuemanager.php index 291174d3c..b20a93468 100644 --- a/lib/queuemanager.php +++ b/lib/queuemanager.php @@ -119,7 +119,9 @@ abstract class QueueManager extends IoManager { if (isset($this->handlers[$queue])) { $class = $this->handlers[$queue]; - if (class_exists($class)) { + if(is_object($class)) { + return $class; + } else if (class_exists($class)) { return new $class(); } else { common_log(LOG_ERR, "Nonexistent handler class '$class' for queue '$queue'"); @@ -182,7 +184,7 @@ abstract class QueueManager extends IoManager * Only registered transports will be reliably picked up! * * @param string $transport - * @param string $class + * @param string $class class name or object instance */ public function connect($transport, $class) { diff --git a/scripts/queuedaemon.php b/scripts/queuedaemon.php index 162f617e0..6cce4eaa7 100755 --- a/scripts/queuedaemon.php +++ b/scripts/queuedaemon.php @@ -122,7 +122,7 @@ class QueueDaemon extends Daemon if ($this->threads > 1) { return $this->runThreads(); } else { - return $this->runLoop(); + return $this->runLoop(true); } } @@ -176,7 +176,8 @@ class QueueDaemon extends Daemon { $this->set_id($this->get_id() . "." . $thread); $this->resetDb(); - $this->runLoop(); + //only include global singletons on the first thread + $this->runLoop($thread == 1); } /** @@ -213,14 +214,18 @@ class QueueDaemon extends Daemon * * Most of the time this won't need to be overridden in a subclass. * + * @param boolean $includeGlobalSingletons Include IoManagers that are + * global singletons (should only be one instance - regardless of how + * many processes or sites there are) + * * @return boolean true on success, false on failure */ - function runLoop() + function runLoop($includeGlobalSingletons) { $this->log(LOG_INFO, 'checking for queued notices'); $master = new IoMaster($this->get_id()); - $master->init($this->all); + $master->init($this->all, $includeGlobalSingletons); $master->service(); $this->log(LOG_INFO, 'finished servicing the queue'); -- cgit v1.2.3-54-g00ecf From ef7db60fed8575c381801c0b998d9ed58aab1745 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 22 Jan 2010 17:14:41 -0500 Subject: Revert "Allow for instances as well as class names to be passed as queue handlers and iomanagers." Going to use brion's SpawningDaemon instead This reverts commit bd72e8b96e1bc360ba46a1864c6121f3b5f11235. --- lib/iomanager.php | 1 - lib/iomaster.php | 25 +++++++------------------ lib/queuemanager.php | 6 ++---- scripts/queuedaemon.php | 13 ++++--------- 4 files changed, 13 insertions(+), 32 deletions(-) (limited to 'lib') diff --git a/lib/iomanager.php b/lib/iomanager.php index f9d97d6a9..ee2ff958b 100644 --- a/lib/iomanager.php +++ b/lib/iomanager.php @@ -31,7 +31,6 @@ abstract class IoManager { - const GLOBAL_SINGLE_ONLY = -1; const SINGLE_ONLY = 0; const INSTANCE_PER_SITE = 1; const INSTANCE_PER_PROCESS = 2; diff --git a/lib/iomaster.php b/lib/iomaster.php index 979f73e75..ce77b53b2 100644 --- a/lib/iomaster.php +++ b/lib/iomaster.php @@ -32,7 +32,6 @@ class IoMaster public $id; protected $multiSite = false; - protected $includeGlobalSingletons = true; protected $managers = array(); protected $singletons = array(); @@ -48,9 +47,8 @@ class IoMaster $this->monitor = new QueueMonitor(); } - public function init($multiSite=null, $includeGlobalSingletons = true) + public function init($multiSite=null) { - $this->includeGlobalSingletons = $includeGlobalSingletons; if ($multiSite !== null) { $this->multiSite = $multiSite; } @@ -109,7 +107,7 @@ class IoMaster */ protected function instantiate($class) { - if (is_string($class) && isset($this->singletons[$class])) { + if (isset($this->singletons[$class])) { // Already instantiated a multi-site-capable handler. // Just let it know it should listen to this site too! $this->singletons[$class]->addSite(common_config('site', 'server')); @@ -118,34 +116,25 @@ class IoMaster $manager = $this->getManager($class); - $caps = $manager->multiSite(); if ($this->multiSite) { + $caps = $manager->multiSite(); if ($caps == IoManager::SINGLE_ONLY) { throw new Exception("$class can't run with --all; aborting."); } - if ($caps == IoManager::INSTANCE_PER_PROCESS || - ( $this->includeGlobalSingletons && $caps == IoManager::GLOBAL_SINGLE_ONLY )) { + if ($caps == IoManager::INSTANCE_PER_PROCESS) { // Save this guy for later! // We'll only need the one to cover multiple sites. - if (is_string($class)){ - $this->singletons[$class] = $manager; - } + $this->singletons[$class] = $manager; $manager->addSite(common_config('site', 'server')); } } - if( $this->includeGlobalSingletons || $caps != IoManager::GLOBAL_SINGLE_ONLY ) { - $this->managers[] = $manager; - } + $this->managers[] = $manager; } protected function getManager($class) { - if(is_object($class)){ - return $class; - }else{ - return call_user_func(array($class, 'get')); - } + return call_user_func(array($class, 'get')); } /** diff --git a/lib/queuemanager.php b/lib/queuemanager.php index b20a93468..291174d3c 100644 --- a/lib/queuemanager.php +++ b/lib/queuemanager.php @@ -119,9 +119,7 @@ abstract class QueueManager extends IoManager { if (isset($this->handlers[$queue])) { $class = $this->handlers[$queue]; - if(is_object($class)) { - return $class; - } else if (class_exists($class)) { + if (class_exists($class)) { return new $class(); } else { common_log(LOG_ERR, "Nonexistent handler class '$class' for queue '$queue'"); @@ -184,7 +182,7 @@ abstract class QueueManager extends IoManager * Only registered transports will be reliably picked up! * * @param string $transport - * @param string $class class name or object instance + * @param string $class */ public function connect($transport, $class) { diff --git a/scripts/queuedaemon.php b/scripts/queuedaemon.php index 6cce4eaa7..162f617e0 100755 --- a/scripts/queuedaemon.php +++ b/scripts/queuedaemon.php @@ -122,7 +122,7 @@ class QueueDaemon extends Daemon if ($this->threads > 1) { return $this->runThreads(); } else { - return $this->runLoop(true); + return $this->runLoop(); } } @@ -176,8 +176,7 @@ class QueueDaemon extends Daemon { $this->set_id($this->get_id() . "." . $thread); $this->resetDb(); - //only include global singletons on the first thread - $this->runLoop($thread == 1); + $this->runLoop(); } /** @@ -214,18 +213,14 @@ class QueueDaemon extends Daemon * * Most of the time this won't need to be overridden in a subclass. * - * @param boolean $includeGlobalSingletons Include IoManagers that are - * global singletons (should only be one instance - regardless of how - * many processes or sites there are) - * * @return boolean true on success, false on failure */ - function runLoop($includeGlobalSingletons) + function runLoop() { $this->log(LOG_INFO, 'checking for queued notices'); $master = new IoMaster($this->get_id()); - $master->init($this->all, $includeGlobalSingletons); + $master->init($this->all); $master->service(); $this->log(LOG_INFO, 'finished servicing the queue'); -- cgit v1.2.3-54-g00ecf From 78eb9c78a781ba8d6929a260e5f9c07714d59ee3 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 22 Jan 2010 17:19:32 -0500 Subject: Will re-enable anything queueing after 0.9.x merge Revert "Any object (not just Notice's) can be queued" This reverts commit 77ea02cac3576f395e4548e7e6cbace90ba566ea. --- classes/Queue_item.php | 13 +++- classes/statusnet.ini | 6 +- db/statusnet.sql | 5 +- lib/dbqueuemanager.php | 95 ++++++++++++++++++--------- lib/jabberqueuehandler.php | 4 +- lib/ombqueuehandler.php | 2 +- lib/pingqueuehandler.php | 2 +- lib/pluginqueuehandler.php | 2 +- lib/publicqueuehandler.php | 6 +- lib/queuehandler.php | 95 ++++++++++++++++++++++++--- lib/smsqueuehandler.php | 2 +- lib/stompqueuemanager.php | 38 +++++++---- lib/xmppmanager.php | 24 ------- plugins/Enjit/enjitqueuehandler.php | 9 ++- plugins/Facebook/facebookqueuehandler.php | 2 +- plugins/RSSCloud/RSSCloudPlugin.php | 41 ++++++++++-- plugins/RSSCloud/RSSCloudQueueHandler.php | 50 ++++++++++++-- plugins/TwitterBridge/twitterqueuehandler.php | 2 +- scripts/handlequeued.php | 2 +- 19 files changed, 291 insertions(+), 109 deletions(-) mode change 100644 => 100755 plugins/RSSCloud/RSSCloudQueueHandler.php (limited to 'lib') diff --git a/classes/Queue_item.php b/classes/Queue_item.php index 4d90e1d23..cf805a606 100644 --- a/classes/Queue_item.php +++ b/classes/Queue_item.php @@ -10,8 +10,7 @@ class Queue_item extends Memcached_DataObject /* the code below is auto generated do not remove the above tag */ public $__table = 'queue_item'; // table name - public $id; // int(4) primary_key not_null - public $frame; // blob not_null + public $notice_id; // int(4) primary_key not_null public $transport; // varchar(8) primary_key not_null public $created; // datetime() not_null public $claimed; // datetime() @@ -23,6 +22,9 @@ class Queue_item extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + function sequenceKey() + { return array(false, false); } + static function top($transport=null) { $qi = new Queue_item(); @@ -40,7 +42,7 @@ class Queue_item extends Memcached_DataObject # XXX: potential race condition # can we force it to only update if claimed is still null # (or old)? - common_log(LOG_INFO, 'claiming queue item id=' . $qi->id . + common_log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id . ' for transport ' . $qi->transport); $orig = clone($qi); $qi->claimed = common_sql_now(); @@ -55,4 +57,9 @@ class Queue_item extends Memcached_DataObject $qi = null; return null; } + + function pkeyGet($kv) + { + return Memcached_DataObject::pkeyGet('Queue_item', $kv); + } } diff --git a/classes/statusnet.ini b/classes/statusnet.ini index 6203650a6..44088cf6b 100644 --- a/classes/statusnet.ini +++ b/classes/statusnet.ini @@ -428,14 +428,14 @@ tagged = K tag = K [queue_item] -id = 129 -frame = 66 +notice_id = 129 transport = 130 created = 142 claimed = 14 [queue_item__keys] -id = K +notice_id = K +transport = K [related_group] group_id = 129 diff --git a/db/statusnet.sql b/db/statusnet.sql index cb7dad3e2..2a9ab74c7 100644 --- a/db/statusnet.sql +++ b/db/statusnet.sql @@ -274,12 +274,13 @@ create table remember_me ( ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; create table queue_item ( - id integer auto_increment primary key comment 'unique identifier', - frame blob not null comment 'serialized object', + + notice_id integer not null comment 'notice queued' references notice (id), transport varchar(8) not null comment 'queue for what? "email", "jabber", "sms", "irc", ...', created datetime not null comment 'date this record was created', claimed datetime comment 'date this item was claimed', + constraint primary key (notice_id, transport), index queue_item_created_idx (created) ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; diff --git a/lib/dbqueuemanager.php b/lib/dbqueuemanager.php index 139f50234..889365b64 100644 --- a/lib/dbqueuemanager.php +++ b/lib/dbqueuemanager.php @@ -31,17 +31,19 @@ class DBQueueManager extends QueueManager { /** - * Saves an object into the queue item table. + * Saves a notice object reference into the queue item table. * @return boolean true on success * @throws ServerException on failure */ public function enqueue($object, $queue) { + $notice = $object; + $qi = new Queue_item(); - $qi->frame = serialize($object); + $qi->notice_id = $notice->id; $qi->transport = $queue; - $qi->created = common_sql_now(); + $qi->created = $notice->created; $result = $qi->insert(); if (!$result) { @@ -71,35 +73,34 @@ class DBQueueManager extends QueueManager */ public function poll() { - $this->_log(LOG_DEBUG, 'Checking for queued objects...'); - $qi = $this->_nextItem(); - if ($qi === false) { - $this->_log(LOG_DEBUG, 'No queue items waiting; idling.'); + $this->_log(LOG_DEBUG, 'Checking for notices...'); + $item = $this->_nextItem(); + if ($item === false) { + $this->_log(LOG_DEBUG, 'No notices waiting; idling.'); return false; } - if ($qi === true) { - // We dequeued an entry for a deleted or invalid object. + if ($item === true) { + // We dequeued an entry for a deleted or invalid notice. // Consider it a hit for poll rate purposes. return true; } - $queue = $qi->transport; - $object = unserialize($qi->frame); - $this->_log(LOG_INFO, 'Got item id=' . $qi->id . ' for transport ' . $queue); + list($queue, $notice) = $item; + $this->_log(LOG_INFO, 'Got notice '. $notice->id . ' for transport ' . $queue); // Yay! Got one! $handler = $this->getHandler($queue); if ($handler) { - if ($handler->handle($object)) { - $this->_log(LOG_INFO, "[$queue] Successfully handled object"); - $this->_done($qi); + if ($handler->handle_notice($notice)) { + $this->_log(LOG_INFO, "[$queue:notice $notice->id] Successfully handled notice"); + $this->_done($notice, $queue); } else { - $this->_log(LOG_INFO, "[$queue] Failed to handle object"); - $this->_fail($qi); + $this->_log(LOG_INFO, "[$queue:notice $notice->id] Failed to handle notice"); + $this->_fail($notice, $queue); } } else { - $this->_log(LOG_INFO, "[$queue] No handler for queue $queue; discarding."); - $this->_done($qi); + $this->_log(LOG_INFO, "[$queue:notice $notice->id] No handler for queue $queue; discarding."); + $this->_done($notice, $queue); } return true; } @@ -107,7 +108,8 @@ class DBQueueManager extends QueueManager /** * Pop the oldest unclaimed item off the queue set and claim it. * - * @return mixed false if no items; true if bogus hit; otherwise Queue_item + * @return mixed false if no items; true if bogus hit; otherwise array(string, Notice) + * giving the queue transport name. */ protected function _nextItem() { @@ -119,42 +121,70 @@ class DBQueueManager extends QueueManager return false; } - return $qi; + $queue = $qi->transport; + $notice = Notice::staticGet('id', $qi->notice_id); + if (empty($notice)) { + $this->_log(LOG_INFO, "[$queue:notice $notice->id] dequeued non-existent notice"); + $qi->delete(); + return true; + } + + $result = $notice; + return array($queue, $notice); } /** * Delete our claimed item from the queue after successful processing. * - * @param QueueItem $qi + * @param Notice $object + * @param string $queue */ - protected function _done($qi) + protected function _done($object, $queue) { + // XXX: right now, we only handle notices + + $notice = $object; + + $qi = Queue_item::pkeyGet(array('notice_id' => $notice->id, + 'transport' => $queue)); + if (empty($qi)) { - $this->_log(LOG_INFO, "_done passed an empty queue item"); + $this->_log(LOG_INFO, "[$queue:notice $notice->id] Cannot find queue item"); } else { if (empty($qi->claimed)) { - $this->_log(LOG_WARNING, "Reluctantly releasing unclaimed queue item"); + $this->_log(LOG_WARNING, "[$queue:notice $notice->id] Reluctantly releasing unclaimed queue item"); } $qi->delete(); $qi->free(); } - $this->_log(LOG_INFO, "done with item"); + $this->_log(LOG_INFO, "[$queue:notice $notice->id] done with item"); + $this->stats('handled', $queue); + + $notice->free(); } /** * Free our claimed queue item for later reprocessing in case of * temporary failure. * - * @param QueueItem $qi + * @param Notice $object + * @param string $queue */ - protected function _fail($qi) + protected function _fail($object, $queue) { + // XXX: right now, we only handle notices + + $notice = $object; + + $qi = Queue_item::pkeyGet(array('notice_id' => $notice->id, + 'transport' => $queue)); + if (empty($qi)) { - $this->_log(LOG_INFO, "_fail passed an empty queue item"); + $this->_log(LOG_INFO, "[$queue:notice $notice->id] Cannot find queue item"); } else { if (empty($qi->claimed)) { - $this->_log(LOG_WARNING, "Ignoring failure for unclaimed queue item"); + $this->_log(LOG_WARNING, "[$queue:notice $notice->id] Ignoring failure for unclaimed queue item"); } else { $orig = clone($qi); $qi->claimed = null; @@ -163,7 +193,10 @@ class DBQueueManager extends QueueManager } } - $this->_log(LOG_INFO, "done with queue item"); + $this->_log(LOG_INFO, "[$queue:notice $notice->id] done with queue item"); + $this->stats('error', $queue); + + $notice->free(); } protected function _log($level, $msg) diff --git a/lib/jabberqueuehandler.php b/lib/jabberqueuehandler.php index 83471f2df..b1518866d 100644 --- a/lib/jabberqueuehandler.php +++ b/lib/jabberqueuehandler.php @@ -34,14 +34,14 @@ class JabberQueueHandler extends QueueHandler return 'jabber'; } - function handle($notice) + function handle_notice($notice) { require_once(INSTALLDIR.'/lib/jabber.php'); try { return jabber_broadcast_notice($notice); } catch (XMPPHP_Exception $e) { $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage()); - return false; + exit(1); } } } diff --git a/lib/ombqueuehandler.php b/lib/ombqueuehandler.php index 24896c784..3ffc1313b 100644 --- a/lib/ombqueuehandler.php +++ b/lib/ombqueuehandler.php @@ -36,7 +36,7 @@ class OmbQueueHandler extends QueueHandler * @fixme doesn't currently report failure back to the queue manager * because omb_broadcast_notice() doesn't report it to us */ - function handle($notice) + function handle_notice($notice) { if ($this->is_remote($notice)) { $this->log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id); diff --git a/lib/pingqueuehandler.php b/lib/pingqueuehandler.php index 4e4d74cb1..8bb218078 100644 --- a/lib/pingqueuehandler.php +++ b/lib/pingqueuehandler.php @@ -30,7 +30,7 @@ class PingQueueHandler extends QueueHandler { return 'ping'; } - function handle($notice) { + function handle_notice($notice) { require_once INSTALLDIR . '/lib/ping.php'; return ping_broadcast_notice($notice); } diff --git a/lib/pluginqueuehandler.php b/lib/pluginqueuehandler.php index 9653ccad4..24d504699 100644 --- a/lib/pluginqueuehandler.php +++ b/lib/pluginqueuehandler.php @@ -42,7 +42,7 @@ class PluginQueueHandler extends QueueHandler return 'plugin'; } - function handle($notice) + function handle_notice($notice) { Event::handle('HandleQueuedNotice', array(&$notice)); return true; diff --git a/lib/publicqueuehandler.php b/lib/publicqueuehandler.php index c9edb8d5d..9ea9ee73a 100644 --- a/lib/publicqueuehandler.php +++ b/lib/publicqueuehandler.php @@ -23,6 +23,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { /** * Queue handler for pushing new notices to public XMPP subscribers. + * @fixme correct this exception handling */ class PublicQueueHandler extends QueueHandler { @@ -32,14 +33,15 @@ class PublicQueueHandler extends QueueHandler return 'public'; } - function handle($notice) + function handle_notice($notice) { require_once(INSTALLDIR.'/lib/jabber.php'); try { return jabber_public_notice($notice); } catch (XMPPHP_Exception $e) { $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage()); - return false; + die($e->getMessage()); } + return true; } } diff --git a/lib/queuehandler.php b/lib/queuehandler.php index 2909cd83b..613be6e33 100644 --- a/lib/queuehandler.php +++ b/lib/queuehandler.php @@ -22,20 +22,51 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } /** * Base class for queue handlers. * - * As of 0.9, queue handlers are short-lived for items as they are - * dequeued by a QueueManager running in an IoMaster in a daemon - * such as queuedaemon.php. - * - * Extensions requiring long-running maintenance or polling should - * register an IoManager. + * As extensions of the Daemon class, each queue handler has the ability + * to launch itself in the background, at which point it'll pass control + * to the configured QueueManager class to poll for updates. * * Subclasses must override at least the following methods: * - transport - * - handle + * - handle_notice */ +#class QueueHandler extends Daemon class QueueHandler { +# function __construct($id=null, $daemonize=true) +# { +# parent::__construct($daemonize); +# +# if ($id) { +# $this->set_id($id); +# } +# } + + /** + * How many seconds a polling-based queue manager should wait between + * checks for new items to handle. + * + * Defaults to 60 seconds; override to speed up or slow down. + * + * @fixme not really compatible with global queue manager + * @return int timeout in seconds + */ +# function timeout() +# { +# return 60; +# } + +# function class_name() +# { +# return ucfirst($this->transport()) . 'Handler'; +# } + +# function name() +# { +# return strtolower($this->class_name().'.'.$this->get_id()); +# } + /** * Return transport keyword which identifies items this queue handler * services; must be defined for all subclasses. @@ -52,17 +83,61 @@ class QueueHandler /** * Here's the meat of your queue handler -- you're handed a Notice - * or other object, which you may do as you will with. + * object, which you may do as you will with. * * If this function indicates failure, a warning will be logged * and the item is placed back in the queue to be re-run. * - * @param mixed $object + * @param Notice $notice + * @return boolean true on success, false on failure + */ + function handle_notice($notice) + { + return true; + } + + /** + * Setup and start of run loop for this queue handler as a daemon. + * Most of the heavy lifting is passed on to the QueueManager's service() + * method, which passes control back to our handle_notice() method for + * each notice that comes in on the queue. + * + * Most of the time this won't need to be overridden in a subclass. + * * @return boolean true on success, false on failure */ - function handle($object) + function run() { + if (!$this->start()) { + $this->log(LOG_WARNING, 'failed to start'); + return false; + } + + $this->log(LOG_INFO, 'checking for queued notices'); + + $queue = $this->transport(); + $timeout = $this->timeout(); + + $qm = QueueManager::get(); + + $qm->service($queue, $this); + + $this->log(LOG_INFO, 'finished servicing the queue'); + + if (!$this->finish()) { + $this->log(LOG_WARNING, 'failed to clean up'); + return false; + } + + $this->log(LOG_INFO, 'terminating normally'); + return true; } + + + function log($level, $msg) + { + common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg); + } } diff --git a/lib/smsqueuehandler.php b/lib/smsqueuehandler.php index 6085d2b4a..48a96409d 100644 --- a/lib/smsqueuehandler.php +++ b/lib/smsqueuehandler.php @@ -31,7 +31,7 @@ class SmsQueueHandler extends QueueHandler return 'sms'; } - function handle($notice) + function handle_notice($notice) { require_once(INSTALLDIR.'/lib/mail.php'); return mail_broadcast_notice_sms($notice); diff --git a/lib/stompqueuemanager.php b/lib/stompqueuemanager.php index 6496b5cf1..00590fdb6 100644 --- a/lib/stompqueuemanager.php +++ b/lib/stompqueuemanager.php @@ -125,25 +125,28 @@ class StompQueueManager extends QueueManager } /** - * Saves an object into the queue item table. + * Saves a notice object reference into the queue item table. * @return boolean true on success */ public function enqueue($object, $queue) { - $msg = serialize($object); + $notice = $object; $this->_connect(); + // XXX: serialize and send entire notice + $result = $this->con->send($this->queueName($queue), - $msg, // BODY of the message - array ('created' => $timestamp)); + $notice->id, // BODY of the message + array ('created' => $notice->created)); if (!$result) { common_log(LOG_ERR, 'Error sending to '.$queue.' queue'); return false; } - common_log(LOG_DEBUG, "complete remote queueing $log for $queue"); + common_log(LOG_DEBUG, 'complete remote queueing notice ID = ' + . $notice->id . ' for ' . $queue); $this->stats('enqueued', $queue); } @@ -171,7 +174,7 @@ class StompQueueManager extends QueueManager $ok = true; $frames = $this->con->readFrames(); foreach ($frames as $frame) { - $ok = $ok && $this->_handleItem($frame); + $ok = $ok && $this->_handleNotice($frame); } return $ok; } @@ -262,10 +265,10 @@ class StompQueueManager extends QueueManager } /** - * Handle and acknowledge an event that's come in through a queue. + * Handle and acknowledge a notice event that's come in through a queue. * * If the queue handler reports failure, the message is requeued for later. - * Missing objects or handler classes will drop the message. + * Missing notices or handler classes will drop the message. * * Side effects: in multi-site mode, may reset site configuration to * match the site that queued the event. @@ -273,15 +276,24 @@ class StompQueueManager extends QueueManager * @param StompFrame $frame * @return bool */ - protected function _handleItem($frame) + protected function _handleNotice($frame) { list($site, $queue) = $this->parseDestination($frame->headers['destination']); if ($site != common_config('site', 'server')) { $this->stats('switch'); StatusNet::init($site); } - $info = "object posted at {$frame->headers['created']} in queue $queue"; - $item = unserialize($frame->body); + + $id = intval($frame->body); + $info = "notice $id posted at {$frame->headers['created']} in queue $queue"; + + $notice = Notice::staticGet('id', $id); + if (empty($notice)) { + $this->_log(LOG_WARNING, "Skipping missing $info"); + $this->con->ack($frame); + $this->stats('badnotice', $queue); + return false; + } $handler = $this->getHandler($queue); if (!$handler) { @@ -291,7 +303,7 @@ class StompQueueManager extends QueueManager return false; } - $ok = $handler->handle($item); + $ok = $handler->handle_notice($notice); if (!$ok) { $this->_log(LOG_WARNING, "Failed handling $info"); @@ -299,7 +311,7 @@ class StompQueueManager extends QueueManager // this kind of queue management ourselves; // if we don't ack, it should resend... $this->con->ack($frame); - $this->enqueue($item, $queue); + $this->enqueue($notice, $queue); $this->stats('requeued', $queue); return false; } diff --git a/lib/xmppmanager.php b/lib/xmppmanager.php index c49986854..dfff63a30 100644 --- a/lib/xmppmanager.php +++ b/lib/xmppmanager.php @@ -175,30 +175,6 @@ class XmppManager extends IoManager } } - /** - * For queue handlers to pass us a message to push out, - * if we're active. - * - * @fixme should this be blocking etc? - * - * @param string $msg XML stanza to send - * @return boolean success - */ - public function send($msg) - { - if ($this->conn && !$this->conn->isDisconnected()) { - $bytes = $this->conn->send($msg); - if ($bytes > 0) { - return true; - } else { - return false; - } - } else { - // Can't send right now... - return false; - } - } - /** * Send a keepalive ping to the XMPP server. */ diff --git a/plugins/Enjit/enjitqueuehandler.php b/plugins/Enjit/enjitqueuehandler.php index 14085cc5e..f0e706b92 100644 --- a/plugins/Enjit/enjitqueuehandler.php +++ b/plugins/Enjit/enjitqueuehandler.php @@ -32,7 +32,14 @@ class EnjitQueueHandler extends QueueHandler return 'enjit'; } - function handle($notice) + function start() + { + $this->log(LOG_INFO, "Starting EnjitQueueHandler"); + $this->log(LOG_INFO, "Broadcasting to ".common_config('enjit', 'apiurl')); + return true; + } + + function handle_notice($notice) { $profile = Profile::staticGet($notice->profile_id); diff --git a/plugins/Facebook/facebookqueuehandler.php b/plugins/Facebook/facebookqueuehandler.php index 524af7bc4..1778690e5 100644 --- a/plugins/Facebook/facebookqueuehandler.php +++ b/plugins/Facebook/facebookqueuehandler.php @@ -28,7 +28,7 @@ class FacebookQueueHandler extends QueueHandler return 'facebook'; } - function handle($notice) + function handle_notice($notice) { if ($this->_isLocal($notice)) { return facebookBroadcastNotice($notice); diff --git a/plugins/RSSCloud/RSSCloudPlugin.php b/plugins/RSSCloud/RSSCloudPlugin.php index 9f444c8bb..2de162628 100644 --- a/plugins/RSSCloud/RSSCloudPlugin.php +++ b/plugins/RSSCloud/RSSCloudPlugin.php @@ -138,9 +138,6 @@ class RSSCloudPlugin extends Plugin case 'RSSCloudNotifier': include_once INSTALLDIR . '/plugins/RSSCloud/RSSCloudNotifier.php'; return false; - case 'RSSCloudQueueHandler': - include_once INSTALLDIR . '/plugins/RSSCloud/RSSCloudQueueHandler.php'; - return false; case 'RSSCloudRequestNotifyAction': case 'LoggingAggregatorAction': include_once INSTALLDIR . '/plugins/RSSCloud/' . @@ -196,6 +193,32 @@ class RSSCloudPlugin extends Plugin return true; } + /** + * broadcast the message when not using queuehandler + * + * @param Notice &$notice the notice + * @param array $queue destination queue + * + * @return boolean hook return + */ + + function onUnqueueHandleNotice(&$notice, $queue) + { + if (($queue == 'rsscloud') && ($this->_isLocal($notice))) { + + common_debug('broadcasting rssCloud bound notice ' . $notice->id); + + $profile = $notice->getProfile(); + + $notifier = new RSSCloudNotifier(); + $notifier->notify($profile); + + return false; + } + + return true; + } + /** * Determine whether the notice was locally created * @@ -238,15 +261,19 @@ class RSSCloudPlugin extends Plugin } /** - * Register RSSCloud notice queue handler + * Add RSSCloudQueueHandler to the list of valid daemons to + * start * - * @param QueueManager $manager + * @param array $daemons the list of daemons to run * * @return boolean hook return + * */ - function onEndInitializeQueueManager($manager) + + function onGetValidDaemons($daemons) { - $manager->connect('rsscloud', 'RSSCloudQueueHandler'); + array_push($daemons, INSTALLDIR . + '/plugins/RSSCloud/RSSCloudQueueHandler.php'); return true; } diff --git a/plugins/RSSCloud/RSSCloudQueueHandler.php b/plugins/RSSCloud/RSSCloudQueueHandler.php old mode 100644 new mode 100755 index 295c26189..693dd27c1 --- a/plugins/RSSCloud/RSSCloudQueueHandler.php +++ b/plugins/RSSCloud/RSSCloudQueueHandler.php @@ -1,3 +1,4 @@ +#!/usr/bin/env php . */ -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } +define('INSTALLDIR', realpath(dirname(__FILE__) . '/../..')); + +$shortoptions = 'i::'; +$longoptions = array('id::'); + +$helptext = <<log(LOG_INFO, "INITIALIZE"); + $this->notifier = new RSSCloudNotifier(); + return true; + } + + function handle_notice($notice) { $profile = $notice->getProfile(); - $notifier = new RSSCloudNotifier(); - return $notifier->notify($profile); + return $this->notifier->notify($profile); + } + + function finish() + { } + +} + +if (have_option('i')) { + $id = get_option_value('i'); +} else if (have_option('--id')) { + $id = get_option_value('--id'); +} else if (count($args) > 0) { + $id = $args[0]; +} else { + $id = null; } +$handler = new RSSCloudQueueHandler($id); + +$handler->runOnce(); diff --git a/plugins/TwitterBridge/twitterqueuehandler.php b/plugins/TwitterBridge/twitterqueuehandler.php index b5a624e83..5089ca7b7 100644 --- a/plugins/TwitterBridge/twitterqueuehandler.php +++ b/plugins/TwitterBridge/twitterqueuehandler.php @@ -28,7 +28,7 @@ class TwitterQueueHandler extends QueueHandler return 'twitter'; } - function handle($notice) + function handle_notice($notice) { return broadcast_twitter($notice); } diff --git a/scripts/handlequeued.php b/scripts/handlequeued.php index 815884969..9031437aa 100755 --- a/scripts/handlequeued.php +++ b/scripts/handlequeued.php @@ -50,7 +50,7 @@ if (empty($notice)) { exit(1); } -if (!$handler->handle($notice)) { +if (!$handler->handle_notice($notice)) { print "Failed to handle notice id $noticeId on queue '$queue'.\n"; exit(1); } -- cgit v1.2.3-54-g00ecf From b34bbb0e8045008a0048829672af905385241735 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 22 Jan 2010 17:55:26 -0500 Subject: Store serialized representations of queue items in the queue --- lib/queuemanager.php | 15 ++------------- 1 file changed, 2 insertions(+), 13 deletions(-) (limited to 'lib') diff --git a/lib/queuemanager.php b/lib/queuemanager.php index 4eb39bfa8..8921b02cc 100644 --- a/lib/queuemanager.php +++ b/lib/queuemanager.php @@ -139,20 +139,13 @@ abstract class QueueManager extends IoManager /** * Encode an object for queued storage. - * Next gen may use serialization. * * @param mixed $object * @return string */ protected function encode($object) { - if ($object instanceof Notice) { - return $object->id; - } else if (is_string($object)) { - return $object; - } else { - throw new ServerException("Can't queue this type", 500); - } + return serialize($object); } /** @@ -164,11 +157,7 @@ abstract class QueueManager extends IoManager */ protected function decode($frame) { - if (is_numeric($frame)) { - return Notice::staticGet(intval($frame)); - } else { - return $frame; - } + return unserialize($frame); } /** -- cgit v1.2.3-54-g00ecf From e9995b0f6ab0788162e22c996e5ee0af416dd519 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sat, 23 Jan 2010 01:25:27 -0500 Subject: Create IM plugin, Pluginize XMPP, Create AIM plugin --- EVENTS.txt | 18 + actions/apiaccountupdatedeliverydevice.php | 10 +- actions/confirmaddress.php | 97 +- actions/imsettings.php | 317 ++-- actions/shownotice.php | 6 - actions/showstream.php | 6 - classes/User.php | 7 +- classes/User_im_prefs.php | 71 + classes/statusnet.ini | 22 +- db/statusnet.sql | 28 +- lib/channel.php | 57 - lib/command.php | 4 +- lib/imchannel.php | 104 ++ lib/immanager.php | 70 + lib/implugin.php | 612 +++++++ lib/imqueuehandler.php | 48 + lib/imreceiverqueuehandler.php | 42 + lib/imsenderqueuehandler.php | 44 + lib/jabber.php | 473 ----- lib/jabberqueuehandler.php | 47 - lib/publicqueuehandler.php | 45 - lib/queued_xmpp.php | 117 -- lib/queuehandler.php | 14 - lib/queuemanager.php | 14 +- lib/queuemonitor.php | 2 +- lib/util.php | 9 - lib/xmppmanager.php | 485 ------ lib/xmppoutqueuehandler.php | 55 - plugins/Aim/AimPlugin.php | 162 ++ plugins/Aim/Fake_Aim.php | 43 + plugins/Aim/README | 27 + plugins/Aim/aimmanager.php | 100 ++ plugins/Aim/extlib/phptoclib/README.txt | 169 ++ plugins/Aim/extlib/phptoclib/aimclassw.php | 2370 ++++++++++++++++++++++++++ plugins/Aim/extlib/phptoclib/dconnection.php | 229 +++ plugins/Imap/imapmanager.php | 8 +- plugins/Xmpp/Fake_XMPP.php | 104 ++ plugins/Xmpp/README | 35 + plugins/Xmpp/Sharing_XMPP.php | 43 + plugins/Xmpp/XmppPlugin.php | 247 +++ plugins/Xmpp/xmppmanager.php | 279 +++ scripts/getvaliddaemons.php | 4 +- scripts/imdaemon.php | 93 + scripts/queuedaemon.php | 9 +- scripts/stopdaemons.sh | 4 +- scripts/xmppdaemon.php | 98 -- 46 files changed, 5200 insertions(+), 1648 deletions(-) create mode 100644 classes/User_im_prefs.php create mode 100644 lib/imchannel.php create mode 100644 lib/immanager.php create mode 100644 lib/implugin.php create mode 100644 lib/imqueuehandler.php create mode 100644 lib/imreceiverqueuehandler.php create mode 100644 lib/imsenderqueuehandler.php delete mode 100644 lib/jabber.php delete mode 100644 lib/jabberqueuehandler.php delete mode 100644 lib/publicqueuehandler.php delete mode 100644 lib/queued_xmpp.php delete mode 100644 lib/xmppmanager.php delete mode 100644 lib/xmppoutqueuehandler.php create mode 100644 plugins/Aim/AimPlugin.php create mode 100644 plugins/Aim/Fake_Aim.php create mode 100644 plugins/Aim/README create mode 100644 plugins/Aim/aimmanager.php create mode 100755 plugins/Aim/extlib/phptoclib/README.txt create mode 100755 plugins/Aim/extlib/phptoclib/aimclassw.php create mode 100755 plugins/Aim/extlib/phptoclib/dconnection.php create mode 100644 plugins/Xmpp/Fake_XMPP.php create mode 100644 plugins/Xmpp/README create mode 100644 plugins/Xmpp/Sharing_XMPP.php create mode 100644 plugins/Xmpp/XmppPlugin.php create mode 100644 plugins/Xmpp/xmppmanager.php create mode 100755 scripts/imdaemon.php delete mode 100755 scripts/xmppdaemon.php (limited to 'lib') diff --git a/EVENTS.txt b/EVENTS.txt index 1ed670697..45f1e9d70 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -699,3 +699,21 @@ StartShowContentLicense: Showing the default license for content EndShowContentLicense: Showing the default license for content - $action: the current action + +GetImTransports: Get IM transports that are available +- &$transports: append your transport to this array like so: $transports[transportName]=array('display'=>display) + +NormalizeImScreenname: Normalize an IM screenname +- $transport: transport the screenname is on +- &$screenname: screenname to be normalized + +ValidateImScreenname: Validate an IM screenname +- $transport: transport the screenname is on +- $screenname: screenname to be validated +- $valid: is the screenname valid? + +SendImConfirmationCode: Send a confirmation code to confirm a user owns an IM screenname +- $transport: transport the screenname exists on +- $screenname: screenname being confirmed +- $code: confirmation code for confirmation URL +- $user: user requesting the confirmation diff --git a/actions/apiaccountupdatedeliverydevice.php b/actions/apiaccountupdatedeliverydevice.php index 684906fe9..4bd6c326f 100644 --- a/actions/apiaccountupdatedeliverydevice.php +++ b/actions/apiaccountupdatedeliverydevice.php @@ -119,10 +119,16 @@ class ApiAccountUpdateDeliveryDeviceAction extends ApiAuthAction if (strtolower($this->device) == 'sms') { $this->user->smsnotify = true; } elseif (strtolower($this->device) == 'im') { - $this->user->jabbernotify = true; + //TODO IM is pluginized now, so what should we do? + //Enable notifications for all IM plugins? + //For now, don't do anything + //$this->user->jabbernotify = true; } elseif (strtolower($this->device == 'none')) { $this->user->smsnotify = false; - $this->user->jabbernotify = false; + //TODO IM is pluginized now, so what should we do? + //Disable notifications for all IM plugins? + //For now, don't do anything + //$this->user->jabbernotify = false; } $result = $this->user->update($original); diff --git a/actions/confirmaddress.php b/actions/confirmaddress.php index cc8351d8d..eaf1c91c1 100644 --- a/actions/confirmaddress.php +++ b/actions/confirmaddress.php @@ -49,7 +49,7 @@ class ConfirmaddressAction extends Action { /** type of confirmation. */ - var $type = null; + var $address; /** * Accept a confirmation code @@ -86,37 +86,75 @@ class ConfirmaddressAction extends Action return; } $type = $confirm->address_type; - if (!in_array($type, array('email', 'jabber', 'sms'))) { + $transports = array(); + Event::handle('GetImTransports', array(&$transports)); + if (!in_array($type, array('email', 'sms')) && !in_array($type, array_keys($transports))) { $this->serverError(sprintf(_('Unrecognized address type %s'), $type)); return; } - if ($cur->$type == $confirm->address) { - $this->clientError(_('That address has already been confirmed.')); - return; - } - + $this->address = $confirm->address; $cur->query('BEGIN'); + if (in_array($type, array('email', 'sms'))) + { + if ($cur->$type == $confirm->address) { + $this->clientError(_('That address has already been confirmed.')); + return; + } + + $orig_user = clone($cur); + + $cur->$type = $confirm->address; + + if ($type == 'sms') { + $cur->carrier = ($confirm->address_extra)+0; + $carrier = Sms_carrier::staticGet($cur->carrier); + $cur->smsemail = $carrier->toEmailAddress($cur->sms); + } + + $result = $cur->updateKeys($orig_user); + + if (!$result) { + common_log_db_error($cur, 'UPDATE', __FILE__); + $this->serverError(_('Couldn\'t update user.')); + return; + } + + if ($type == 'email') { + $cur->emailChanged(); + } + + } else { + + $user_im_prefs = new User_im_prefs(); + $user_im_prefs->transport = $confirm->address_type; + $user_im_prefs->user_id = $cur->id; + if ($user_im_prefs->find() && $user_im_prefs->fetch()) { + if($user_im_prefs->screenname == $confirm->address){ + $this->clientError(_('That address has already been confirmed.')); + return; + } + $user_im_prefs->screenname = $confirm->address; + $result = $user_im_prefs->update(); + + if (!$result) { + common_log_db_error($user_im_prefs, 'UPDATE', __FILE__); + $this->serverError(_('Couldn\'t update user im preferences.')); + return; + } + }else{ + $user_im_prefs = new User_im_prefs(); + $user_im_prefs->screenname = $confirm->address; + $user_im_prefs->transport = $confirm->address_type; + $user_im_prefs->user_id = $cur->id; + $result = $user_im_prefs->insert(); + + if (!$result) { + common_log_db_error($user_im_prefs, 'INSERT', __FILE__); + $this->serverError(_('Couldn\'t insert user im preferences.')); + return; + } + } - $orig_user = clone($cur); - - $cur->$type = $confirm->address; - - if ($type == 'sms') { - $cur->carrier = ($confirm->address_extra)+0; - $carrier = Sms_carrier::staticGet($cur->carrier); - $cur->smsemail = $carrier->toEmailAddress($cur->sms); - } - - $result = $cur->updateKeys($orig_user); - - if (!$result) { - common_log_db_error($cur, 'UPDATE', __FILE__); - $this->serverError(_('Couldn\'t update user.')); - return; - } - - if ($type == 'email') { - $cur->emailChanged(); } $result = $confirm->delete(); @@ -128,8 +166,6 @@ class ConfirmaddressAction extends Action } $cur->query('COMMIT'); - - $this->type = $type; $this->showPage(); } @@ -153,11 +189,10 @@ class ConfirmaddressAction extends Action function showContent() { $cur = common_current_user(); - $type = $this->type; $this->element('p', null, sprintf(_('The address "%s" has been '. 'confirmed for your account.'), - $cur->$type)); + $this->address)); } } diff --git a/actions/imsettings.php b/actions/imsettings.php index af4915843..fe1864f0d 100644 --- a/actions/imsettings.php +++ b/actions/imsettings.php @@ -31,9 +31,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } -require_once INSTALLDIR.'/lib/connectsettingsaction.php'; -require_once INSTALLDIR.'/lib/jabber.php'; - /** * Settings for Jabber/XMPP integration * @@ -68,8 +65,8 @@ class ImsettingsAction extends ConnectSettingsAction function getInstructions() { return _('You can send and receive notices through '. - 'Jabber/GTalk [instant messages](%%doc.im%%). '. - 'Configure your address and settings below.'); + 'instant messaging [instant messages](%%doc.im%%). '. + 'Configure your addresses and settings below.'); } /** @@ -84,85 +81,108 @@ class ImsettingsAction extends ConnectSettingsAction function showContent() { - if (!common_config('xmpp', 'enabled')) { + $transports = array(); + Event::handle('GetImTransports', array(&$transports)); + if (! $transports) { $this->element('div', array('class' => 'error'), _('IM is not available.')); return; } $user = common_current_user(); - $this->elementStart('form', array('method' => 'post', - 'id' => 'form_settings_im', - 'class' => 'form_settings', - 'action' => - common_local_url('imsettings'))); - $this->elementStart('fieldset', array('id' => 'settings_im_address')); - $this->element('legend', null, _('Address')); - $this->hidden('token', common_session_token()); - - if ($user->jabber) { - $this->element('p', 'form_confirmed', $user->jabber); - $this->element('p', 'form_note', - _('Current confirmed Jabber/GTalk address.')); - $this->hidden('jabber', $user->jabber); - $this->submit('remove', _('Remove')); - } else { - $confirm = $this->getConfirmation(); - if ($confirm) { - $this->element('p', 'form_unconfirmed', $confirm->address); + + $user_im_prefs_by_transport = array(); + + foreach($transports as $transport=>$transport_info) + { + $this->elementStart('form', array('method' => 'post', + 'id' => 'form_settings_im', + 'class' => 'form_settings', + 'action' => + common_local_url('imsettings'))); + $this->elementStart('fieldset', array('id' => 'settings_im_address')); + $this->element('legend', null, $transport_info['display']); + $this->hidden('token', common_session_token()); + $this->hidden('transport', $transport); + + if ($user_im_prefs = User_im_prefs::pkeyGet( array('transport' => $transport, 'user_id' => $user->id) )) { + $user_im_prefs_by_transport[$transport] = $user_im_prefs; + $this->element('p', 'form_confirmed', $user_im_prefs->screenname); $this->element('p', 'form_note', - sprintf(_('Awaiting confirmation on this address. '. - 'Check your Jabber/GTalk account for a '. - 'message with further instructions. '. - '(Did you add %s to your buddy list?)'), - jabber_daemon_address())); - $this->hidden('jabber', $confirm->address); - $this->submit('cancel', _('Cancel')); + sprintf(_('Current confirmed %s address.'),$transport_info['display'])); + $this->hidden('screenname', $user_im_prefs->screenname); + $this->submit('remove', _('Remove')); } else { - $this->elementStart('ul', 'form_data'); - $this->elementStart('li'); - $this->input('jabber', _('IM address'), - ($this->arg('jabber')) ? $this->arg('jabber') : null, - sprintf(_('Jabber or GTalk address, '. - 'like "UserName@example.org". '. - 'First, make sure to add %s to your '. - 'buddy list in your IM client or on GTalk.'), - jabber_daemon_address())); - $this->elementEnd('li'); - $this->elementEnd('ul'); - $this->submit('add', _('Add')); + $confirm = $this->getConfirmation($transport); + if ($confirm) { + $this->element('p', 'form_unconfirmed', $confirm->address); + $this->element('p', 'form_note', + sprintf(_('Awaiting confirmation on this address. '. + 'Check your %s account for a '. + 'message with further instructions.'), + $transport_info['display'])); + $this->hidden('screenname', $confirm->address); + $this->submit('cancel', _('Cancel')); + } else { + $this->elementStart('ul', 'form_data'); + $this->elementStart('li'); + $this->input('screenname', _('IM address'), + ($this->arg('screenname')) ? $this->arg('screenname') : null, + sprintf(_('%s screenname.'), + $transport_info['display'])); + $this->elementEnd('li'); + $this->elementEnd('ul'); + $this->submit('add', _('Add')); + } } + $this->elementEnd('fieldset'); + $this->elementEnd('form'); + } + + if($user_im_prefs_by_transport) + { + $this->elementStart('form', array('method' => 'post', + 'id' => 'form_settings_im', + 'class' => 'form_settings', + 'action' => + common_local_url('imsettings'))); + $this->elementStart('fieldset', array('id' => 'settings_im_preferences')); + $this->element('legend', null, _('Preferences')); + $this->hidden('token', common_session_token()); + $this->elementStart('table'); + $this->elementStart('tr'); + $this->element('th', null, _('Preferences')); + foreach($user_im_prefs_by_transport as $transport=>$user_im_prefs) + { + $this->element('th', null, $transports[$transport]['display']); + } + $this->elementEnd('tr'); + $preferences = array( + array('name'=>'notify', 'description'=>_('Send me notices')), + array('name'=>'updatefrompresence', 'description'=>_('Post a notice when my status changes.')), + array('name'=>'replies', 'description'=>_('Send me replies '. + 'from people I\'m not subscribed to.')), + array('name'=>'microid', 'description'=>_('Publish a MicroID')) + ); + foreach($preferences as $preference) + { + $this->elementStart('tr'); + foreach($user_im_prefs_by_transport as $transport=>$user_im_prefs) + { + $preference_name = $preference['name']; + $this->elementStart('td'); + $this->checkbox($transport . '_' . $preference['name'], + $preference['description'], + $user_im_prefs->$preference_name); + $this->elementEnd('td'); + } + $this->elementEnd('tr'); + } + $this->elementEnd('table'); + $this->submit('save', _('Save')); + $this->elementEnd('fieldset'); + $this->elementEnd('form'); } - $this->elementEnd('fieldset'); - - $this->elementStart('fieldset', array('id' => 'settings_im_preferences')); - $this->element('legend', null, _('Preferences')); - $this->elementStart('ul', 'form_data'); - $this->elementStart('li'); - $this->checkbox('jabbernotify', - _('Send me notices through Jabber/GTalk.'), - $user->jabbernotify); - $this->elementEnd('li'); - $this->elementStart('li'); - $this->checkbox('updatefrompresence', - _('Post a notice when my Jabber/GTalk status changes.'), - $user->updatefrompresence); - $this->elementEnd('li'); - $this->elementStart('li'); - $this->checkbox('jabberreplies', - _('Send me replies through Jabber/GTalk '. - 'from people I\'m not subscribed to.'), - $user->jabberreplies); - $this->elementEnd('li'); - $this->elementStart('li'); - $this->checkbox('jabbermicroid', - _('Publish a MicroID for my Jabber/GTalk address.'), - $user->jabbermicroid); - $this->elementEnd('li'); - $this->elementEnd('ul'); - $this->submit('save', _('Save')); - $this->elementEnd('fieldset'); - $this->elementEnd('form'); } /** @@ -171,14 +191,14 @@ class ImsettingsAction extends ConnectSettingsAction * @return Confirm_address address object for this user */ - function getConfirmation() + function getConfirmation($transport) { $user = common_current_user(); $confirm = new Confirm_address(); $confirm->user_id = $user->id; - $confirm->address_type = 'jabber'; + $confirm->address_type = $transport; if ($confirm->find(true)) { return $confirm; @@ -232,35 +252,31 @@ class ImsettingsAction extends ConnectSettingsAction function savePreferences() { - - $jabbernotify = $this->boolean('jabbernotify'); - $updatefrompresence = $this->boolean('updatefrompresence'); - $jabberreplies = $this->boolean('jabberreplies'); - $jabbermicroid = $this->boolean('jabbermicroid'); - $user = common_current_user(); - assert(!is_null($user)); // should already be checked - - $user->query('BEGIN'); - - $original = clone($user); - - $user->jabbernotify = $jabbernotify; - $user->updatefrompresence = $updatefrompresence; - $user->jabberreplies = $jabberreplies; - $user->jabbermicroid = $jabbermicroid; - - $result = $user->update($original); - - if ($result === false) { - common_log_db_error($user, 'UPDATE', __FILE__); - $this->serverError(_('Couldn\'t update user.')); - return; + $user_im_prefs = new User_im_prefs(); + $user_im_prefs->user_id = $user->id; + if($user_im_prefs->find() && $user_im_prefs->fetch()) + { + $preferences = array('notify', 'updatefrompresence', 'replies', 'microid'); + $user_im_prefs->query('BEGIN'); + do + { + $original = clone($user_im_prefs); + foreach($preferences as $preference) + { + $user_im_prefs->$preference = $this->boolean($user_im_prefs->transport . '_' . $preference); + } + $result = $user_im_prefs->update($original); + + if ($result === false) { + common_log_db_error($user, 'UPDATE', __FILE__); + $this->serverError(_('Couldn\'t update IM preferences.')); + return; + } + }while($user_im_prefs->fetch()); + $user_im_prefs->query('COMMIT'); } - - $user->query('COMMIT'); - $this->showForm(_('Preferences saved.'), true); } @@ -268,7 +284,7 @@ class ImsettingsAction extends ConnectSettingsAction * Sends a confirmation to the address given * * Stores a confirmation record and sends out a - * Jabber message with the confirmation info. + * message with the confirmation info. * * @return void */ @@ -277,36 +293,41 @@ class ImsettingsAction extends ConnectSettingsAction { $user = common_current_user(); - $jabber = $this->trimmed('jabber'); + $screenname = $this->trimmed('screenname'); + $transport = $this->trimmed('transport'); // Some validation - if (!$jabber) { - $this->showForm(_('No Jabber ID.')); + if (!$screenname) { + $this->showForm(_('No screenname.')); return; } - $jabber = jabber_normalize_jid($jabber); - - if (!$jabber) { - $this->showForm(_('Cannot normalize that Jabber ID')); + if (!$transport) { + $this->showForm(_('No transport.')); return; } - if (!jabber_valid_base_jid($jabber)) { - $this->showForm(_('Not a valid Jabber ID')); + + Event::handle('NormalizeImScreenname', array($transport, &$screenname)); + + if (!$screenname) { + $this->showForm(_('Cannot normalize that screenname')); return; - } else if ($user->jabber == $jabber) { - $this->showForm(_('That is already your Jabber ID.')); + } + $valid = false; + Event::handle('ValidateImScreenname', array($transport, $screenname, &$valid)); + if (!$valid) { + $this->showForm(_('Not a valid screenname')); return; - } else if ($this->jabberExists($jabber)) { - $this->showForm(_('Jabber ID already belongs to another user.')); + } else if ($this->screennameExists($transport, $screenname)) { + $this->showForm(_('Screenname already belongs to another user.')); return; } $confirm = new Confirm_address(); - $confirm->address = $jabber; - $confirm->address_type = 'jabber'; + $confirm->address = $screenname; + $confirm->address_type = $transport; $confirm->user_id = $user->id; $confirm->code = common_confirmation_code(64); $confirm->sent = common_sql_now(); @@ -320,15 +341,10 @@ class ImsettingsAction extends ConnectSettingsAction return; } - jabber_confirm_address($confirm->code, - $user->nickname, - $jabber); + Event::handle('SendImConfirmationCode', array($transport, $screenname, $confirm->code, $user)); - $msg = sprintf(_('A confirmation code was sent '. - 'to the IM address you added. '. - 'You must approve %s for '. - 'sending messages to you.'), - jabber_daemon_address()); + $msg = _('A confirmation code was sent '. + 'to the IM address you added.'); $this->showForm($msg, true); } @@ -343,15 +359,16 @@ class ImsettingsAction extends ConnectSettingsAction function cancelConfirmation() { - $jabber = $this->arg('jabber'); + $screenname = $this->trimmed('screenname'); + $transport = $this->trimmed('transport'); - $confirm = $this->getConfirmation(); + $confirm = $this->getConfirmation($transport); if (!$confirm) { $this->showForm(_('No pending confirmation to cancel.')); return; } - if ($confirm->address != $jabber) { + if ($confirm->address != $screenname) { $this->showForm(_('That is the wrong IM address.')); return; } @@ -360,7 +377,7 @@ class ImsettingsAction extends ConnectSettingsAction if (!$result) { common_log_db_error($confirm, 'DELETE', __FILE__); - $this->serverError(_('Couldn\'t delete email confirmation.')); + $this->serverError(_('Couldn\'t delete confirmation.')); return; } @@ -379,29 +396,25 @@ class ImsettingsAction extends ConnectSettingsAction { $user = common_current_user(); - $jabber = $this->arg('jabber'); + $screenname = $this->trimmed('screenname'); + $transport = $this->trimmed('transport'); // Maybe an old tab open...? - if ($user->jabber != $jabber) { - $this->showForm(_('That is not your Jabber ID.')); + $user_im_prefs = new User_im_prefs(); + $user_im_prefs->user_id = $user->id; + if(! ($user_im_prefs->find() && $user_im_prefs->fetch())) { + $this->showForm(_('That is not your screenname.')); return; } - $user->query('BEGIN'); - - $original = clone($user); - - $user->jabber = null; - - $result = $user->updateKeys($original); + $result = $user_im_prefs->delete(); if (!$result) { common_log_db_error($user, 'UPDATE', __FILE__); - $this->serverError(_('Couldn\'t update user.')); + $this->serverError(_('Couldn\'t update user im prefs.')); return; } - $user->query('COMMIT'); // XXX: unsubscribe to the old address @@ -409,25 +422,27 @@ class ImsettingsAction extends ConnectSettingsAction } /** - * Does this Jabber ID exist? + * Does this screenname exist? * * Checks if we already have another user with this address. * - * @param string $jabber Address to check + * @param string $transport Transport to check + * @param string $screenname Screenname to check * - * @return boolean whether the Jabber ID exists + * @return boolean whether the screenname exists */ - function jabberExists($jabber) + function screennameExists($transport, $screenname) { $user = common_current_user(); - $other = User::staticGet('jabber', $jabber); - - if (!$other) { + $user_im_prefs = new User_im_prefs(); + $user_im_prefs->transport = $transport; + $user_im_prefs->screenname = $screenname; + if($user_im_prefs->find() && $user_im_prefs->fetch()){ + return true; + }else{ return false; - } else { - return $other->id != $user->id; } } } diff --git a/actions/shownotice.php b/actions/shownotice.php index d09100f67..d0528a9f0 100644 --- a/actions/shownotice.php +++ b/actions/shownotice.php @@ -275,12 +275,6 @@ class ShownoticeAction extends OwnerDesignAction 'content' => $id->toString())); } - if ($user->jabbermicroid && $user->jabber && $this->notice->uri) { - $id = new Microid('xmpp:', $user->jabber, - $this->notice->uri); - $this->element('meta', array('name' => 'microid', - 'content' => $id->toString())); - } $this->element('link',array('rel'=>'alternate', 'type'=>'application/json+oembed', 'href'=>common_local_url( diff --git a/actions/showstream.php b/actions/showstream.php index 75e10858d..b9782a3f1 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -166,12 +166,6 @@ class ShowstreamAction extends ProfileAction $this->element('meta', array('name' => 'microid', 'content' => $id->toString())); } - if ($this->user->jabbermicroid && $this->user->jabber && $this->profile->profileurl) { - $id = new Microid('xmpp:'.$this->user->jabber, - $this->selfUrl()); - $this->element('meta', array('name' => 'microid', - 'content' => $id->toString())); - } // See https://wiki.mozilla.org/Microsummaries diff --git a/classes/User.php b/classes/User.php index 6ea975202..57c56849d 100644 --- a/classes/User.php +++ b/classes/User.php @@ -48,11 +48,6 @@ class User extends Memcached_DataObject public $language; // varchar(50) public $timezone; // varchar(50) public $emailpost; // tinyint(1) default_1 - public $jabber; // varchar(255) unique_key - public $jabbernotify; // tinyint(1) - public $jabberreplies; // tinyint(1) - public $jabbermicroid; // tinyint(1) default_1 - public $updatefrompresence; // tinyint(1) public $sms; // varchar(64) unique_key public $carrier; // int(4) public $smsnotify; // tinyint(1) @@ -92,7 +87,7 @@ class User extends Memcached_DataObject function updateKeys(&$orig) { $parts = array(); - foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) { + foreach (array('nickname', 'email', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) { if (strcmp($this->$k, $orig->$k) != 0) { $parts[] = $k . ' = ' . $this->_quote($this->$k); } diff --git a/classes/User_im_prefs.php b/classes/User_im_prefs.php new file mode 100644 index 000000000..8ecdfe9fa --- /dev/null +++ b/classes/User_im_prefs.php @@ -0,0 +1,71 @@ +. + * + * @category Data + * @package StatusNet + * @author Craig Andrews + * @copyright 2009 StatusNet Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class User_im_prefs extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'user_im_prefs'; // table name + public $user_id; // int(4) primary_key not_null + public $screenname; // varchar(255) not_null + public $transport; // varchar(255) not_null + public $notify; // tinyint(1) + public $replies; // tinyint(1) + public $microid; // tinyint(1) + public $updatefrompresence; // tinyint(1) + public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00 + public $modified; // timestamp not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User_im_prefs',$k,$v); } + + function pkeyGet($kv) + { + return Memcached_DataObject::pkeyGet('User_im_prefs', $kv); + } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + /* + DB_DataObject calculates the sequence key(s) by taking the first key returned by the keys() function. + In this case, the keys() function returns user_id as the first key. user_id is not a sequence, but + DB_DataObject's sequenceKey() will incorrectly think it is. Then, since the sequenceKey() is a numeric + type, but is not set to autoincrement in the database, DB_DataObject will create a _seq table and + manage the sequence itself. This is not the correct behavior for the user_id in this class. + So we override that incorrect behavior, and simply say there is no sequence key. + */ + function sequenceKey() + { + return array(false,false); + } +} diff --git a/classes/statusnet.ini b/classes/statusnet.ini index 6203650a6..d8a817ebc 100644 --- a/classes/statusnet.ini +++ b/classes/statusnet.ini @@ -540,11 +540,6 @@ emailmicroid = 17 language = 2 timezone = 2 emailpost = 17 -jabber = 2 -jabbernotify = 17 -jabberreplies = 17 -jabbermicroid = 17 -updatefrompresence = 17 sms = 2 carrier = 1 smsnotify = 17 @@ -564,7 +559,6 @@ id = K nickname = U email = U incomingemail = U -jabber = U sms = U uri = U @@ -616,3 +610,19 @@ modified = 384 [user_location_prefs__keys] user_id = K +[user_im_prefs] +user_id = 129 +screenname = 130 +transport = 130 +notify = 17 +replies = 17 +microid = 17 +updatefrompresence = 17 +created = 142 +modified = 384 + +[user_im_prefs__keys] +user_id = K +transport = K +transport = U +screenname = U diff --git a/db/statusnet.sql b/db/statusnet.sql index 17de4fd0d..63b50a3f7 100644 --- a/db/statusnet.sql +++ b/db/statusnet.sql @@ -62,11 +62,6 @@ create table user ( language varchar(50) comment 'preferred language', timezone varchar(50) comment 'timezone', emailpost tinyint default 1 comment 'Post by email', - jabber varchar(255) unique key comment 'jabber ID for notices', - jabbernotify tinyint default 0 comment 'whether to send notices to jabber', - jabberreplies tinyint default 0 comment 'whether to send notices to jabber on replies', - jabbermicroid tinyint default 1 comment 'whether to publish xmpp microid', - updatefrompresence tinyint default 0 comment 'whether to record updates from Jabber presence notices', sms varchar(64) unique key comment 'sms phone number', carrier integer comment 'foreign key to sms_carrier' references sms_carrier (id), smsnotify tinyint default 0 comment 'whether to send notices to SMS', @@ -259,9 +254,9 @@ create table oid_nonces ( create table confirm_address ( code varchar(32) not null primary key comment 'good random code', user_id integer not null comment 'user who requested confirmation' references user (id), - address varchar(255) not null comment 'address (email, Jabber, SMS, etc.)', + address varchar(255) not null comment 'address (email, xmpp, SMS, etc.)', address_extra varchar(255) not null comment 'carrier ID, for SMS', - address_type varchar(8) not null comment 'address type ("email", "jabber", "sms")', + address_type varchar(8) not null comment 'address type ("email", "xmpp", "sms")', claimed datetime comment 'date this was claimed for queueing', sent datetime comment 'date this was sent for queueing', modified timestamp comment 'date this record was modified' @@ -276,7 +271,7 @@ create table remember_me ( create table queue_item ( id integer auto_increment primary key comment 'unique identifier', frame blob not null comment 'data: object reference or opaque string', - transport varchar(8) not null comment 'queue for what? "email", "jabber", "sms", "irc", ...', + transport varchar(8) not null comment 'queue for what? "email", "xmpp", "sms", "irc", ...', created datetime not null comment 'date this record was created', claimed datetime comment 'date this item was claimed', @@ -348,7 +343,7 @@ create table invitation ( code varchar(32) not null primary key comment 'random code for an invitation', user_id int not null comment 'who sent the invitation' references user (id), address varchar(255) not null comment 'invitation sent to', - address_type varchar(8) not null comment 'address type ("email", "jabber", "sms")', + address_type varchar(8) not null comment 'address type ("email", "xmpp", "sms")', created datetime not null comment 'date this record was created', index invitation_address_idx (address, address_type), @@ -633,3 +628,18 @@ create table inbox ( constraint primary key (user_id) ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table user_im_prefs ( + user_id integer not null comment 'user' references user (id), + screenname varchar(255) not null comment 'screenname on this service', + transport varchar(255) not null comment 'transport (ex xmpp, aim)', + notify tinyint(1) not null default 0 comment 'Notify when a new notice is sent', + replies tinyint(1) not null default 0 comment 'Send replies from people not subscribed to', + microid tinyint(1) not null default 1 comment 'Publish a MicroID', + updatefrompresence tinyint(1) not null default 0 comment 'Send replies from people not subscribed to.', + created timestamp not null DEFAULT CURRENT_TIMESTAMP comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + constraint primary key (user_id, transport), + constraint unique key `transport_screenname_key` ( `transport` , `screenname` ) +); diff --git a/lib/channel.php b/lib/channel.php index 3cd168786..05437b4e9 100644 --- a/lib/channel.php +++ b/lib/channel.php @@ -47,63 +47,6 @@ class Channel } } -class XMPPChannel extends Channel -{ - - var $conn = null; - - function source() - { - return 'xmpp'; - } - - function __construct($conn) - { - $this->conn = $conn; - } - - function on($user) - { - return $this->set_notify($user, 1); - } - - function off($user) - { - return $this->set_notify($user, 0); - } - - function output($user, $text) - { - $text = '['.common_config('site', 'name') . '] ' . $text; - jabber_send_message($user->jabber, $text); - } - - function error($user, $text) - { - $text = '['.common_config('site', 'name') . '] ' . $text; - jabber_send_message($user->jabber, $text); - } - - function set_notify(&$user, $notify) - { - $orig = clone($user); - $user->jabbernotify = $notify; - $result = $user->update($orig); - if (!$result) { - $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); - common_log(LOG_ERR, - 'Could not set notify flag to ' . $notify . - ' for user ' . common_log_objstring($user) . - ': ' . $last_error->message); - return false; - } else { - common_log(LOG_INFO, - 'User ' . $user->nickname . ' set notify flag to ' . $notify); - return true; - } - } -} - class WebChannel extends Channel { var $out = null; diff --git a/lib/command.php b/lib/command.php index 2a51fd687..44b7b2274 100644 --- a/lib/command.php +++ b/lib/command.php @@ -596,7 +596,7 @@ class OffCommand extends Command } function execute($channel) { - if ($other) { + if ($this->other) { $channel->error($this->user, _("Command not yet implemented.")); } else { if ($channel->off($this->user)) { @@ -619,7 +619,7 @@ class OnCommand extends Command function execute($channel) { - if ($other) { + if ($this->other) { $channel->error($this->user, _("Command not yet implemented.")); } else { if ($channel->on($this->user)) { diff --git a/lib/imchannel.php b/lib/imchannel.php new file mode 100644 index 000000000..12354ce4b --- /dev/null +++ b/lib/imchannel.php @@ -0,0 +1,104 @@ +. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +class IMChannel extends Channel +{ + + var $imPlugin; + + function source() + { + return $imPlugin->transport; + } + + function __construct($imPlugin) + { + $this->imPlugin = $imPlugin; + } + + function on($user) + { + return $this->set_notify($user, 1); + } + + function off($user) + { + return $this->set_notify($user, 0); + } + + function output($user, $text) + { + $text = '['.common_config('site', 'name') . '] ' . $text; + $this->imPlugin->send_message($this->imPlugin->get_screenname($user), $text); + } + + function error($user, $text) + { + $text = '['.common_config('site', 'name') . '] ' . $text; + + $screenname = $this->imPlugin->get_screenname($user); + if($screenname){ + $this->imPlugin->send_message($screenname, $text); + return true; + }else{ + common_log(LOG_ERR, + 'Could not send error message to user ' . common_log_objstring($user) . + ' on transport ' . $this->imPlugin->transport .' : user preference does not exist'); + return false; + } + } + + function set_notify($user, $notify) + { + $user_im_prefs = new User_im_prefs(); + $user_im_prefs->transport = $this->imPlugin->transport; + $user_im_prefs->user_id = $user->id; + if($user_im_prefs->find() && $user_im_prefs->fetch()){ + if($user_im_prefs->notify == $notify){ + //notify is already set the way they want + return true; + }else{ + $original = clone($user_im_prefs); + $user_im_prefs->notify = $notify; + $result = $user_im_prefs->update($original); + + if (!$result) { + $last_error = &PEAR::getStaticProperty('DB_DataObject','lastError'); + common_log(LOG_ERR, + 'Could not set notify flag to ' . $notify . + ' for user ' . common_log_objstring($user) . + ' on transport ' . $this->imPlugin->transport .' : ' . $last_error->message); + return false; + } else { + common_log(LOG_INFO, + 'User ' . $user->nickname . ' set notify flag to ' . $notify); + return true; + } + } + }else{ + common_log(LOG_ERR, + 'Could not set notify flag to ' . $notify . + ' for user ' . common_log_objstring($user) . + ' on transport ' . $this->imPlugin->transport .' : user preference does not exist'); + return false; + } + } +} diff --git a/lib/immanager.php b/lib/immanager.php new file mode 100644 index 000000000..4c28ec0e6 --- /dev/null +++ b/lib/immanager.php @@ -0,0 +1,70 @@ +. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +/** + * IKM background connection manager for IM-using queue handlers, + * allowing them to send outgoing messages on the right connection. + * + * In a multi-site queuedaemon.php run, one connection will be instantiated + * for each site being handled by the current process that has IM enabled. + * + * Implementations that extend this class will likely want to: + * 1) override start() with their connection process. + * 2) override handleInput() with what to do when data is waiting on + * one of the sockets + * 3) override idle($timeout) to do keepalives (if necessary) + * 4) implement send_raw_message() to send raw data that ImPlugin::enqueue_outgoing_raw + * enqueued + */ + +abstract class ImManager extends IoManager +{ + abstract function send_raw_message($data); + + function __construct($imPlugin) + { + $this->plugin = $imPlugin; + //TODO We only really want to register this event if this is the thread that runs the ImManager + Event::addHandler('EndInitializeQueueManager', array($this, 'onEndInitializeQueueManager')); + } + + /** + * Fetch the singleton manager for the current site. + * @return mixed ImManager, or false if unneeded + */ + public static function get() + { + throw new Exception('ImManager should be created using it\'s constructor, not the static get method'); + } + + /** + * Register notice queue handler + * + * @param QueueManager $manager + * + * @return boolean hook return + */ + function onEndInitializeQueueManager($manager) + { + $manager->connect($this->plugin->transport . '-out', new ImSenderQueueHandler($this->plugin, $this), 'imdaemon'); + return true; + } +} diff --git a/lib/implugin.php b/lib/implugin.php new file mode 100644 index 000000000..5d4d8949c --- /dev/null +++ b/lib/implugin.php @@ -0,0 +1,612 @@ +. + * + * @category Plugin + * @package StatusNet + * @author Craig Andrews + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +/** + * Superclass for plugins that do authentication + * + * Implementations will likely want to override onStartIoManagerClasses() so that their + * IO manager is used + * + * @category Plugin + * @package StatusNet + * @author Craig Andrews + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +abstract class ImPlugin extends Plugin +{ + //name of this IM transport + public $transport = null; + //list of screennames that should get all public notices + public $public = array(); + + /** + * normalize a screenname for comparison + * + * @param string $screenname screenname to normalize + * + * @return string an equivalent screenname in normalized form + */ + abstract function normalize($screenname); + + + /** + * validate (ensure the validity of) a screenname + * + * @param string $screenname screenname to validate + * + * @return boolean + */ + abstract function validate($screenname); + + /** + * get the internationalized/translated display name of this IM service + * + * @return string + */ + abstract function getDisplayName(); + + /** + * send a single notice to a given screenname + * The implementation should put raw data, ready to send, into the outgoing + * queue using enqueue_outgoing_raw() + * + * @param string $screenname screenname to send to + * @param Notice $notice notice to send + * + * @return boolean success value + */ + function send_notice($screenname, $notice) + { + return $this->send_message($screenname, $this->format_notice($notice)); + } + + /** + * send a message (text) to a given screenname + * The implementation should put raw data, ready to send, into the outgoing + * queue using enqueue_outgoing_raw() + * + * @param string $screenname screenname to send to + * @param Notice $body text to send + * + * @return boolean success value + */ + abstract function send_message($screenname, $body); + + /** + * receive a raw message + * Raw IM data is taken from the incoming queue, and passed to this function. + * It should parse the raw message and call handle_incoming() + * + * @param object $data raw IM data + * + * @return boolean success value + */ + abstract function receive_raw_message($data); + + /** + * get the screenname of the daemon that sends and receives message for this service + * + * @return string screenname of this plugin + */ + abstract function daemon_screenname(); + + /** + * get the microid uri of a given screenname + * + * @param string $screenname screenname + * + * @return string microid uri + */ + function microiduri($screenname) + { + return $this->transport . ':' . $screenname; + } + //========================UTILITY FUNCTIONS USEFUL TO IMPLEMENTATIONS - MISC ========================\ + + /** + * Put raw message data (ready to send) into the outgoing queue + * + * @param object $data + */ + function enqueue_outgoing_raw($data) + { + $qm = QueueManager::get(); + $qm->enqueue($data, $this->transport . '-out'); + } + + /** + * Put raw message data (received, ready to be processed) into the incoming queue + * + * @param object $data + */ + function enqueue_incoming_raw($data) + { + $qm = QueueManager::get(); + $qm->enqueue($data, $this->transport . '-in'); + } + + /** + * given a screenname, get the corresponding user + * + * @param string $screenname + * + * @return User user + */ + function get_user($screenname) + { + $user_im_prefs = $this->get_user_im_prefs_from_screenname($screenname); + if($user_im_prefs){ + $user = User::staticGet('id', $user_im_prefs->user_id); + $user_im_prefs->free(); + return $user; + }else{ + return false; + } + } + + + /** + * given a screenname, get the User_im_prefs object for this transport + * + * @param string $screenname + * + * @return User_im_prefs user_im_prefs + */ + function get_user_im_prefs_from_screenname($screenname) + { + if($user_im_prefs = User_im_prefs::pkeyGet( array('transport' => $this->transport, 'screenname' => $screenname) )){ + return $user_im_prefs; + }else{ + return false; + } + } + + + /** + * given a User, get their screenname + * + * @param User $user + * + * @return string screenname of that user + */ + function get_screenname($user) + { + $user_im_prefs = $this->get_user_im_prefs_from_user($user); + if($user_im_prefs){ + return $user_im_prefs->screenname; + }else{ + return false; + } + } + + + /** + * given a User, get their User_im_prefs + * + * @param User $user + * + * @return User_im_prefs user_im_prefs of that user + */ + function get_user_im_prefs_from_user($user) + { + if($user_im_prefs = User_im_prefs::pkeyGet( array('transport' => $this->transport, 'user_id' => $user->id) )){ + return $user_im_prefs; + }else{ + return false; + } + } + //========================UTILITY FUNCTIONS USEFUL TO IMPLEMENTATIONS - SENDING ========================\ + /** + * Send a message to a given screenname from the site + * + * @param string $screenname screenname to send the message to + * @param string $msg message contents to send + * + * @param boolean success + */ + protected function send_from_site($screenname, $msg) + { + $text = '['.common_config('site', 'name') . '] ' . $msg; + $this->send_message($screenname, $text); + } + + /** + * send a confirmation code to a user + * + * @param string $screenname screenname sending to + * @param string $code the confirmation code + * @param User $user user sending to + * + * @return boolean success value + */ + function send_confirmation_code($screenname, $code, $user) + { + $body = sprintf(_('User "%s" on %s has said that your %s screenname belongs to them. ' . + 'If that\'s true, you can confirm by clicking on this URL: ' . + '%s' . + ' . (If you cannot click it, copy-and-paste it into the ' . + 'address bar of your browser). If that user isn\'t you, ' . + 'or if you didn\'t request this confirmation, just ignore this message.'), + $user->nickname, common_config('site', 'name'), $this->getDisplayName(), common_local_url('confirmaddress', array('code' => $code))); + + return $this->send_message($screenname, $body); + } + + /** + * send a notice to all public listeners + * + * For notices that are generated on the local system (by users), we can optionally + * forward them to remote listeners by XMPP. + * + * @param Notice $notice notice to broadcast + * + * @return boolean success flag + */ + + function public_notice($notice) + { + // Now, users who want everything + + // FIXME PRIV don't send out private messages here + // XXX: should we send out non-local messages if public,localonly + // = false? I think not + + foreach ($this->public as $screenname) { + common_log(LOG_INFO, + 'Sending notice ' . $notice->id . + ' to public listener ' . $screenname, + __FILE__); + $this->send_notice($screenname, $notice); + } + + return true; + } + + /** + * broadcast a notice to all subscribers and reply recipients + * + * This function will send a notice to all subscribers on the local server + * who have IM addresses, and have IM notification enabled, and + * have this subscription enabled for IM. It also sends the notice to + * all recipients of @-replies who have IM addresses and IM notification + * enabled. This is really the heart of IM distribution in StatusNet. + * + * @param Notice $notice The notice to broadcast + * + * @return boolean success flag + */ + + function broadcast_notice($notice) + { + + $ni = $notice->whoGets(); + + foreach ($ni as $user_id => $reason) { + $user = User::staticGet($user_id); + if (empty($user)) { + // either not a local user, or just not found + continue; + } + $user_im_prefs = $this->get_user_im_prefs_from_user($user); + if(!$user_im_prefs || !$user_im_prefs->notify){ + continue; + } + + switch ($reason) { + case NOTICE_INBOX_SOURCE_REPLY: + if (!$user_im_prefs->replies) { + continue 2; + } + break; + case NOTICE_INBOX_SOURCE_SUB: + $sub = Subscription::pkeyGet(array('subscriber' => $user->id, + 'subscribed' => $notice->profile_id)); + if (empty($sub) || !$sub->jabber) { + continue 2; + } + break; + case NOTICE_INBOX_SOURCE_GROUP: + break; + default: + throw new Exception(sprintf(_("Unknown inbox source %d."), $reason)); + } + + common_log(LOG_INFO, + 'Sending notice ' . $notice->id . ' to ' . $user_im_prefs->screenname, + __FILE__); + $this->send_notice($user_im_prefs->screenname, $notice); + $user_im_prefs->free(); + } + + return true; + } + + /** + * makes a plain-text formatted version of a notice, suitable for IM distribution + * + * @param Notice $notice notice being sent + * + * @return string plain-text version of the notice, with user nickname prefixed + */ + + function format_notice($notice) + { + $profile = $notice->getProfile(); + return $profile->nickname . ': ' . $notice->content . ' [' . $notice->id . ']'; + } + //========================UTILITY FUNCTIONS USEFUL TO IMPLEMENTATIONS - RECEIVING ========================\ + + /** + * Attempt to handle a message as a command + * @param User $user user the message is from + * @param string $body message text + * @return boolean true if the message was a command and was executed, false if it was not a command + */ + protected function handle_command($user, $body) + { + $inter = new CommandInterpreter(); + $cmd = $inter->handle_command($user, $body); + if ($cmd) { + $chan = new IMChannel($this); + $cmd->execute($chan); + return true; + } else { + return false; + } + } + + /** + * Is some text an autoreply message? + * @param string $txt message text + * @return boolean true if autoreply + */ + protected function is_autoreply($txt) + { + if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) { + return true; + } else if (preg_match('/^System: Message wasn\'t delivered. Offline storage size was exceeded.$/', $txt)) { + return true; + } else { + return false; + } + } + + /** + * Is some text an OTR message? + * @param string $txt message text + * @return boolean true if OTR + */ + protected function is_otr($txt) + { + if (preg_match('/^\?OTR/', $txt)) { + return true; + } else { + return false; + } + } + + /** + * Helper for handling incoming messages + * Your incoming message handler will probably want to call this function + * + * @param string $from screenname the message was sent from + * @param string $message message contents + * + * @param boolean success + */ + protected function handle_incoming($from, $notice_text) + { + $user = $this->get_user($from); + // For common_current_user to work + global $_cur; + $_cur = $user; + + if (!$user) { + $this->send_from_site($from, 'Unknown user; go to ' . + common_local_url('imsettings') . + ' to add your address to your account'); + common_log(LOG_WARNING, 'Message from unknown user ' . $from); + return; + } + if ($this->handle_command($user, $notice_text)) { + common_log(LOG_INFO, "Command message by $from handled."); + return; + } else if ($this->is_autoreply($notice_text)) { + common_log(LOG_INFO, 'Ignoring auto reply from ' . $from); + return; + } else if ($this->is_otr($notice_text)) { + common_log(LOG_INFO, 'Ignoring OTR from ' . $from); + return; + } else { + + common_log(LOG_INFO, 'Posting a notice from ' . $user->nickname); + + $this->add_notice($from, $user, $notice_text); + } + + $user->free(); + unset($user); + unset($_cur); + unset($message); + } + + /** + * Helper for handling incoming messages + * Your incoming message handler will probably want to call this function + * + * @param string $from screenname the message was sent from + * @param string $message message contents + * + * @param boolean success + */ + protected function add_notice($screenname, $user, $body) + { + $body = trim(strip_tags($body)); + $content_shortened = common_shorten_links($body); + if (Notice::contentTooLong($content_shortened)) { + $this->send_from_site($screenname, sprintf(_('Message too long - maximum is %1$d characters, you sent %2$d.'), + Notice::maxContent(), + mb_strlen($content_shortened))); + return; + } + + try { + $notice = Notice::saveNew($user->id, $content_shortened, $this->transport); + } catch (Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + $this->send_from_site($from, $e->getMessage()); + return; + } + + common_broadcast_notice($notice); + common_log(LOG_INFO, + 'Added notice ' . $notice->id . ' from user ' . $user->nickname); + $notice->free(); + unset($notice); + } + + //========================EVENT HANDLERS========================\ + + /** + * Register notice queue handler + * + * @param QueueManager $manager + * + * @return boolean hook return + */ + function onEndInitializeQueueManager($manager) + { + $manager->connect($this->transport . '-in', new ImReceiverQueueHandler($this)); + $manager->connect($this->transport, new ImQueueHandler($this)); + return true; + } + + function onStartImDaemonIoManagers(&$classes) + { + //$classes[] = new ImManager($this); // handles sending/receiving/pings/reconnects + return true; + } + + function onStartEnqueueNotice($notice, &$transports) + { + $profile = Profile::staticGet($notice->profile_id); + + if (!$profile) { + common_log(LOG_WARNING, 'Refusing to broadcast notice with ' . + 'unknown profile ' . common_log_objstring($notice), + __FILE__); + }else{ + $transports[] = $this->transport; + } + + return true; + } + + function onEndShowHeadElements($action) + { + $aname = $action->trimmed('action'); + + if ($aname == 'shownotice') { + + $user_im_prefs = new User_im_prefs(); + $user_im_prefs->user_id = $action->profile->id; + $user_im_prefs->transport = $this->transport; + + if ($user_im_prefs->find() && $user_im_prefs->fetch() && $user_im_prefs->microid && $action->notice->uri) { + $id = new Microid($this->microiduri($user_im_prefs->screenname), + $action->notice->uri); + $action->element('meta', array('name' => 'microid', + 'content' => $id->toString())); + } + + } else if ($aname == 'showstream') { + + $user_im_prefs = new User_im_prefs(); + $user_im_prefs->user_id = $action->user->id; + $user_im_prefs->transport = $this->transport; + + if ($user_im_prefs->find() && $user_im_prefs->fetch() && $user_im_prefs->microid && $action->profile->profileurl) { + $id = new Microid($this->microiduri($user_im_prefs->screenname), + $action->selfUrl()); + $action->element('meta', array('name' => 'microid', + 'content' => $id->toString())); + } + } + } + + function onNormalizeImScreenname($transport, &$screenname) + { + if($transport == $this->transport) + { + $screenname = $this->normalize($screenname); + return false; + } + } + + function onValidateImScreenname($transport, $screenname, &$valid) + { + if($transport == $this->transport) + { + $valid = $this->validate($screenname); + return false; + } + } + + function onGetImTransports(&$transports) + { + $transports[$this->transport] = array('display' => $this->getDisplayName()); + } + + function onSendImConfirmationCode($transport, $screenname, $code, $user) + { + if($transport == $this->transport) + { + $this->send_confirmation_code($screenname, $code, $user); + return false; + } + } + + function onUserDeleteRelated($user, &$tables) + { + $tables[] = 'User_im_prefs'; + return true; + } + + function initialize() + { + if(is_null($this->transport)){ + throw new Exception('transport cannot be null'); + } + } +} diff --git a/lib/imqueuehandler.php b/lib/imqueuehandler.php new file mode 100644 index 000000000..b42d8e7c0 --- /dev/null +++ b/lib/imqueuehandler.php @@ -0,0 +1,48 @@ +. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +/** + * Common superclass for all IM sending queue handlers. + */ + +class ImQueueHandler extends QueueHandler +{ + function __construct($plugin) + { + $this->plugin = $plugin; + } + + /** + * Handle a notice + * @param Notice $notice + * @return boolean success + */ + function handle($notice) + { + $this->plugin->broadcast_notice($notice); + if ($notice->is_local == Notice::LOCAL_PUBLIC || + $notice->is_local == Notice::LOCAL_NONPUBLIC) { + $this->plugin->public_notice($notice); + } + return true; + } + +} diff --git a/lib/imreceiverqueuehandler.php b/lib/imreceiverqueuehandler.php new file mode 100644 index 000000000..269c7db91 --- /dev/null +++ b/lib/imreceiverqueuehandler.php @@ -0,0 +1,42 @@ +. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +/** + * Common superclass for all IM receiving queue handlers. + */ + +class ImReceiverQueueHandler extends QueueHandler +{ + function __construct($plugin) + { + $this->plugin = $plugin; + } + + /** + * Handle incoming IM data sent by a user to the IM bot + * @param object $data + * @return boolean success + */ + function handle($data) + { + return $this->plugin->receive_raw_message($data); + } +} diff --git a/lib/imsenderqueuehandler.php b/lib/imsenderqueuehandler.php new file mode 100644 index 000000000..3dd96ff73 --- /dev/null +++ b/lib/imsenderqueuehandler.php @@ -0,0 +1,44 @@ +. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +/** + * Common superclass for all IM sending queue handlers. + */ + +class ImSenderQueueHandler extends QueueHandler +{ + function __construct($plugin, $immanager) + { + $this->plugin = $plugin; + $this->immanager = $immanager; + } + + /** + * Handle outgoing IM data to be sent from the bot to a user + * @param object $data + * @return boolean success + */ + function handle($data) + { + return $this->immanager->send_raw_message($data); + } +} + diff --git a/lib/jabber.php b/lib/jabber.php deleted file mode 100644 index b6b23521b..000000000 --- a/lib/jabber.php +++ /dev/null @@ -1,473 +0,0 @@ -. - * - * @category Network - * @package StatusNet - * @author Evan Prodromou - * @copyright 2008 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once 'XMPPHP/XMPP.php'; - -/** - * checks whether a string is a syntactically valid Jabber ID (JID) - * - * @param string $jid string to check - * - * @return boolean whether the string is a valid JID - */ - -function jabber_valid_base_jid($jid) -{ - // Cheap but effective - return Validate::email($jid); -} - -/** - * normalizes a Jabber ID for comparison - * - * @param string $jid JID to check - * - * @return string an equivalent JID in normalized (lowercase) form - */ - -function jabber_normalize_jid($jid) -{ - if (preg_match("/(?:([^\@]+)\@)?([^\/]+)(?:\/(.*))?$/", $jid, $matches)) { - $node = $matches[1]; - $server = $matches[2]; - return strtolower($node.'@'.$server); - } else { - return null; - } -} - -/** - * the JID of the Jabber daemon for this StatusNet instance - * - * @return string JID of the Jabber daemon - */ - -function jabber_daemon_address() -{ - return common_config('xmpp', 'user') . '@' . common_config('xmpp', 'server'); -} - -class Sharing_XMPP extends XMPPHP_XMPP -{ - function getSocket() - { - return $this->socket; - } -} - -/** - * Build an XMPP proxy connection that'll save outgoing messages - * to the 'xmppout' queue to be picked up by xmppdaemon later. - */ -function jabber_proxy() -{ - $proxy = new Queued_XMPP(common_config('xmpp', 'host') ? - common_config('xmpp', 'host') : - common_config('xmpp', 'server'), - common_config('xmpp', 'port'), - common_config('xmpp', 'user'), - common_config('xmpp', 'password'), - common_config('xmpp', 'resource') . 'daemon', - common_config('xmpp', 'server'), - common_config('xmpp', 'debug') ? - true : false, - common_config('xmpp', 'debug') ? - XMPPHP_Log::LEVEL_VERBOSE : null); - return $proxy; -} - -/** - * Lazy-connect the configured Jabber account to the configured server; - * if already opened, the same connection will be returned. - * - * In a multi-site background process, each site configuration - * will get its own connection. - * - * @param string $resource Resource to connect (defaults to configured resource) - * - * @return XMPPHP connection to the configured server - */ - -function jabber_connect($resource=null) -{ - static $connections = array(); - $site = common_config('site', 'server'); - if (empty($connections[$site])) { - if (empty($resource)) { - $resource = common_config('xmpp', 'resource'); - } - $conn = new Sharing_XMPP(common_config('xmpp', 'host') ? - common_config('xmpp', 'host') : - common_config('xmpp', 'server'), - common_config('xmpp', 'port'), - common_config('xmpp', 'user'), - common_config('xmpp', 'password'), - $resource, - common_config('xmpp', 'server'), - common_config('xmpp', 'debug') ? - true : false, - common_config('xmpp', 'debug') ? - XMPPHP_Log::LEVEL_VERBOSE : null - ); - - if (!$conn) { - return false; - } - $connections[$site] = $conn; - - $conn->autoSubscribe(); - $conn->useEncryption(common_config('xmpp', 'encryption')); - - try { - common_log(LOG_INFO, __METHOD__ . ": connecting " . - common_config('xmpp', 'user') . '/' . $resource); - //$conn->connect(true); // true = persistent connection - $conn->connect(); // persistent connections break multisite - } catch (XMPPHP_Exception $e) { - common_log(LOG_ERR, $e->getMessage()); - return false; - } - - $conn->processUntil('session_start'); - } - return $connections[$site]; -} - -/** - * Queue send for a single notice to a given Jabber address - * - * @param string $to JID to send the notice to - * @param Notice $notice notice to send - * - * @return boolean success value - */ - -function jabber_send_notice($to, $notice) -{ - $conn = jabber_proxy(); - $profile = Profile::staticGet($notice->profile_id); - if (!$profile) { - common_log(LOG_WARNING, 'Refusing to send notice with ' . - 'unknown profile ' . common_log_objstring($notice), - __FILE__); - return false; - } - $msg = jabber_format_notice($profile, $notice); - $entry = jabber_format_entry($profile, $notice); - $conn->message($to, $msg, 'chat', null, $entry); - $profile->free(); - return true; -} - -/** - * extra information for XMPP messages, as defined by Twitter - * - * @param Profile $profile Profile of the sending user - * @param Notice $notice Notice being sent - * - * @return string Extra information (Atom, HTML, addresses) in string format - */ - -function jabber_format_entry($profile, $notice) -{ - $entry = $notice->asAtomEntry(true, true); - - $xs = new XMLStringer(); - $xs->elementStart('html', array('xmlns' => 'http://jabber.org/protocol/xhtml-im')); - $xs->elementStart('body', array('xmlns' => 'http://www.w3.org/1999/xhtml')); - $xs->element('a', array('href' => $profile->profileurl), - $profile->nickname); - $xs->text(": "); - if (!empty($notice->rendered)) { - $xs->raw($notice->rendered); - } else { - $xs->raw(common_render_content($notice->content, $notice)); - } - $xs->text(" "); - $xs->element('a', array( - 'href'=>common_local_url('conversation', - array('id' => $notice->conversation)).'#notice-'.$notice->id - ),sprintf(_('[%s]'),$notice->id)); - $xs->elementEnd('body'); - $xs->elementEnd('html'); - - $html = $xs->getString(); - - return $html . ' ' . $entry; -} - -/** - * sends a single text message to a given JID - * - * @param string $to JID to send the message to - * @param string $body body of the message - * @param string $type type of the message - * @param string $subject subject of the message - * - * @return boolean success flag - */ - -function jabber_send_message($to, $body, $type='chat', $subject=null) -{ - $conn = jabber_proxy(); - $conn->message($to, $body, $type, $subject); - return true; -} - -/** - * sends a presence stanza on the Jabber network - * - * @param string $status current status, free-form string - * @param string $show structured status value - * @param string $to recipient of presence, null for general - * @param string $type type of status message, related to $show - * @param int $priority priority of the presence - * - * @return boolean success value - */ - -function jabber_send_presence($status, $show='available', $to=null, - $type = 'available', $priority=null) -{ - $conn = jabber_connect(); - if (!$conn) { - return false; - } - $conn->presence($status, $show, $to, $type, $priority); - return true; -} - -/** - * sends a confirmation request to a JID - * - * @param string $code confirmation code for confirmation URL - * @param string $nickname nickname of confirming user - * @param string $address JID to send confirmation to - * - * @return boolean success flag - */ - -function jabber_confirm_address($code, $nickname, $address) -{ - $body = 'User "' . $nickname . '" on ' . common_config('site', 'name') . ' ' . - 'has said that your Jabber ID belongs to them. ' . - 'If that\'s true, you can confirm by clicking on this URL: ' . - common_local_url('confirmaddress', array('code' => $code)) . - ' . (If you cannot click it, copy-and-paste it into the ' . - 'address bar of your browser). If that user isn\'t you, ' . - 'or if you didn\'t request this confirmation, just ignore this message.'; - - return jabber_send_message($address, $body); -} - -/** - * sends a "special" presence stanza on the Jabber network - * - * @param string $type Type of presence - * @param string $to JID to send presence to - * @param string $show show value for presence - * @param string $status status value for presence - * - * @return boolean success flag - * - * @see jabber_send_presence() - */ - -function jabber_special_presence($type, $to=null, $show=null, $status=null) -{ - // FIXME: why use this instead of jabber_send_presence()? - $conn = jabber_connect(); - - $to = htmlspecialchars($to); - $status = htmlspecialchars($status); - - $out = "send($out); -} - -/** - * Queue broadcast of a notice to all subscribers and reply recipients - * - * This function will send a notice to all subscribers on the local server - * who have Jabber addresses, and have Jabber notification enabled, and - * have this subscription enabled for Jabber. It also sends the notice to - * all recipients of @-replies who have Jabber addresses and Jabber notification - * enabled. This is really the heart of Jabber distribution in StatusNet. - * - * @param Notice $notice The notice to broadcast - * - * @return boolean success flag - */ - -function jabber_broadcast_notice($notice) -{ - if (!common_config('xmpp', 'enabled')) { - return true; - } - $profile = Profile::staticGet($notice->profile_id); - - if (!$profile) { - common_log(LOG_WARNING, 'Refusing to broadcast notice with ' . - 'unknown profile ' . common_log_objstring($notice), - __FILE__); - return false; - } - - $msg = jabber_format_notice($profile, $notice); - $entry = jabber_format_entry($profile, $notice); - - $profile->free(); - unset($profile); - - $sent_to = array(); - - $conn = jabber_proxy(); - - $ni = $notice->whoGets(); - - foreach ($ni as $user_id => $reason) { - $user = User::staticGet($user_id); - if (empty($user) || - empty($user->jabber) || - !$user->jabbernotify) { - // either not a local user, or just not found - continue; - } - switch ($reason) { - case NOTICE_INBOX_SOURCE_REPLY: - if (!$user->jabberreplies) { - continue 2; - } - break; - case NOTICE_INBOX_SOURCE_SUB: - $sub = Subscription::pkeyGet(array('subscriber' => $user->id, - 'subscribed' => $notice->profile_id)); - if (empty($sub) || !$sub->jabber) { - continue 2; - } - break; - case NOTICE_INBOX_SOURCE_GROUP: - break; - default: - throw new Exception(sprintf(_("Unknown inbox source %d."), $reason)); - } - - common_log(LOG_INFO, - 'Sending notice ' . $notice->id . ' to ' . $user->jabber, - __FILE__); - $conn->message($user->jabber, $msg, 'chat', null, $entry); - } - - return true; -} - -/** - * Queue send of a notice to all public listeners - * - * For notices that are generated on the local system (by users), we can optionally - * forward them to remote listeners by XMPP. - * - * @param Notice $notice notice to broadcast - * - * @return boolean success flag - */ - -function jabber_public_notice($notice) -{ - // Now, users who want everything - - $public = common_config('xmpp', 'public'); - - // FIXME PRIV don't send out private messages here - // XXX: should we send out non-local messages if public,localonly - // = false? I think not - - if ($public && $notice->is_local == Notice::LOCAL_PUBLIC) { - $profile = Profile::staticGet($notice->profile_id); - - if (!$profile) { - common_log(LOG_WARNING, 'Refusing to broadcast notice with ' . - 'unknown profile ' . common_log_objstring($notice), - __FILE__); - return false; - } - - $msg = jabber_format_notice($profile, $notice); - $entry = jabber_format_entry($profile, $notice); - - $conn = jabber_proxy(); - - foreach ($public as $address) { - common_log(LOG_INFO, - 'Sending notice ' . $notice->id . - ' to public listener ' . $address, - __FILE__); - $conn->message($address, $msg, 'chat', null, $entry); - } - $profile->free(); - } - - return true; -} - -/** - * makes a plain-text formatted version of a notice, suitable for Jabber distribution - * - * @param Profile &$profile profile of the sending user - * @param Notice &$notice notice being sent - * - * @return string plain-text version of the notice, with user nickname prefixed - */ - -function jabber_format_notice(&$profile, &$notice) -{ - return $profile->nickname . ': ' . $notice->content . ' [' . $notice->id . ']'; -} diff --git a/lib/jabberqueuehandler.php b/lib/jabberqueuehandler.php deleted file mode 100644 index 83471f2df..000000000 --- a/lib/jabberqueuehandler.php +++ /dev/null @@ -1,47 +0,0 @@ -. - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -/** - * Queue handler for pushing new notices to Jabber users. - * @fixme this exception handling doesn't look very good. - */ -class JabberQueueHandler extends QueueHandler -{ - var $conn = null; - - function transport() - { - return 'jabber'; - } - - function handle($notice) - { - require_once(INSTALLDIR.'/lib/jabber.php'); - try { - return jabber_broadcast_notice($notice); - } catch (XMPPHP_Exception $e) { - $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage()); - return false; - } - } -} diff --git a/lib/publicqueuehandler.php b/lib/publicqueuehandler.php deleted file mode 100644 index c9edb8d5d..000000000 --- a/lib/publicqueuehandler.php +++ /dev/null @@ -1,45 +0,0 @@ -. - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -/** - * Queue handler for pushing new notices to public XMPP subscribers. - */ -class PublicQueueHandler extends QueueHandler -{ - - function transport() - { - return 'public'; - } - - function handle($notice) - { - require_once(INSTALLDIR.'/lib/jabber.php'); - try { - return jabber_public_notice($notice); - } catch (XMPPHP_Exception $e) { - $this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage()); - return false; - } - } -} diff --git a/lib/queued_xmpp.php b/lib/queued_xmpp.php deleted file mode 100644 index 4b890c4ca..000000000 --- a/lib/queued_xmpp.php +++ /dev/null @@ -1,117 +0,0 @@ -. - * - * @category Network - * @package StatusNet - * @author Brion Vibber - * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/jabber.php'; - -class Queued_XMPP extends XMPPHP_XMPP -{ - /** - * Constructor - * - * @param string $host - * @param integer $port - * @param string $user - * @param string $password - * @param string $resource - * @param string $server - * @param boolean $printlog - * @param string $loglevel - */ - public function __construct($host, $port, $user, $password, $resource, $server = null, $printlog = false, $loglevel = null) - { - parent::__construct($host, $port, $user, $password, $resource, $server, $printlog, $loglevel); - // Normally the fulljid isn't filled out until resource binding time; - // we need to save it here since we're not talking to a real server. - $this->fulljid = "{$this->basejid}/{$this->resource}"; - } - - /** - * Send a formatted message to the outgoing queue for later forwarding - * to a real XMPP connection. - * - * @param string $msg - */ - public function send($msg, $timeout=NULL) - { - $qm = QueueManager::get(); - $qm->enqueue(strval($msg), 'xmppout'); - } - - /** - * Since we'll be getting input through a queue system's run loop, - * we'll process one standalone message at a time rather than our - * own XMPP message pump. - * - * @param string $message - */ - public function processMessage($message) { - $frame = array_shift($this->frames); - xml_parse($this->parser, $frame->body, false); - } - - //@{ - /** - * Stream i/o functions disabled; push input through processMessage() - */ - public function connect($timeout = 30, $persistent = false, $sendinit = true) - { - throw new Exception("Can't connect to server from XMPP queue proxy."); - } - - public function disconnect() - { - throw new Exception("Can't connect to server from XMPP queue proxy."); - } - - public function process() - { - throw new Exception("Can't read stream from XMPP queue proxy."); - } - - public function processUntil($event, $timeout=-1) - { - throw new Exception("Can't read stream from XMPP queue proxy."); - } - - public function read() - { - throw new Exception("Can't read stream from XMPP queue proxy."); - } - - public function readyToProcess() - { - throw new Exception("Can't read stream from XMPP queue proxy."); - } - //@} -} - diff --git a/lib/queuehandler.php b/lib/queuehandler.php index 2909cd83b..2194dd161 100644 --- a/lib/queuehandler.php +++ b/lib/queuehandler.php @@ -36,20 +36,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } class QueueHandler { - /** - * Return transport keyword which identifies items this queue handler - * services; must be defined for all subclasses. - * - * Must be 8 characters or less to fit in the queue_item database. - * ex "email", "jabber", "sms", "irc", ... - * - * @return string - */ - function transport() - { - return null; - } - /** * Here's the meat of your queue handler -- you're handed a Notice * or other object, which you may do as you will with. diff --git a/lib/queuemanager.php b/lib/queuemanager.php index 61e28085a..0b405943d 100644 --- a/lib/queuemanager.php +++ b/lib/queuemanager.php @@ -213,18 +213,8 @@ abstract class QueueManager extends IoManager $this->connect('sms', 'SmsQueueHandler'); } - // XMPP output handlers... - $this->connect('jabber', 'JabberQueueHandler'); - $this->connect('public', 'PublicQueueHandler'); - - // @fixme this should get an actual queue - //$this->connect('confirm', 'XmppConfirmHandler'); - // For compat with old plugins not registering their own handlers. $this->connect('plugin', 'PluginQueueHandler'); - - $this->connect('xmppout', 'XmppOutQueueHandler', 'xmppdaemon'); - } Event::handle('EndInitializeQueueManager', array($this)); } @@ -251,8 +241,8 @@ abstract class QueueManager extends IoManager $group = 'queuedaemon'; if ($this->master) { // hack hack - if ($this->master instanceof XmppMaster) { - return 'xmppdaemon'; + if ($this->master instanceof ImMaster) { + return 'imdaemon'; } } return $group; diff --git a/lib/queuemonitor.php b/lib/queuemonitor.php index 1c306a629..3dc0ea65a 100644 --- a/lib/queuemonitor.php +++ b/lib/queuemonitor.php @@ -36,7 +36,7 @@ class QueueMonitor * Only explicitly listed thread/site/queue owners will be incremented. * * @param string $key counter name - * @param array $owners list of owner keys like 'queue:jabber' or 'site:stat01' + * @param array $owners list of owner keys like 'queue:xmpp' or 'site:stat01' */ public function stats($key, $owners=array()) { diff --git a/lib/util.php b/lib/util.php index 6c9f6316a..e60cb6765 100644 --- a/lib/util.php +++ b/lib/util.php @@ -994,18 +994,9 @@ function common_enqueue_notice($notice) $transports = $allTransports; - $xmpp = common_config('xmpp', 'enabled'); - - if ($xmpp) { - $transports[] = 'jabber'; - } - if ($notice->is_local == Notice::LOCAL_PUBLIC || $notice->is_local == Notice::LOCAL_NONPUBLIC) { $transports = array_merge($transports, $localTransports); - if ($xmpp) { - $transports[] = 'public'; - } } if (Event::handle('StartEnqueueNotice', array($notice, &$transports))) { diff --git a/lib/xmppmanager.php b/lib/xmppmanager.php deleted file mode 100644 index 985e7c32e..000000000 --- a/lib/xmppmanager.php +++ /dev/null @@ -1,485 +0,0 @@ -. - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } - -/** - * XMPP background connection manager for XMPP-using queue handlers, - * allowing them to send outgoing messages on the right connection. - * - * Input is handled during socket select loop, keepalive pings during idle. - * Any incoming messages will be forwarded to the main XmppDaemon process, - * which handles direct user interaction. - * - * In a multi-site queuedaemon.php run, one connection will be instantiated - * for each site being handled by the current process that has XMPP enabled. - */ - -class XmppManager extends IoManager -{ - protected $site = null; - protected $pingid = 0; - protected $lastping = null; - - static protected $singletons = array(); - - const PING_INTERVAL = 120; - - /** - * Fetch the singleton XmppManager for the current site. - * @return mixed XmppManager, or false if unneeded - */ - public static function get() - { - if (common_config('xmpp', 'enabled')) { - $site = common_config('site', 'server'); - if (empty(self::$singletons[$site])) { - self::$singletons[$site] = new XmppManager(); - } - return self::$singletons[$site]; - } else { - return false; - } - } - - /** - * Tell the i/o master we need one instance for each supporting site - * being handled in this process. - */ - public static function multiSite() - { - return IoManager::INSTANCE_PER_SITE; - } - - function __construct() - { - $this->site = common_config('site', 'server'); - $this->resource = common_config('xmpp', 'resource') . 'daemon'; - } - - /** - * Initialize connection to server. - * @return boolean true on success - */ - public function start($master) - { - parent::start($master); - $this->switchSite(); - - require_once INSTALLDIR . "/lib/jabber.php"; - - # Low priority; we don't want to receive messages - - common_log(LOG_INFO, "INITIALIZE"); - $this->conn = jabber_connect($this->resource); - - if (empty($this->conn)) { - common_log(LOG_ERR, "Couldn't connect to server."); - return false; - } - - $this->log(LOG_DEBUG, "Initializing stanza handlers."); - - $this->conn->addEventHandler('message', 'handle_message', $this); - $this->conn->addEventHandler('presence', 'handle_presence', $this); - $this->conn->addEventHandler('reconnect', 'handle_reconnect', $this); - - $this->conn->setReconnectTimeout(600); - jabber_send_presence("Send me a message to post a notice", 'available', null, 'available', 100); - - return !is_null($this->conn); - } - - /** - * Message pump is triggered on socket input, so we only need an idle() - * call often enough to trigger our outgoing pings. - */ - function timeout() - { - return self::PING_INTERVAL; - } - - /** - * Lists the XMPP connection socket to allow i/o master to wake - * when input comes in here as well as from the queue source. - * - * @return array of resources - */ - public function getSockets() - { - if ($this->conn) { - return array($this->conn->getSocket()); - } else { - return array(); - } - } - - /** - * Process XMPP events that have come in over the wire. - * Side effects: may switch site configuration - * @fixme may kill process on XMPP error - * @param resource $socket - */ - public function handleInput($socket) - { - $this->switchSite(); - - # Process the queue for as long as needed - try { - if ($this->conn) { - assert($socket === $this->conn->getSocket()); - - common_log(LOG_DEBUG, "Servicing the XMPP queue."); - $this->stats('xmpp_process'); - $this->conn->processTime(0); - } - } catch (XMPPHP_Exception $e) { - common_log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage()); - die($e->getMessage()); - } - } - - /** - * Idle processing for io manager's execution loop. - * Send keepalive pings to server. - * - * Side effect: kills process on exception from XMPP library. - * - * @fixme non-dying error handling - */ - public function idle($timeout=0) - { - if ($this->conn) { - $now = time(); - if (empty($this->lastping) || $now - $this->lastping > self::PING_INTERVAL) { - $this->switchSite(); - try { - $this->sendPing(); - $this->lastping = $now; - } catch (XMPPHP_Exception $e) { - common_log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage()); - die($e->getMessage()); - } - } - } - } - - /** - * For queue handlers to pass us a message to push out, - * if we're active. - * - * @fixme should this be blocking etc? - * - * @param string $msg XML stanza to send - * @return boolean success - */ - public function send($msg) - { - if ($this->conn && !$this->conn->isDisconnected()) { - $bytes = $this->conn->send($msg); - if ($bytes > 0) { - $this->conn->processTime(0); - return true; - } else { - return false; - } - } else { - // Can't send right now... - return false; - } - } - - /** - * Send a keepalive ping to the XMPP server. - */ - protected function sendPing() - { - $jid = jabber_daemon_address().'/'.$this->resource; - $server = common_config('xmpp', 'server'); - - if (!isset($this->pingid)) { - $this->pingid = 0; - } else { - $this->pingid++; - } - - common_log(LOG_DEBUG, "Sending ping #{$this->pingid}"); - - $this->conn->send(""); - } - - /** - * Callback for Jabber reconnect event - * @param $pl - */ - function handle_reconnect(&$pl) - { - common_log(LOG_NOTICE, 'XMPP reconnected'); - - $this->conn->processUntil('session_start'); - $this->conn->presence(null, 'available', null, 'available', 100); - } - - - function get_user($from) - { - $user = User::staticGet('jabber', jabber_normalize_jid($from)); - return $user; - } - - /** - * XMPP callback for handling message input... - * @param array $pl XMPP payload - */ - function handle_message(&$pl) - { - $from = jabber_normalize_jid($pl['from']); - - if ($pl['type'] != 'chat') { - $this->log(LOG_WARNING, "Ignoring message of type ".$pl['type']." from $from."); - return; - } - - if (mb_strlen($pl['body']) == 0) { - $this->log(LOG_WARNING, "Ignoring message with empty body from $from."); - return; - } - - // Forwarded from another daemon for us to handle; this shouldn't - // happen any more but we might get some legacy items. - if ($this->is_self($from)) { - $this->log(LOG_INFO, "Got forwarded notice from self ($from)."); - $from = $this->get_ofrom($pl); - $this->log(LOG_INFO, "Originally sent by $from."); - if (is_null($from) || $this->is_self($from)) { - $this->log(LOG_INFO, "Ignoring notice originally sent by $from."); - return; - } - } - - $user = $this->get_user($from); - - // For common_current_user to work - global $_cur; - $_cur = $user; - - if (!$user) { - $this->from_site($from, 'Unknown user; go to ' . - common_local_url('imsettings') . - ' to add your address to your account'); - $this->log(LOG_WARNING, 'Message from unknown user ' . $from); - return; - } - if ($this->handle_command($user, $pl['body'])) { - $this->log(LOG_INFO, "Command message by $from handled."); - return; - } else if ($this->is_autoreply($pl['body'])) { - $this->log(LOG_INFO, 'Ignoring auto reply from ' . $from); - return; - } else if ($this->is_otr($pl['body'])) { - $this->log(LOG_INFO, 'Ignoring OTR from ' . $from); - return; - } else { - - $this->log(LOG_INFO, 'Posting a notice from ' . $user->nickname); - - $this->add_notice($user, $pl); - } - - $user->free(); - unset($user); - unset($_cur); - - unset($pl['xml']); - $pl['xml'] = null; - - $pl = null; - unset($pl); - } - - - function is_self($from) - { - return preg_match('/^'.strtolower(jabber_daemon_address()).'/', strtolower($from)); - } - - function get_ofrom($pl) - { - $xml = $pl['xml']; - $addresses = $xml->sub('addresses'); - if (!$addresses) { - $this->log(LOG_WARNING, 'Forwarded message without addresses'); - return null; - } - $address = $addresses->sub('address'); - if (!$address) { - $this->log(LOG_WARNING, 'Forwarded message without address'); - return null; - } - if (!array_key_exists('type', $address->attrs)) { - $this->log(LOG_WARNING, 'No type for forwarded message'); - return null; - } - $type = $address->attrs['type']; - if ($type != 'ofrom') { - $this->log(LOG_WARNING, 'Type of forwarded message is not ofrom'); - return null; - } - if (!array_key_exists('jid', $address->attrs)) { - $this->log(LOG_WARNING, 'No jid for forwarded message'); - return null; - } - $jid = $address->attrs['jid']; - if (!$jid) { - $this->log(LOG_WARNING, 'Could not get jid from address'); - return null; - } - $this->log(LOG_DEBUG, 'Got message forwarded from jid ' . $jid); - return $jid; - } - - function is_autoreply($txt) - { - if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) { - return true; - } else if (preg_match('/^System: Message wasn\'t delivered. Offline storage size was exceeded.$/', $txt)) { - return true; - } else { - return false; - } - } - - function is_otr($txt) - { - if (preg_match('/^\?OTR/', $txt)) { - return true; - } else { - return false; - } - } - - function from_site($address, $msg) - { - $text = '['.common_config('site', 'name') . '] ' . $msg; - jabber_send_message($address, $text); - } - - function handle_command($user, $body) - { - $inter = new CommandInterpreter(); - $cmd = $inter->handle_command($user, $body); - if ($cmd) { - $chan = new XMPPChannel($this->conn); - $cmd->execute($chan); - return true; - } else { - return false; - } - } - - function add_notice(&$user, &$pl) - { - $body = trim($pl['body']); - $content_shortened = common_shorten_links($body); - if (Notice::contentTooLong($content_shortened)) { - $from = jabber_normalize_jid($pl['from']); - $this->from_site($from, sprintf(_('Message too long - maximum is %1$d characters, you sent %2$d.'), - Notice::maxContent(), - mb_strlen($content_shortened))); - return; - } - - try { - $notice = Notice::saveNew($user->id, $content_shortened, 'xmpp'); - } catch (Exception $e) { - $this->log(LOG_ERR, $e->getMessage()); - $this->from_site($user->jabber, $e->getMessage()); - return; - } - - common_broadcast_notice($notice); - $this->log(LOG_INFO, - 'Added notice ' . $notice->id . ' from user ' . $user->nickname); - $notice->free(); - unset($notice); - } - - function handle_presence(&$pl) - { - $from = jabber_normalize_jid($pl['from']); - switch ($pl['type']) { - case 'subscribe': - # We let anyone subscribe - $this->subscribed($from); - $this->log(LOG_INFO, - 'Accepted subscription from ' . $from); - break; - case 'subscribed': - case 'unsubscribed': - case 'unsubscribe': - $this->log(LOG_INFO, - 'Ignoring "' . $pl['type'] . '" from ' . $from); - break; - default: - if (!$pl['type']) { - $user = User::staticGet('jabber', $from); - if (!$user) { - $this->log(LOG_WARNING, 'Presence from unknown user ' . $from); - return; - } - if ($user->updatefrompresence) { - $this->log(LOG_INFO, 'Updating ' . $user->nickname . - ' status from presence.'); - $this->add_notice($user, $pl); - } - $user->free(); - unset($user); - } - break; - } - unset($pl['xml']); - $pl['xml'] = null; - - $pl = null; - unset($pl); - } - - function log($level, $msg) - { - $text = 'XMPPDaemon('.$this->resource.'): '.$msg; - common_log($level, $text); - } - - function subscribed($to) - { - jabber_special_presence('subscribed', $to); - } - - /** - * Make sure we're on the right site configuration - */ - protected function switchSite() - { - if ($this->site != common_config('site', 'server')) { - common_log(LOG_DEBUG, __METHOD__ . ": switching to site $this->site"); - $this->stats('switch'); - StatusNet::init($this->site); - } - } -} diff --git a/lib/xmppoutqueuehandler.php b/lib/xmppoutqueuehandler.php deleted file mode 100644 index 2afa260f1..000000000 --- a/lib/xmppoutqueuehandler.php +++ /dev/null @@ -1,55 +0,0 @@ -. - */ - -/** - * Queue handler for pre-processed outgoing XMPP messages. - * Formatted XML stanzas will have been pushed into the queue - * via the Queued_XMPP connection proxy, probably from some - * other queue processor. - * - * Here, the XML stanzas are simply pulled out of the queue and - * pushed out over the wire; an XmppManager is needed to set up - * and maintain the actual server connection. - * - * This queue will be run via XmppDaemon rather than QueueDaemon. - * - * @author Brion Vibber - */ -class XmppOutQueueHandler extends QueueHandler -{ - function transport() { - return 'xmppout'; - } - - /** - * Take a previously-queued XMPP stanza and send it out ot the server. - * @param string $msg - * @return boolean true on success - */ - function handle($msg) - { - assert(is_string($msg)); - - $xmpp = XmppManager::get(); - $ok = $xmpp->send($msg); - - return $ok; - } -} - diff --git a/plugins/Aim/AimPlugin.php b/plugins/Aim/AimPlugin.php new file mode 100644 index 000000000..3855d1fb0 --- /dev/null +++ b/plugins/Aim/AimPlugin.php @@ -0,0 +1,162 @@ +. + * + * @category IM + * @package StatusNet + * @author Craig Andrews + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} +// We bundle the phptoclib library... +set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/extlib/phptoclib'); + +/** + * Plugin for AIM + * + * @category Plugin + * @package StatusNet + * @author Craig Andrews + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class AimPlugin extends ImPlugin +{ + public $user = null; + public $password = null; + public $publicFeed = array(); + + public $transport = 'aim'; + + function getDisplayName() + { + return _m('AIM'); + } + + function normalize($screenname) + { + $screenname = str_replace(" ","", $screenname); + return strtolower($screenname); + } + + function daemon_screenname() + { + return $this->user; + } + + function validate($screenname) + { + if(preg_match('/^[a-z]\w{2,15}$/i', $screenname)) { + return true; + }else{ + return false; + } + } + + /** + * Load related modules when needed + * + * @param string $cls Name of the class to be loaded + * + * @return boolean hook value; true means continue processing, false means stop. + */ + function onAutoload($cls) + { + $dir = dirname(__FILE__); + + switch ($cls) + { + case 'Aim': + require_once(INSTALLDIR.'/plugins/Aim/extlib/phptoclib/aimclassw.php'); + return false; + case 'AimManager': + include_once $dir . '/'.strtolower($cls).'.php'; + return false; + case 'Fake_Aim': + include_once $dir . '/'. $cls .'.php'; + return false; + default: + return true; + } + } + + function onStartImDaemonIoManagers(&$classes) + { + parent::onStartImDaemonIoManagers(&$classes); + $classes[] = new AimManager($this); // handles sending/receiving + return true; + } + + function microiduri($screenname) + { + return 'aim:' . $screenname; + } + + function send_message($screenname, $body) + { + $this->fake_aim->sendIm($screenname, $body); + $this->enqueue_outgoing_raw($this->fake_aim->would_be_sent); + return true; + } + + function receive_raw_message($message) + { + $info=Aim::getMessageInfo($message); + $from = $info['from']; + $user = $this->get_user($from); + $notice_text = $info['message']; + + return $this->handle_incoming($from, $notice_text); + } + + function initialize(){ + if(!isset($this->user)){ + throw new Exception("must specify a user"); + } + if(!isset($this->password)){ + throw new Exception("must specify a password"); + } + + $this->fake_aim = new Fake_Aim($this->user,$this->password,4); + return true; + } + + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'AIM', + 'version' => STATUSNET_VERSION, + 'author' => 'Craig Andrews', + 'homepage' => 'http://status.net/wiki/Plugin:AIM', + 'rawdescription' => + _m('The AIM plugin allows users to send and receive notices over the AIM network.')); + return true; + } +} + diff --git a/plugins/Aim/Fake_Aim.php b/plugins/Aim/Fake_Aim.php new file mode 100644 index 000000000..139b68f82 --- /dev/null +++ b/plugins/Aim/Fake_Aim.php @@ -0,0 +1,43 @@ +. + * + * @category Network + * @package StatusNet + * @author Craig Andrews + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class Fake_Aim extends Aim +{ + public $would_be_sent = null; + + function sflapSend($sflap_type, $sflap_data, $no_null, $formatted) + { + $this->would_be_sent = array($sflap_type, $sflap_data, $no_null, $formatted); + } +} + diff --git a/plugins/Aim/README b/plugins/Aim/README new file mode 100644 index 000000000..046591738 --- /dev/null +++ b/plugins/Aim/README @@ -0,0 +1,27 @@ +The AIM plugin allows users to send and receive notices over the AIM network. + +Installation +============ +add "addPlugin('aim', + array('setting'=>'value', 'setting2'=>'value2', ...);" +to the bottom of your config.php + +The daemon included with this plugin must be running. It will be started by +the plugin along with their other daemons when you run scripts/startdaemons.sh. +See the StatusNet README for more about queuing and daemons. + +Settings +======== +user*: username (screenname) to use when logging into AIM +password*: password for that user + +* required +default values are in (parenthesis) + +Example +======= +addPlugin('aim', array( + 'user=>'...', + 'password'=>'...' +)); + diff --git a/plugins/Aim/aimmanager.php b/plugins/Aim/aimmanager.php new file mode 100644 index 000000000..d9b7421fb --- /dev/null +++ b/plugins/Aim/aimmanager.php @@ -0,0 +1,100 @@ +. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +/** + * AIM background connection manager for AIM-using queue handlers, + * allowing them to send outgoing messages on the right connection. + * + * Input is handled during socket select loop, keepalive pings during idle. + * Any incoming messages will be handled. + * + * In a multi-site queuedaemon.php run, one connection will be instantiated + * for each site being handled by the current process that has XMPP enabled. + */ + +class AimManager extends ImManager +{ + + public $conn = null; + /** + * Initialize connection to server. + * @return boolean true on success + */ + public function start($master) + { + if(parent::start($master)) + { + $this->connect(); + return true; + }else{ + return false; + } + } + + public function getSockets() + { + $this->connect(); + if($this->conn){ + return array($this->conn->myConnection); + }else{ + return array(); + } + } + + /** + * Process AIM events that have come in over the wire. + * @param resource $socket + */ + public function handleInput($socket) + { + common_log(LOG_DEBUG, "Servicing the AIM queue."); + $this->stats('aim_process'); + $this->conn->receive(); + } + + function connect() + { + if (!$this->conn) { + $this->conn=new Aim($this->plugin->user,$this->plugin->password,4); + $this->conn->registerHandler("IMIn",array($this,"handle_aim_message")); + $this->conn->myServer="toc.oscar.aol.com"; + $this->conn->signon(); + $this->conn->setProfile(_m('Send me a message to post a notice'),false); + } + return $this->conn; + } + + function handle_aim_message($data) + { + $this->plugin->enqueue_incoming_raw($data); + return true; + } + + function send_raw_message($data) + { + $this->connect(); + if (!$this->conn) { + return false; + } + $this->conn->sflapSend($data[0],$data[1],$data[2],$data[3]); + return true; + } +} diff --git a/plugins/Aim/extlib/phptoclib/README.txt b/plugins/Aim/extlib/phptoclib/README.txt new file mode 100755 index 000000000..0eec13af8 --- /dev/null +++ b/plugins/Aim/extlib/phptoclib/README.txt @@ -0,0 +1,169 @@ +phpTOCLib version 1.0 RC1 + +This is released under the LGPL. AIM,TOC,OSCAR, and all other related protocols/terms are +copyright AOL/Time Warner. This project is in no way affiliated with them, nor is this +project supported by them. + +Some of the code is loosely based off of a script by Jeffrey Grafton. Mainly the decoding of packets, and the +function for roasting passwords is entirly his. + +TOC documentation used is available at http://simpleaim.sourceforge.net/docs/TOC.txt + + +About: +phpTOCLib aims to be a PHP equivalent to the PERL module NET::AIM. Due to some limitations, +this is difficult. Many features have been excluded in the name of simplicity, and leaves +you alot of room to code with externally, providing function access to the variables that +need them. + +I have aimed to make this extensible, and easy to use, therefore taking away some built in +functionality that I had originally out in. This project comes after several months of +researching the TOC protocol. + +example.php is included with the class. It needs to be executed from the command line +(ie:php -q testscript.php) and you need to call php.exe with the -q +example is provided as a demonstaration only. Though it creats a very simple, functional bot, it lacks any sort of commands, it merely resends the message it recieves in reverse. + + +Revisions: + +----------------------------------- +by Rajiv Makhijani +(02/24/04) + - Fixed Bug in Setting Permit/Deny Mode + - Fixes so Uninitialized string offset notice doesn't appear + - Replaced New Lines Outputed for Each Flap Read with " . " so + that you can still tell it is active but it does not take so much space + - Removed "eh?" message + - Added MySQL Database Connection Message + - New Functions: + update_profile(profile data string, powered by boolean) + * The profile data string is the text that goes in the profile. + * The powered by boolean if set to true displays a link to the + sourceforge page of the script. +(02/28/04) + - Silent option added to set object not to output any information + - To follow silent rule use sEcho function instead of Echo +----------------------------------- +by Jeremy (pickleman78) +(05/26/04) beta 1 release + -Complete overhaul of class design and message handling + -Fixed bug involving sign off after long periods of idling + -Added new function $Aim->registerHandler + -Added the capability to handle all AIM messages + -Processing the messages is still the users responsibility + -Did a little bit of code cleanup + -Added a few internal functions to make the classes internal life easier + -Improved AIM server error message processing + -Updated this document (hopefully Rajiv will clean it up some, since I'm a terrible documenter) +------------------------------------------------------------------------------------------------------------- + + + +Functions: + +Several methods are provided in the class that allow for simple access to some of the +common features of AIM. Below are details. + +$Aim->Aim($sn,$password,$pdmode, $silent=false) +The constructor, it takes 4 arguments. +$sn is your screen name +$password is you password, in plain text +$pdmode is the permit deny mode. This can be as follows: +1 - Allow All +2 - Deny All +3 - Permit only those on your permit list +4 - Permit all those not on your deny list +$silent if set to true prints out nothing + +So, if your screen-name is JohnDoe746 and your password is fertu, and you want to allow +all users of the AIM server to contact you, you would code as follows +$myaim=new Aim("JohnDoe746","fertu",1); + + +$Aim->add_permit($buddy) +This adds the buddy passed to the function to your permit list. +ie: $myaim->add_permit("My friend22"); + +$Aim->block_buddy($buddy) +Blocks a user. This will switch your pd mode to 4. After using this, for the user to remain +out of contact with you, it is required to provide the constructor with a pd mode of 4 +ie:$myaim->block_buddy("Annoying guy 4"); + +$Aim->send_im($to,$message,$auto=false) +Sends $message to $user. If you set the 3rd argument to true, then the recipient will receive it in +the same format as an away message. (Auto Response from me:) +A message longer than 65535 will be truncated +ie:$myaim->send_im("myfriend","This is a happy message"); + +$Aim->set_my_info() +Sends an update buddy command to the server and allows some internal values about yourself +to be set. +ie:$myaim->set_my_info(); + +$Aim->signon() +Call this to connect to the server. This must be called before any other methods will work +properly +ie:$mybot->signon(); + +$Aim->getLastReceived() +Returns $this->myLastReceived['decoded']. This should be the only peice of the gotten data +you need to concern yourself with. This is a preferred method of accessing this variable to prevent +accidental modification of $this->myLastReceived. Accidently modifying this variable can +cause some internal failures. + +$Aim->read_from_aim() +This is a wrapper for $Aim->sflap_read(), and only returns the $this->myLastReceived['data'] +portion of the message. It is preferred that you do not call $Aim->sflap_read() and use this +function instead. This function has a return value. Calling this prevents the need to call +$Aim->getLastReceived() + +$Aim->setWarning($wl) +This allows you to update the bots warning level when warned. + +$Aim->getBuddies() +Returns the $this->myBuddyList array. Use this instead of modifying the internal variable + +$Aim->getPermit() +Returns the $this->myPermitList array. Use this instead of modifying the internal variable + +$Aim->getBlocked() +Returns the $this->myBlockedList array. Use this instead of modifying the internal variable + +$Aim->warn_user($user,$anon=false) +Warn $user. If anon is set to true, then it warns the user anonomously + +$Aim->update_profile($information, $poweredby=false) +Updates Profile to $information. If $poweredby is true a link to +sourceforge page for this script is appended to profile + +$Aim->registerHandler($function_name,$command) +This is by far the best thing about the new release. +For more information please reas supplement.txt. It is not included here because of the sheer size of the document. +supplement.txt contains full details on using registerHandler and what to expect for each input. + + +For convenience, I have provided some functions to simplify message processing. + +They can be read about in the file "supplement.txt". I chose not to include the text here because it +is a huge document + + + +There are a few things you should note about AIM +1)An incoming message has HTML tags in it. You are responsible for stripping those tags +2)Outgoing messages can have HTML tags, but will work fine if they don't. To include things + in the time feild next to the users name, send it as a comment + +Conclusion: +The class is released under the LGPL. If you have any bug reports, comments, questions +feature requests, or want to help/show me what you've created with this(I am very interested in this), +please drop me an email: pickleman78@users.sourceforge.net. This code was written by +Jeremy(a.k.a pickleman78) and Rajiv M (a.k.a compwiz562). + + +Special thanks: +I'd like to thank all of the people who have contributed ideas, testing, bug reports, and code additions to +this project. I'd like to especially thank Rajiv, who has done do much for the project, and has kept this documnet +looking nice. He also has done alot of testing of this script too. I'd also like to thank SpazLink for his help in +testing. And finally I'd like to thank Jeffery Grafton, whose script inspired me to start this project. diff --git a/plugins/Aim/extlib/phptoclib/aimclassw.php b/plugins/Aim/extlib/phptoclib/aimclassw.php new file mode 100755 index 000000000..0657910d9 --- /dev/null +++ b/plugins/Aim/extlib/phptoclib/aimclassw.php @@ -0,0 +1,2370 @@ + + * @author Rajiv Makhijani + * @package phptoclib + * @version 1.0RC1 + * @copyright 2005 + * @access public + * + */ +class Aim +{ + /** + * AIM ScreenName + * + * @var String + * @access private + */ + var $myScreenName; + + /** + * AIM Password (Plain Text) + * + * @var String + * @access private + */ + var $myPassword; + + + /** + * AIM TOC Server + * + * @var String + * @access public + */ + var $myServer="toc.oscar.aol.com"; + + /** + * AIM Formatted ScreenName + * + * @var String + * @access private + */ + var $myFormatSN; + + /** + * AIM TOC Server Port + * + * @var String + * @access public + */ + var $myPort="5190"; + + /** + * Profile Data + * Use setProfile() to update + * + * @var String + * @access private + */ + var $myProfile="Powered by phpTOCLib. Please visit http://sourceforge.net/projects/phptoclib for more information"; //The profile of the bot + + /** + * Socket Connection Resource ID + * + * @var Resource + * @access private + */ + var $myConnection; //Connection resource ID + + /** + * Roasted AIM Password + * + * @var String + * @access private + */ + var $myRoastedPass; + + /** + * Last Message Recieved From Server + * + * @var String + * @access private + */ + var $myLastReceived; + + /** + * Current Seq Number Used to Communicate with Server + * + * @var Integer + * @access private + */ + var $mySeqNum; + + /** + * Current Warning Level + * Getter: getWarning() + * Setter: setWarning() + * + * @var Integer + * @access private + */ + var $myWarnLevel; //Warning Level of the bot + + /** + * Auth Code + * + * @var Integer + * @access private + */ + var $myAuthCode; + + /** + * Buddies + * Getter: getBuddies() + * + * @var Array + * @access private + */ + var $myBuddyList; + + /** + * Blocked Buddies + * Getter: getBlocked() + * + * @var Array + * @access private + */ + var $myBlockedList; + + /** + * Permited Buddies + * Getter: getBlocked() + * + * @var Array + * @access private + */ + var $myPermitList; + + /** + * Permit/Deny Mode + * 1 - Allow All + * 2 - Deny All + * 3 - Permit only those on your permit list + * 4 - Permit all those not on your deny list + * + * @var Integer + * @access private + */ + var $myPdMode; + + //Below variables added 4-29 by Jeremy: Implementing chat + + /** + * Contains Chat Room Info + * $myChatRooms['roomid'] = people in room + * + * @var Array + * @access private + */ + var $myChatRooms; + + //End of chat implementation + + + /** + * Event Handler Functions + * + * @var Array + * @access private + */ + var $myEventHandlers = array(); + + /** + * Array of direct connection objects(including file transfers) + * + * @var Array + * @access private + */ + var $myDirectConnections = array(); + + /** + * Array of the actual connections + * + * @var Array + * @access private + */ + var $myConnections = array(); + + /** + * The current state of logging + * + * @var Boolean + * @access private + */ + + var $myLogging = false; + + /** + * Constructor + * + * Permit/Deny Mode Options + * 1 - Allow All + * 2 - Deny All + * 3 - Permit only those on your permit list + * 4 - Permit all those not on your deny list + * + * @param String $sn AIM Screenname + * @param String $password AIM Password + * @param Integer $pdmode Permit/Deny Mode + * @access public + */ + function Aim($sn, $password, $pdmode) + { + //Constructor assignment + $this->myScreenName = $this->normalize($sn); + $this->myPassword = $password; + $this->myRoastedPass = $this->roastPass($password); + $this->mySeqNum = 1; + $this->myConnection = 0; + $this->myWarnLevel = 0; + $this->myAuthCode = $this->makeCode(); + $this->myPdMode = $pdmode; + $this->myFormatSN = $this->myScreenName; + + $this->log("PHPTOCLIB v" . PHPTOCLIB_VERSION . " Object Created"); + + } + + /** + * Enables debug logging (Logging is disabled by default) + * + * + * @access public + * @return void + */ + + function setLogging($enable) + { + $this->myLogging=$enable; + } + + function log($data) + { + if($this->myLogging){ + error_log($data); + } + } + + /** + * Logs a packet + * + * + * @access private + * @param Array $packary Packet + * @param String $in Prepend + * @return void + */ + function logPacket($packary,$in) + { + if(!$this->myLogging || sizeof($packary)<=0 || (@strlen($packary['decoded'])<=0 && @isset($packary['decoded']))) + return; + $towrite=$in . ": "; + foreach($packary as $k=>$d) + { + $towrite.=$k . ":" . $d . "\r\n"; + } + $towrite.="\r\n\r\n"; + $this->log($towrite); + } + /** + * Roasts/Hashes Password + * + * @param String $password Password + * @access private + * @return String Roasted Password + */ + function roastPass($password) + { + $roaststring = 'Tic/Toc'; + $roasted_password = '0x'; + for ($i = 0; $i < strlen($password); $i++) + $roasted_password .= bin2hex($password[$i] ^ $roaststring[($i % 7)]); + return $roasted_password; + } + + /** + * Access Method for myScreenName + * + * @access public + * @param $formated Returns formatted Screenname if true as returned by server + * @return String Screenname + */ + function getMyScreenName($formated = false) + { + if ($formated) + { + return $this->myFormatSN; + } + else + { + return $this->normalize($this->myScreenName); + } + } + + /** + * Generated Authorization Code + * + * @access private + * @return Integer Auth Code + */ + function makeCode() + { + $sn = ord($this->myScreenName[0]) - 96; + $pw = ord($this->myPassword[0]) - 96; + $a = $sn * 7696 + 738816; + $b = $sn * 746512; + $c = $pw * $a; + + return $c - $a + $b + 71665152; + } + + + /** + * Reads from Socket + * + * @access private + * @return String Data + */ + function sflapRead() + { + if ($this->socketcheck($this->myConnection)) + { + $this->log("Disconnected.... Reconnecting in 60 seconds"); + sleep(60); + $this->signon(); + } + + $header = fread($this->myConnection,SFLAP_HEADER_LEN); + + if (strlen($header) == 0) + { + $this->myLastReceived = ""; + return ""; + } + $header_data = unpack("aast/Ctype/nseq/ndlen", $header); + $this->log(" . ", false); + $packet = fread($this->myConnection, $header_data['dlen']); + if (strlen($packet) <= 0 && $sockinfo['blocked']) + $this->derror("Could not read data"); + + if ($header_data['type'] == SFLAP_TYPE_SIGNON) + { + $packet_data=unpack("Ndecoded", $packet); + } + + if ($header_data['type'] == SFLAP_TYPE_KEEPALIVE) + { + $this->myLastReceived = ''; + return 0; + } + else if (strlen($packet)>0) + { + $packet_data = unpack("a*decoded", $packet); + } + $this->log("socketcheck check now"); + if ($this->socketcheck($this->myConnection)) + { + $this->derror("Connection ended unexpectedly"); + } + + $data = array_merge($header_data, $packet_data); + $this->myLastReceived = $data; + $this->logPacket($data,"in"); + return $data; + } + + /** + * Sends Data on Socket + * + * @param String $sflap_type Type + * @param String $sflap_data Data + * @param boolean $no_null No Null + * @param boolean $formatted Format + * @access private + * @return String Roasted Password + */ + function sflapSend($sflap_type, $sflap_data, $no_null, $formatted) + { + $packet = ""; + if (strlen($sflap_data) >= MAX_PACKLENGTH) + $sflap_data = substr($sflap_data,0,MAX_PACKLENGTH); + + if ($formatted) + { + $len = strlen($sflap_len); + $sflap_header = pack("aCnn",'*', $sflap_type, $this->mySeqNum, $len); + $packet = $sflap_header . $sflap_data; + } else { + if (!$no_null) + { + $sflap_data = str_replace("\0","", trim($sflap_data)); + $sflap_data .= "\0"; + } + $data = pack("a*", $sflap_data); + $len = strlen($sflap_data); + $header = pack("aCnn","*", $sflap_type, $this->mySeqNum, $len); + $packet = $header . $data; + } + + //Make sure we are still connected + if ($this->socketcheck($this->myConnection)) + { + $this->log("Disconnected.... reconnecting in 60 seconds"); + sleep(60); + $this->signon(); + } + $sent = fputs($this->myConnection, $packet) or $this->derror("Error sending packet to AIM"); + $this->mySeqNum++; + sleep(ceil($this->myWarnLevel/10)); + $this->logPacket(array($sflap_type,$sflap_data),"out"); + } + + /** + * Escape the thing that TOC doesn't like,that would be + * ",', $,{,},[,] + * + * @param String $data Data to Escape + * @see decodeData + * @access private + * @return String $data Escaped Data + */ + function encodeData($data) + { + $data = str_replace('"','\"', $data); + $data = str_replace('$','\$', $data); + $data = str_replace("'","\'", $data); + $data = str_replace('{','\{', $data); + $data = str_replace('}','\}', $data); + $data = str_replace('[','\[', $data); + $data = str_replace(']','\]', $data); + return $data; + } + + /** + * Unescape data TOC has escaped + * ",', $,{,},[,] + * + * @param String $data Data to Unescape + * @see encodeData + * @access private + * @return String $data Unescape Data + */ + function decodeData($data) + { + $data = str_replace('\"','"', $data); + $data = str_replace('\$','$', $data); + $data = str_replace("\'","'", $data); + $data = str_replace('\{','{', $data); + $data = str_replace('\}','}', $data); + $data = str_replace('\[','[', $data); + $data = str_replace('\]',']', $data); + $data = str_replace('"','"', $data); + $data = str_replace('&','&', $data); + return $data; + } + + /** + * Normalize ScreenName + * no spaces and all lowercase + * + * @param String $nick ScreenName + * @access public + * @return String $nick Normalized ScreenName + */ + function normalize($nick) + { + $nick = str_replace(" ","", $nick); + $nick = strtolower($nick); + return $nick; + } + + /** + * Sets internal info with update buddy + * Currently only sets warning level + * + * @access public + * @return void + */ + function setMyInfo() + { + //Sets internal values bvase on the update buddy command + $this->log("Setting my warning level ..."); + $this->sflapSend(SFLAP_TYPE_DATA,"toc_get_status " . $this->normalize($this->myScreenName),0,0); + //The rest of this will now be handled by the other functions. It is assumed + //that we may have other data queued in the socket, do we should just add this + //message to the queue instead of trying to set it in here + } + + /** + * Connects to AIM and Signs On Using Info Provided in Constructor + * + * @access public + * @return void + */ + function signon() + { + $this->log("Ready to sign on to the server"); + $this->myConnection = fsockopen($this->myServer, $this->myPort, $errno, $errstr,10) or die("$errorno:$errstr"); + $this->log("Connected to server"); + $this->mySeqNum = (time() % 65536); //Select an arbitrary starting point for + //sequence numbers + if (!$this->myConnection) + $this->derror("Error connecting to toc.oscar.aol.com"); + $this->log("Connected to AOL"); + //Send the flapon packet + fputs($this->myConnection,"FLAPON\r\n\n\0"); //send the initial handshake + $this->log("Sent flapon"); + $this->sflapRead(); //Make sure the server responds with what we expect + if (!$this->myLastReceived) + $this->derror("Error sending the initialization string"); + + //send the FLAP SIGNON packet back with what it needs + //There are 2 parts to the signon packet. They are sent in succession, there + //is no indication if either packet was correctly sent + $signon_packet = pack("Nnna".strlen($this->myScreenName),1,1,strlen($this->myScreenName), $this->myScreenName); + $this->sflapSend(SFLAP_TYPE_SIGNON, $signon_packet,1,0); + $this->log("sent signon packet part one"); + + $signon_packet_part2 = 'toc2_signon login.oscar.aol.com 29999 ' . $this->myScreenName . ' ' . $this->myRoastedPass . ' english-US "TIC:TOC2:REVISION" 160 ' . $this->myAuthCode; + $this->log($signon_packet_part2 . ""); + $this->sflapSend(SFLAP_TYPE_DATA, $signon_packet_part2,0,0); + $this->log("Sent signon packet part 2... Awaiting response..."); + + $this->sflapRead(); + $this->log("Received Sign on packet, beginning initilization..."); + $message = $this->getLastReceived(); + $this->log($message . "\n"); + if (strstr($message,"ERROR:")) + { + $this->onError($message); + die("Fatal signon error"); + } + stream_set_timeout($this->myConnection,2); + //The information sent before the config2 command is utterly useless to us + //So we will just skim through them until we reach it + + //Add the first entry to the connection array + $this->myConnections[] = $this->myConnection; + + + //UPDATED 4/12/03: Now this will use the receive function and send the + //received messaged to the assigned handlers. This is where the signon + //method has no more use + + $this->log("Done with signon proccess"); + //socket_set_blocking($this->myConnection,false); + } + + /** + * Sends Instant Message + * + * @param String $to Message Recipient SN + * @param String $message Message to Send + * @param boolean $auto Sent as Auto Response / Away Message Style + * @access public + * @return void + */ + function sendIM($to, $message, $auto = false) + { + if ($auto) $auto = "auto"; + else $auto = ""; + $to = $this->normalize($to); + $message = $this->encodeData($message); + $command = 'toc2_send_im "' . $to . '" "' . $message . '" ' . $auto; + $this->sflapSend(SFLAP_TYPE_DATA, trim($command),0,0); + $cleanedmessage = str_replace("
", " ", $this->decodeData($message)); + $cleanedmessage = strip_tags($cleanedmessage); + $this->log("TO - " . $to . " : " . $cleanedmessage); + } + + /** + * Set Away Message + * + * @param String $message Away message (some HTML supported). + * Use null to remove the away message + * @access public + * @return void + */ + function setAway($message) + { + $message = $this->encodeData($message); + $command = 'toc_set_away "' . $message . '"'; + $this->sflapSend(SFLAP_TYPE_DATA, trim($command),0,0); + $this->log("SET AWAY MESSAGE - " . $this->decodeData($message)); + } + + /** + * Fills Buddy List + * Not implemented fully yet + * + * @access public + * @return void + */ + function setBuddyList() + { + //This better be the right message + $message = $this->myLastReceived['decoded']; + if (strpos($message,"CONFIG2:") === false) + { + $this->log("setBuddyList cannot be called at this time because I got $message"); + return false; + } + $people = explode("\n",trim($message,"\n")); + //The first 3 elements of the array are who knows what, element 3 should be + //a letter followed by a person + for($i = 1; $imyPermitList[] = $name; + break; + case 'd': + $this->myBlockedList[] = $name; + break; + case 'b': + $this->myBuddyList[] = $name; + break; + case 'done': + break; + default: + // + } + } + } + + /** + * Adds buddy to Permit list + * + * @param String $buddy Buddy's Screenname + * @access public + * @return void + */ + function addPermit($buddy) + { + $this->sflapSend(SFLAP_TYPE_DATA,"toc2_add_permit " . $this->normalize($buddy),0,0); + $this->myPermitList[] = $this->normalize($buddy); + return 1; + } + + /** + * Blocks buddy + * + * @param String $buddy Buddy's Screenname + * @access public + * @return void + */ + function blockBuddy($buddy) + { + $this->sflapSend(SFLAP_TYPE_DATA,"toc2_add_deny " . $this->normalize($buddy),0,0); + $this->myBlockedList[] = $this->normalize($buddy); + return 1; + } + + /** + * Returns last message received from server + * + * @access private + * @return String Last Message from Server + */ + function getLastReceived() + { + if (@$instuff = $this->myLastReceived['decoded']){ + return $this->myLastReceived['decoded']; + }else{ + return; + } + } + + /** + * Returns Buddy List + * + * @access public + * @return array Buddy List + */ + function getBuddies() + { + return $this->myBuddyList; + } + + /** + * Returns Permit List + * + * @access public + * @return array Permit List + */ + function getPermit() + { + return $this->myPermitList; + } + + /** + * Returns Blocked Buddies + * + * @access public + * @return array Blocked List + */ + function getBlocked() + { + return $this->myBlockedList; + } + + + + + /** + * Reads and returns data from server + * + * This is a wrapper for $Aim->sflap_read(), and only returns the $this->myLastReceived['data'] + * portion of the message. It is preferred that you do not call $Aim->sflap_read() and use this + * function instead. This function has a return value. Calling this prevents the need to call + * $Aim->getLastReceived() + * + * @access public + * @return String Data recieved from server + */ + function read_from_aim() + { + $this->sflapRead(); + $returnme = $this->getLastReceived(); + return $returnme; + } + + /** + * Sets current internal warning level + * + * This allows you to update the bots warning level when warned. + * + * @param int Warning Level % + * @access private + * @return void + */ + function setWarningLevel($warnlevel) + { + $this->myWarnLevel = $warnlevel; + } + + /** + * Warns / "Evils" a User + * + * To successfully warn another user they must have sent you a message. + * There is a limit on how much and how often you can warn another user. + * Normally when you warn another user they are aware who warned them, + * however there is the option to warn anonymously. When warning anon. + * note that the warning is less severe. + * + * @param String $to Screenname to warn + * @param boolean $anon Warn's anonymously if true. (default = false) + * @access public + * @return void + */ + function warnUser($to, $anon = false) + { + if (!$anon) + $anon = '"norm"'; + + else + $anon = '"anon"'; + $this->sflapSend(SFLAP_TYPE_DATA,"toc_evil " . $this->normalize($to) . " $anon",0,0); + } + + /** + * Returns warning level of bot + * + * @access public + * @return void + */ + function getWarningLevel() + { + return $this->myWarningLevel; + } + + /** + * Sets bot's profile/info + * + * Limited to 1024 bytes. + * + * @param String $profiledata Profile Data (Can contain limited html: br,hr,font,b,i,u etc) + * @param boolean $poweredby If true, appends link to phpTOCLib project to profile + * @access public + * @return void + */ + function setProfile($profiledata, $poweredby = false) + { + if ($poweredby == false){ + $this->myProfile = $profiledata; + }else{ + $this->myProfile = $profiledata . "

Powered by phpTOCLib
http://sourceforge.net/projects/phptoclib
"; + } + + $this->sflapSend(SFLAP_TYPE_DATA,"toc_set_info \"" . $this->encodeData($this->myProfile) . "\"",0,0); + $this->setMyInfo(); + $this->log("Profile has been updated..."); + } + + //6/29/04 by Jeremy: + //Added mthod to accept a rvous,decline it, and + //read from the rvous socket + + //Decline + + /** + * Declines a direct connection request (rvous) + * + * @param String $nick ScreenName request was from + * @param String $cookie Request cookie (from server) + * @param String $uuid UUID + * + * @access public + * @return void + */ + function declineRvous($nick, $cookie, $uuid) + { + $nick = $this->normalize($nick); + $this->sflapSend(SFLAP_TYPE_DATA,"toc_rvous_cancel $nick $cookie $uuid",0,0); + } + + /** + * Accepts a direct connection request (rvous) + * + * @param String $nick ScreenName request was from + * @param String $cookie Request cookie (from server) + * @param String $uuid UUID + * @param String $vip IP of User DC with + * @param int $port Port number to connect to + * + * @access public + * @return void + */ + function acceptRvous($nick, $cookie, $uuid, $vip, $port) + { + $this->sflapSend(SFLAP_TYPE_DATA,"toc_rvous_accept $nick $cookie $uuid",0,0); + + //Now open the connection to that user + if ($uuid == IMAGE_UID) + { + $dcon = new Dconnect($vip, $port); + } + else if ($uuid == FILE_SEND_UID) + { + $dcon = new FileSendConnect($vip, $port); + } + if (!$dcon->connected) + { + $this->log("The connection failed"); + return false; + } + + //Place this dcon object inside the array + $this->myDirectConnections[] = $dcon; + //Place the socket in an array to + $this->myConnections[] = $dcon->sock; + + + //Get rid of the first packet because its worthless + //and confusing + $dcon->readDIM(); + //Assign the cookie + $dcon->cookie = $dcon->lastReceived['cookie']; + $dcon->connectedTo = $this->normalize($nick); + return $dcon; + } + + /** + * Sends a Message over a Direct Connection + * + * Only works if a direct connection is already established with user + * + * @param String $to Message Recipient SN + * @param String $message Message to Send + * + * @access public + * @return void + */ + function sendDim($to, $message) + { + //Find the connection + for($i = 0;$imyDirectConnections);$i++) + { + if ($this->normalize($to) == $this->myDirectConnections[$i]->connectedTo && $this->myDirectConnections[$i]->type == CONN_TYPE_DC) + { + $dcon = $this->myDirectConnections[$i]; + break; + } + } + if (!$dcon) + { + $this->log("Could not find a direct connection to $to"); + return false; + } + $dcon->sendMessage($message, $this->normalize($this->myScreenName)); + return true; + } + + /** + * Closes an established Direct Connection + * + * @param DConnect $dcon Direct Connection Object to Close + * + * @access public + * @return void + */ + function closeDcon($dcon) + { + + $nary = array(); + for($i = 0;$imyConnections);$i++) + { + if ($dcon->sock == $this->myConnections[$i]) + unset($this->myConnections[$i]); + } + + $this->myConnections = array_values($this->myConnections); + unset($nary); + $nary2 = array(); + + for($i = 0;$imyDirectConnections);$i++) + { + if ($dcon == $this->myDirectConnections[$i]) + unset($this->myDirectConnections[$i]); + } + $this->myDirectConnections = array_values($this->myDirectConnections); + $dcon->close(); + unset($dcon); + } + + //Added 4/29/04 by Jeremy: + //Various chat related methods + + /** + * Accepts a Chat Room Invitation (Joins room) + * + * @param String $chatid ID of Chat Room + * + * @access public + * @return void + */ + function joinChat($chatid) + { + $this->sflapSend(SFLAP_TYPE_DATA,"toc_chat_accept " . $chatid,0,0); + } + + /** + * Leaves a chat room + * + * @param String $chatid ID of Chat Room + * + * @access public + * @return void + */ + function leaveChat($chatid) + { + $this->sflapSend(SFLAP_TYPE_DATA,"toc_chat_leave " . $chatid,0,0); + } + + /** + * Sends a message in a chat room + * + * @param String $chatid ID of Chat Room + * @param String $message Message to send + * + * @access public + * @return void + */ + function chatSay($chatid, $message) + { + $this->sflapSend(SFLAP_TYPE_DATA,"toc_chat_send " . $chatid . " \"" . $this->encodeData($message) . "\"",0,0); + } + + /** + * Invites a user to a chat room + * + * @param String $chatid ID of Chat Room + * @param String $who Screenname of user + * @param String $message Note to include with invitiation + * + * @access public + * @return void + */ + function chatInvite($chatid, $who, $message) + { + $who = $this->normalize($who); + $this->sflapSend(SFLAP_TYPE_DATA,"toc_chat_invite " . $chatid . " \"" . $this->encodeData($message) . "\" " . $who,0,0); + } + + /** + * Joins/Creates a new chat room + * + * @param String $name Name of the new chat room + * @param String $exchange Exchange of new chat room + * + * @access public + * @return void + */ + function joinNewChat($name, $exchange) + { + //Creates a new chat + $this->sflapSend(SFLAP_TYPE_DATA,"toc_chat_join " . $exchange . " \"" . $name . "\"",0,0); + } + + /** + * Disconnect error handler, attempts to reconnect in 60 seconds + * + * @param String $message Error message (desc of where error encountered etc) + * + * @access private + * @return void + */ + function derror($message) + { + $this->log($message); + $this->log("Error"); + fclose($this->myConnection); + if ((time() - $GLOBALS['errortime']) < 600){ + $this->log("Reconnecting in 60 Seconds"); + sleep(60); + } + $this->signon(); + $GLOBALS['errortime'] = time(); + } + + /** + * Returns connection type of socket (main or rvous etc) + * + * Helper method for recieve() + * + * @param Resource $sock Socket to determine type for + * + * @access private + * @return void + * @see receive + */ + function connectionType($sock) + { + //Is it the main connection? + if ($sock == $this->myConnection) + return CONN_TYPE_NORMAL; + else + { + for($i = 0;$imyDirectConnections);$i++) + { + if ($sock == $this->myDirectConnections[$i]->sock) + return $this->myDirectConnections[$i]->type; + } + } + return false; + } + + /** + * Checks for new data and calls appropriate methods + * + * This method is usually called in an infinite loop to keep checking for new data + * + * @access public + * @return void + * @see connectionType + */ + function receive() + { + //This function will be used to get the incoming data + //and it will be used to call the event handlers + + //First, get an array of sockets that have data that is ready to be read + $ready = array(); + $ready = $this->myConnections; + $numrdy = stream_select($ready, $w = NULL, $x = NULL,NULL); + + //Now that we've waited for something, go through the $ready + //array and read appropriately + + for($i = 0;$iconnectionType($ready[$i]); + if ($type == CONN_TYPE_NORMAL) + { + //Next step:Get the data sitting in the socket + $message = $this->read_from_aim(); + if (strlen($message) <= 0) + { + return; + } + + //Third step: Get the command from the server + @list($cmd, $rest) = explode(":", $message); + + //Fourth step, take the command, test the type, and pass it off + //to the correct internal handler. The internal handler will + //do what needs to be done on the class internals to allow + //it to work, then proceed to pass it off to the user created handle + //if there is one + $this->log($cmd); + switch($cmd) + { + case 'SIGN_ON': + $this->onSignOn($message); + break; + case 'CONFIG2': + $this->onConfig($message); + break; + case 'ERROR': + $this->onError($message); + break; + case 'NICK': + $this->onNick($message); + break; + case 'IM_IN2': + $this->onImIn($message); + break; + case 'UPDATE_BUDDY2': + $this->onUpdateBuddy($message); + break; + case 'EVILED': + $this->onWarn($message); + break; + case 'CHAT_JOIN': + $this->onChatJoin($message); + break; + case 'CHAT_IN': + $this->onChatIn($message); + break; + case 'CHAT_UPDATE_BUDDY': + $this->onChatUpdate($message); + break; + case 'CHAT_INVITE': + $this->onChatInvite($message); + break; + case 'CHAT_LEFT': + $this->onChatLeft($message); + break; + case 'GOTO_URL': + $this->onGotoURL($message); + break; + case 'DIR_STATUS': + $this->onDirStatus($message); + break; + case 'ADMIN_NICK_STATUS': + $this->onAdminNick($message); + break; + case 'ADMIN_PASSWD_STATUS': + $this->onAdminPasswd($message); + break; + case 'PAUSE': + $this->onPause($message); + break; + case 'RVOUS_PROPOSE': + $this->onRvous($message); + break; + default: + $this->log("Fell through: $message"); + $this->CatchAll($message); + break; + } + } + else + { + for($j = 0;$jmyDirectConnections);$j++) + { + if ($this->myDirectConnections[$j]->sock == $ready[$i]) + { + $dcon = $this->myDirectConnections[$j]; + break; + } + } + //Now read from the dcon + if ($dcon->type == CONN_TYPE_DC) + { + if ($dcon->readDIM() == false) + { + $this->closeDcon($dcon); + continue; + } + + $message['message'] = $dcon->lastMessage; + if ($message['message'] == "too big") + { + $this->sendDim("Connection dropped because you sent a message larger that " . MAX_DCON_SIZE . " bytes.", $dcon->connectedTo); + $this->closeDcon($dcon); + continue; + } + $message['from'] = $dcon->connectedTo; + $this->onDimIn($message); + } + } + } + $this->conn->myLastReceived=""; + //Now get out of this function because the handlers should take care + //of everything + } + + //The next block of code is all the event handlers needed by the class + //Some are left blank and only call the users handler because the class + //either does not support the command, or cannot do anything with it + // --------------------------------------------------------------------- + + /** + * Direct IM In Event Handler + * + * Called when Direct IM is received. + * Call's user handler (if available) for DimIn. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onDimIn($data) + { + $this->callHandler("DimIn", $data); + } + + /** + * Sign On Event Handler + * + * Called when Sign On event occurs. + * Call's user handler (if available) for SIGN_ON. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onSignOn($data) + { + $this->callHandler("SignOn", $data); + } + + /** + * Config Event Handler + * + * Called when Config data received. + * Call's user handler (if available) for Config. + * + * Loads buddy list and other info + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onConfig($data) + { + $this->log("onConfig Message: " . $data); + + if (strpos($data,"CONFIG2:") === false) + { + $this->log("get_buddy_list cannot be called at this time because I got $data"); + //return false; + } + $people = explode("\n",trim($data,"\n")); + //The first 3 elements of the array are who knows what, element 3 should be + //a letter followed by a person + + //AIM decided to add this wonderful new feature, the recent buddy thing, this kind of + //messes this funtion up, so we need to adapt it... unfortuneately, its not really + //clear how this works, so we are just going to add their name to the permit list. + + //Recent buddies I believe are in the format + //number:name:number.... I think the first number counts down from 25 how long its + //been... but I don't know the second number,,,, + + //TODO: Figure out the new recent buddies system + + //Note: adding that at the bottom is a quick hack and may have adverse consequences... + for($i = 1;$imyPermitList[] = $name; + break; + case 'd': + $this->myBlockedList[] = $name; + break; + case 'b': + $this->myBuddyList[] = $name; + break; + case 'done': + break; + default: + //This is assumed to be recent buddies... + $this->myPermitList[]=$name; + } + } + + //We only get the config message once, so now we should send our pd mode + + $this->sflapSend(SFLAP_TYPE_DATA,"toc2_set_pdmode " . $this->myPdMode,0,0); + //Adds yourself to the permit list + //This is to fix an odd behavior if you have nobody on your list + //the server won't send the config command... so this takes care of it + $this->sflapSend(SFLAP_TYPE_DATA,"toc2_add_permit " . $this->normalize($this->myScreenName),0,0); + + //Now we allow the user to send a list, update anything they want, etc + $this->callHandler("Config", $data); + //Now that we have taken care of what the user wants, send the init_done message + $this->sflapSend(SFLAP_TYPE_DATA,"toc_init_done",0,0); + //'VOICE_UID' + //'FILE_GET_UID' + //'IMAGE_UID' + //'BUDDY_ICON_UID' + //'STOCKS_UID' + //'GAMES_UID' + $this->sflapSend(SFLAP_TYPE_DATA, "toc_set_caps " . IMAGE_UID . " " . FILE_SEND_UID ." " . FILE_GET_UID . " " . BUDDY_ICON_UID . "",0,0); + } + + + /** + * Error Event Handler + * + * Called when an Error occurs. + * Call's user handler (if available) for Error. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onError($data) + { + static $errarg = ''; + static $ERRORS = array( + 0=>'Success', + 901 =>'$errarg not currently available', + 902 =>'Warning of $errarg not currently available', + 903 =>'A message has been dropped, you are exceeding + the server speed limit', + 911 =>'Error validating input', + 912 =>'Invalid account', + 913 =>'Error encountered while processing request', + 914 =>'Service unavailable', + 950 =>'Chat in $errarg is unavailable.', + 960 =>'You are sending message too fast to $errarg', + 961 =>'You missed an im from $errarg because it was too big.', + 962 =>'You missed an im from $errarg because it was sent too fast.', + 970 =>'Failure', + 971 =>'Too many matches', + 972 =>'Need more qualifiers', + 973 =>'Dir service temporarily unavailable', + 974 =>'Email lookup restricted', + 975 =>'Keyword Ignored', + 976 =>'No Keywords', + 977 =>'Language not supported', + 978 =>'Country not supported', + 979 =>'Failure unknown $errarg', + 980 =>'Incorrect nickname or password.', + 981 =>'The service is temporarily unavailable.', + 982 =>'Your warning level is currently too high to sign on.', + 983 =>'You have been connecting and + disconnecting too frequently. Wait 10 minutes and try again. + If you continue to try, you will need to wait even longer.', + 989 =>'An unknown signon error has occurred $errarg' + ); + $data_array = explode(":", $data); + for($i=0; $ilog($errorstring . "\n"); + + $this->callHandler("Error", $data); + } + + /** + * Nick Event Handler + * + * Called when formatted own ScreenName is receieved + * Call's user handler (if available) for Nick. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onNick($data) + { + //This is our nick, so set a field called "myFormatSN" which will represent + //the actual name given by the server to us, NOT the normalized screen name + @list($cmd, $nick) = explode(":", $data); + $this->myFormatSN = $nick; + + $this->callHandler("Nick", $data); + } + + /** + * IM In Event Handler + * + * Called when an Instant Message is received. + * Call's user handler (if available) for IMIn. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onImIn($data) + { + //Perhaps we should add an internal log for debugging purposes?? + //But now, this should probably be handled by the user purely + + $this->callHandler("IMIn", $data); + } + + /** + * UpdateBuddy Event Handler + * + * Called when a Buddy Update is receieved. + * Call's user handler (if available) for UpdateBuddy. + * If info is about self, updates self info (Currently ownly warning). + * + * ToDo: Keep track of idle, warning etc on Buddy List + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onUpdateBuddy($data) + { + //Again, since our class currently does not deal with other people without + //outside help, then this is also probably best left to the user. Though + //we should probably allow this to replace the setMyInfo function above + //by handling the input if and only if it is us + //Check and see that this is the command expected + if (strpos($data,"UPDATE_BUDDY2:") == -1) + { + $this->log("A different message than expected was received"); + return false; + } + + //@list($cmd, $info['sn'], $info['online'], $info['warnlevel'], $info['signon'], $info['idle'], $info['uc']) = explode(":", $command['incoming']); + + //@list($cmd, $sn, $online, $warning, $starttime, $idletime, $uc) = explode(":", $data); + $info = $this->getMessageInfo($data); + if ($this->normalize($info['sn']) == $this->normalize($this->myScreenName)) + { + $warning = rtrim($info['warnlevel'],"%"); + $this->myWarnLevel = $warning; + $this->log("My warning level is $this->myWarnLevel %"); + } + + $this->callHandler("UpdateBuddy", $data); + } + + /** + * Warning Event Handler + * + * Called when bot is warned. + * Call's user handler (if available) for Warn. + * Updates internal warning level + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onWarn($data) + { + /* + For reference: + $command['incoming'] .= ":0"; + $it = explode(":", $command['incoming']); + $info['warnlevel'] = $it[1]; + $info['from'] = $it[2]; + */ + //SImply update our warning level + //@list($cmd, $newwarn, $user) = explode(":", $data); + + $info = $this->getMessageInfo($data); + + $this->setWarningLevel(trim($info['warnlevel'],"%")); + $this->log("My warning level is $this->myWarnLevel %"); + + $this->callHandler("Warned", $data); + } + + /** + * Chat Join Handler + * + * Called when bot joins a chat room. + * Call's user handler (if available) for ChatJoin. + * Adds chat room to internal chat room list. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onChatJoin($data) + { + @list($cmd, $rmid, $rmname) = explode(":", $data); + $this->myChatRooms[$rmid] = 0; + + $this->callHandler("ChatJoin", $data); + } + + /** + * Returns number of chat rooms bot is in + * + * @access public + * @param String $data Raw message from server + * @return int + */ + function getNumChats() + { + return count($this->myChatRooms); + } + + /** + * Chat Update Handler + * + * Called when bot received chat room data (user update). + * Call's user handler (if available) for ChatUpdate. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onChatUpdate($data) + { + $stuff = explode(":", $data); + $people = sizeof($stuff); + $people -= 2; + + $this->callHandler("ChatUpdate", $data); + } + + /** + * Chat Message In Handler + * + * Called when chat room message is received. + * Call's user handler (if available) for ChatIn. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onChatIn($data) + { + $this->callHandler("ChatIn", $data); + } + + + /** + * Chat Invite Handler + * + * Called when bot is invited to a chat room. + * Call's user handler (if available) for ChatInvite. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onChatInvite($data) + { + //@list($cmd, $name, $id, $from, $data) = explode(":", $data,6); + //$data = explode(":",$data,6); + //$nm = array(); + //@list($nm['cmd'],$nm['name'],$nm['id'],$nm['from'],$nm['message']) = $data; + + + $this->callHandler("ChatInvite", $data); + } + + /** + * Chat Left Handler + * + * Called when bot leaves a chat room + * Call's user handler (if available) for ChatLeft. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onChatLeft($data) + { + $info = $this->getMessageInfo($data); + unset($this->myChatRooms[$info['chatid']]); + $this->callHandler("ChatLeft", $data); + } + + /** + * Goto URL Handler + * + * Called on GotoURL. + * Call's user handler (if available) for GotoURL. + * No detailed info available for this / Unsupported. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onGotoURL($data) + { + //This is of no use to the internal class + + $this->callHandler("GotoURL", $data); + } + + /** + * Dir Status Handler + * + * Called on DirStatus. + * Call's user handler (if available) for DirStatus. + * No detailed info available for this / Unsupported. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onDirStatus($data) + { + //This is not currently suported + + $this->callHandler("DirStatus", $data); + } + + /** + * AdminNick Handler + * + * Called on AdminNick. + * Call's user handler (if available) for AdminNick. + * No detailed info available for this / Unsupported. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onAdminNick($data) + { + //NOt particularly useful to us + $this->callHandler("AdminNick", $data); + } + + /** + * AdminPasswd Handler + * + * Called on AdminPasswd. + * Call's user handler (if available) for AdminPasswd. + * No detailed info available for this / Unsupported. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onAdminPasswd($data) + { + //Also not particlualry useful to the internals + $this->callHandler("AdminPasswd", $data); + } + + /** + * Pause Handler + * + * Called on Pause. + * Call's user handler (if available) for Pause. + * No detailed info available for this / Unsupported. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onPause($data) + { + //This is pretty useless to us too... + + $this->callHandler("Pause", $data); + } + + /** + * Direct Connection Handler + * + * Called on Direct Connection Request(Rvous). + * Call's user handler (if available) for Rvous. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function onRvous($data) + { + $this->callHandler("Rvous", $data); + } + + /** + * CatchAll Handler + * + * Called for unrecognized commands. + * Logs unsupported messages to array. + * Call's user handler (if available) for CatchAll. + * + * @access private + * @param String $data Raw message from server + * @return void + */ + function CatchAll($data) + { + //Add to a log of unsupported messages. + + $this->unsupported[] = $data; + //$this->log($data); + //print_r($data); + + $this->callHandler("CatchAll", $data); + } + + /** + * Calls User Handler + * + * Calls registered handler for a specific event. + * + * @access private + * @param String $event Command (event) name (Rvous etc) + * @param String $data Raw message from server + * @see registerHandler + * @return void + */ + function callHandler($event, $data) + { + + if (isset($this->myEventHandlers[$event])) + { + //$function = $this->myEventHandlers[$event] . "(\$data);"; + //eval($function); + call_user_func($this->myEventHandlers[$event], $data); + } + else + { + $this->noHandler($data); + } + } + + /** + * Registers a user handler + * + * Handler List + * SignOn, Config, ERROR, NICK, IMIn, UpdateBuddy, Eviled, Warned, ChatJoin + * ChatIn, ChatUpdate, ChatInvite, ChatLeft, GotoURL, DirStatus, AdminNick + * AdminPasswd, Pause, Rvous, DimIn, CatchAll + * + * @access private + * @param String $event Event name + * @param String $handler User function to call + * @see callHandler + * @return boolean Returns true if successful + */ + function registerHandler($event, $handler) + { + if (is_callable($handler)) + { + $this->myEventHandlers[$event] = $handler; + return true; + } + else + { + return false; + } + } + + /** + * No user handler method fall back. + * + * Does nothing with message. + * + * @access public + * @param String $message Raw server message + * @return void + */ + function noHandler($message) + { + //This function intentionally left blank + //This is where the handlers will fall to for now. I plan on including a more + //efficent check to avoid the apparent stack jumps that this code will produce + //But for now, just fall into here, and be happy + return; + } + + //GLOBAL FUNCTIONS + + /** + * Finds type, and returns as part of array ['type'] + * Puts message in ['incoming'] + * + * Helper method for getMessageInfo. + * + * @access public + * @param String $message Raw server message + * @see msg_parse + * @see getMessageInfo + * @return array + */ + static function msg_type($message) + { + $command = array(); + @list($cmd, $rest) = explode(":", $message); + switch($cmd) + { + case 'IM_IN2': + $type = AIM_TYPE_MSG; + break; + + case 'UPDATE_BUDDY2': + $type = AIM_TYPE_UPDATEBUDDY; + break; + + case 'EVILED': + $type = AIM_TYPE_WARN; + break; + + case 'SIGN_ON': + $type = AIM_TYPE_SIGNON; + break; + + case 'NICK': + $type = AIM_TYPE_NICK; + break; + + case 'ERROR': + $type = AIM_TYPE_ERROR; + break; + + case 'CHAT_JOIN': + $type = AIM_TYPE_CHATJ; + break; + + case 'CHAT_IN': + $type = AIM_TYPE_CHATI; + break; + + case 'CHAT_UPDATE_BUDDY': + $type = AIM_TYPE_CHATUPDBUD; + break; + + case 'CHAT_INVITE': + $type = AIM_TYPE_CHATINV; + break; + + case 'CHAT_LEFT': + $type = AIM_TYPE_CHATLE; + break; + + case 'GOTO_URL': + $type = AIM_TYPE_URL; + break; + + case 'ADMIN_NICK_STATUS': + $type = AIM_TYPE_NICKSTAT; + break; + + case 'ADMIN_PASSWD_STATUS': + $type = AIM_TYPE_PASSSTAT; + break; + + case 'RVOUS_PROPOSE': + $type = AIM_TYPE_RVOUSP; + break; + + default: + $type = AIM_TYPE_NOT_IMPLEMENTED; + break; + } + $command['type'] = $type; + $command['incoming'] = $message; + return $command; + } + + /** + * Parses message and splits into info array + * + * Helper method for getMessageInfo. + * + * @access public + * @param String $command Message and type (after msg_type) + * @see msg_type + * @see getMessageInfo + * @return array + */ + static function msg_parse($command) + { + $info = array(); + switch($command['type']) + { + case AIM_TYPE_WARN: + $command['incoming'] .= ":0"; + $it = explode(":", $command['incoming']); + $info['warnlevel'] = $it[1]; + $info['from'] = $it[2]; + + break; + + case AIM_TYPE_MSG: + $it = explode(":", $command['incoming'],5); + $info['auto'] = $it[2]; + $info['from'] = $it[1]; + $info['message'] = $it[4]; + break; + + case AIM_TYPE_UPDATEBUDDY: + @list($cmd, $info['sn'], $info['online'], $info['warnlevel'], $info['signon'], $info['idle'], $info['uc']) = explode(":", $command['incoming']); + break; + + case AIM_TYPE_SIGNON: + @list($cmd, $info['version']) = explode(":", $command['incoming']); + break; + + case AIM_TYPE_NICK: + @list($cmd, $info['nickname']) = explode(":", $command['incoming']); + break; + case AIM_TYPE_ERROR: + @list($cmd, $info['errorcode'], $info['args']) = explode(":", $command['incoming']); + break; + + case AIM_TYPE_CHATJ: + @list($cmd, $info['chatid'], $info['chatname']) = explode(":", $command['incoming']); + break; + + case AIM_TYPE_CHATI: + @list($cmd, $info['chatid'], $info['user'], $info['whisper'], $info['message']) = explode(":", $command['incoming'],5); + break; + + case AIM_TYPE_CHATUPDBUD: + @list($cmd, $info['chatid'], $info['inside'], $info['userlist']) = explode(":", $command['incoming'],3); + break; + + case AIM_TYPE_CHATINV: + @list($cmd, $info['chatname'], $info['chatid'], $info['from'], $info['message']) = explode(":", $command['incoming'],5); + break; + + case AIM_TYPE_CHATLE: + @list($cmd, $info['chatid']) = explode(":", $command['incoming']); + break; + + case AIM_TYPE_URL: + @list($cmd, $info['windowname'], $info['url']) = explode(":", $command['incoming'],3); + break; + + case AIM_TYPE_RVOUSP: + @list($cmd,$info['user'],$info['uuid'],$info['cookie'],$info['seq'],$info['rip'],$info['pip'],$info['vip'],$info['port'],$info['tlvs']) = explode(":",$command['incoming'],10); + break; + + case AIM_TYPE_NICKSTAT: + case AIM_TYPE_PASSSTAT: + @list($cmd, $info['returncode'], $info['opt']) = explode(":", $command['incoming'],3); + break; + + default: + $info['command'] = $command['incoming']; + } + return $info; + } + + /** + * Returns a parsed message + * + * Calls msg_parse(msg_type( to first determine message type and then parse accordingly + * + * @access public + * @param String $command Raw server message + * @see msg_type + * @see msg_parse + * @return array + */ + static function getMessageInfo($message) + { + return self::msg_parse(self::msg_type($message)); + } + + /** + * Checks socket for end of file + * + * @access public + * @param Resource $socket Socket to check + * @return boolean true if end of file (socket) + */ + static function socketcheck($socket){ + $info = stream_get_meta_data($socket); + return $info['eof']; + //return(feof($socket)); + } +} + +?> diff --git a/plugins/Aim/extlib/phptoclib/dconnection.php b/plugins/Aim/extlib/phptoclib/dconnection.php new file mode 100755 index 000000000..c6be25ffb --- /dev/null +++ b/plugins/Aim/extlib/phptoclib/dconnection.php @@ -0,0 +1,229 @@ +connect($ip,$port)) + { + sEcho("Connection failed constructor"); + $this->connected=false; + } + else + $this->connected=true; + + $this->lastMessage=""; + $this->lastReceived=""; + } + + function readDIM() + { + /* + if(!$this->stuffToRead()) + { + sEcho("Nothing to read"); + $this->lastMessage=$this->lastReceived=""; + return false; + } + */ + $head=fread($this->sock,6); + if(strlen($head)<=0) + { + sEcho("The direct connection has been closed"); + return false; + } + $minihead=unpack("a4ver/nsize",$head); + if($minihead['size'] <=0) + return; + $headerinfo=unpack("nchan/nsix/nzero/a6cookie/Npt1/Npt2/npt3/Nlen/Npt/npt0/ntype/Nzerom/a*sn",fread($this->sock,($minihead['size']-6))); + $allheader=array_merge($minihead,$headerinfo); + sEcho($allheader); + if($allheader['len']>0 && $allheader['len'] <= MAX_DIM_SIZE) + { + $left=$allheader['len']; + $stuff=""; + $nonin=0; + while(strlen($stuff) < $allheader['len'] && $nonin<3) + { + $stuffg=fread($this->sock,$left); + if(strlen($stuffg)<0) + { + $nonin++; + continue; + } + $left=$left - strlen($stuffg); + $stuff.=$stuffg; + } + $data=unpack("a*decoded",$stuff); + } + + else if($allheader['len'] > MAX_DIM_SIZE) + { + $data['decoded']="too big"; + } + + else + $data['decoded']=""; + $all=array_merge($allheader,$data); + + $this->lastReceived=$all; + $this->lastMessage=$all['decoded']; + + //$function=$this->DimInf . "(\$all);"; + //eval($function); + + return $all; + } + + function sendMessage($message,$sn) + { + //Make the "mini header" + $minihead=pack("a4n","ODC2",76); + $header=pack("nnna6NNnNNnnNa*",1,6,0,$this->cookie,0,0,0,strlen($message),0,0,96,0,$sn); + $bighead=$minihead . $header; + while(strlen($bighead)<76) + $bighead.=pack("c",0); + + $tosend=$bighead . pack("a*",$message); + $w=array($this->sock); + stream_select($r=NULL,$w,$e=NULL,NULL); + //Now send it all + fputs($this->sock,$tosend,strlen($tosend)); + } + function stuffToRead() + { + //$info=stream_get_meta_data($this->sock); + //sEcho($info); + $s=array($this->sock); + $changed=stream_select($s,$fds=NULL,$m=NULL,0,20000); + return ($changed>0); + } + + function close() + { + $this->connected=false; + return fclose($this->sock); + } + + function connect($ip,$port) + { + $this->sock=fsockopen($ip,$port,$en,$es,3); + if(!$this->sock) + { sEcho("Connection failed"); + $this->sock=null; + return false; + } + return true; + } +} + + +class FileSendConnect +{ + var $sock; + var $lastReceived; + var $lastMessage; + var $connected; + var $cookie; + var $tpye=3; + + + function FileSendConnect($ip,$port) + { + if(!$this->connect($ip,$port)) + { + sEcho("Connection failed constructor"); + $this->connected=false; + } + else + $this->connected=true; + + $this->lastMessage=""; + $this->lastReceived=""; + } + + function readDIM() + { + + if(!$this->stuffToRead()) + { + sEcho("Nothing to read"); + $this->lastMessage=$this->lastReceived=""; + return; + } + + $minihead=unpack("a4ver/nsize",fread($this->sock,6)); + if($minihead['size'] <=0) + return; + $headerinfo=unpack("nchan/nsix/nzero/a6cookie/Npt1/Npt2/npt3/Nlen/Npt/npt0/ntype/Nzerom/a*sn",fread($this->sock,($minihead['size']-6))); + $allheader=array_merge($minihead,$headerinfo); + sEcho($allheader); + if($allheader['len']>0) + $data=unpack("a*decoded",fread($this->sock,$allheader['len'])); + else + $data['decoded']=""; + $all=array_merge($allheader,$data); + + $this->lastReceived=$all; + $this->lastMessage=$all['decoded']; + + //$function=$this->DimInf . "(\$all);"; + //eval($function); + + return $all; + } + + function sendMessage($message,$sn) + { + //Make the "mini header" + $minihead=pack("a4n","ODC2",76); + $header=pack("nnna6NNnNNnnNa*",1,6,0,$this->cookie,0,0,0,strlen($message),0,0,96,0,$sn); + $bighead=$minihead . $header; + while(strlen($bighead)<76) + $bighead.=pack("c",0); + + $tosend=$bighead . pack("a*",$message); + + //Now send it all + fwrite($this->sock,$tosend,strlen($tosend)); + } + function stuffToRead() + { + //$info=stream_get_meta_data($this->sock); + //sEcho($info); + $s=array($this->sock); + $changed=stream_select($s,$fds=NULL,$m=NULL,1); + return ($changed>0); + } + + function close() + { + $this->connected=false; + fclose($this->sock); + unset($this->sock); + return true; + } + + function connect($ip,$port) + { + $this->sock=fsockopen($ip,$port,$en,$es,3); + if(!$this->sock) + { sEcho("Connection failed to" . $ip . ":" . $port); + $this->sock=null; + return false; + } + return true; + } +} diff --git a/plugins/Imap/imapmanager.php b/plugins/Imap/imapmanager.php index e4fda5809..4c0edeaa1 100644 --- a/plugins/Imap/imapmanager.php +++ b/plugins/Imap/imapmanager.php @@ -57,12 +57,14 @@ class ImapManager extends IoManager } /** - * Tell the i/o master we need one instance for each supporting site - * being handled in this process. + * Tell the i/o master we need one instance globally. + * Since this is a plugin manager, the plugin class itself will + * create one instance per site. This prevents the IoMaster from + * making more instances. */ public static function multiSite() { - return IoManager::INSTANCE_PER_SITE; + return IoManager::GLOBAL_SINGLE_ONLY; } /** diff --git a/plugins/Xmpp/Fake_XMPP.php b/plugins/Xmpp/Fake_XMPP.php new file mode 100644 index 000000000..a0f329ca0 --- /dev/null +++ b/plugins/Xmpp/Fake_XMPP.php @@ -0,0 +1,104 @@ +. + * + * @category Network + * @package StatusNet + * @author Brion Vibber + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class Fake_XMPP extends XMPPHP_XMPP +{ + public $would_be_sent = null; + + /** + * Constructor + * + * @param string $host + * @param integer $port + * @param string $user + * @param string $password + * @param string $resource + * @param string $server + * @param boolean $printlog + * @param string $loglevel + */ + public function __construct($host, $port, $user, $password, $resource, $server = null, $printlog = false, $loglevel = null) + { + parent::__construct($host, $port, $user, $password, $resource, $server, $printlog, $loglevel); + // Normally the fulljid isn't filled out until resource binding time; + // we need to save it here since we're not talking to a real server. + $this->fulljid = "{$this->basejid}/{$this->resource}"; + } + + /** + * Send a formatted message to the outgoing queue for later forwarding + * to a real XMPP connection. + * + * @param string $msg + */ + public function send($msg, $timeout=NULL) + { + $this->would_be_sent = $msg; + } + + //@{ + /** + * Stream i/o functions disabled; only do output + */ + public function connect($timeout = 30, $persistent = false, $sendinit = true) + { + throw new Exception("Can't connect to server from fake XMPP."); + } + + public function disconnect() + { + throw new Exception("Can't connect to server from fake XMPP."); + } + + public function process() + { + throw new Exception("Can't read stream from fake XMPP."); + } + + public function processUntil($event, $timeout=-1) + { + throw new Exception("Can't read stream from fake XMPP."); + } + + public function read() + { + throw new Exception("Can't read stream from fake XMPP."); + } + + public function readyToProcess() + { + throw new Exception("Can't read stream from fake XMPP."); + } + //@} +} + diff --git a/plugins/Xmpp/README b/plugins/Xmpp/README new file mode 100644 index 000000000..9bd71e980 --- /dev/null +++ b/plugins/Xmpp/README @@ -0,0 +1,35 @@ +The XMPP plugin allows users to send and receive notices over the XMPP/Jabber/GTalk network. + +Installation +============ +add "addPlugin('xmpp', + array('setting'=>'value', 'setting2'=>'value2', ...);" +to the bottom of your config.php + +The daemon included with this plugin must be running. It will be started by +the plugin along with their other daemons when you run scripts/startdaemons.sh. +See the StatusNet README for more about queuing and daemons. + +Settings +======== +user*: user part of the jid +server*: server part of the jid +resource: resource part of the jid +port (5222): port on which to connect to the server +encryption (true): use encryption on the connection +host (same as server): host to connect to. Usually, you won't set this. +debug (false): log extra debug info +public: list of jid's that should get the public feed (firehose) + +* required +default values are in (parenthesis) + +Example +======= +addPlugin('xmpp', array( + 'user=>'update', + 'server=>'identi.ca', + 'password'=>'...', + 'public'=>array('bob@aol.com', 'sue@google.com') +)); + diff --git a/plugins/Xmpp/Sharing_XMPP.php b/plugins/Xmpp/Sharing_XMPP.php new file mode 100644 index 000000000..4b69125da --- /dev/null +++ b/plugins/Xmpp/Sharing_XMPP.php @@ -0,0 +1,43 @@ +. + * + * @category Jabber + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +class Sharing_XMPP extends XMPPHP_XMPP +{ + function getSocket() + { + return $this->socket; + } +} diff --git a/plugins/Xmpp/XmppPlugin.php b/plugins/Xmpp/XmppPlugin.php new file mode 100644 index 000000000..b9551b852 --- /dev/null +++ b/plugins/Xmpp/XmppPlugin.php @@ -0,0 +1,247 @@ +. + * + * @category IM + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Plugin for XMPP + * + * @category Plugin + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class XmppPlugin extends ImPlugin +{ + public $server = null; + public $port = 5222; + public $user = 'update'; + public $resource = null; + public $encryption = true; + public $password = null; + public $host = null; // only set if != server + public $debug = false; // print extra debug info + + public $transport = 'xmpp'; + + protected $fake_xmpp; + + function getDisplayName(){ + return _m('XMPP/Jabber/GTalk'); + } + + function normalize($screenname) + { + if (preg_match("/(?:([^\@]+)\@)?([^\/]+)(?:\/(.*))?$/", $screenname, $matches)) { + $node = $matches[1]; + $server = $matches[2]; + return strtolower($node.'@'.$server); + } else { + return null; + } + } + + function daemon_screenname() + { + $ret = $this->user . '@' . $this->server; + if($this->resource) + { + return $ret . '/' . $this->resource; + }else{ + return $ret; + } + } + + function validate($screenname) + { + // Cheap but effective + return Validate::email($screenname); + } + + /** + * Load related modules when needed + * + * @param string $cls Name of the class to be loaded + * + * @return boolean hook value; true means continue processing, false means stop. + */ + + function onAutoload($cls) + { + $dir = dirname(__FILE__); + + switch ($cls) + { + case 'Sharing_XMPP': + case 'Fake_XMPP': + include_once $dir . '/'.$cls.'.php'; + return false; + case 'XmppManager': + include_once $dir . '/'.strtolower($cls).'.php'; + return false; + default: + return true; + } + } + + function onStartImDaemonIoManagers(&$classes) + { + parent::onStartImDaemonIoManagers(&$classes); + $classes[] = new XmppManager($this); // handles pings/reconnects + return true; + } + + function microiduri($screenname) + { + return 'xmpp:' . $screenname; + } + + function send_message($screenname, $body) + { + $this->fake_xmpp->message($screenname, $body, 'chat'); + $this->enqueue_outgoing_raw($this->fake_xmpp->would_be_sent); + return true; + } + + function send_notice($screenname, $notice) + { + $msg = $this->format_notice($notice); + $entry = $this->format_entry($notice); + + $this->fake_xmpp->message($screenname, $msg, 'chat', null, $entry); + $this->enqueue_outgoing_raw($this->fake_xmpp->would_be_sent); + return true; + } + + /** + * extra information for XMPP messages, as defined by Twitter + * + * @param Profile $profile Profile of the sending user + * @param Notice $notice Notice being sent + * + * @return string Extra information (Atom, HTML, addresses) in string format + */ + + function format_entry($notice) + { + $profile = $notice->getProfile(); + + $entry = $notice->asAtomEntry(true, true); + + $xs = new XMLStringer(); + $xs->elementStart('html', array('xmlns' => 'http://jabber.org/protocol/xhtml-im')); + $xs->elementStart('body', array('xmlns' => 'http://www.w3.org/1999/xhtml')); + $xs->element('a', array('href' => $profile->profileurl), + $profile->nickname); + $xs->text(": "); + if (!empty($notice->rendered)) { + $xs->raw($notice->rendered); + } else { + $xs->raw(common_render_content($notice->content, $notice)); + } + $xs->text(" "); + $xs->element('a', array( + 'href'=>common_local_url('conversation', + array('id' => $notice->conversation)).'#notice-'.$notice->id + ),sprintf(_('[%s]'),$notice->id)); + $xs->elementEnd('body'); + $xs->elementEnd('html'); + + $html = $xs->getString(); + + return $html . ' ' . $entry; + } + + function receive_raw_message($pl) + { + $from = $this->normalize($pl['from']); + + if ($pl['type'] != 'chat') { + common_log(LOG_WARNING, "Ignoring message of type ".$pl['type']." from $from."); + return true; + } + + if (mb_strlen($pl['body']) == 0) { + common_log(LOG_WARNING, "Ignoring message with empty body from $from."); + return true; + } + + return $this->handle_incoming($from, $pl['body']); + } + + function initialize(){ + if(!isset($this->server)){ + throw new Exception("must specify a server"); + } + if(!isset($this->port)){ + throw new Exception("must specify a port"); + } + if(!isset($this->user)){ + throw new Exception("must specify a user"); + } + if(!isset($this->password)){ + throw new Exception("must specify a password"); + } + + $this->fake_xmpp = new Fake_XMPP($this->host ? + $this->host : + $this->server, + $this->port, + $this->user, + $this->password, + $this->resource, + $this->server, + $this->debug ? + true : false, + $this->debug ? + XMPPHP_Log::LEVEL_VERBOSE : null + ); + return true; + } + + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'XMPP', + 'version' => STATUSNET_VERSION, + 'author' => 'Craig Andrews, Evan Prodromou', + 'homepage' => 'http://status.net/wiki/Plugin:XMPP', + 'rawdescription' => + _m('The XMPP plugin allows users to send and receive notices over the XMPP/Jabber network.')); + return true; + } +} + diff --git a/plugins/Xmpp/xmppmanager.php b/plugins/Xmpp/xmppmanager.php new file mode 100644 index 000000000..87d818668 --- /dev/null +++ b/plugins/Xmpp/xmppmanager.php @@ -0,0 +1,279 @@ +. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +/** + * XMPP background connection manager for XMPP-using queue handlers, + * allowing them to send outgoing messages on the right connection. + * + * Input is handled during socket select loop, keepalive pings during idle. + * Any incoming messages will be handled. + * + * In a multi-site queuedaemon.php run, one connection will be instantiated + * for each site being handled by the current process that has XMPP enabled. + */ + +class XmppManager extends ImManager +{ + protected $lastping = null; + protected $pingid = null; + + public $conn = null; + + const PING_INTERVAL = 120; + + + /** + * Initialize connection to server. + * @return boolean true on success + */ + public function start($master) + { + if(parent::start($master)) + { + $this->connect(); + return true; + }else{ + return false; + } + } + + function send_raw_message($data) + { + $this->connect(); + if (!$this->conn || $this->conn->isDisconnected()) { + return false; + } + $this->conn->send($data); + return true; + } + + /** + * Message pump is triggered on socket input, so we only need an idle() + * call often enough to trigger our outgoing pings. + */ + function timeout() + { + return self::PING_INTERVAL; + } + + /** + * Process XMPP events that have come in over the wire. + * @fixme may kill process on XMPP error + * @param resource $socket + */ + public function handleInput($socket) + { + # Process the queue for as long as needed + try { + common_log(LOG_DEBUG, "Servicing the XMPP queue."); + $this->stats('xmpp_process'); + $this->conn->processTime(0); + } catch (XMPPHP_Exception $e) { + common_log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage()); + die($e->getMessage()); + } + } + + /** + * Lists the IM connection socket to allow i/o master to wake + * when input comes in here as well as from the queue source. + * + * @return array of resources + */ + public function getSockets() + { + $this->connect(); + if($this->conn){ + return array($this->conn->getSocket()); + }else{ + return array(); + } + } + + /** + * Idle processing for io manager's execution loop. + * Send keepalive pings to server. + * + * Side effect: kills process on exception from XMPP library. + * + * @fixme non-dying error handling + */ + public function idle($timeout=0) + { + $now = time(); + if (empty($this->lastping) || $now - $this->lastping > self::PING_INTERVAL) { + try { + $this->send_ping(); + } catch (XMPPHP_Exception $e) { + common_log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage()); + die($e->getMessage()); + } + } + } + + function connect() + { + if (!$this->conn || $this->conn->isDisconnected()) { + $resource = 'queue' . posix_getpid(); + $this->conn = new Sharing_XMPP($this->plugin->host ? + $this->plugin->host : + $this->plugin->server, + $this->plugin->port, + $this->plugin->user, + $this->plugin->password, + $this->plugin->resource, + $this->plugin->server, + $this->plugin->debug ? + true : false, + $this->plugin->debug ? + XMPPHP_Log::LEVEL_VERBOSE : null + ); + + if (!$this->conn) { + return false; + } + $this->conn->addEventHandler('message', 'handle_xmpp_message', $this); + $this->conn->addEventHandler('reconnect', 'handle_xmpp_reconnect', $this); + $this->conn->setReconnectTimeout(600); + + $this->conn->autoSubscribe(); + $this->conn->useEncryption($this->plugin->encryption); + + try { + $this->conn->connect(true); // true = persistent connection + } catch (XMPPHP_Exception $e) { + common_log(LOG_ERR, $e->getMessage()); + return false; + } + + $this->conn->processUntil('session_start'); + $this->send_presence(_m('Send me a message to post a notice'), 'available', null, 'available', 100); + } + return $this->conn; + } + + function send_ping() + { + $this->connect(); + if (!$this->conn || $this->conn->isDisconnected()) { + return false; + } + $now = time(); + if (!isset($this->pingid)) { + $this->pingid = 0; + } else { + $this->pingid++; + } + + common_log(LOG_DEBUG, "Sending ping #{$this->pingid}"); + $this->conn->send(""); + $this->lastping = $now; + return true; + } + + function handle_xmpp_message(&$pl) + { + $this->plugin->enqueue_incoming_raw($pl); + return true; + } + + /** + * Callback for Jabber reconnect event + * @param $pl + */ + function handle_xmpp_reconnect(&$pl) + { + common_log(LOG_NOTICE, 'XMPP reconnected'); + + $this->conn->processUntil('session_start'); + $this->send_presence(_m('Send me a message to post a notice'), 'available', null, 'available', 100); + } + + /** + * sends a presence stanza on the XMPP network + * + * @param string $status current status, free-form string + * @param string $show structured status value + * @param string $to recipient of presence, null for general + * @param string $type type of status message, related to $show + * @param int $priority priority of the presence + * + * @return boolean success value + */ + + function send_presence($status, $show='available', $to=null, + $type = 'available', $priority=null) + { + $this->connect(); + if (!$this->conn || $this->conn->isDisconnected()) { + return false; + } + $this->conn->presence($status, $show, $to, $type, $priority); + return true; + } + + /** + * sends a "special" presence stanza on the XMPP network + * + * @param string $type Type of presence + * @param string $to JID to send presence to + * @param string $show show value for presence + * @param string $status status value for presence + * + * @return boolean success flag + * + * @see send_presence() + */ + + function special_presence($type, $to=null, $show=null, $status=null) + { + // FIXME: why use this instead of send_presence()? + $this->connect(); + if (!$this->conn || $this->conn->isDisconnected()) { + return false; + } + + $to = htmlspecialchars($to); + $status = htmlspecialchars($status); + + $out = "conn->send($out); + return true; + } +} diff --git a/scripts/getvaliddaemons.php b/scripts/getvaliddaemons.php index a332e06b5..80c21bce5 100755 --- a/scripts/getvaliddaemons.php +++ b/scripts/getvaliddaemons.php @@ -39,9 +39,7 @@ $daemons = array(); $daemons[] = INSTALLDIR.'/scripts/queuedaemon.php'; -if(common_config('xmpp','enabled')) { - $daemons[] = INSTALLDIR.'/scripts/xmppdaemon.php'; -} +$daemons[] = INSTALLDIR.'/scripts/imdaemon.php'; if (Event::handle('GetValidDaemons', array(&$daemons))) { foreach ($daemons as $daemon) { diff --git a/scripts/imdaemon.php b/scripts/imdaemon.php new file mode 100755 index 000000000..c37a26b7c --- /dev/null +++ b/scripts/imdaemon.php @@ -0,0 +1,93 @@ +#!/usr/bin/env php +. + */ + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +$shortoptions = 'fi::'; +$longoptions = array('id::', 'foreground'); + +$helptext = <<get_id()); + $master->init(); + $master->service(); + + common_log(LOG_INFO, 'terminating normally'); + + return true; + } + +} + +class ImMaster extends IoMaster +{ + /** + * Initialize IoManagers for the currently configured site + * which are appropriate to this instance. + */ + function initManagers() + { + $classes = array(); + if (Event::handle('StartImDaemonIoManagers', array(&$classes))) { + $classes[] = 'QueueManager'; + } + Event::handle('EndImDaemonIoManagers', array(&$classes)); + foreach ($classes as $class) { + $this->instantiate($class); + } + } +} + +if (have_option('i', 'id')) { + $id = get_option_value('i', 'id'); +} else if (count($args) > 0) { + $id = $args[0]; +} else { + $id = null; +} + +$foreground = have_option('f', 'foreground'); + +$daemon = new ImDaemon($id, !$foreground); + +$daemon->runOnce(); diff --git a/scripts/queuedaemon.php b/scripts/queuedaemon.php index a9cfda6d7..bedd14b1a 100755 --- a/scripts/queuedaemon.php +++ b/scripts/queuedaemon.php @@ -21,7 +21,7 @@ define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); $shortoptions = 'fi:at:'; -$longoptions = array('id=', 'foreground', 'all', 'threads=', 'skip-xmpp', 'xmpp-only'); +$longoptions = array('id=', 'foreground', 'all', 'threads='); /** * Attempts to get a count of the processors available on the current system @@ -163,13 +163,6 @@ if (!$threads) { $daemonize = !(have_option('f') || have_option('--foreground')); $all = have_option('a') || have_option('--all'); -if (have_option('--skip-xmpp')) { - define('XMPP_EMERGENCY_FLAG', true); -} -if (have_option('--xmpp-only')) { - define('XMPP_ONLY_FLAG', true); -} - $daemon = new QueueDaemon($id, $daemonize, $threads, $all); $daemon->runOnce(); diff --git a/scripts/stopdaemons.sh b/scripts/stopdaemons.sh index c790f1f34..bc1230e64 100755 --- a/scripts/stopdaemons.sh +++ b/scripts/stopdaemons.sh @@ -23,8 +23,8 @@ SDIR=`dirname $0` DIR=`php $SDIR/getpiddir.php` -for f in jabberhandler ombhandler publichandler smshandler pinghandler \ - xmppconfirmhandler xmppdaemon twitterhandler facebookhandler \ +for f in ombhandler smshandler pinghandler \ + twitterhandler facebookhandler \ twitterstatusfetcher synctwitterfriends pluginhandler rsscloudhandler; do FILES="$DIR/$f.*.pid" diff --git a/scripts/xmppdaemon.php b/scripts/xmppdaemon.php deleted file mode 100755 index fd7cf055b..000000000 --- a/scripts/xmppdaemon.php +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env php -. - */ - -define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); - -$shortoptions = 'fi::'; -$longoptions = array('id::', 'foreground'); - -$helptext = <<get_id()); - $master->init(); - $master->service(); - - common_log(LOG_INFO, 'terminating normally'); - - return true; - } - -} - -class XmppMaster extends IoMaster -{ - /** - * Initialize IoManagers for the currently configured site - * which are appropriate to this instance. - */ - function initManagers() - { - // @fixme right now there's a hack in QueueManager to determine - // which queues to subscribe to based on the master class. - $this->instantiate('QueueManager'); - $this->instantiate('XmppManager'); - } -} - -// Abort immediately if xmpp is not enabled, otherwise the daemon chews up -// lots of CPU trying to connect to unconfigured servers -if (common_config('xmpp','enabled')==false) { - print "Aborting daemon - xmpp is disabled\n"; - exit(); -} - -if (have_option('i', 'id')) { - $id = get_option_value('i', 'id'); -} else if (count($args) > 0) { - $id = $args[0]; -} else { - $id = null; -} - -$foreground = have_option('f', 'foreground'); - -$daemon = new XMPPDaemon($id, !$foreground); - -$daemon->runOnce(); -- cgit v1.2.3-54-g00ecf From 065140400018dec28ed82fd31a754c94b7b87521 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 28 Jan 2010 16:08:42 -0500 Subject: Add backwards compatibility for the XMPP configuration before XMPP was made into a plugin --- lib/statusnet.php | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/statusnet.php b/lib/statusnet.php index beeb26ccc..2654ba573 100644 --- a/lib/statusnet.php +++ b/lib/statusnet.php @@ -274,7 +274,6 @@ class StatusNet } // Backwards compatibility - if (array_key_exists('memcached', $config)) { if ($config['memcached']['enabled']) { addPlugin('Memcache', array('servers' => $config['memcached']['server'])); @@ -284,6 +283,21 @@ class StatusNet $config['cache']['base'] = $config['memcached']['base']; } } + if (array_key_exists('xmpp', $config)) { + if ($config['xmpp']['enabled']) { + addPlugin('xmpp', array( + 'server' => $config['xmpp']['server'], + 'port' => $config['xmpp']['port'], + 'user' => $config['xmpp']['user'], + 'resource' => $config['xmpp']['resource'], + 'encryption' => $config['xmpp']['encryption'], + 'password' => $config['xmpp']['password'], + 'host' => $config['xmpp']['host'], + 'debug' => $config['xmpp']['debug'], + 'public' => $config['xmpp']['public'] + )); + } + } } } -- cgit v1.2.3-54-g00ecf From 886e28aaa9e4e9a524d5b1a933a2d2a13994aec9 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 16 Mar 2010 14:18:37 -0700 Subject: Stub plugins administration panel, allows for disabling/re-enabling plugins from the default plugins list. --- actions/plugindisable.php | 78 ++++++++++++++++ actions/pluginenable.php | 166 ++++++++++++++++++++++++++++++++ actions/pluginsadminpanel.php | 110 ++++++++++++++++++++++ lib/adminpanelaction.php | 8 ++ lib/default.php | 3 +- lib/plugindisableform.php | 93 ++++++++++++++++++ lib/pluginenableform.php | 114 ++++++++++++++++++++++ lib/pluginlist.php | 213 ++++++++++++++++++++++++++++++++++++++++++ lib/router.php | 7 ++ lib/statusnet.php | 5 + 10 files changed, 796 insertions(+), 1 deletion(-) create mode 100644 actions/plugindisable.php create mode 100644 actions/pluginenable.php create mode 100644 actions/pluginsadminpanel.php create mode 100644 lib/plugindisableform.php create mode 100644 lib/pluginenableform.php create mode 100644 lib/pluginlist.php (limited to 'lib') diff --git a/actions/plugindisable.php b/actions/plugindisable.php new file mode 100644 index 000000000..7f107b333 --- /dev/null +++ b/actions/plugindisable.php @@ -0,0 +1,78 @@ +. + * + * PHP version 5 + * + * @category Action + * @package StatusNet + * @author Brion Vibber + * @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); +} + +/** + * Plugin enable action. + * + * (Re)-enables a plugin from the default plugins list. + * + * Takes parameters: + * + * - plugin: plugin name + * - token: session token to prevent CSRF attacks + * - ajax: boolean; whether to return Ajax or full-browser results + * + * Only works if the current user is logged in. + * + * @category Action + * @package StatusNet + * @author Brion Vibber + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +class PluginDisableAction extends PluginEnableAction +{ + /** + * Value to save into $config['plugins']['disable-'] + */ + protected function overrideValue() + { + return 1; + } + + protected function successShortTitle() + { + // TRANS: Page title for AJAX form return when a disabling a plugin. + return _m('plugin', 'Disabled'); + } + + protected function successNextForm() + { + return new EnablePluginForm($this, $this->plugin); + } +} + + diff --git a/actions/pluginenable.php b/actions/pluginenable.php new file mode 100644 index 000000000..2dbb3e395 --- /dev/null +++ b/actions/pluginenable.php @@ -0,0 +1,166 @@ +. + * + * PHP version 5 + * + * @category Action + * @package StatusNet + * @author Brion Vibber + * @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); +} + +/** + * Plugin enable action. + * + * (Re)-enables a plugin from the default plugins list. + * + * Takes parameters: + * + * - plugin: plugin name + * - token: session token to prevent CSRF attacks + * - ajax: boolean; whether to return Ajax or full-browser results + * + * Only works if the current user is logged in. + * + * @category Action + * @package StatusNet + * @author Brion Vibber + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +class PluginEnableAction extends Action +{ + var $user; + var $plugin; + + /** + * Check pre-requisites and instantiate attributes + * + * @param Array $args array of arguments (URL, GET, POST) + * + * @return boolean success flag + */ + + function prepare($args) + { + parent::prepare($args); + + // @fixme these are pretty common, should a parent class factor these out? + + // Only allow POST requests + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->clientError(_('This action only accepts POST requests.')); + return false; + } + + // CSRF protection + + $token = $this->trimmed('token'); + + if (!$token || $token != common_session_token()) { + $this->clientError(_('There was a problem with your session token.'. + ' Try again, please.')); + return false; + } + + // Only for logged-in users + + $this->user = common_current_user(); + + if (empty($this->user)) { + $this->clientError(_('Not logged in.')); + return false; + } + + if (!AdminPanelAction::canAdmin('plugins')) { + $this->clientError(_('You cannot administer plugins.')); + return false; + } + + $this->plugin = $this->arg('plugin'); + $defaultPlugins = common_config('plugins', 'default'); + if (!array_key_exists($this->plugin, $defaultPlugins)) { + $this->clientError(_('No such plugin.')); + return false; + } + + return true; + } + + /** + * Handle request + * + * Does the subscription and returns results. + * + * @param Array $args unused. + * + * @return void + */ + + function handle($args) + { + $key = 'disable-' . $this->plugin; + Config::save('plugins', $key, $this->overrideValue()); + + // @fixme this is a pretty common pattern and should be refactored down + if ($this->boolean('ajax')) { + $this->startHTML('text/xml;charset=utf-8'); + $this->elementStart('head'); + $this->element('title', null, $this->successShortTitle()); + $this->elementEnd('head'); + $this->elementStart('body'); + $form = $this->successNextForm(); + $form->show(); + $this->elementEnd('body'); + $this->elementEnd('html'); + } else { + $url = common_local_url('pluginsadminpanel'); + common_redirect($url, 303); + } + } + + /** + * Value to save into $config['plugins']['disable-'] + */ + protected function overrideValue() + { + return 0; + } + + protected function successShortTitle() + { + // TRANS: Page title for AJAX form return when enabling a plugin. + return _m('plugin', 'Enabled'); + } + + protected function successNextForm() + { + return new DisablePluginForm($this, $this->plugin); + } +} diff --git a/actions/pluginsadminpanel.php b/actions/pluginsadminpanel.php new file mode 100644 index 000000000..bc400bd51 --- /dev/null +++ b/actions/pluginsadminpanel.php @@ -0,0 +1,110 @@ +. + * + * @category Settings + * @package StatusNet + * @author Brion Vibber + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Plugins settings + * + * @category Admin + * @package StatusNet + * @author Brion Vibber + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class PluginsadminpanelAction extends AdminPanelAction +{ + + /** + * Returns the page title + * + * @return string page title + */ + + function title() + { + // TRANS: Tab and title for plugins admin panel. + return _('Plugins'); + } + + /** + * Instructions for using this form. + * + * @return string instructions + */ + + function getInstructions() + { + // TRANS: Instructions at top of plugin admin page. + return _('Additional plugins can be enabled and configured manually. ' . + 'See the online plugin ' . + 'documentation for more details.'); + } + + /** + * Show the plugins admin panel form + * + * @return void + */ + + function showForm() + { + $this->elementStart('fieldset', array('id' => 'settings_plugins_default')); + + // TRANS: Admin form section header + $this->element('legend', null, _('Default plugins'), 'default'); + + $this->showDefaultPlugins(); + + $this->elementEnd('fieldset'); + } + + /** + * Until we have a general plugin metadata infrastructure, for now + * we'll just list up the ones we know from the global default + * plugins list. + */ + protected function showDefaultPlugins() + { + $plugins = array_keys(common_config('plugins', 'default')); + natsort($plugins); + + if ($plugins) { + $list = new PluginList($plugins, $this); + $list->show(); + } else { + $this->element('p', null, + _('All default plugins have been disabled from the ' . + 'site\'s configuration file.')); + } + } +} diff --git a/lib/adminpanelaction.php b/lib/adminpanelaction.php index a927e2333..d87981b6a 100644 --- a/lib/adminpanelaction.php +++ b/lib/adminpanelaction.php @@ -407,6 +407,14 @@ class AdminPanelNav extends Widget $menu_title, $action_name == 'snapshotadminpanel', 'nav_snapshot_admin_panel'); } + if (AdminPanelAction::canAdmin('plugins')) { + // TRANS: Menu item title/tooltip + $menu_title = _('Plugins configuration'); + // TRANS: Menu item for site administration + $this->out->menuItem(common_local_url('pluginsadminpanel'), _('Plugins'), + $menu_title, $action_name == 'pluginsadminpanel', 'nav_design_admin_panel'); + } + Event::handle('EndAdminPanelNav', array($this)); } $this->action->elementEnd('ul'); diff --git a/lib/default.php b/lib/default.php index 10f3f1a97..eb0cb0b64 100644 --- a/lib/default.php +++ b/lib/default.php @@ -285,8 +285,9 @@ $default = 'RSSCloud' => null, 'OpenID' => null), ), + 'pluginlist' => array(), 'admin' => - array('panels' => array('design', 'site', 'user', 'paths', 'access', 'sessions', 'sitenotice')), + array('panels' => array('design', 'site', 'user', 'paths', 'access', 'sessions', 'sitenotice', 'plugins')), 'singleuser' => array('enabled' => false, 'nickname' => null), diff --git a/lib/plugindisableform.php b/lib/plugindisableform.php new file mode 100644 index 000000000..3cbabdb2c --- /dev/null +++ b/lib/plugindisableform.php @@ -0,0 +1,93 @@ +. + * + * @category Form + * @package StatusNet + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +/** + * Form for joining a group + * + * @category Form + * @package StatusNet + * @author Brion Vibber + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + * + * @see PluginEnableForm + */ + +class PluginDisableForm extends PluginEnableForm +{ + /** + * ID of the form + * + * @return string ID of the form + */ + + function id() + { + return 'plugin-disable-' . $this->plugin; + } + + /** + * class of the form + * + * @return string of the form class + */ + + function formClass() + { + return 'form_plugin_disable'; + } + + /** + * Action of the form + * + * @return string URL of the action + */ + + function action() + { + return common_local_url('plugindisable', + array('plugin' => $this->plugin)); + } + + /** + * Action elements + * + * @return void + */ + + function formActions() + { + // TRANS: Plugin admin panel controls + $this->out->submit('submit', _m('plugin', 'Disable')); + } + +} diff --git a/lib/pluginenableform.php b/lib/pluginenableform.php new file mode 100644 index 000000000..8683ffd0b --- /dev/null +++ b/lib/pluginenableform.php @@ -0,0 +1,114 @@ +. + * + * @category Form + * @package StatusNet + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/form.php'; + +/** + * Form for joining a group + * + * @category Form + * @package StatusNet + * @author Brion Vibber + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + * + * @see PluginDisableForm + */ + +class PluginEnableForm extends Form +{ + /** + * Plugin to enable/disable + */ + + var $plugin = null; + + /** + * Constructor + * + * @param HTMLOutputter $out output channel + * @param string $plugin plugin to enable/disable + */ + + function __construct($out=null, $plugin=null) + { + parent::__construct($out); + + $this->plugin = $plugin; + } + + /** + * ID of the form + * + * @return string ID of the form + */ + + function id() + { + return 'plugin-enable-' . $this->plugin; + } + + /** + * class of the form + * + * @return string of the form class + */ + + function formClass() + { + return 'form_plugin_enable'; + } + + /** + * Action of the form + * + * @return string URL of the action + */ + + function action() + { + return common_local_url('pluginenable', + array('plugin' => $this->plugin)); + } + + /** + * Action elements + * + * @return void + */ + + function formActions() + { + // TRANS: Plugin admin panel controls + $this->out->submit('submit', _m('plugin', 'Enable')); + } +} diff --git a/lib/pluginlist.php b/lib/pluginlist.php new file mode 100644 index 000000000..07a17ba39 --- /dev/null +++ b/lib/pluginlist.php @@ -0,0 +1,213 @@ +. + * + * @category Settings + * @package StatusNet + * @author Brion Vibber + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require INSTALLDIR . "/lib/pluginenableform.php"; +require INSTALLDIR . "/lib/plugindisableform.php"; + +/** + * Plugin list + * + * @category Admin + * @package StatusNet + * @author Brion Vibber + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class PluginList extends Widget +{ + var $plugins = array(); + + function __construct($plugins, $out) + { + parent::__construct($out); + $this->plugins = $plugins; + } + + function show() + { + $this->startList(); + $this->showPlugins(); + $this->endList(); + } + + function startList() + { + $this->out->elementStart('table', 'plugin_list'); + } + + function endList() + { + $this->out->elementEnd('table'); + } + + function showPlugins() + { + foreach ($this->plugins as $plugin) { + $pli = $this->newListItem($plugin); + $pli->show(); + } + } + + function newListItem($plugin) + { + return new PluginListItem($plugin, $this->out); + } +} + +class PluginListItem extends Widget +{ + /** Current plugin. */ + var $plugin = null; + + /** Local cache for plugin version info */ + protected static $versions = false; + + function __construct($plugin, $out) + { + parent::__construct($out); + $this->plugin = $plugin; + } + + function show() + { + $meta = $this->metaInfo(); + + $this->out->elementStart('tr', array('id' => 'plugin-' . $this->plugin)); + + // Name and controls + $this->out->elementStart('td'); + $this->out->elementStart('div'); + if (!empty($meta['homepage'])) { + $this->out->elementStart('a', array('href' => $meta['homepage'])); + } + $this->out->text($this->plugin); + if (!empty($meta['homepage'])) { + $this->out->elementEnd('a'); + } + $this->out->elementEnd('div'); + + $form = $this->getControlForm(); + $form->show(); + + $this->out->elementEnd('td'); + + // Version and authors + $this->out->elementStart('td'); + if (!empty($meta['version'])) { + $this->out->elementStart('div'); + $this->out->text($meta['version']); + $this->out->elementEnd('div'); + } + if (!empty($meta['author'])) { + $this->out->elementStart('div'); + $this->out->text($meta['author']); + $this->out->elementEnd('div'); + } + $this->out->elementEnd('td'); + + // Description + $this->out->elementStart('td'); + if (!empty($meta['rawdescription'])) { + $this->out->raw($meta['rawdescription']); + } + $this->out->elementEnd('td'); + + $this->out->elementEnd('tr'); + } + + /** + * Pull up the appropriate control form for this plugin, depending + * on its current state. + * + * @return Form + */ + protected function getControlForm() + { + $key = 'disable-' . $this->plugin; + if (common_config('plugins', $key)) { + return new PluginEnableForm($this->out, $this->plugin); + } else { + return new PluginDisableForm($this->out, $this->plugin); + } + } + + /** + * Grab metadata about this plugin... + * Warning: horribly inefficient and may explode! + * Doesn't work for disabled plugins either. + * + * @fixme pull structured data from plugin source + */ + function metaInfo() + { + $versions = self::getPluginVersions(); + $found = false; + + foreach ($versions as $info) { + // hack for URL shorteners... "LilUrl (ur1.ca)" etc + list($name, ) = explode(' ', $info['name']); + + if ($name == $this->plugin) { + if ($found) { + // hack for URL shorteners... + $found['rawdescription'] .= "
\n" . $info['rawdescription']; + } else { + $found = $info; + } + } + } + + if ($found) { + return $found; + } else { + return array('name' => $this->plugin, + 'rawdescription' => _m('plugin-description', + '(Plugin descriptions unavailable when disabled.)')); + } + } + + /** + * Lazy-load the set of active plugin version info + * @return array + */ + protected static function getPluginVersions() + { + if (!is_array(self::$versions)) { + $versions = array(); + Event::handle('PluginVersion', array(&$versions)); + self::$versions = $versions; + } + return self::$versions; + } +} diff --git a/lib/router.php b/lib/router.php index a48ee875e..9fe2f60ae 100644 --- a/lib/router.php +++ b/lib/router.php @@ -658,6 +658,13 @@ class Router $m->connect('admin/sessions', array('action' => 'sessionsadminpanel')); $m->connect('admin/sitenotice', array('action' => 'sitenoticeadminpanel')); $m->connect('admin/snapshot', array('action' => 'snapshotadminpanel')); + $m->connect('admin/plugins', array('action' => 'pluginsadminpanel')); + $m->connect('admin/plugins/enable/:plugin', + array('action' => 'pluginenable'), + array('plugin' => '[A-Za-z0-9_]+')); + $m->connect('admin/plugins/disable/:plugin', + array('action' => 'plugindisable'), + array('plugin' => '[A-Za-z0-9_]+')); $m->connect('getfile/:filename', array('action' => 'getfile'), diff --git a/lib/statusnet.php b/lib/statusnet.php index 776cfb579..98f25c8a0 100644 --- a/lib/statusnet.php +++ b/lib/statusnet.php @@ -163,6 +163,11 @@ class StatusNet { // Load default plugins foreach (common_config('plugins', 'default') as $name => $params) { + $key = 'disable-' . $name; + if (common_config('plugins', $key)) { + continue; + } + if (is_null($params)) { addPlugin($name); } else if (is_array($params)) { -- cgit v1.2.3-54-g00ecf From 9398c61ed321472ab7131c063ed319a51d2b2bef Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Mon, 1 Mar 2010 21:40:42 -0500 Subject: Use PHP exceptions for PEAR error handling. Allows for the common try/catch construct, which makes error handling cleaner and easier. --- index.php | 97 ++++++++++++++++++++++++++++++---------------------------- lib/common.php | 12 ++++++++ 2 files changed, 63 insertions(+), 46 deletions(-) (limited to 'lib') diff --git a/index.php b/index.php index 6bfbc11da..78c4de62a 100644 --- a/index.php +++ b/index.php @@ -37,8 +37,6 @@ define('INSTALLDIR', dirname(__FILE__)); define('STATUSNET', true); define('LACONICA', true); // compatibility -require_once INSTALLDIR . '/lib/common.php'; - $user = null; $action = null; @@ -68,52 +66,63 @@ function getPath($req) */ function handleError($error) { - if ($error->getCode() == DB_DATAOBJECT_ERROR_NODATA) { - return; - } + try { - $logmsg = "PEAR error: " . $error->getMessage(); - if (common_config('site', 'logdebug')) { - $logmsg .= " : ". $error->getDebugInfo(); - } - // DB queries often end up with a lot of newlines; merge to a single line - // for easier grepability... - $logmsg = str_replace("\n", " ", $logmsg); - common_log(LOG_ERR, $logmsg); - - // @fixme backtrace output should be consistent with exception handling - if (common_config('site', 'logdebug')) { - $bt = $error->getBacktrace(); - foreach ($bt as $n => $line) { - common_log(LOG_ERR, formatBacktraceLine($n, $line)); + if ($error->getCode() == DB_DATAOBJECT_ERROR_NODATA) { + return; } - } - if ($error instanceof DB_DataObject_Error - || $error instanceof DB_Error - ) { - $msg = sprintf( - _( - 'The database for %s isn\'t responding correctly, '. - 'so the site won\'t work properly. '. - 'The site admins probably know about the problem, '. - 'but you can contact them at %s to make sure. '. - 'Otherwise, wait a few minutes and try again.' - ), - common_config('site', 'name'), - common_config('site', 'email') - ); - } else { - $msg = _( - 'An important error occured, probably related to email setup. '. - 'Check logfiles for more info..' - ); - } - $dac = new DBErrorAction($msg, 500); - $dac->showPage(); + $logmsg = "PEAR error: " . $error->getMessage(); + if ($error instanceof PEAR_Exception && common_config('site', 'logdebug')) { + $logmsg .= " : ". $error->toText(); + } + // DB queries often end up with a lot of newlines; merge to a single line + // for easier grepability... + $logmsg = str_replace("\n", " ", $logmsg); + common_log(LOG_ERR, $logmsg); + + // @fixme backtrace output should be consistent with exception handling + if (common_config('site', 'logdebug')) { + $bt = $error->getTrace(); + foreach ($bt as $n => $line) { + common_log(LOG_ERR, formatBacktraceLine($n, $line)); + } + } + if ($error instanceof DB_DataObject_Error + || $error instanceof DB_Error + || ($error instanceof PEAR_Exception && $error->getCode() == -24) + ) { + $msg = sprintf( + _( + 'The database for %s isn\'t responding correctly, '. + 'so the site won\'t work properly. '. + 'The site admins probably know about the problem, '. + 'but you can contact them at %s to make sure. '. + 'Otherwise, wait a few minutes and try again.' + ), + common_config('site', 'name'), + common_config('site', 'email') + ); + } else { + $msg = _( + 'An important error occured, probably related to email setup. '. + 'Check logfiles for more info..' + ); + } + + $dac = new DBErrorAction($msg, 500); + $dac->showPage(); + + } catch (Exception $e) { + echo _('An error occurred.'); + } exit(-1); } +set_exception_handler('handleError'); + +require_once INSTALLDIR . '/lib/common.php'; + /** * Format a backtrace line for debug output roughly like debug_print_backtrace() does. * Exceptions already have this built in, but PEAR error objects just give us the array. @@ -238,10 +247,6 @@ function main() return; } - // For database errors - - PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'handleError'); - // Make sure RW database is setup setupRW(); diff --git a/lib/common.php b/lib/common.php index 8d2e6b420..45946c216 100644 --- a/lib/common.php +++ b/lib/common.php @@ -71,6 +71,7 @@ if (!function_exists('dl')) { # global configuration object require_once('PEAR.php'); +require_once('PEAR/Exception.php'); require_once('DB/DataObject.php'); require_once('DB/DataObject/Cast.php'); # for dates @@ -127,6 +128,17 @@ require_once INSTALLDIR.'/lib/subs.php'; require_once INSTALLDIR.'/lib/clientexception.php'; require_once INSTALLDIR.'/lib/serverexception.php'; + +//set PEAR error handling to use regular PHP exceptions +function PEAR_ErrorToPEAR_Exception($err) +{ + if ($err->getCode()) { + throw new PEAR_Exception($err->getMessage(), $err->getCode()); + } + throw new PEAR_Exception($err->getMessage()); +} +PEAR::setErrorHandling(PEAR_ERROR_CALLBACK, 'PEAR_ErrorToPEAR_Exception'); + try { StatusNet::init(@$server, @$path, @$conffile); } catch (NoConfigException $e) { -- cgit v1.2.3-54-g00ecf From 14adb7cc41e3d5d4e543c1f13f7a60d3cadb5c71 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 26 Apr 2010 02:40:36 -0400 Subject: Give users more control over URL shortening Users and administrators can set how long an URL can be before it's shortened, and how long a notice can be before all its URLs are shortened. They can also turn off shortening altogether. Squashed commit of the following: commit d136b390115829c4391b3666bb1967f190a0de35 Author: Evan Prodromou Date: Mon Apr 26 02:39:00 2010 -0400 use site and user settings to determine when to shorten URLs commit 1e1c851ff3cb2da5e0dc3a0b06239a9d9c618488 Author: Evan Prodromou Date: Mon Apr 26 02:38:40 2010 -0400 add a method to force shortening URLs commit 4d29ca0b91201f6df42940297ed5b64b070efe49 Author: Evan Prodromou Date: Mon Apr 26 02:37:41 2010 -0400 static method for getting best URL shortening service commit a9c6a3bace0af44bcf38d1c790425a7be9c72147 Author: Evan Prodromou Date: Mon Apr 26 02:37:11 2010 -0400 allow 0 in numeric entries in othersettings commit 767ff2f7ecfd7e76e8418fc79d45e61898f09382 Author: Evan Prodromou Date: Mon Apr 26 02:36:46 2010 -0400 allow 0 or blank string in inputs commit 1e21af42a685f600f4a53f49a194013e78b12f20 Author: Evan Prodromou Date: Mon Apr 26 02:01:11 2010 -0400 add more URL-shortening options to othersettings commit 869a6be0f5779aff69018d02f9ac0273946040d9 Author: Evan Prodromou Date: Sat Apr 24 14:22:51 2010 -0400 move url shortener superclass to lib from plugin commit 9c0c9863d532942b99184f14e923fc3c050f8177 Author: Evan Prodromou Date: Sat Apr 24 14:20:28 2010 -0400 documentation and whitespace on UrlShortenerPlugin commit 7a1dd5798f0fcf2c03d1257a18ddcb9008879de0 Author: Evan Prodromou Date: Sat Apr 24 14:05:46 2010 -0400 add defaults for URL shortening commit d259c37ad231ca0010c60e5cfd397bb1732874a4 Author: Evan Prodromou Date: Sat Apr 24 13:40:10 2010 -0400 Add User_urlshortener_prefs Add a table for URL shortener prefs, a corresponding class, and the correct mumbo-jumbo in statusnet.ini to make everything work. --- README | 20 +++- actions/othersettings.php | 58 ++++++++++- classes/File_redirection.php | 38 ++++++- classes/User_urlshortener_prefs.php | 105 +++++++++++++++++++ classes/statusnet.ini | 11 ++ db/statusnet.sql | 13 +++ lib/default.php | 4 + lib/htmloutputter.php | 2 +- lib/urlshortenerplugin.php | 155 ++++++++++++++++++++++++++++ lib/util.php | 54 +++++++--- plugins/BitlyUrl/BitlyUrlPlugin.php | 2 - plugins/LilUrl/LilUrlPlugin.php | 2 - plugins/PtitUrl/PtitUrlPlugin.php | 1 - plugins/SimpleUrl/SimpleUrlPlugin.php | 2 - plugins/TightUrl/TightUrlPlugin.php | 2 - plugins/UrlShortener/UrlShortenerPlugin.php | 95 ----------------- 16 files changed, 435 insertions(+), 129 deletions(-) create mode 100755 classes/User_urlshortener_prefs.php create mode 100644 lib/urlshortenerplugin.php delete mode 100644 plugins/UrlShortener/UrlShortenerPlugin.php (limited to 'lib') diff --git a/README b/README index 1e244c448..dcf305ea6 100644 --- a/README +++ b/README @@ -843,9 +843,7 @@ sslserver: use an alternate server name for SSL URLs, like parameters correctly so that both the SSL server and the "normal" server can access the session cookie and preferably other cookies as well. -shorturllength: Length of URL at which URLs in a message exceeding 140 - characters will be sent to the user's chosen - shortening service. +shorturllength: ignored. See 'url' section below. dupelimit: minimum time allowed for one person to say the same thing twice. Default 60s. Anything lower is considered a user or UI error. @@ -1468,6 +1466,22 @@ disallow: Array of (virtual) directories to disallow. Default is 'main', 'search', 'message', 'settings', 'admin'. Ignored when site is private, in which case the entire site ('/') is disallowed. +url +--- + +Everybody loves URL shorteners. These are some options for fine-tuning +how and when the server shortens URLs. + +shortener: URL shortening service to use by default. Users can override + individually. 'ur1.ca' by default. +maxlength: If an URL is strictly longer than this limit, it will be + shortened. Note that the URL shortener service may return an + URL longer than this limit. Defaults to 25. Users can + override. If set to 0, all URLs will be shortened. +maxnoticelength: If a notice is strictly longer than this limit, all + URLs in the notice will be shortened. Users can override. + -1 means the text limit for notices. + Plugins ======= diff --git a/actions/othersettings.php b/actions/othersettings.php index 10e9873b3..8d6e00404 100644 --- a/actions/othersettings.php +++ b/actions/othersettings.php @@ -98,8 +98,10 @@ class OthersettingsAction extends AccountSettingsAction $this->hidden('token', common_session_token()); $this->elementStart('ul', 'form_data'); - $shorteners = array(); + $shorteners = array(_('[none]') => array('freeService' => false)); + Event::handle('GetUrlShorteners', array(&$shorteners)); + $services = array(); foreach($shorteners as $name=>$value) { @@ -119,8 +121,22 @@ class OthersettingsAction extends AccountSettingsAction $this->elementEnd('li'); } $this->elementStart('li'); + $this->input('maxurllength', + _('URL longer than'), + (!is_null($this->arg('maxurllength'))) ? + $this->arg('maxurllength') : User_urlshortener_prefs::maxUrlLength($user), + _('URLs longer than this will be shortened.')); + $this->elementEnd('li'); + $this->elementStart('li'); + $this->input('maxnoticelength', + _('Text longer than'), + (!is_null($this->arg('maxnoticelength'))) ? + $this->arg('maxnoticelength') : User_urlshortener_prefs::maxNoticeLength($user), + _('URLs in notices longer than this will be shortened.')); + $this->elementEnd('li'); + $this->elementStart('li'); $this->checkbox('viewdesigns', _('View profile designs'), - $user->viewdesigns, _('Show or hide profile designs.')); + - $user->viewdesigns, _('Show or hide profile designs.')); $this->elementEnd('li'); $this->elementEnd('ul'); $this->submit('save', _('Save')); @@ -156,6 +172,18 @@ class OthersettingsAction extends AccountSettingsAction $viewdesigns = $this->boolean('viewdesigns'); + $maxurllength = $this->trimmed('maxurllength'); + + if (!Validate::number($maxurllength, array('min' => 0))) { + throw new ClientException(_('Invalid number for max url length.')); + } + + $maxnoticelength = $this->trimmed('maxnoticelength'); + + if (!Validate::number($maxnoticelength, array('min' => 0))) { + throw new ClientException(_('Invalid number for max notice length.')); + } + $user = common_current_user(); assert(!is_null($user)); // should already be checked @@ -175,6 +203,32 @@ class OthersettingsAction extends AccountSettingsAction return; } + $prefs = User_urlshortener_prefs::getPrefs($user); + $orig = null; + + if (empty($prefs)) { + $prefs = new User_urlshortener_prefs(); + + $prefs->user_id = $user->id; + $prefs->created = common_sql_now(); + } else { + $orig = clone($prefs); + } + + $prefs->urlshorteningservice = $urlshorteningservice; + $prefs->maxurllength = $maxurllength; + $prefs->maxnoticelength = $maxnoticelength; + + if (!empty($orig)) { + $result = $prefs->update($orig); + } else { + $result = $prefs->insert(); + } + + if (!$result) { + throw new ServerException(_('Error saving user URL shortening preferences.')); + } + $user->query('COMMIT'); $this->showForm(_('Preferences saved.'), true); diff --git a/classes/File_redirection.php b/classes/File_redirection.php index f128b3e07..00ec75309 100644 --- a/classes/File_redirection.php +++ b/classes/File_redirection.php @@ -176,22 +176,52 @@ class File_redirection extends Memcached_DataObject * @param string $long_url * @return string */ - function makeShort($long_url) { + function makeShort($long_url) + { $canon = File_redirection::_canonUrl($long_url); $short_url = File_redirection::_userMakeShort($canon); // Did we get one? Is it shorter? - if (!empty($short_url) && mb_strlen($short_url) < mb_strlen($long_url)) { + + if (!empty($short_url)) { + return $short_url; + } else { + return $long_url; + } + } + + /** + * Shorten a URL with the current user's configured shortening + * options, if applicable. + * + * If it cannot be shortened or the "short" URL is longer than the + * original, the original is returned. + * + * If the referenced item has not been seen before, embedding data + * may be saved. + * + * @param string $long_url + * @return string + */ + + function forceShort($long_url) + { + $canon = File_redirection::_canonUrl($long_url); + + $short_url = File_redirection::_userMakeShort($canon, true); + + // Did we get one? Is it shorter? + if (!empty($short_url)) { return $short_url; } else { return $long_url; } } - function _userMakeShort($long_url) { - $short_url = common_shorten_url($long_url); + function _userMakeShort($long_url, $force = false) { + $short_url = common_shorten_url($long_url, $force); if (!empty($short_url) && $short_url != $long_url) { $short_url = (string)$short_url; // store it diff --git a/classes/User_urlshortener_prefs.php b/classes/User_urlshortener_prefs.php new file mode 100755 index 000000000..e0f85af01 --- /dev/null +++ b/classes/User_urlshortener_prefs.php @@ -0,0 +1,105 @@ +. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class User_urlshortener_prefs extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'user_urlshortener_prefs'; // table name + public $user_id; // int(4) primary_key not_null + public $urlshorteningservice; // varchar(50) default_ur1.ca + public $maxurllength; // int(4) not_null + public $maxnoticelength; // int(4) not_null + public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00 + public $modified; // timestamp not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User_urlshortener_prefs',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE + + function sequenceKey() + { + return array(false, false, false); + } + + static function maxUrlLength($user) + { + $def = common_config('url', 'maxlength'); + + $prefs = self::getPrefs($user); + + if (empty($prefs)) { + return $def; + } else { + return $prefs->maxurllength; + } + } + + static function maxNoticeLength($user) + { + $def = common_config('url', 'maxnoticelength'); + + if ($def == -1) { + $def = Notice::maxContent(); + } + + $prefs = self::getPrefs($user); + + if (empty($prefs)) { + return $def; + } else { + return $prefs->maxnoticelength; + } + } + + static function urlShorteningService($user) + { + $def = common_config('url', 'shortener'); + + $prefs = self::getPrefs($user); + + if (empty($prefs)) { + if (!empty($user)) { + return $user->urlshorteningservice; + } else { + return $def; + } + } else { + return $prefs->urlshorteningservice; + } + } + + static function getPrefs($user) + { + if (empty($user)) { + return null; + } + + $prefs = User_urlshortener_prefs::staticGet('user_id', $user->id); + + return $prefs; + } +} diff --git a/classes/statusnet.ini b/classes/statusnet.ini index 473bd6ff5..d13fdfa52 100644 --- a/classes/statusnet.ini +++ b/classes/statusnet.ini @@ -649,3 +649,14 @@ user_id = K transport = K transport = U screenname = U + +[user_urlshortener_prefs] +user_id = 129 +urlshorteningservice = 2 +maxurllength = 129 +maxnoticelength = 129 +created = 142 +modified = 384 + +[user_urlshortener_prefs__keys] +user_id = K diff --git a/db/statusnet.sql b/db/statusnet.sql index 16d09a11f..a0c497fff 100644 --- a/db/statusnet.sql +++ b/db/statusnet.sql @@ -665,3 +665,16 @@ create table local_group ( modified timestamp comment 'date this record was modified' ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table user_urlshortener_prefs ( + + user_id integer not null comment 'user' references user (id), + urlshorteningservice varchar(50) default 'ur1.ca' comment 'service to use for auto-shortening URLs', + maxurllength integer not null comment 'urls greater than this length will be shortened, 0 = always, null = never', + maxnoticelength integer not null comment 'notices with content greater than this value will have all urls shortened, 0 = always, null = never', + + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + constraint primary key (user_id) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; diff --git a/lib/default.php b/lib/default.php index c98f179ae..dec08fc06 100644 --- a/lib/default.php +++ b/lib/default.php @@ -304,4 +304,8 @@ $default = array('subscribers' => true, 'members' => true, 'peopletag' => true), + 'url' => + array('shortener' => 'ur1.ca', + 'maxlength' => 25, + 'maxnoticelength' => -1) ); diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index 7786b5941..9d06ba23c 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -176,7 +176,7 @@ class HTMLOutputter extends XMLOutputter $attrs = array('name' => $id, 'type' => 'text', 'id' => $id); - if ($value) { + if (!is_null($value)) { // value can be 0 or '' $attrs['value'] = $value; } $this->element('input', $attrs); diff --git a/lib/urlshortenerplugin.php b/lib/urlshortenerplugin.php new file mode 100644 index 000000000..8acfac26f --- /dev/null +++ b/lib/urlshortenerplugin.php @@ -0,0 +1,155 @@ +. + * + * @category Plugin + * @package StatusNet + * @author Craig Andrews + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +/** + * Superclass for plugins that do URL shortening + * + * @category Plugin + * @package StatusNet + * @author Craig Andrews + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +abstract class UrlShortenerPlugin extends Plugin +{ + public $shortenerName; + public $freeService = false; + + // Url Shortener plugins should implement some (or all) + // of these methods + + /** + * Make an URL shorter. + * + * @param string $url URL to shorten + * + * @return string shortened version of the url, or null on failure + */ + + protected abstract function shorten($url); + + /** + * Utility to get the data at an URL + * + * @param string $url URL to fetch + * + * @return string response body + * + * @todo rename to code-standard camelCase httpGet() + */ + + protected function http_get($url) + { + $request = HTTPClient::start(); + $response = $request->get($url); + return $response->getBody(); + } + + /** + * Utility to post a request and get a response URL + * + * @param string $url URL to fetch + * @param array $data post parameters + * + * @return string response body + * + * @todo rename to code-standard httpPost() + */ + + protected function http_post($url, $data) + { + $request = HTTPClient::start(); + $response = $request->post($url, null, $data); + return $response->getBody(); + } + + // Hook handlers + + /** + * Called when all plugins have been initialized + * + * @return boolean hook value + */ + + function onInitializePlugin() + { + if (!isset($this->shortenerName)) { + throw new Exception("must specify a shortenerName"); + } + return true; + } + + /** + * Called when a showing the URL shortener drop-down box + * + * Properties of the shortening service currently only + * include whether it's a free service. + * + * @param array &$shorteners array mapping shortener name to properties + * + * @return boolean hook value + */ + + function onGetUrlShorteners(&$shorteners) + { + $shorteners[$this->shortenerName] = + array('freeService' => $this->freeService); + return true; + } + + /** + * Called to shorten an URL + * + * @param string $url URL to shorten + * @param string $shortenerName Shortening service. Don't handle if it's + * not you! + * @param string &$shortenedUrl URL after shortening; out param. + * + * @return boolean hook value + */ + + function onStartShortenUrl($url, $shortenerName, &$shortenedUrl) + { + if ($shortenerName == $this->shortenerName) { + $result = $this->shorten($url); + if (isset($result) && $result != null && $result !== false) { + $shortenedUrl = $result; + common_log(LOG_INFO, + __CLASS__ . ": $this->shortenerName ". + "shortened $url to $shortenedUrl"); + return false; + } + } + return true; + } +} diff --git a/lib/util.php b/lib/util.php index 96d21bc59..c78ed33bd 100644 --- a/lib/util.php +++ b/lib/util.php @@ -828,9 +828,21 @@ function common_linkify($url) { function common_shorten_links($text) { - $maxLength = Notice::maxContent(); - if ($maxLength == 0 || mb_strlen($text) <= $maxLength) return $text; - return common_replace_urls_callback($text, array('File_redirection', 'makeShort')); + common_debug("common_shorten_links() called"); + + $user = common_current_user(); + + $maxLength = User_urlshortener_prefs::maxNoticeLength($user); + + common_debug("maxLength = $maxLength"); + + if (mb_strlen($text) > $maxLength) { + common_debug("Forcing shortening"); + return common_replace_urls_callback($text, array('File_redirection', 'forceShort')); + } else { + common_debug("Not forcing shortening"); + return common_replace_urls_callback($text, array('File_redirection', 'makeShort')); + } } function common_xml_safe_str($str) @@ -1392,7 +1404,7 @@ function common_valid_tag($tag) * Determine if given domain or address literal is valid * eg for use in JIDs and URLs. Does not check if the domain * exists! - * + * * @param string $domain * @return boolean valid or not */ @@ -1734,30 +1746,42 @@ function common_database_tablename($tablename) /** * Shorten a URL with the current user's configured shortening service, * or ur1.ca if configured, or not at all if no shortening is set up. - * Length is not considered. * - * @param string $long_url + * @param string $long_url original URL + * @param boolean $force Force shortening (used when notice is too long) + * * @return string may return the original URL if shortening failed * * @fixme provide a way to specify a particular shortener * @fixme provide a way to specify to use a given user's shortening preferences */ -function common_shorten_url($long_url) + +function common_shorten_url($long_url, $force = false) { + common_debug("Shortening URL '$long_url' (force = $force)"); + $long_url = trim($long_url); + $user = common_current_user(); - if (empty($user)) { - // common current user does not find a user when called from the XMPP daemon - // therefore we'll set one here fix, so that XMPP given URLs may be shortened - $shortenerName = 'ur1.ca'; - } else { - $shortenerName = $user->urlshorteningservice; + + $maxUrlLength = User_urlshortener_prefs::maxUrlLength($user); + common_debug("maxUrlLength = $maxUrlLength"); + + // $force forces shortening even if it's not strictly needed + + if (mb_strlen($long_url) < $maxUrlLength && !$force) { + common_debug("Skipped shortening URL."); + return $long_url; } - if(Event::handle('StartShortenUrl', array($long_url,$shortenerName,&$shortenedUrl))){ + $shortenerName = User_urlshortener_prefs::urlShorteningService($user); + + common_debug("Shortener name = '$shortenerName'"); + + if (Event::handle('StartShortenUrl', array($long_url, $shortenerName, &$shortenedUrl))) { //URL wasn't shortened, so return the long url return $long_url; - }else{ + } else { //URL was shortened, so return the result return trim($shortenedUrl); } diff --git a/plugins/BitlyUrl/BitlyUrlPlugin.php b/plugins/BitlyUrl/BitlyUrlPlugin.php index f7f28b4d6..b649d3d0b 100644 --- a/plugins/BitlyUrl/BitlyUrlPlugin.php +++ b/plugins/BitlyUrl/BitlyUrlPlugin.php @@ -31,8 +31,6 @@ if (!defined('STATUSNET')) { exit(1); } -require_once INSTALLDIR.'/plugins/UrlShortener/UrlShortenerPlugin.php'; - class BitlyUrlPlugin extends UrlShortenerPlugin { public $serviceUrl; diff --git a/plugins/LilUrl/LilUrlPlugin.php b/plugins/LilUrl/LilUrlPlugin.php index c3e37c0c0..cdff9f4e6 100644 --- a/plugins/LilUrl/LilUrlPlugin.php +++ b/plugins/LilUrl/LilUrlPlugin.php @@ -31,8 +31,6 @@ if (!defined('STATUSNET')) { exit(1); } -require_once INSTALLDIR.'/plugins/UrlShortener/UrlShortenerPlugin.php'; - class LilUrlPlugin extends UrlShortenerPlugin { public $serviceUrl; diff --git a/plugins/PtitUrl/PtitUrlPlugin.php b/plugins/PtitUrl/PtitUrlPlugin.php index ddba942e6..cdf46846b 100644 --- a/plugins/PtitUrl/PtitUrlPlugin.php +++ b/plugins/PtitUrl/PtitUrlPlugin.php @@ -30,7 +30,6 @@ if (!defined('STATUSNET')) { exit(1); } -require_once INSTALLDIR.'/plugins/UrlShortener/UrlShortenerPlugin.php'; class PtitUrlPlugin extends UrlShortenerPlugin { diff --git a/plugins/SimpleUrl/SimpleUrlPlugin.php b/plugins/SimpleUrl/SimpleUrlPlugin.php index 6eac7dbb1..5d3f97d33 100644 --- a/plugins/SimpleUrl/SimpleUrlPlugin.php +++ b/plugins/SimpleUrl/SimpleUrlPlugin.php @@ -31,8 +31,6 @@ if (!defined('STATUSNET')) { exit(1); } -require_once INSTALLDIR.'/plugins/UrlShortener/UrlShortenerPlugin.php'; - class SimpleUrlPlugin extends UrlShortenerPlugin { public $serviceUrl; diff --git a/plugins/TightUrl/TightUrlPlugin.php b/plugins/TightUrl/TightUrlPlugin.php index e2d494a7b..f242db6c8 100644 --- a/plugins/TightUrl/TightUrlPlugin.php +++ b/plugins/TightUrl/TightUrlPlugin.php @@ -31,8 +31,6 @@ if (!defined('STATUSNET')) { exit(1); } -require_once INSTALLDIR.'/plugins/UrlShortener/UrlShortenerPlugin.php'; - class TightUrlPlugin extends UrlShortenerPlugin { public $serviceUrl; diff --git a/plugins/UrlShortener/UrlShortenerPlugin.php b/plugins/UrlShortener/UrlShortenerPlugin.php deleted file mode 100644 index 027624b7a..000000000 --- a/plugins/UrlShortener/UrlShortenerPlugin.php +++ /dev/null @@ -1,95 +0,0 @@ -. - * - * @category Plugin - * @package StatusNet - * @author Craig Andrews - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -/** - * Superclass for plugins that do URL shortening - * - * @category Plugin - * @package StatusNet - * @author Craig Andrews - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -abstract class UrlShortenerPlugin extends Plugin -{ - public $shortenerName; - public $freeService=false; - //------------Url Shortener plugin should implement some (or all) of these methods------------\\ - - /** - * Short a URL - * @param url - * @return string shortened version of the url, or null if URL shortening failed - */ - protected abstract function shorten($url); - - //------------These methods may help you implement your plugin------------\\ - protected function http_get($url) - { - $request = HTTPClient::start(); - $response = $request->get($url); - return $response->getBody(); - } - - protected function http_post($url,$data) - { - $request = HTTPClient::start(); - $response = $request->post($url, null, $data); - return $response->getBody(); - } - - //------------Below are the methods that connect StatusNet to the implementing Url Shortener plugin------------\\ - - function onInitializePlugin(){ - if(!isset($this->shortenerName)){ - throw new Exception("must specify a shortenerName"); - } - } - - function onGetUrlShorteners(&$shorteners) - { - $shorteners[$this->shortenerName]=array('freeService'=>$this->freeService); - } - - function onStartShortenUrl($url,$shortenerName,&$shortenedUrl) - { - if($shortenerName == $this->shortenerName && strlen($url) >= common_config('site', 'shorturllength')){ - $result = $this->shorten($url); - if(isset($result) && $result != null && $result !== false){ - $shortenedUrl=$result; - common_log(LOG_INFO, __CLASS__ . ": $this->shortenerName shortened $url to $shortenedUrl"); - return false; - } - } - } -} -- cgit v1.2.3-54-g00ecf From 5414396a2ee9f1401d69b60969e04a1941e24e21 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 30 Apr 2010 14:41:54 -0700 Subject: IM cleanup on 1.0.x branch: * Fake_XMPP back to Queued_XMPP, refactor how we use it and don't create objects and load classes until we need them. * fix fatal error in IM settings while waiting for a Jabber confirmation. * Caching fix for user_im_prefs * fix for saving multiple transport settings * some fixes for AIM & using normalized addresses for lookups --- actions/imsettings.php | 17 +++--- classes/User_im_prefs.php | 23 ++++++++ classes/statusnet.ini | 6 ++- lib/implugin.php | 25 ++++++--- plugins/Aim/AimPlugin.php | 9 +++- plugins/Aim/README | 2 +- plugins/Xmpp/Fake_XMPP.php | 114 ---------------------------------------- plugins/Xmpp/Queued_XMPP.php | 121 +++++++++++++++++++++++++++++++++++++++++++ plugins/Xmpp/XmppPlugin.php | 27 +++++----- 9 files changed, 198 insertions(+), 146 deletions(-) delete mode 100644 plugins/Xmpp/Fake_XMPP.php create mode 100644 plugins/Xmpp/Queued_XMPP.php (limited to 'lib') diff --git a/actions/imsettings.php b/actions/imsettings.php index 2c2606b76..662b1063e 100644 --- a/actions/imsettings.php +++ b/actions/imsettings.php @@ -133,8 +133,7 @@ class ImsettingsAction extends ConnectSettingsAction 'message with further instructions. '. '(Did you add %s to your buddy list?)'), $transport_info['display'], - $transport_info['daemon_screenname'], - jabber_daemon_address())); + $transport_info['daemon_screenname'])); $this->hidden('screenname', $confirm->address); // TRANS: Button label to cancel an IM address confirmation procedure. $this->submit('cancel', _m('BUTTON','Cancel')); @@ -163,12 +162,11 @@ class ImsettingsAction extends ConnectSettingsAction 'action' => common_local_url('imsettings'))); $this->elementStart('fieldset', array('id' => 'settings_im_preferences')); - $this->element('legend', null, _('Preferences')); + // TRANS: Header for IM preferences form. + $this->element('legend', null, _('IM Preferences')); $this->hidden('token', common_session_token()); $this->elementStart('table'); $this->elementStart('tr'); - // TRANS: Header for IM preferences form. - $this->element('th', null, _('IM Preferences')); foreach($user_im_prefs_by_transport as $transport=>$user_im_prefs) { $this->element('th', null, $transports[$transport]['display']); @@ -278,19 +276,20 @@ class ImsettingsAction extends ConnectSettingsAction $user = common_current_user(); $user_im_prefs = new User_im_prefs(); + $user_im_prefs->query('BEGIN'); $user_im_prefs->user_id = $user->id; if($user_im_prefs->find() && $user_im_prefs->fetch()) { $preferences = array('notify', 'updatefrompresence', 'replies', 'microid'); - $user_im_prefs->query('BEGIN'); do { $original = clone($user_im_prefs); + $new = clone($user_im_prefs); foreach($preferences as $preference) { - $user_im_prefs->$preference = $this->boolean($user_im_prefs->transport . '_' . $preference); + $new->$preference = $this->boolean($new->transport . '_' . $preference); } - $result = $user_im_prefs->update($original); + $result = $new->update($original); if ($result === false) { common_log_db_error($user, 'UPDATE', __FILE__); @@ -299,8 +298,8 @@ class ImsettingsAction extends ConnectSettingsAction return; } }while($user_im_prefs->fetch()); - $user_im_prefs->query('COMMIT'); } + $user_im_prefs->query('COMMIT'); // TRANS: Confirmation message for successful IM preferences save. $this->showForm(_('Preferences saved.'), true); } diff --git a/classes/User_im_prefs.php b/classes/User_im_prefs.php index 8ecdfe9fa..75be8969e 100644 --- a/classes/User_im_prefs.php +++ b/classes/User_im_prefs.php @@ -68,4 +68,27 @@ class User_im_prefs extends Memcached_DataObject { return array(false,false); } + + /** + * We have two compound keys with unique constraints: + * (transport, user_id) which is our primary key, and + * (transport, screenname) which is an additional constraint. + * + * Currently there's not a way to represent that second key + * in the general keys list, so we're adding it here to the + * list of keys to use for caching, ensuring that it gets + * cleared as well when we change. + * + * @return array of cache keys + */ + function _allCacheKeys() + { + $ukeys = 'transport,screenname'; + $uvals = $this->transport . ',' . $this->screenname; + + $ckeys = parent::_allCacheKeys(); + $ckeys[] = $this->cacheKey($this->tableName(), $ukeys, $uvals); + return $ckeys; + } + } diff --git a/classes/statusnet.ini b/classes/statusnet.ini index d13fdfa52..b57d86226 100644 --- a/classes/statusnet.ini +++ b/classes/statusnet.ini @@ -647,8 +647,10 @@ modified = 384 [user_im_prefs__keys] user_id = K transport = K -transport = U -screenname = U +; There's another unique index on (transport, screenname) +; but we have no way to represent a compound index other than +; the primary key in here. To ensure proper cache purging, +; we need to tweak the class. [user_urlshortener_prefs] user_id = 129 diff --git a/lib/implugin.php b/lib/implugin.php index 7302859a4..7125aaee8 100644 --- a/lib/implugin.php +++ b/lib/implugin.php @@ -107,10 +107,15 @@ abstract class ImPlugin extends Plugin * receive a raw message * Raw IM data is taken from the incoming queue, and passed to this function. * It should parse the raw message and call handle_incoming() + * + * Returning false may CAUSE REPROCESSING OF THE QUEUE ITEM, and should + * be used for temporary failures only. For permanent failures such as + * unrecognized addresses, return true to indicate your processing has + * completed. * * @param object $data raw IM data * - * @return boolean success value + * @return boolean true if processing completed, false for temporary failures */ abstract function receive_raw_message($data); @@ -185,9 +190,12 @@ abstract class ImPlugin extends Plugin */ function get_user_im_prefs_from_screenname($screenname) { - if($user_im_prefs = User_im_prefs::pkeyGet( array('transport' => $this->transport, 'screenname' => $screenname) )){ + $user_im_prefs = User_im_prefs::pkeyGet( + array('transport' => $this->transport, + 'screenname' => $this->normalize($screenname))); + if ($user_im_prefs) { return $user_im_prefs; - }else{ + } else { return false; } } @@ -203,9 +211,9 @@ abstract class ImPlugin extends Plugin function get_screenname($user) { $user_im_prefs = $this->get_user_im_prefs_from_user($user); - if($user_im_prefs){ + if ($user_im_prefs) { return $user_im_prefs->screenname; - }else{ + } else { return false; } } @@ -220,9 +228,12 @@ abstract class ImPlugin extends Plugin */ function get_user_im_prefs_from_user($user) { - if($user_im_prefs = User_im_prefs::pkeyGet( array('transport' => $this->transport, 'user_id' => $user->id) )){ + $user_im_prefs = User_im_prefs::pkeyGet( + array('transport' => $this->transport, + 'user_id' => $user->id)); + if ($user_im_prefs){ return $user_im_prefs; - }else{ + } else { return false; } } diff --git a/plugins/Aim/AimPlugin.php b/plugins/Aim/AimPlugin.php index 3855d1fb0..30da1dbc7 100644 --- a/plugins/Aim/AimPlugin.php +++ b/plugins/Aim/AimPlugin.php @@ -126,6 +126,11 @@ class AimPlugin extends ImPlugin return true; } + /** + * Accept a queued input message. + * + * @return true if processing completed, false if message should be reprocessed + */ function receive_raw_message($message) { $info=Aim::getMessageInfo($message); @@ -133,7 +138,9 @@ class AimPlugin extends ImPlugin $user = $this->get_user($from); $notice_text = $info['message']; - return $this->handle_incoming($from, $notice_text); + $this->handle_incoming($from, $notice_text); + + return true; } function initialize(){ diff --git a/plugins/Aim/README b/plugins/Aim/README index 046591738..7d486a036 100644 --- a/plugins/Aim/README +++ b/plugins/Aim/README @@ -6,7 +6,7 @@ add "addPlugin('aim', array('setting'=>'value', 'setting2'=>'value2', ...);" to the bottom of your config.php -The daemon included with this plugin must be running. It will be started by +scripts/imdaemon.php included with StatusNet must be running. It will be started by the plugin along with their other daemons when you run scripts/startdaemons.sh. See the StatusNet README for more about queuing and daemons. diff --git a/plugins/Xmpp/Fake_XMPP.php b/plugins/Xmpp/Fake_XMPP.php deleted file mode 100644 index 0f7cfd3b4..000000000 --- a/plugins/Xmpp/Fake_XMPP.php +++ /dev/null @@ -1,114 +0,0 @@ -. - * - * @category Network - * @package StatusNet - * @author Brion Vibber - * @copyright 2010 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -class Fake_XMPP extends XMPPHP_XMPP -{ - public $would_be_sent = null; - - /** - * Constructor - * - * @param string $host - * @param integer $port - * @param string $user - * @param string $password - * @param string $resource - * @param string $server - * @param boolean $printlog - * @param string $loglevel - */ - public function __construct($host, $port, $user, $password, $resource, $server = null, $printlog = false, $loglevel = null) - { - parent::__construct($host, $port, $user, $password, $resource, $server, $printlog, $loglevel); - - // We use $host to connect, but $server to build JIDs if specified. - // This seems to fix an upstream bug where $host was used to build - // $this->basejid, never seen since it isn't actually used in the base - // classes. - if (!$server) { - $server = $this->host; - } - $this->basejid = $this->user . '@' . $server; - - // Normally the fulljid is filled out by the server at resource binding - // time, but we need to do it since we're not talking to a real server. - $this->fulljid = "{$this->basejid}/{$this->resource}"; - } - - /** - * Send a formatted message to the outgoing queue for later forwarding - * to a real XMPP connection. - * - * @param string $msg - */ - public function send($msg, $timeout=NULL) - { - $this->would_be_sent = $msg; - } - - //@{ - /** - * Stream i/o functions disabled; only do output - */ - public function connect($timeout = 30, $persistent = false, $sendinit = true) - { - throw new Exception("Can't connect to server from fake XMPP."); - } - - public function disconnect() - { - throw new Exception("Can't connect to server from fake XMPP."); - } - - public function process() - { - throw new Exception("Can't read stream from fake XMPP."); - } - - public function processUntil($event, $timeout=-1) - { - throw new Exception("Can't read stream from fake XMPP."); - } - - public function read() - { - throw new Exception("Can't read stream from fake XMPP."); - } - - public function readyToProcess() - { - throw new Exception("Can't read stream from fake XMPP."); - } - //@} -} - diff --git a/plugins/Xmpp/Queued_XMPP.php b/plugins/Xmpp/Queued_XMPP.php new file mode 100644 index 000000000..73eff2246 --- /dev/null +++ b/plugins/Xmpp/Queued_XMPP.php @@ -0,0 +1,121 @@ +. + * + * @category Network + * @package StatusNet + * @author Brion Vibber + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class Queued_XMPP extends XMPPHP_XMPP +{ + /** + * Reference to the XmppPlugin object we're hooked up to. + */ + public $plugin; + + /** + * Constructor + * + * @param XmppPlugin $plugin + * @param string $host + * @param integer $port + * @param string $user + * @param string $password + * @param string $resource + * @param string $server + * @param boolean $printlog + * @param string $loglevel + */ + public function __construct($plugin, $host, $port, $user, $password, $resource, $server = null, $printlog = false, $loglevel = null) + { + $this->plugin = $plugin; + + parent::__construct($host, $port, $user, $password, $resource, $server, $printlog, $loglevel); + + // We use $host to connect, but $server to build JIDs if specified. + // This seems to fix an upstream bug where $host was used to build + // $this->basejid, never seen since it isn't actually used in the base + // classes. + if (!$server) { + $server = $this->host; + } + $this->basejid = $this->user . '@' . $server; + + // Normally the fulljid is filled out by the server at resource binding + // time, but we need to do it since we're not talking to a real server. + $this->fulljid = "{$this->basejid}/{$this->resource}"; + } + + /** + * Send a formatted message to the outgoing queue for later forwarding + * to a real XMPP connection. + * + * @param string $msg + */ + public function send($msg, $timeout=NULL) + { + $this->plugin->enqueue_outgoing_raw($msg); + } + + //@{ + /** + * Stream i/o functions disabled; only do output + */ + public function connect($timeout = 30, $persistent = false, $sendinit = true) + { + throw new Exception("Can't connect to server from fake XMPP."); + } + + public function disconnect() + { + throw new Exception("Can't connect to server from fake XMPP."); + } + + public function process() + { + throw new Exception("Can't read stream from fake XMPP."); + } + + public function processUntil($event, $timeout=-1) + { + throw new Exception("Can't read stream from fake XMPP."); + } + + public function read() + { + throw new Exception("Can't read stream from fake XMPP."); + } + + public function readyToProcess() + { + throw new Exception("Can't read stream from fake XMPP."); + } + //@} + +} + diff --git a/plugins/Xmpp/XmppPlugin.php b/plugins/Xmpp/XmppPlugin.php index 03bf47fea..a2521536b 100644 --- a/plugins/Xmpp/XmppPlugin.php +++ b/plugins/Xmpp/XmppPlugin.php @@ -60,8 +60,6 @@ class XmppPlugin extends ImPlugin public $transport = 'xmpp'; - protected $fake_xmpp; - function getDisplayName(){ return _m('XMPP/Jabber/GTalk'); } @@ -292,7 +290,7 @@ class XmppPlugin extends ImPlugin require_once 'XMPP.php'; return false; case 'Sharing_XMPP': - case 'Fake_XMPP': + case 'Queued_XMPP': require_once $dir . '/'.$cls.'.php'; return false; case 'XmppManager': @@ -317,9 +315,7 @@ class XmppPlugin extends ImPlugin function send_message($screenname, $body) { - $this->fake_xmpp->message($screenname, $body, 'chat'); - $this->enqueue_outgoing_raw($this->fake_xmpp->would_be_sent); - return true; + $this->queuedConnection()->message($screenname, $body, 'chat'); } function send_notice($screenname, $notice) @@ -327,8 +323,7 @@ class XmppPlugin extends ImPlugin $msg = $this->format_notice($notice); $entry = $this->format_entry($notice); - $this->fake_xmpp->message($screenname, $msg, 'chat', null, $entry); - $this->enqueue_outgoing_raw($this->fake_xmpp->would_be_sent); + $this->queuedConnection()->message($screenname, $msg, 'chat', null, $entry); return true; } @@ -385,10 +380,19 @@ class XmppPlugin extends ImPlugin return true; } - return $this->handle_incoming($from, $pl['body']); + $this->handle_incoming($from, $pl['body']); + + return true; } - function initialize(){ + /** + * Build a queue-proxied XMPP interface object. Any outgoing messages + * will be run back through us for enqueing rather than sent directly. + * + * @return Queued_XMPP + * @throws Exception if server settings are invalid. + */ + function queuedConnection(){ if(!isset($this->server)){ throw new Exception("must specify a server"); } @@ -402,7 +406,7 @@ class XmppPlugin extends ImPlugin throw new Exception("must specify a password"); } - $this->fake_xmpp = new Fake_XMPP($this->host ? + return new Queued_XMPP($this, $this->host ? $this->host : $this->server, $this->port, @@ -415,7 +419,6 @@ class XmppPlugin extends ImPlugin $this->debug ? XMPPHP_Log::LEVEL_VERBOSE : null ); - return true; } function onPluginVersion(&$versions) -- cgit v1.2.3-54-g00ecf From 3e8af172d636cc7ca3a9e2301b928f6ca79b9eb2 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 5 May 2010 17:30:42 -0700 Subject: Add ?uselang=xx language override option (only valid, locally-enabled languages supported, just as with headers and user settings). Great aid for debugging & translation testing --- lib/util.php | 35 +++++++++++++++++++++++++---------- 1 file changed, 25 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/util.php b/lib/util.php index e7ea9df61..e15c69f95 100644 --- a/lib/util.php +++ b/lib/util.php @@ -138,23 +138,38 @@ function common_timezone() return common_config('site', 'timezone'); } +function common_valid_language($lang) +{ + if ($lang) { + // Validate -- we don't want to end up with a bogus code + // left over from some old junk. + foreach (common_config('site', 'languages') as $code => $info) { + if ($info['lang'] == $lang) { + return true; + } + } + } + return false; +} + function common_language() { + // Allow ?uselang=xx override, very useful for debugging + // and helping translators check usage and context. + if (isset($_GET['uselang'])) { + $uselang = strval($_GET['uselang']); + if (common_valid_language($uselang)) { + return $uselang; + } + } // If there is a user logged in and they've set a language preference // then return that one... if (_have_config() && common_logged_in()) { $user = common_current_user(); - $user_language = $user->language; - - if ($user->language) { - // Validate -- we don't want to end up with a bogus code - // left over from some old junk. - foreach (common_config('site', 'languages') as $code => $info) { - if ($info['lang'] == $user_language) { - return $user_language; - } - } + + if (common_valid_language($user->language)) { + return $user->language; } } -- cgit v1.2.3-54-g00ecf From 30328fc1666b9e3a6651c5d8881933debaf5ecc6 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 6 May 2010 23:33:27 -0400 Subject: Enable ClientSideShorten plugin by default --- lib/default.php | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/default.php b/lib/default.php index 449d2b3bb..52a4ec783 100644 --- a/lib/default.php +++ b/lib/default.php @@ -287,6 +287,7 @@ $default = 'OStatus' => null, 'WikiHashtags' => null, 'RSSCloud' => null, + 'ClientSideShorten' => null, 'OpenID' => null), ), 'pluginlist' => array(), -- cgit v1.2.3-54-g00ecf From 4b0458801af03b40fa636849da0a7e96bbd3e860 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 6 May 2010 23:40:07 -0400 Subject: Ignore PEAR errors with code DB_DATAOBJECT_ERROR_NODATA --- lib/common.php | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'lib') diff --git a/lib/common.php b/lib/common.php index 2bda88c97..72a1b7075 100644 --- a/lib/common.php +++ b/lib/common.php @@ -132,6 +132,12 @@ require_once INSTALLDIR.'/lib/serverexception.php'; //set PEAR error handling to use regular PHP exceptions function PEAR_ErrorToPEAR_Exception($err) { + //DB_DataObject throws error when an empty set would be returned + //That behavior is weird, and not how the rest of StatusNet works. + //So just ignore those errors. + if ($err->getCode() == DB_DATAOBJECT_ERROR_NODATA) { + return; + } if ($err->getCode()) { throw new PEAR_Exception($err->getMessage(), $err->getCode()); } -- cgit v1.2.3-54-g00ecf From b407665b983297078f5361db24c60a7d46e0f4ba Mon Sep 17 00:00:00 2001 From: Zachary Copley Date: Tue, 20 Apr 2010 11:29:13 -0700 Subject: Initial work on API method for updating a group's profile info --- actions/apigroupprofileupdate.php | 370 ++++++++++++++++++++++++++++++++++++++ lib/router.php | 6 + 2 files changed, 376 insertions(+) create mode 100644 actions/apigroupprofileupdate.php (limited to 'lib') diff --git a/actions/apigroupprofileupdate.php b/actions/apigroupprofileupdate.php new file mode 100644 index 000000000..0d3620c26 --- /dev/null +++ b/actions/apigroupprofileupdate.php @@ -0,0 +1,370 @@ +. + * + * @category API + * @package StatusNet + * @author Zach Copley + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR . '/lib/apiauth.php'; + +class ApiValidationException extends Exception { } + +/** + * API analog to the group edit page + * + * @category API + * @package StatusNet + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ApiGroupProfileUpdateAction extends ApiAuthAction +{ + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + * + */ + + function prepare($args) + { + parent::prepare($args); + + $this->nickname = common_canonical_nickname($this->trimmed('nickname')); + $this->fullname = $this->trimmed('fullname'); + $this->homepage = $this->trimmed('homepage'); + $this->description = $this->trimmed('description'); + $this->location = $this->trimmed('location'); + $this->aliasstring = $this->trimmed('aliases'); + + $this->user = $this->auth_user; + $this->group = $this->getTargetGroup($this->arg('id')); + + return true; + } + + /** + * Handle the request + * + * See which request params have been set, and update the profile + * + * @param array $args $_REQUEST data (unused) + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->clientError( + _('This method requires a POST.'), + 400, $this->format + ); + return; + } + + if (!in_array($this->format, array('xml', 'json'))) { + $this->clientError( + _('API method not found.'), + 404, + $this->format + ); + return; + } + + if (empty($this->user)) { + $this->clientError(_('No such user.'), 404, $this->format); + return; + } + + if (empty($this->group)) { + $this->clientError(_('Group not found.'), 404, $this->format); + return false; + } + + if (!$this->user->isAdmin($this->group)) { + $this->clientError(_('You must be an admin to edit the group.'), 403); + return false; + } + + $this->group->query('BEGIN'); + + $orig = clone($this->group); + + try { + + if (!empty($this->nickname)) { + if ($this->validateNickname()) { + $this->group->nickname = $this->nickname; + $this->group->mainpage = common_local_url( + 'showgroup', + array('nickname' => $this->nickname) + ); + } + } + + if (!empty($this->fullname)) { + $this->validateFullname(); + $this->group->fullname = $this->fullname; + } + + if (!empty($this->homepage)) { + $this->validateHomepage(); + $this->group->homepage = $this->hompage; + } + + if (!empty($this->description)) { + $this->validateDescription(); + $this->group->description = $this->decription; + } + + if (!empty($this->location)) { + $this->validateLocation(); + $this->group->location = $this->location; + } + + } catch (ApiValidationException $ave) { + $this->clientError( + $ave->getMessage(), + 403, + $this->format + ); + return; + } + + $result = $this->group->update($orig); + + if (!$result) { + common_log_db_error($this->group, 'UPDATE', __FILE__); + $this->serverError(_('Could not update group.')); + } + + $aliases = null; + + try { + + if (!empty($this->aliasstring)) { + $aliases = $this->parseAliases(); + } + + } catch (ApiValidationException $ave) { + $this->clientError( + $ave->getMessage(), + 403, + $this->format + ); + return; + } + + $result = $this->group->setAliases($aliases); + + if (!$result) { + $this->serverError(_('Could not create aliases.')); + } + + if (!empty($this->nickname) && $this->nickname != $orig->nickname) { + common_log(LOG_INFO, "Saving local group info."); + $local = Local_group::staticGet('group_id', $this->group->id); + $local->setNickname($this->nickname); + } + + $this->group->query('COMMIT'); + + switch($this->format) { + case 'xml': + $this->showSingleXmlGroup($this->group); + break; + case 'json': + $this->showSingleJsonGroup($this->group); + break; + default: + $this->clientError(_('API method not found.'), 404, $this->format); + break; + } + } + + function nicknameExists($nickname) + { + $group = Local_group::staticGet('nickname', $nickname); + + if (!empty($group) && + $group->group_id != $this->group->id) { + return true; + } + + $alias = Group_alias::staticGet('alias', $nickname); + + if (!empty($alias) && + $alias->group_id != $this->group->id) { + return true; + } + + return false; + } + + function validateNickname() + { + if (!Validate::string( + $this->nickname, array( + 'min_length' => 1, + 'max_length' => 64, + 'format' => NICKNAME_FMT + ) + ) + ) { + throw new ApiValidationException( + _( + 'Nickname must have only lowercase letters ' . + 'and numbers and no spaces.' + ) + ); + } else if ($this->nicknameExists($this->nickname)) { + throw new ApiValidationException( + _('Nickname already in use. Try another one.') + ); + } else if (!User_group::allowedNickname($this->nickname)) { + throw new ApiValidationException( + _('Not a valid nickname.') + ); + } + } + + function validateHomepage() + { + if (!is_null($this->homepage) + && (strlen($this->homepage) > 0) + && !Validate::uri( + $this->homepage, + array('allowed_schemes' => array('http', 'https') + ) + ) + ) { + throw new ApiValidationException( + _('Homepage is not a valid URL.') + ); + } + } + + function validateFullname() + { + if (!is_null($this->fullname) && mb_strlen($this->fullname) > 255) { + throw new ApiValidationException( + _('Full name is too long (max 255 chars).') + ); + } + } + + function validateDescription() + { + if (User_group::descriptionTooLong($this->description)) { + throw new ApiValidationException( + sprintf( + _('description is too long (max %d chars).'), + User_group::maxDescription() + ) + ); + } + } + + function validateLocation() + { + if (!is_null($this->location) && mb_strlen($this->location) > 255) { + throw new ApiValidationException( + _('Location is too long (max 255 chars).') + ); + } + } + + function validateAliases() + { + $aliases = array_map( + 'common_canonical_nickname', + array_unique( + preg_split('/[\s,]+/', + $this->aliasstring + ) + ) + ); + + if (empty($aliases)) { + $aliases = array(); + } + + if (count($aliases) > common_config('group', 'maxaliases')) { + throw new ApiValidationException( + sprintf( + _('Too many aliases! Maximum %d.'), + common_config('group', 'maxaliases') + ) + ); + } + + foreach ($aliases as $alias) { + if (!Validate::string( + $alias, array( + 'min_length' => 1, + 'max_length' => 64, + 'format' => NICKNAME_FMT) + ) + ) { + throw new ApiValidationException( + sprintf( + _('Invalid alias: "%s"'), + $alias + ) + ); + } + + if ($this->nicknameExists($alias)) { + throw new ApiValidationException( + sprintf( + _('Alias "%s" already in use. Try another one.'), + $alias) + ); + } + + // XXX assumes alphanum nicknames + if (strcmp($alias, $nickname) == 0) { + throw new ApiValidationException( + _('Alias can\'t be the same as nickname.') + ); + } + } + + return $aliases; + } + +} \ No newline at end of file diff --git a/lib/router.php b/lib/router.php index a040abb83..faa26c861 100644 --- a/lib/router.php +++ b/lib/router.php @@ -650,6 +650,12 @@ class Router $m->connect('api/statusnet/groups/create.:format', array('action' => 'ApiGroupCreate', 'format' => '(xml|json)')); + + $m->connect('api/statusnet/groups/update/:id.:format', + array('action' => 'ApiGroupProfileUpdate', + 'id' => '[a-zA-Z0-9]+', + 'format' => '(xml|json)')); + // Tags $m->connect('api/statusnet/tags/timeline/:tag.:format', array('action' => 'ApiTimelineTag', -- cgit v1.2.3-54-g00ecf From 06a63b0404aa96efc1118563482c11567b048961 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 7 May 2010 00:52:54 -0700 Subject: Finish api/statusnet/groups/update --- actions/apigroupprofileupdate.php | 19 ++++++++----------- lib/apiaction.php | 2 ++ 2 files changed, 10 insertions(+), 11 deletions(-) (limited to 'lib') diff --git a/actions/apigroupprofileupdate.php b/actions/apigroupprofileupdate.php index 0d3620c26..6ac4b5a4b 100644 --- a/actions/apigroupprofileupdate.php +++ b/actions/apigroupprofileupdate.php @@ -33,8 +33,6 @@ if (!defined('STATUSNET')) { require_once INSTALLDIR . '/lib/apiauth.php'; -class ApiValidationException extends Exception { } - /** * API analog to the group edit page * @@ -62,6 +60,7 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction parent::prepare($args); $this->nickname = common_canonical_nickname($this->trimmed('nickname')); + $this->fullname = $this->trimmed('fullname'); $this->homepage = $this->trimmed('homepage'); $this->description = $this->trimmed('description'); @@ -172,12 +171,12 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction $this->serverError(_('Could not update group.')); } - $aliases = null; + $aliases = array(); try { - if (!empty($this->aliasstring)) { - $aliases = $this->parseAliases(); + if (!empty($this->aliasstring)) { + $aliases = $this->validateAliases(); } } catch (ApiValidationException $ave) { @@ -195,7 +194,7 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction $this->serverError(_('Could not create aliases.')); } - if (!empty($this->nickname) && $this->nickname != $orig->nickname) { + if (!empty($this->nickname) && ($this->nickname != $orig->nickname)) { common_log(LOG_INFO, "Saving local group info."); $local = Local_group::staticGet('group_id', $this->group->id); $local->setNickname($this->nickname); @@ -260,6 +259,8 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction _('Not a valid nickname.') ); } + + return true; } function validateHomepage() @@ -319,10 +320,6 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction ) ); - if (empty($aliases)) { - $aliases = array(); - } - if (count($aliases) > common_config('group', 'maxaliases')) { throw new ApiValidationException( sprintf( @@ -357,7 +354,7 @@ class ApiGroupProfileUpdateAction extends ApiAuthAction } // XXX assumes alphanum nicknames - if (strcmp($alias, $nickname) == 0) { + if (strcmp($alias, $this->nickname) == 0) { throw new ApiValidationException( _('Alias can\'t be the same as nickname.') ); diff --git a/lib/apiaction.php b/lib/apiaction.php index 42aa08ef7..d35391d4e 100644 --- a/lib/apiaction.php +++ b/lib/apiaction.php @@ -97,6 +97,8 @@ if (!defined('STATUSNET')) { exit(1); } +class ApiValidationException extends Exception { } + /** * Contains most of the Twitter-compatible API output functions. * -- cgit v1.2.3-54-g00ecf From da18701394ef717cd68dad11f5a830719ad675e6 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 7 May 2010 16:32:24 -0700 Subject: Fix for repeats from the API having null source attribution --- actions/apidirectmessagenew.php | 8 -------- actions/apistatusesretweet.php | 2 +- actions/apistatusesupdate.php | 12 ------------ lib/apiaction.php | 9 +++++++++ lib/apiauth.php | 3 +-- 5 files changed, 11 insertions(+), 23 deletions(-) (limited to 'lib') diff --git a/actions/apidirectmessagenew.php b/actions/apidirectmessagenew.php index b9ac92d77..65d065648 100644 --- a/actions/apidirectmessagenew.php +++ b/actions/apidirectmessagenew.php @@ -52,7 +52,6 @@ require_once INSTALLDIR . '/lib/apiauth.php'; class ApiDirectMessageNewAction extends ApiAuthAction { - var $source = null; var $other = null; var $content = null; @@ -76,13 +75,6 @@ class ApiDirectMessageNewAction extends ApiAuthAction return; } - $this->source = $this->trimmed('source'); // Not supported by Twitter. - - $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api'); - if (empty($this->source) || in_array($this->source, $reserved_sources)) { - $source = 'api'; - } - $this->content = $this->trimmed('text'); $this->user = $this->auth_user; diff --git a/actions/apistatusesretweet.php b/actions/apistatusesretweet.php index 128c881e2..9aa337485 100644 --- a/actions/apistatusesretweet.php +++ b/actions/apistatusesretweet.php @@ -79,7 +79,7 @@ class ApiStatusesRetweetAction extends ApiAuthAction $this->user = $this->auth_user; - if ($this->user->id == $notice->profile_id) { + if ($this->user->id == $this->original->profile_id) { $this->clientError(_('Cannot repeat your own notice.'), 400, $this->format); return false; diff --git a/actions/apistatusesupdate.php b/actions/apistatusesupdate.php index 5f3a447c2..a0a81f336 100644 --- a/actions/apistatusesupdate.php +++ b/actions/apistatusesupdate.php @@ -155,8 +155,6 @@ class ApiStatusesUpdateAction extends ApiAuthAction var $lat = null; var $lon = null; - static $reserved_sources = array('web', 'omb', 'mail', 'xmpp', 'api'); - /** * Take arguments for running * @@ -171,19 +169,9 @@ class ApiStatusesUpdateAction extends ApiAuthAction parent::prepare($args); $this->status = $this->trimmed('status'); - $this->source = $this->trimmed('source'); $this->lat = $this->trimmed('lat'); $this->lon = $this->trimmed('long'); - // try to set the source attr from OAuth app - if (empty($this->source)) { - $this->source = $this->oauth_source; - } - - if (empty($this->source) || in_array($this->source, self::$reserved_sources)) { - $this->source = 'api'; - } - $this->in_reply_to_status_id = intval($this->trimmed('in_reply_to_status_id')); diff --git a/lib/apiaction.php b/lib/apiaction.php index d35391d4e..e481a1ef2 100644 --- a/lib/apiaction.php +++ b/lib/apiaction.php @@ -126,9 +126,12 @@ class ApiAction extends Action var $count = null; var $max_id = null; var $since_id = null; + var $source = null; var $access = self::READ_ONLY; // read (default) or read-write + static $reserved_sources = array('web', 'omb', 'ostatus', 'mail', 'xmpp', 'api'); + /** * Initialization. * @@ -152,6 +155,12 @@ class ApiAction extends Action header('X-StatusNet-Warning: since parameter is disabled; use since_id'); } + $this->source = $this->trimmed('source'); + + if (empty($this->source) || in_array($this->source, self::$reserved_sources)) { + $this->source = 'api'; + } + return true; } diff --git a/lib/apiauth.php b/lib/apiauth.php index 8c3998888..9c68e2771 100644 --- a/lib/apiauth.php +++ b/lib/apiauth.php @@ -72,7 +72,6 @@ class ApiAuthAction extends ApiAction { var $auth_user_nickname = null; var $auth_user_password = null; - var $oauth_source = null; /** * Take arguments for running, looks for an OAuth request, @@ -181,7 +180,7 @@ class ApiAuthAction extends ApiAction // set the source attr - $this->oauth_source = $app->name; + $this->source = $app->name; $appUser = Oauth_application_user::staticGet('token', $access_token); -- cgit v1.2.3-54-g00ecf From d2234580357349a6887a2321e69d11de7bb29106 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 31 May 2010 08:49:14 -0700 Subject: Widgetize the design form Squashed commit of the following: commit a4610db66974866fdeb98184ce7e2be1470fb4d7 Author: Evan Prodromou Date: Mon May 31 08:48:35 2010 -0700 use selfUrl for designform action commit fd9f46ab33caa2c2d0df90d1d596c7b8c6453ce3 Author: Evan Prodromou Date: Mon May 31 08:29:43 2010 -0700 fix design settings syntax commit d1797ef9f90bf038665463424ad962bfe039c9f0 Author: Evan Prodromou Date: Mon Nov 9 23:23:53 2009 -0500 widgetizing design form --- lib/designform.php | 293 +++++++++++++++++++++++++++++++++++++++++++++++++ lib/designsettings.php | 173 +---------------------------- 2 files changed, 295 insertions(+), 171 deletions(-) create mode 100644 lib/designform.php (limited to 'lib') diff --git a/lib/designform.php b/lib/designform.php new file mode 100644 index 000000000..b22d77f31 --- /dev/null +++ b/lib/designform.php @@ -0,0 +1,293 @@ +. + * + * @category Form + * @package StatusNet + * @author Evan Prodromou + * @author Sarven Capadisli + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +/** + * Form for choosing a design + * + * Used for choosing a site design, user design, or group design. + * + * @category Form + * @package StatusNet + * @author Evan Prodromou + * @author Sarven Capadisli + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + * + */ + +class DesignForm extends Form +{ + /** + * Return-to args + */ + + var $design = null; + var $actionurl = null; + + /** + * Constructor + * + * @param HTMLOutputter $out output channel + * @param Design $design initial design + * @param Design $actionurl url of action (for form posting) + */ + + function __construct($out, $design, $actionurl) + { + parent::__construct($out); + + $this->design = $design; + $this->actionurl = $actionurl; + } + + /** + * ID of the form + * + * @return int ID of the form + */ + + function id() + { + return 'design'; + } + + /** + * class of the form + * + * @return string class of the form + */ + + function formClass() + { + return 'form_design'; + } + + /** + * Action of the form + * + * @return string URL of the action + */ + + function action() + { + return $this->actionurl; + } + + /** + * Legend of the Form + * + * @return void + */ + function formLegend() + { + $this->out->element('legend', null, _('Change design')); + } + + /** + * Data elements of the form + * + * @return void + */ + + function formData() + { + $this->out->elementStart('ul', 'form_data'); + $this->out->elementStart('li'); + $this->out->element('label', array('for' => 'design_background-image_file'), + _('Upload file')); + $this->out->element('input', array('name' => 'design_background-image_file', + 'type' => 'file', + 'id' => 'design_background-image_file')); + $this->out->element('p', 'form_guide', _('You can upload your personal ' . + 'background image. The maximum file size is 2Mb.')); + $this->out->element('input', array('name' => 'MAX_FILE_SIZE', + 'type' => 'hidden', + 'id' => 'MAX_FILE_SIZE', + 'value' => ImageFile::maxFileSizeInt())); + $this->out->elementEnd('li'); + + if (!empty($design->backgroundimage)) { + + $this->out->elementStart('li', array('id' => + 'design_background-image_onoff')); + + $this->out->element('img', array('src' => + Design::url($design->backgroundimage))); + + $attrs = array('name' => 'design_background-image_onoff', + 'type' => 'radio', + 'id' => 'design_background-image_on', + 'class' => 'radio', + 'value' => 'on'); + + if ($design->disposition & BACKGROUND_ON) { + $attrs['checked'] = 'checked'; + } + + $this->out->element('input', $attrs); + + $this->out->element('label', array('for' => 'design_background-image_on', + 'class' => 'radio'), + _('On')); + + $attrs = array('name' => 'design_background-image_onoff', + 'type' => 'radio', + 'id' => 'design_background-image_off', + 'class' => 'radio', + 'value' => 'off'); + + if ($design->disposition & BACKGROUND_OFF) { + $attrs['checked'] = 'checked'; + } + + $this->out->element('input', $attrs); + + $this->out->element('label', array('for' => 'design_background-image_off', + 'class' => 'radio'), + _('Off')); + $this->out->element('p', 'form_guide', _('Turn background image on or off.')); + $this->out->elementEnd('li'); + + $this->out->elementStart('li'); + $this->out->checkbox('design_background-image_repeat', + _('Tile background image'), + ($design->disposition & BACKGROUND_TILE) ? true : false); + $this->out->elementEnd('li'); + } + + $this->out->elementEnd('ul'); + $this->out->elementEnd('fieldset'); + + $this->out->elementStart('fieldset', array('id' => 'settings_design_color')); + $this->out->element('legend', null, _('Change colours')); + $this->out->elementStart('ul', 'form_data'); + + try { + + $bgcolor = new WebColor($design->backgroundcolor); + + $this->out->elementStart('li'); + $this->out->element('label', array('for' => 'swatch-1'), _('Background')); + $this->out->element('input', array('name' => 'design_background', + 'type' => 'text', + 'id' => 'swatch-1', + 'class' => 'swatch', + 'maxlength' => '7', + 'size' => '7', + 'value' => '')); + $this->out->elementEnd('li'); + + $ccolor = new WebColor($design->contentcolor); + + $this->out->elementStart('li'); + $this->out->element('label', array('for' => 'swatch-2'), _('Content')); + $this->out->element('input', array('name' => 'design_content', + 'type' => 'text', + 'id' => 'swatch-2', + 'class' => 'swatch', + 'maxlength' => '7', + 'size' => '7', + 'value' => '')); + $this->out->elementEnd('li'); + + $sbcolor = new WebColor($design->sidebarcolor); + + $this->out->elementStart('li'); + $this->out->element('label', array('for' => 'swatch-3'), _('Sidebar')); + $this->out->element('input', array('name' => 'design_sidebar', + 'type' => 'text', + 'id' => 'swatch-3', + 'class' => 'swatch', + 'maxlength' => '7', + 'size' => '7', + 'value' => '')); + $this->out->elementEnd('li'); + + $tcolor = new WebColor($design->textcolor); + + $this->out->elementStart('li'); + $this->out->element('label', array('for' => 'swatch-4'), _('Text')); + $this->out->element('input', array('name' => 'design_text', + 'type' => 'text', + 'id' => 'swatch-4', + 'class' => 'swatch', + 'maxlength' => '7', + 'size' => '7', + 'value' => '')); + $this->out->elementEnd('li'); + + $lcolor = new WebColor($design->linkcolor); + + $this->out->elementStart('li'); + $this->out->element('label', array('for' => 'swatch-5'), _('Links')); + $this->out->element('input', array('name' => 'design_links', + 'type' => 'text', + 'id' => 'swatch-5', + 'class' => 'swatch', + 'maxlength' => '7', + 'size' => '7', + 'value' => '')); + $this->out->elementEnd('li'); + + } catch (WebColorException $e) { + common_log(LOG_ERR, 'Bad color values in design ID: ' .$design->id); + } + + $this->out->elementEnd('ul'); + $this->out->elementEnd('fieldset'); + + $this->out->elementStart('fieldset'); + + $this->out->submit('defaults', _('Use defaults'), 'submit form_action-default', + 'defaults', _('Restore default designs')); + + $this->out->element('input', array('id' => 'settings_design_reset', + 'type' => 'reset', + 'value' => 'Reset', + 'class' => 'submit form_action-primary', + 'title' => _('Reset back to default'))); + } + + /** + * Action elements + * + * @return void + */ + + function formActions() + { + $this->out->submit('save', _('Save'), 'submit form_action-secondary', + 'save', _('Save design')); + } +} diff --git a/lib/designsettings.php b/lib/designsettings.php index 4955e9219..98ef8256c 100644 --- a/lib/designsettings.php +++ b/lib/designsettings.php @@ -87,177 +87,8 @@ class DesignSettingsAction extends AccountSettingsAction function showDesignForm($design) { - - $this->elementStart('form', array('method' => 'post', - 'enctype' => 'multipart/form-data', - 'id' => 'form_settings_design', - 'class' => 'form_settings', - 'action' => $this->submitaction)); - $this->elementStart('fieldset'); - $this->hidden('token', common_session_token()); - - $this->elementStart('fieldset', array('id' => - 'settings_design_background-image')); - $this->element('legend', null, _('Change background image')); - $this->elementStart('ul', 'form_data'); - $this->elementStart('li'); - $this->element('label', array('for' => 'design_background-image_file'), - _('Upload file')); - $this->element('input', array('name' => 'design_background-image_file', - 'type' => 'file', - 'id' => 'design_background-image_file')); - $this->element('p', 'form_guide', _('You can upload your personal ' . - 'background image. The maximum file size is 2MB.')); - $this->element('input', array('name' => 'MAX_FILE_SIZE', - 'type' => 'hidden', - 'id' => 'MAX_FILE_SIZE', - 'value' => ImageFile::maxFileSizeInt())); - $this->elementEnd('li'); - - if (!empty($design->backgroundimage)) { - - $this->elementStart('li', array('id' => - 'design_background-image_onoff')); - - $this->element('img', array('src' => - Design::url($design->backgroundimage))); - - $attrs = array('name' => 'design_background-image_onoff', - 'type' => 'radio', - 'id' => 'design_background-image_on', - 'class' => 'radio', - 'value' => 'on'); - - if ($design->disposition & BACKGROUND_ON) { - $attrs['checked'] = 'checked'; - } - - $this->element('input', $attrs); - - $this->element('label', array('for' => 'design_background-image_on', - 'class' => 'radio'), - _('On')); - - $attrs = array('name' => 'design_background-image_onoff', - 'type' => 'radio', - 'id' => 'design_background-image_off', - 'class' => 'radio', - 'value' => 'off'); - - if ($design->disposition & BACKGROUND_OFF) { - $attrs['checked'] = 'checked'; - } - - $this->element('input', $attrs); - - $this->element('label', array('for' => 'design_background-image_off', - 'class' => 'radio'), - _('Off')); - $this->element('p', 'form_guide', _('Turn background image on or off.')); - $this->elementEnd('li'); - - $this->elementStart('li'); - $this->checkbox('design_background-image_repeat', - _('Tile background image'), - ($design->disposition & BACKGROUND_TILE) ? true : false); - $this->elementEnd('li'); - } - - $this->elementEnd('ul'); - $this->elementEnd('fieldset'); - - $this->elementStart('fieldset', array('id' => 'settings_design_color')); - $this->element('legend', null, _('Change colours')); - $this->elementStart('ul', 'form_data'); - - try { - - $bgcolor = new WebColor($design->backgroundcolor); - - $this->elementStart('li'); - $this->element('label', array('for' => 'swatch-1'), _('Background')); - $this->element('input', array('name' => 'design_background', - 'type' => 'text', - 'id' => 'swatch-1', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->elementEnd('li'); - - $ccolor = new WebColor($design->contentcolor); - - $this->elementStart('li'); - $this->element('label', array('for' => 'swatch-2'), _('Content')); - $this->element('input', array('name' => 'design_content', - 'type' => 'text', - 'id' => 'swatch-2', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->elementEnd('li'); - - $sbcolor = new WebColor($design->sidebarcolor); - - $this->elementStart('li'); - $this->element('label', array('for' => 'swatch-3'), _('Sidebar')); - $this->element('input', array('name' => 'design_sidebar', - 'type' => 'text', - 'id' => 'swatch-3', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->elementEnd('li'); - - $tcolor = new WebColor($design->textcolor); - - $this->elementStart('li'); - $this->element('label', array('for' => 'swatch-4'), _('Text')); - $this->element('input', array('name' => 'design_text', - 'type' => 'text', - 'id' => 'swatch-4', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->elementEnd('li'); - - $lcolor = new WebColor($design->linkcolor); - - $this->elementStart('li'); - $this->element('label', array('for' => 'swatch-5'), _('Links')); - $this->element('input', array('name' => 'design_links', - 'type' => 'text', - 'id' => 'swatch-5', - 'class' => 'swatch', - 'maxlength' => '7', - 'size' => '7', - 'value' => '')); - $this->elementEnd('li'); - - } catch (WebColorException $e) { - common_log(LOG_ERR, 'Bad color values in design ID: ' .$design->id); - } - - $this->elementEnd('ul'); - $this->elementEnd('fieldset'); - - $this->submit('defaults', _('Use defaults'), 'submit form_action-default', - 'defaults', _('Restore default designs')); - - $this->element('input', array('id' => 'settings_design_reset', - 'type' => 'reset', - 'value' => 'Reset', - 'class' => 'submit form_action-primary', - 'title' => _('Reset back to default'))); - - $this->submit('save', _('Save'), 'submit form_action-secondary', - 'save', _('Save design')); - - $this->elementEnd('fieldset'); - $this->elementEnd('form'); + $form = new DesignForm($this, $design, $this->selfUrl()); + $form->show(); } /** -- cgit v1.2.3-54-g00ecf From 4ee2c12507b046e048ff023b94872cbbe9bde9a4 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Tue, 15 Jun 2010 17:04:15 -0400 Subject: Use presence of IM plugins to decide if "IM" menu option should be shown in Connect --- lib/connectsettingsaction.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/connectsettingsaction.php b/lib/connectsettingsaction.php index b9c14799e..c3a88be55 100644 --- a/lib/connectsettingsaction.php +++ b/lib/connectsettingsaction.php @@ -105,7 +105,7 @@ class ConnectSettingsNav extends Widget # action => array('prompt', 'title') $menu = array(); - if (common_config('xmpp', 'enabled')) { + if (Event::handle('GetImTransports', array(&$transports))) { $menu['imsettings'] = array(_('IM'), _('Updates by instant messenger (IM)')); -- cgit v1.2.3-54-g00ecf From 1a62d1b49378bba4b69476282b9a5d0e03073405 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Wed, 16 Jun 2010 16:00:54 -0400 Subject: Use presence of IM plugins to decide if "IM" options should be available --- actions/subscriptions.php | 8 +++++--- lib/connectsettingsaction.php | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) (limited to 'lib') diff --git a/actions/subscriptions.php b/actions/subscriptions.php index 7b10b3425..da563a218 100644 --- a/actions/subscriptions.php +++ b/actions/subscriptions.php @@ -185,7 +185,9 @@ class SubscriptionsListItem extends SubscriptionListItem return; } - if (!common_config('xmpp', 'enabled') && !common_config('sms', 'enabled')) { + $transports = array(); + Event::handle('GetImTransports', array(&$transports)); + if (!$transports && !common_config('sms', 'enabled')) { return; } @@ -195,7 +197,7 @@ class SubscriptionsListItem extends SubscriptionListItem 'action' => common_local_url('subedit'))); $this->out->hidden('token', common_session_token()); $this->out->hidden('profile', $this->profile->id); - if (common_config('xmpp', 'enabled')) { + if ($transports) { $attrs = array('name' => 'jabber', 'type' => 'checkbox', 'class' => 'checkbox', @@ -205,7 +207,7 @@ class SubscriptionsListItem extends SubscriptionListItem } $this->out->element('input', $attrs); - $this->out->element('label', array('for' => 'jabber-'.$this->profile->id), _('Jabber')); + $this->out->element('label', array('for' => 'jabber-'.$this->profile->id), _('IM')); } else { $this->out->hidden('jabber', $sub->jabber); } diff --git a/lib/connectsettingsaction.php b/lib/connectsettingsaction.php index c3a88be55..5d62fc56b 100644 --- a/lib/connectsettingsaction.php +++ b/lib/connectsettingsaction.php @@ -105,7 +105,9 @@ class ConnectSettingsNav extends Widget # action => array('prompt', 'title') $menu = array(); - if (Event::handle('GetImTransports', array(&$transports))) { + $transports = array(); + Event::handle('GetImTransports', array(&$transports)); + if ($transports) { $menu['imsettings'] = array(_('IM'), _('Updates by instant messenger (IM)')); -- cgit v1.2.3-54-g00ecf From dad0b06a386092b159118780a6a6801f3cf674de Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Tue, 22 Jun 2010 22:01:13 -0400 Subject: Throw an error if queueing is disable when using an IM plugin --- lib/implugin.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/implugin.php b/lib/implugin.php index 7125aaee8..dafb8a416 100644 --- a/lib/implugin.php +++ b/lib/implugin.php @@ -619,8 +619,13 @@ abstract class ImPlugin extends Plugin function initialize() { + if( ! common_config('queue', 'enabled')) + { + throw new ServerException("Queueing must be enabled to use IM plugins"); + } + if(is_null($this->transport)){ - throw new Exception('transport cannot be null'); + throw new ServerException('transport cannot be null'); } } } -- cgit v1.2.3-54-g00ecf From 974c4df0293afe43d763b7d888c7d92b22b67c56 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 12 Jul 2010 09:56:32 -0700 Subject: Ticket 2433: Skip locale fallback list check on Windows ('locale -a' shell-out doesn't work there) --- lib/util.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) (limited to 'lib') diff --git a/lib/util.php b/lib/util.php index 2a90b56a9..9f62097d5 100644 --- a/lib/util.php +++ b/lib/util.php @@ -88,8 +88,8 @@ function common_init_language() // don't do the job. en_US.UTF-8 should be there most of the // time, but not guaranteed. $ok = common_init_locale("en_US"); - if (!$ok) { - // Try to find a complete, working locale... + if (!$ok && strtolower(substr(PHP_OS, 0, 3)) != 'win') { + // Try to find a complete, working locale on Unix/Linux... // @fixme shelling out feels awfully inefficient // but I don't think there's a more standard way. $all = `locale -a`; @@ -101,9 +101,9 @@ function common_init_language() } } } - if (!$ok) { - common_log(LOG_ERR, "Unable to find a UTF-8 locale on this system; UI translations may not work."); - } + } + if (!$ok) { + common_log(LOG_ERR, "Unable to find a UTF-8 locale on this system; UI translations may not work."); } $locale_set = common_init_locale($language); } -- cgit v1.2.3-54-g00ecf From 1b3b7f9a422f6b703ec36d43e2283f91a9835f3b Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 12 Jul 2010 10:27:23 -0700 Subject: Ticket 2427: fix regression in plugin i18n --- lib/language.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/language.php b/lib/language.php index 1805707ad..6840148d2 100644 --- a/lib/language.php +++ b/lib/language.php @@ -213,16 +213,16 @@ function _mdomain($backtrace) $plug = strpos($path, '/plugins/'); if ($plug === false) { // We're not in a plugin; return default domain. - return 'statusnet'; + $final = 'statusnet'; } else { $cut = $plug + 9; $cut2 = strpos($path, '/', $cut); if ($cut2) { - $cached[$path] = substr($path, $cut, $cut2 - $cut); + $final = substr($path, $cut, $cut2 - $cut); } else { // We might be running directly from the plugins dir? // If so, there's no place to store locale info. - return 'statusnet'; + $final = 'statusnet'; } } $cached[$path] = $final; -- cgit v1.2.3-54-g00ecf From c2a26ba65339f7731e5e1f019704ee70c3943e94 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 29 Jul 2010 21:03:48 -0400 Subject: removing redundant constructor --- lib/mysqlschema.php | 15 --------------- 1 file changed, 15 deletions(-) (limited to 'lib') diff --git a/lib/mysqlschema.php b/lib/mysqlschema.php index 455695366..464c718f9 100644 --- a/lib/mysqlschema.php +++ b/lib/mysqlschema.php @@ -50,21 +50,6 @@ class MysqlSchema extends Schema static $_single = null; protected $conn = null; - /** - * Constructor. Only run once for singleton object. - */ - - protected function __construct() - { - // XXX: there should be an easier way to do this. - $user = new User(); - - $this->conn = $user->getDatabaseConnection(); - - $user->free(); - - unset($user); - } /** * Main public entry point. Use this to get -- cgit v1.2.3-54-g00ecf From 47f19988d1b0e4f64fde8a385d3205c2fd476234 Mon Sep 17 00:00:00 2001 From: James Walker Date: Thu, 29 Jul 2010 21:04:28 -0400 Subject: allow schema to work on more than one connection (namely, the Status_network DB) --- lib/schema.php | 37 ++++++++++++++++++++++--------------- 1 file changed, 22 insertions(+), 15 deletions(-) (limited to 'lib') diff --git a/lib/schema.php b/lib/schema.php index 1503c96d4..e5def514e 100644 --- a/lib/schema.php +++ b/lib/schema.php @@ -47,40 +47,47 @@ if (!defined('STATUSNET')) { class Schema { - static $_single = null; + static $_static = null; protected $conn = null; /** * Constructor. Only run once for singleton object. */ - protected function __construct() + protected function __construct($conn = null) { - // XXX: there should be an easier way to do this. - $user = new User(); - - $this->conn = $user->getDatabaseConnection(); - - $user->free(); + if (is_null($conn)) { + // XXX: there should be an easier way to do this. + $user = new User(); + $conn = $user->getDatabaseConnection(); + $user->free(); + unset($user); + } - unset($user); + $this->conn = $conn; } /** * Main public entry point. Use this to get - * the singleton object. + * the schema object. * - * @return Schema the (single) Schema object + * @return Schema the Schema object for the connection */ - static function get() + static function get($conn = null) { + if (is_null($conn)) { + $key = 'default'; + } else { + $key = md5(serialize($conn->dsn)); + } + $type = common_config('db', 'type'); - if (empty(self::$_single)) { + if (empty(self::$_static[$key])) { $schemaClass = ucfirst($type).'Schema'; - self::$_single = new $schemaClass(); + self::$_static[$key] = new $schemaClass($conn); } - return self::$_single; + return self::$_static[$key]; } /** -- cgit v1.2.3-54-g00ecf From 0caebc93084b160987239f34b25acadd3aff1fa4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 30 Jul 2010 13:16:47 -0700 Subject: Fix for ticket #2471: install.php returns unsuccessfully but doesn't display error message if PHP < 5.2.6 is used http://status.net/open-source/issues/2471 Old bit of code didn't get updated for new installer --- lib/installer.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/installer.php b/lib/installer.php index bd9d69cd4..ff2bed140 100644 --- a/lib/installer.php +++ b/lib/installer.php @@ -91,7 +91,7 @@ abstract class Installer } if (version_compare(PHP_VERSION, '5.2.3', '<')) { - $errors[] = 'Require PHP version 5.2.3 or greater.'; + $this->warning('Require PHP version 5.2.3 or greater.'); $pass = false; } -- cgit v1.2.3-54-g00ecf From 44d01f70a64453049bebde59ac035fd10b8de626 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sat, 31 Jul 2010 23:59:22 +0200 Subject: Localisation updates from http://translatewiki.net * add support for Danish --- lib/language.php | 1 + locale/af/LC_MESSAGES/statusnet.po | 53 +- locale/ar/LC_MESSAGES/statusnet.po | 56 +- locale/arz/LC_MESSAGES/statusnet.po | 53 +- locale/bg/LC_MESSAGES/statusnet.po | 53 +- locale/br/LC_MESSAGES/statusnet.po | 53 +- locale/ca/LC_MESSAGES/statusnet.po | 53 +- locale/cs/LC_MESSAGES/statusnet.po | 53 +- locale/da/LC_MESSAGES/statusnet.po | 6734 +++++++++++++++++++++++++++++++++ locale/de/LC_MESSAGES/statusnet.po | 87 +- locale/el/LC_MESSAGES/statusnet.po | 53 +- locale/en_GB/LC_MESSAGES/statusnet.po | 53 +- locale/es/LC_MESSAGES/statusnet.po | 63 +- locale/fa/LC_MESSAGES/statusnet.po | 53 +- locale/fi/LC_MESSAGES/statusnet.po | 53 +- locale/fr/LC_MESSAGES/statusnet.po | 117 +- locale/ga/LC_MESSAGES/statusnet.po | 53 +- locale/gl/LC_MESSAGES/statusnet.po | 53 +- locale/he/LC_MESSAGES/statusnet.po | 53 +- locale/hsb/LC_MESSAGES/statusnet.po | 83 +- locale/ia/LC_MESSAGES/statusnet.po | 53 +- locale/is/LC_MESSAGES/statusnet.po | 53 +- locale/it/LC_MESSAGES/statusnet.po | 53 +- locale/ja/LC_MESSAGES/statusnet.po | 53 +- locale/ko/LC_MESSAGES/statusnet.po | 56 +- locale/mk/LC_MESSAGES/statusnet.po | 84 +- locale/nb/LC_MESSAGES/statusnet.po | 95 +- locale/nl/LC_MESSAGES/statusnet.po | 86 +- locale/nn/LC_MESSAGES/statusnet.po | 56 +- locale/pl/LC_MESSAGES/statusnet.po | 53 +- locale/pt/LC_MESSAGES/statusnet.po | 53 +- locale/pt_BR/LC_MESSAGES/statusnet.po | 53 +- locale/ru/LC_MESSAGES/statusnet.po | 123 +- locale/statusnet.pot | 48 +- locale/sv/LC_MESSAGES/statusnet.po | 53 +- locale/te/LC_MESSAGES/statusnet.po | 56 +- locale/tr/LC_MESSAGES/statusnet.po | 53 +- locale/uk/LC_MESSAGES/statusnet.po | 80 +- locale/vi/LC_MESSAGES/statusnet.po | 53 +- locale/zh_CN/LC_MESSAGES/statusnet.po | 53 +- locale/zh_TW/LC_MESSAGES/statusnet.po | 53 +- 41 files changed, 8217 insertions(+), 933 deletions(-) create mode 100644 locale/da/LC_MESSAGES/statusnet.po (limited to 'lib') diff --git a/lib/language.php b/lib/language.php index 6840148d2..d93e4e0ad 100644 --- a/lib/language.php +++ b/lib/language.php @@ -307,6 +307,7 @@ function get_all_languages() { 'br' => array('q' => 0.8, 'lang' => 'br', 'name' => 'Breton', 'direction' => 'ltr'), 'ca' => array('q' => 0.5, 'lang' => 'ca', 'name' => 'Catalan', 'direction' => 'ltr'), 'cs' => array('q' => 0.5, 'lang' => 'cs', 'name' => 'Czech', 'direction' => 'ltr'), + 'da' => array('q' => 0.8, 'lang' => 'da', 'name' => 'Danish', 'direction' => 'ltr'), 'de' => array('q' => 0.8, 'lang' => 'de', 'name' => 'German', 'direction' => 'ltr'), 'el' => array('q' => 0.1, 'lang' => 'el', 'name' => 'Greek', 'direction' => 'ltr'), 'en-us' => array('q' => 1, 'lang' => 'en', 'name' => 'English (US)', 'direction' => 'ltr'), diff --git a/locale/af/LC_MESSAGES/statusnet.po b/locale/af/LC_MESSAGES/statusnet.po index 4a80ba662..ef9e71bc7 100644 --- a/locale/af/LC_MESSAGES/statusnet.po +++ b/locale/af/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:20:53+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:35+0000\n" "Language-Team: Afrikaans\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: af\n" "X-Message-Group: out-statusnet\n" @@ -98,7 +98,7 @@ msgstr "Hierdie bladsy bestaan nie" #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -208,7 +208,7 @@ msgstr "Opdaterings van %1$s en vriende op %2$s." #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -256,7 +256,7 @@ msgstr "Kon nie die profiel stoor nie." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -506,6 +506,11 @@ msgstr "%s groepe" msgid "groups on %s" msgstr "groepe op %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Die deblokkering van die gebruiker het gefaal." + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -644,17 +649,21 @@ msgstr "Die status is verwyder." msgid "No status with that ID found." msgstr "Geen status met die ID gevind nie." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Die kennisgewing is te lank. Gebruik maksimum %d karakters." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Nie gevind nie." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4571,6 +4580,12 @@ msgstr "Weergawe" msgid "Author(s)" msgstr "Outeur(s)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4634,7 +4649,7 @@ msgstr "" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4689,45 +4704,45 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "" #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/ar/LC_MESSAGES/statusnet.po b/locale/ar/LC_MESSAGES/statusnet.po index bfcefa70d..753779db4 100644 --- a/locale/ar/LC_MESSAGES/statusnet.po +++ b/locale/ar/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Arabic # +# Author@translatewiki.net: Brion # Author@translatewiki.net: Meno25 # Author@translatewiki.net: OsamaK # -- @@ -9,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:20:54+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:37+0000\n" "Language-Team: Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ar\n" "X-Message-Group: out-statusnet\n" @@ -99,7 +100,7 @@ msgstr "لا صفحة كهذه." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -209,7 +210,7 @@ msgstr "" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -257,7 +258,7 @@ msgstr "لم يمكن حفظ الملف." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -499,6 +500,11 @@ msgstr "مجموعات %s" msgid "groups on %s" msgstr "مجموعات %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "ارفع ملفًا" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -639,17 +645,21 @@ msgstr "حُذِفت الحالة." msgid "No status with that ID found." msgstr "لا حالة وُجدت بهذه الهوية." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "هذه طويلة جدًا. أطول حجم للإشعار %d حرفًا." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "لم يوجد." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -3588,7 +3598,7 @@ msgstr "مجموعة %s" #: actions/showgroup.php:84 #, php-format msgid "%1$s group, page %2$d" -msgstr "مجموعة %1$، الصفحة %2$d" +msgstr "مجموعة %1$s، الصفحة %2$d" #: actions/showgroup.php:227 msgid "Group profile" @@ -4583,6 +4593,12 @@ msgstr "النسخة" msgid "Author(s)" msgstr "المؤلف(ون)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4646,7 +4662,7 @@ msgstr "لم يمكن إنشاء توكن الولوج ل%s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4701,46 +4717,46 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "مشكلة أثناء حفظ الإشعار." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "مشكلة أثناء حفظ الإشعار." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "آر تي @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/arz/LC_MESSAGES/statusnet.po b/locale/arz/LC_MESSAGES/statusnet.po index 918b90fe4..e845c1aeb 100644 --- a/locale/arz/LC_MESSAGES/statusnet.po +++ b/locale/arz/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:20:56+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:40+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 (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: arz\n" "X-Message-Group: out-statusnet\n" @@ -106,7 +106,7 @@ msgstr "لا صفحه كهذه" #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -216,7 +216,7 @@ msgstr "" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -264,7 +264,7 @@ msgstr "لم يمكن حفظ الملف." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -507,6 +507,11 @@ msgstr "مجموعات %s" msgid "groups on %s" msgstr "مجموعات %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "ارفع ملفًا" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -648,17 +653,21 @@ msgstr "حُذِفت الحاله." msgid "No status with that ID found." msgstr "" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "" -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "لم يوجد." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4611,6 +4620,12 @@ msgstr "النسخه" msgid "Author(s)" msgstr "المؤلف/ين" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4675,7 +4690,7 @@ msgstr "ما نفعش يتعمل امارة تسجيل دخول لـ %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4730,46 +4745,46 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "مشكله أثناء حفظ الإشعار." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "مشكله أثناء حفظ الإشعار." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "آر تى @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/bg/LC_MESSAGES/statusnet.po b/locale/bg/LC_MESSAGES/statusnet.po index 52d145239..8c974f942 100644 --- a/locale/bg/LC_MESSAGES/statusnet.po +++ b/locale/bg/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:20:58+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:42+0000\n" "Language-Team: Bulgarian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: bg\n" "X-Message-Group: out-statusnet\n" @@ -99,7 +99,7 @@ msgstr "Няма такака страница." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -207,7 +207,7 @@ msgstr "Бележки от %1$s и приятели в %2$s." #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -255,7 +255,7 @@ msgstr "Грешка при запазване на профила." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -505,6 +505,11 @@ msgstr "Групи на %s" msgid "groups on %s" msgstr "групи в %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Качване на файл" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -646,17 +651,21 @@ msgstr "Бележката е изтрита." msgid "No status with that ID found." msgstr "Не е открита бележка с такъв идентификатор." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, fuzzy, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Твърде дълга бележка. Трябва да е най-много 140 знака." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Не е открито." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4753,6 +4762,12 @@ msgstr "Версия" msgid "Author(s)" msgstr "Автор(и)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4820,7 +4835,7 @@ msgstr "Грешка при отбелязване като любима." #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4882,46 +4897,46 @@ msgstr "" "отново след няколко минути." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Забранено ви е да публикувате бележки в този сайт." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Проблем при записване на бележката." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "Проблем при записване на бележката." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/br/LC_MESSAGES/statusnet.po b/locale/br/LC_MESSAGES/statusnet.po index b6272905e..1237d3182 100644 --- a/locale/br/LC_MESSAGES/statusnet.po +++ b/locale/br/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:20:59+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:43+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: out-statusnet\n" @@ -98,7 +98,7 @@ msgstr "N'eus ket eus ar bajenn-se." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -208,7 +208,7 @@ msgstr "Hizivadennoù %1$s ha mignoned e %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -256,7 +256,7 @@ msgstr "Diposubl eo enrollañ ar profil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -502,6 +502,11 @@ msgstr "Strolladoù %s" msgid "groups on %s" msgstr "strolladoù war %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "C'hwitet en deus an urzhiad" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Arventenn oauth_token nann-roet." @@ -640,17 +645,21 @@ msgstr "Statud diverket." msgid "No status with that ID found." msgstr "N'eo ket bet kavet a statud evit an ID-mañ" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Re hir eo ! Ment hirañ an ali a zo a %d arouezenn." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "N'eo ket bet kavet." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4590,6 +4599,12 @@ msgstr "Stumm" msgid "Author(s)" msgstr "Aozer(ien)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4653,7 +4668,7 @@ msgstr "" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4708,45 +4723,45 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Ur gudenn 'zo bet pa veze enrollet an ali." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Ur gudenn 'zo bet pa veze enrollet boest degemer ar strollad." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/ca/LC_MESSAGES/statusnet.po b/locale/ca/LC_MESSAGES/statusnet.po index b0451a360..a6ccd881e 100644 --- a/locale/ca/LC_MESSAGES/statusnet.po +++ b/locale/ca/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:01+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:45+0000\n" "Language-Team: Catalan\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ca\n" "X-Message-Group: out-statusnet\n" @@ -101,7 +101,7 @@ msgstr "No existeix la pàgina." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -218,7 +218,7 @@ msgstr "Actualitzacions de %1$s i amics a %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -268,7 +268,7 @@ msgstr "No s'ha pogut desar el perfil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -517,6 +517,11 @@ msgstr "%s grups" msgid "groups on %s" msgstr "grups sobre %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Puja un fitxer" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "No s'ha proporcionat cap paràmetre oauth_token." @@ -662,17 +667,21 @@ msgstr "S'ha eliminat l'estat." msgid "No status with that ID found." msgstr "No s'ha trobat cap estatus amb la ID trobada." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Massa llarg. La longitud màxima és de %d caràcters." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "No s'ha trobat." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "La mida màxima de l'avís és %d caràcters, incloent l'URL de l'adjunt." @@ -4827,6 +4836,12 @@ msgstr "Versió" msgid "Author(s)" msgstr "Autoria" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4894,7 +4909,7 @@ msgstr "No s'ha pogut crear un testimoni d'inici de sessió per a %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4954,45 +4969,45 @@ msgstr "" "enviar en uns minuts." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Ha estat bandejat de publicar avisos en aquest lloc." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "S'ha produït un problema en desar l'avís." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "S'ha produït un problema en desar la safata d'entrada del grup." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/cs/LC_MESSAGES/statusnet.po b/locale/cs/LC_MESSAGES/statusnet.po index dd2630eaa..a07e38f09 100644 --- a/locale/cs/LC_MESSAGES/statusnet.po +++ b/locale/cs/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:03+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:47+0000\n" "Language-Team: Czech\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: cs\n" "X-Message-Group: out-statusnet\n" @@ -106,7 +106,7 @@ msgstr "Žádné takové oznámení." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -215,7 +215,7 @@ msgstr "" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -266,7 +266,7 @@ msgstr "Nelze uložit profil" #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -518,6 +518,11 @@ msgstr "" msgid "groups on %s" msgstr "" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Upload" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -665,18 +670,22 @@ msgstr "Obrázek nahrán" msgid "No status with that ID found." msgstr "" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, fuzzy, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Je to příliš dlouhé. Maximální sdělení délka je 140 znaků" -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 #, fuzzy msgid "Not found." msgstr "Žádný požadavek nebyl nalezen!" -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4792,6 +4801,12 @@ msgstr "Osobní" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4859,7 +4874,7 @@ msgstr "Nelze uložin informace o obrázku" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4916,46 +4931,46 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problém při ukládání sdělení" #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "Problém při ukládání sdělení" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/da/LC_MESSAGES/statusnet.po b/locale/da/LC_MESSAGES/statusnet.po new file mode 100644 index 000000000..3ea5d7f7e --- /dev/null +++ b/locale/da/LC_MESSAGES/statusnet.po @@ -0,0 +1,6734 @@ +# Translation of StatusNet to Danish +# +# Author@translatewiki.net: Mstenbaek +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:48+0000\n" +"Language-Team: Danish\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: da\n" +"X-Message-Group: out-statusnet\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#. TRANS: Page title +#. TRANS: Menu item for site administration +#: actions/accessadminpanel.php:55 lib/adminpanelaction.php:376 +msgid "Access" +msgstr "Adgang" + +#. TRANS: Page notice +#: actions/accessadminpanel.php:67 +msgid "Site access settings" +msgstr "Indstillinger for adgang til webstedet" + +#. TRANS: Form legend for registration form. +#: actions/accessadminpanel.php:161 +msgid "Registration" +msgstr "Registrering" + +#. TRANS: Checkbox instructions for admin setting "Private" +#: actions/accessadminpanel.php:165 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "Forhindre anonyme brugere (som ikke er logget ind) i at se webstedet?" + +#. TRANS: Checkbox label for prohibiting anonymous users from viewing site. +#: actions/accessadminpanel.php:167 +msgctxt "LABEL" +msgid "Private" +msgstr "Privat" + +#. TRANS: Checkbox instructions for admin setting "Invite only" +#: actions/accessadminpanel.php:174 +msgid "Make registration invitation only." +msgstr "Registreing er kun mulig gennem en invitation" + +#. TRANS: Checkbox label for configuring site as invite only. +#: actions/accessadminpanel.php:176 +msgid "Invite only" +msgstr "Kun Inviterede" + +#. TRANS: Checkbox instructions for admin setting "Closed" (no new registrations) +#: actions/accessadminpanel.php:183 +msgid "Disable new registrations." +msgstr "Forhindre nye registreringer" + +#. TRANS: Checkbox label for disabling new user registrations. +#: actions/accessadminpanel.php:185 +msgid "Closed" +msgstr "Lukket" + +#. TRANS: Title / tooltip for button to save access settings in site admin panel +#: actions/accessadminpanel.php:202 +msgid "Save access settings" +msgstr "Gem adgangsindstillinger" + +#. TRANS: Button label to save e-mail preferences. +#. TRANS: Button label to save IM preferences. +#. TRANS: Button label to save SMS preferences. +#. TRANS: Button label +#: actions/accessadminpanel.php:203 actions/emailsettings.php:224 +#: actions/imsettings.php:184 actions/smssettings.php:209 +#: lib/applicationeditform.php:361 +msgctxt "BUTTON" +msgid "Save" +msgstr "Gem" + +#. TRANS: Server error when page not found (404) +#: actions/all.php:68 actions/public.php:98 actions/replies.php:93 +#: actions/showfavorites.php:138 actions/tag.php:52 +msgid "No such page." +msgstr "Siden findes ikke" + +#: actions/all.php:79 actions/allrss.php:68 +#: actions/apiaccountupdatedeliverydevice.php:114 +#: actions/apiaccountupdateprofile.php:105 +#: actions/apiaccountupdateprofilebackgroundimage.php:116 +#: actions/apiaccountupdateprofileimage.php:105 actions/apiblockcreate.php:97 +#: actions/apiblockdestroy.php:96 actions/apidirectmessage.php:77 +#: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 +#: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 +#: actions/apigroupleave.php:100 actions/apigrouplist.php:73 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 +#: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 +#: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 +#: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 +#: actions/favoritesrss.php:74 actions/foaf.php:40 actions/foaf.php:58 +#: actions/hcard.php:67 actions/microsummary.php:62 actions/newmessage.php:116 +#: actions/otp.php:76 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/rsd.php:116 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:93 actions/userrss.php:40 +#: actions/xrds.php:71 lib/command.php:478 lib/galleryaction.php:59 +#: lib/mailbox.php:82 lib/profileaction.php:77 +msgid "No such user." +msgstr "Ingen bruger fundet." + +#. TRANS: Page title. %1$s is user nickname, %2$d is page number +#: actions/all.php:90 +#, php-format +msgid "%1$s and friends, page %2$d" +msgstr "%1$s og venner, side %2$d" + +#. TRANS: Page title. %1$s is user nickname +#. TRANS: H1 text. %1$s is user nickname +#. TRANS: Message is used as link title. %s is a user nickname. +#: actions/all.php:93 actions/all.php:185 actions/allrss.php:116 +#: actions/apitimelinefriends.php:210 actions/apitimelinehome.php:116 +#: lib/personalgroupnav.php:100 +#, php-format +msgid "%s and friends" +msgstr "%s og venner" + +#. TRANS: %1$s is user nickname +#: actions/all.php:107 +#, php-format +msgid "Feed for friends of %s (RSS 1.0)" +msgstr "Feed for venner af %s (RSS 1.0)" + +#. TRANS: %1$s is user nickname +#: actions/all.php:116 +#, php-format +msgid "Feed for friends of %s (RSS 2.0)" +msgstr "Feed for venner af %s (RSS 1.0)" + +#. TRANS: %1$s is user nickname +#: actions/all.php:125 +#, php-format +msgid "Feed for friends of %s (Atom)" +msgstr "Feed for venner af %s (Atom)" + +#. TRANS: %1$s is user nickname +#: actions/all.php:138 +#, 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 skrevet noget endnu." + +#: actions/all.php:143 +#, php-format +msgid "" +"Try subscribing to more people, [join a group](%%action.groups%%) or post " +"something yourself." +msgstr "" +"Prøv at abonnere på flere personer, [deltage i en gruppe] (%%action.groups%" +"%) eller skriv noget selv." + +#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" +#: actions/all.php:146 +#, php-format +msgid "" +"You can try to [nudge %1$s](../%2$s) from their profile or [post something " +"to their attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." +msgstr "" + +#: actions/all.php:149 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 their attention." +msgstr "" + +#. TRANS: H1 text +#: actions/all.php:182 +msgid "You and friends" +msgstr "Du og vennerne" + +#. TRANS: Message is used as link description. %1$s is a username, %2$s is a site name. +#. TRANS: Message is used as a subtitle. %1$s is a user nickname, %2$s is a site name. +#: actions/allrss.php:121 actions/apitimelinefriends.php:216 +#: actions/apitimelinehome.php:122 +#, php-format +msgid "Updates from %1$s and friends on %2$s!" +msgstr "Opdateringer fra %1$s og venner på %2$s!" + +#: actions/apiaccountratelimitstatus.php:72 +#: actions/apiaccountupdatedeliverydevice.php:94 +#: actions/apiaccountupdateprofile.php:97 +#: actions/apiaccountupdateprofilebackgroundimage.php:94 +#: actions/apiaccountupdateprofilecolors.php:118 +#: actions/apiaccountverifycredentials.php:70 actions/apidirectmessage.php:156 +#: actions/apifavoritecreate.php:100 actions/apifavoritedestroy.php:101 +#: actions/apifriendshipscreate.php:100 actions/apifriendshipsdestroy.php:100 +#: actions/apifriendshipsshow.php:128 actions/apigroupcreate.php:139 +#: actions/apigroupismember.php:115 actions/apigroupjoin.php:156 +#: actions/apigroupleave.php:142 actions/apigrouplist.php:137 +#: actions/apigrouplistall.php:122 actions/apigroupmembership.php:107 +#: actions/apigroupshow.php:116 actions/apihelptest.php:88 +#: actions/apistatusesdestroy.php:104 actions/apistatusesretweets.php:112 +#: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 +#: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 +#: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 +#: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 +#: actions/apitimelineretweetedtome.php:121 +#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 +#: actions/apitimelineuser.php:163 actions/apiusershow.php:101 +msgid "API method not found." +msgstr "API metode ikke fundet." + +#: actions/apiaccountupdatedeliverydevice.php:86 +#: actions/apiaccountupdateprofile.php:89 +#: actions/apiaccountupdateprofilebackgroundimage.php:86 +#: actions/apiaccountupdateprofilecolors.php:110 +#: actions/apiaccountupdateprofileimage.php:84 actions/apiblockcreate.php:89 +#: actions/apiblockdestroy.php:88 actions/apidirectmessagenew.php:109 +#: actions/apifavoritecreate.php:91 actions/apifavoritedestroy.php:92 +#: actions/apifriendshipscreate.php:91 actions/apifriendshipsdestroy.php:91 +#: actions/apigroupcreate.php:105 actions/apigroupjoin.php:92 +#: actions/apigroupleave.php:92 actions/apimediaupload.php:67 +#: actions/apistatusesretweet.php:65 actions/apistatusesupdate.php:198 +msgid "This method requires a POST." +msgstr "Denne metode kræver en POST." + +#: actions/apiaccountupdatedeliverydevice.php:106 +msgid "" +"You must specify a parameter named 'device' with a value of one of: sms, im, " +"none." +msgstr "" +"Du skal angive en parameter med navnet 'device', med værdien sat til en af " +"følgende: sms, im, none." + +#: actions/apiaccountupdatedeliverydevice.php:133 +msgid "Could not update user." +msgstr "Kunne ikke opdatere brugeren." + +#: actions/apiaccountupdateprofile.php:112 +#: actions/apiaccountupdateprofilebackgroundimage.php:194 +#: actions/apiaccountupdateprofilecolors.php:185 +#: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/hcard.php:74 +#: actions/replies.php:80 actions/usergroups.php:100 lib/galleryaction.php:66 +#: lib/profileaction.php:84 +msgid "User has no profile." +msgstr "Brugeren har ingen profil." + +#: actions/apiaccountupdateprofile.php:147 +msgid "Could not save profile." +msgstr "Kunne ikke gemme profilen." + +#: actions/apiaccountupdateprofilebackgroundimage.php:108 +#: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 +#: actions/designadminpanel.php:123 actions/editapplication.php:118 +#: actions/newapplication.php:101 actions/newnotice.php:94 +#: lib/designsettings.php:283 +#, php-format +msgid "" +"The server was unable to handle that much POST data (%s bytes) due to its " +"current configuration." +msgstr "" +"Serveren var ikke i stand til at håndtere så meget POST data (%s bytes) på " +"grund af sin nuværende konfiguration." + +#: actions/apiaccountupdateprofilebackgroundimage.php:136 +#: actions/apiaccountupdateprofilebackgroundimage.php:146 +#: actions/apiaccountupdateprofilecolors.php:164 +#: actions/apiaccountupdateprofilecolors.php:174 +#: actions/groupdesignsettings.php:290 actions/groupdesignsettings.php:300 +#: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 +#: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 +msgid "Unable to save your design settings." +msgstr "Kunne ikke gemme dine design indstillinger." + +#: actions/apiaccountupdateprofilebackgroundimage.php:187 +#: actions/apiaccountupdateprofilecolors.php:142 +msgid "Could not update your design." +msgstr "Kunne ikke opdatere dit design." + +#: actions/apiblockcreate.php:105 +msgid "You cannot block yourself!" +msgstr "Du kan ikke blokere dig selv!" + +#: actions/apiblockcreate.php:126 +msgid "Block user failed." +msgstr "Blokering af bruger mislykkedes" + +#: actions/apiblockdestroy.php:114 +msgid "Unblock user failed." +msgstr "Ophæv blokering af bruger mislykkedes." + +#: actions/apidirectmessage.php:89 +#, php-format +msgid "Direct messages from %s" +msgstr "Direkte beskeder fra %s" + +#: actions/apidirectmessage.php:93 +#, php-format +msgid "All the direct messages sent from %s" +msgstr "Alle direkte beskeder, sendt fra %s" + +#: actions/apidirectmessage.php:101 +#, php-format +msgid "Direct messages to %s" +msgstr "Direkte beskeder til %s" + +#: actions/apidirectmessage.php:105 +#, php-format +msgid "All the direct messages sent to %s" +msgstr "Alle direkte beskeder, sendt til %s" + +#: actions/apidirectmessagenew.php:118 +msgid "No message text!" +msgstr "Ingen besked tekst!" + +#: actions/apidirectmessagenew.php:127 actions/newmessage.php:150 +#, php-format +msgid "That's too long. Max message size is %d chars." +msgstr "Det er for langt. Maksimal besked størrelse er %d tegn." + +#: actions/apidirectmessagenew.php:138 +msgid "Recipient user not found." +msgstr "Modtager bruger ikke fundet" + +#: actions/apidirectmessagenew.php:142 +msgid "Can't send direct messages to users who aren't your friend." +msgstr "Kan ikke sende direkte beskeder til brugere, som ikke din ven." + +#: actions/apifavoritecreate.php:109 actions/apifavoritedestroy.php:110 +#: actions/apistatusesdestroy.php:121 +msgid "No status found with that ID." +msgstr "Ingen status fundet med dette ID." + +#: actions/apifavoritecreate.php:120 +msgid "This status is already a favorite." +msgstr "Denne status er allerede en favorit." + +#: actions/apifavoritecreate.php:131 actions/favor.php:84 lib/command.php:285 +msgid "Could not create favorite." +msgstr "Kunne ikke oprette favorit." + +#: actions/apifavoritedestroy.php:123 +msgid "That status is not a favorite." +msgstr "Denne status er ikke en favorit." + +#: actions/apifavoritedestroy.php:135 actions/disfavor.php:87 +msgid "Could not delete favorite." +msgstr "Kunne ikke slette favorit." + +#: actions/apifriendshipscreate.php:109 +msgid "Could not follow user: profile not found." +msgstr "" + +#: actions/apifriendshipscreate.php:118 +#, php-format +msgid "Could not follow user: %s is already on your list." +msgstr "Kunne ikke følge bruger: %s er allerede på din liste." + +#: actions/apifriendshipsdestroy.php:109 +msgid "Could not unfollow user: User not found." +msgstr "Kunne ikke stoppe følgeskab af bruger: Bruger ikke fundet." + +#: actions/apifriendshipsdestroy.php:120 +msgid "You cannot unfollow yourself." +msgstr "Du kan ikke ophæve følgeskab til dig selv." + +#: actions/apifriendshipsexists.php:91 +msgid "Two valid IDs or screen_names must be supplied." +msgstr "" + +#: actions/apifriendshipsshow.php:134 +msgid "Could not determine source user." +msgstr "Kunne ikke finde kilde bruger" + +#: actions/apifriendshipsshow.php:142 +msgid "Could not find target user." +msgstr "Kunne ikke finde mål bruger." + +#: actions/apigroupcreate.php:167 actions/editgroup.php:186 +#: actions/newgroup.php:126 actions/profilesettings.php:215 +#: actions/register.php:212 +msgid "Nickname must have only lowercase letters and numbers and no spaces." +msgstr "Kaldenavn må kun have små bogstaver og tal og ingen mellemrum." + +#: actions/apigroupcreate.php:176 actions/editgroup.php:190 +#: actions/newgroup.php:130 actions/profilesettings.php:238 +#: actions/register.php:215 +msgid "Nickname already in use. Try another one." +msgstr "Kaldenavn allerede er i brug. Prøv med et andet." + +#: actions/apigroupcreate.php:183 actions/editgroup.php:193 +#: actions/newgroup.php:133 actions/profilesettings.php:218 +#: actions/register.php:217 +msgid "Not a valid nickname." +msgstr "Ikke et gyldigt kaldenavn" + +#: actions/apigroupcreate.php:199 actions/editapplication.php:215 +#: actions/editgroup.php:199 actions/newapplication.php:203 +#: actions/newgroup.php:139 actions/profilesettings.php:222 +#: actions/register.php:224 +msgid "Homepage is not a valid URL." +msgstr "Hjemmesiden er ikke en gyldig URL adresse." + +#: actions/apigroupcreate.php:208 actions/editgroup.php:202 +#: actions/newgroup.php:142 actions/profilesettings.php:225 +#: actions/register.php:227 +msgid "Full name is too long (max 255 chars)." +msgstr "Fulde navn er for langt (max 255 tegn)." + +#: actions/apigroupcreate.php:216 actions/editapplication.php:190 +#: actions/newapplication.php:172 +#, php-format +msgid "Description is too long (max %d chars)." +msgstr "Beskrivelse er for lang (max %d tegn)." + +#: actions/apigroupcreate.php:227 actions/editgroup.php:208 +#: actions/newgroup.php:148 actions/profilesettings.php:232 +#: actions/register.php:234 +msgid "Location is too long (max 255 chars)." +msgstr "Placering er for lang (max 255 tegn)." + +#: actions/apigroupcreate.php:246 actions/editgroup.php:219 +#: actions/newgroup.php:159 +#, php-format +msgid "Too many aliases! Maximum %d." +msgstr "Alt for mange aliaser! Maksimum %d." + +#: actions/apigroupcreate.php:267 +#, php-format +msgid "Invalid alias: \"%s\"." +msgstr "Ugyldigt alias: \"%s\"." + +#: actions/apigroupcreate.php:276 actions/editgroup.php:232 +#: actions/newgroup.php:172 +#, php-format +msgid "Alias \"%s\" already in use. Try another one." +msgstr "Alias \"%s\" er allerede i brug. Prøv med et andet." + +#: actions/apigroupcreate.php:289 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 kaldenavn." + +#: actions/apigroupismember.php:96 actions/apigroupjoin.php:105 +#: actions/apigroupleave.php:105 actions/apigroupmembership.php:92 +#: actions/apigroupshow.php:83 actions/apitimelinegroup.php:92 +msgid "Group not found." +msgstr "Gruppen blev ikke fundet." + +#: actions/apigroupjoin.php:111 actions/joingroup.php:100 +msgid "You are already a member of that group." +msgstr "Du er allerede medlem af denne gruppe." + +#: actions/apigroupjoin.php:120 actions/joingroup.php:105 lib/command.php:327 +msgid "You have been blocked from that group by the admin." +msgstr "Du er blevet blokeret fra denne gruppe af administratoren." + +#: actions/apigroupjoin.php:139 actions/joingroup.php:134 +#, php-format +msgid "Could not join user %1$s to group %2$s." +msgstr "Kunne ikke tilslutte bruger %1$s til gruppe %2$s." + +#: actions/apigroupleave.php:115 +msgid "You are not a member of this group." +msgstr "Du er ikke medlem af denne gruppe." + +#: actions/apigroupleave.php:125 actions/leavegroup.php:129 +#, php-format +msgid "Could not remove user %1$s from group %2$s." +msgstr "Kunne ikke fjerne brugeren %1$s fra gruppen %2$s." + +#. TRANS: %s is a user name +#: actions/apigrouplist.php:98 +#, php-format +msgid "%s's groups" +msgstr "%s's grupper" + +#. TRANS: Meant to convey the user %2$s is a member of each of the groups listed on site %1$s +#: actions/apigrouplist.php:108 +#, php-format +msgid "%1$s groups %2$s is a member of." +msgstr "%1$s grupper som %2$s er medlem af." + +#. TRANS: Message is used as a title. %s is a site name. +#. TRANS: Message is used as a page title. %s is a nick name. +#: actions/apigrouplistall.php:92 actions/usergroups.php:63 +#, php-format +msgid "%s groups" +msgstr "%s's grupper" + +#: actions/apigrouplistall.php:96 +#, php-format +msgid "groups on %s" +msgstr "grupper på %s" + +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Ophæv blokering af bruger mislykkedes." + +#: actions/apioauthauthorize.php:101 +msgid "No oauth_token parameter provided." +msgstr "Ingen oauth_token parameter angivet." + +#: actions/apioauthauthorize.php:106 +msgid "Invalid token." +msgstr "Ugyldigt token." + +#: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 +#: actions/deletenotice.php:169 actions/disfavor.php:74 +#: actions/emailsettings.php:267 actions/favor.php:75 actions/geocode.php:55 +#: actions/groupblock.php:66 actions/grouplogo.php:312 +#: actions/groupunblock.php:66 actions/imsettings.php:227 +#: actions/invite.php:56 actions/login.php:137 actions/makeadmin.php:66 +#: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 +#: actions/oauthappssettings.php:159 actions/oauthconnectionssettings.php:135 +#: actions/othersettings.php:145 actions/passwordsettings.php:138 +#: actions/profilesettings.php:194 actions/recoverpassword.php:350 +#: actions/register.php:172 actions/remotesubscribe.php:77 +#: actions/repeat.php:83 actions/smssettings.php:256 actions/subedit.php:38 +#: actions/subscribe.php:86 actions/tagother.php:166 +#: actions/unsubscribe.php:69 actions/userauthorization.php:52 +#: lib/designsettings.php:294 +msgid "There was a problem with your session token. Try again, please." +msgstr "Der var et problem med din session token. Venligst prøv igen." + +#: actions/apioauthauthorize.php:135 +msgid "Invalid nickname / password!" +msgstr "Ugyldig kaldenavn / password!" + +#: actions/apioauthauthorize.php:159 +msgid "Database error deleting OAuth application user." +msgstr "Databasefejl ved sletning af OAuth applikationsbruger." + +#: actions/apioauthauthorize.php:185 +msgid "Database error inserting OAuth application user." +msgstr "Databasefejl ved tilføjelse af OAuth applikationsbruger." + +#: actions/apioauthauthorize.php:214 +#, php-format +msgid "" +"The request token %s has been authorized. Please exchange it for an access " +"token." +msgstr "" +"Anmodnings-token %s er blevet godkendt. Venligst anvend den til en Adgangs-" +"token." + +#: actions/apioauthauthorize.php:227 +#, php-format +msgid "The request token %s has been denied and revoked." +msgstr "Anmodnings-token %s er blevet afvist og trukket tilbage." + +#. TRANS: Message given submitting a form with an unknown action in e-mail settings. +#. TRANS: Message given submitting a form with an unknown action in IM settings. +#. TRANS: Message given submitting a form with an unknown action in SMS settings. +#: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 +#: actions/designadminpanel.php:104 actions/editapplication.php:139 +#: actions/emailsettings.php:286 actions/grouplogo.php:322 +#: actions/imsettings.php:242 actions/newapplication.php:121 +#: actions/oauthconnectionssettings.php:147 actions/recoverpassword.php:44 +#: actions/smssettings.php:277 lib/designsettings.php:304 +msgid "Unexpected form submission." +msgstr "Uventet formularafsendelse." + +#: actions/apioauthauthorize.php:259 +msgid "An application would like to connect to your account" +msgstr "En applikation vil gerne forbinde til din konto" + +#: actions/apioauthauthorize.php:276 +msgid "Allow or deny access" +msgstr "Tillad eller Afvis adgang" + +#: actions/apioauthauthorize.php:292 +#, php-format +msgid "" +"The application %1$s by %2$s would like " +"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 "" +"Applikationen %1$s af %2$s vil gerne %3$s dine data for konto %4$s. Du bør kun give adgang til din %4$s konto " +"til tredjemand du stoler på." + +#. TRANS: Main menu option when logged in for access to user settings +#: actions/apioauthauthorize.php:310 lib/action.php:450 +msgid "Account" +msgstr "Konto" + +#: actions/apioauthauthorize.php:313 actions/login.php:252 +#: actions/profilesettings.php:106 actions/register.php:431 +#: actions/showgroup.php:245 actions/tagother.php:94 +#: actions/userauthorization.php:145 lib/groupeditform.php:152 +#: lib/userprofile.php:132 +msgid "Nickname" +msgstr "Kaldenavn" + +#. TRANS: Link description in user account settings menu. +#: actions/apioauthauthorize.php:316 actions/login.php:255 +#: actions/register.php:436 lib/accountsettingsaction.php:125 +msgid "Password" +msgstr "Adgangskode" + +#: actions/apioauthauthorize.php:328 +msgid "Deny" +msgstr "Nægt" + +#: actions/apioauthauthorize.php:334 +msgid "Allow" +msgstr "Tillad" + +#: actions/apioauthauthorize.php:351 +msgid "Allow or deny access to your account information." +msgstr "Tillad eller nægte adgang til dine kontooplysninger." + +#: actions/apistatusesdestroy.php:112 +msgid "This method requires a POST or DELETE." +msgstr "Denne metode kræver en POST eller DELETE." + +#: actions/apistatusesdestroy.php:135 +msgid "You may not delete another user's status." +msgstr "Du kan ikke slette en anden brugers status." + +#: actions/apistatusesretweet.php:75 actions/apistatusesretweets.php:72 +#: actions/deletenotice.php:52 actions/shownotice.php:92 +msgid "No such notice." +msgstr "Ingen sådan meddelelse." + +#: actions/apistatusesretweet.php:83 +msgid "Cannot repeat your own notice." +msgstr "Kan ikke gentage din egen meddelelse." + +#: actions/apistatusesretweet.php:91 +msgid "Already repeated that notice." +msgstr "Allerede gentaget denne medelelse." + +#: actions/apistatusesshow.php:139 +msgid "Status deleted." +msgstr "Status slettet." + +#: actions/apistatusesshow.php:145 +msgid "No status with that ID found." +msgstr "Ingen status med dette ID fundet." + +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 +#: lib/mailhandler.php:60 +#, php-format +msgid "That's too long. Max notice size is %d chars." +msgstr "Det er for langt. Maksimal besked størrelse er %d tegn." + +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 +msgid "Not found." +msgstr "Ikke fundet." + +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 +#, php-format +msgid "Max notice size is %d chars, including attachment URL." +msgstr "Max meddelelse størrelse er %d tegn, inklusiv vedlagt URL." + +#: actions/apisubscriptions.php:232 actions/apisubscriptions.php:262 +msgid "Unsupported format." +msgstr "Formatet understøttes ikke" + +#: actions/apitimelinefavorites.php:110 +#, php-format +msgid "%1$s / Favorites from %2$s" +msgstr "%1$s / favoritter fra %2$s" + +#: actions/apitimelinefavorites.php:119 +#, php-format +msgid "%1$s updates favorited by %2$s / %2$s." +msgstr "%1$s opdateringer favoriseret af %2$s / %2$s." + +#: actions/apitimelinementions.php:118 +#, php-format +msgid "%1$s / Updates mentioning %2$s" +msgstr "%1$s / opdateringer nævner %2$s" + +#: actions/apitimelinementions.php:131 +#, php-format +msgid "%1$s updates that reply to updates from %2$s / %3$s." +msgstr "%1$s opdateringer, som svar på opdateringer fra %2$s / %3$s." + +#: actions/apitimelinepublic.php:197 actions/publicrss.php:103 +#, php-format +msgid "%s public timeline" +msgstr "%s offentlig tidslinie" + +#: actions/apitimelinepublic.php:202 actions/publicrss.php:105 +#, php-format +msgid "%s updates from everyone!" +msgstr "%s opdateringer fra alle!" + +#: actions/apitimelineretweetedtome.php:111 +#, php-format +msgid "Repeated to %s" +msgstr "Gentagne til %s" + +#: actions/apitimelineretweetsofme.php:114 +#, php-format +msgid "Repeats of %s" +msgstr "Gentaget af %s" + +#: actions/apitimelinetag.php:105 actions/tag.php:67 +#, php-format +msgid "Notices tagged with %s" +msgstr "Bekendtgørelser tagged med %s" + +#: actions/apitimelinetag.php:107 actions/tagrss.php:65 +#, php-format +msgid "Updates tagged with %1$s on %2$s!" +msgstr "Opdateringer tagged med %1$s på %2$s!" + +#: actions/apitrends.php:87 +msgid "API method under construction." +msgstr "" + +#: actions/attachment.php:73 +msgid "No such attachment." +msgstr "Ingen sådan fil." + +#: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 +#: actions/editgroup.php:84 actions/groupdesignsettings.php:84 +#: actions/grouplogo.php:86 actions/groupmembers.php:76 +#: actions/grouprss.php:91 actions/showgroup.php:121 +msgid "No nickname." +msgstr "Ingen kaldenavn." + +#: actions/avatarbynickname.php:64 +msgid "No size." +msgstr "Ingen størrelse." + +#: actions/avatarbynickname.php:69 +msgid "Invalid size." +msgstr "Ugyldig størrelse." + +#. TRANS: Link description in user account settings menu. +#: actions/avatarsettings.php:67 actions/showgroup.php:230 +#: lib/accountsettingsaction.php:118 +msgid "Avatar" +msgstr "Avatar" + +#: actions/avatarsettings.php:78 +#, php-format +msgid "You can upload your personal avatar. The maximum file size is %s." +msgstr "" +"Du kan uploade dine personlige avatar. Den maksimale filstørrelse er %s." + +#: actions/avatarsettings.php:106 actions/avatarsettings.php:185 +#: actions/grouplogo.php:181 actions/remotesubscribe.php:191 +#: actions/userauthorization.php:72 actions/userrss.php:108 +msgid "User without matching profile." +msgstr "Bruger uden matchende profil." + +#: actions/avatarsettings.php:119 actions/avatarsettings.php:197 +#: actions/grouplogo.php:254 +msgid "Avatar settings" +msgstr "Avatar indstillinger" + +#: actions/avatarsettings.php:127 actions/avatarsettings.php:205 +#: actions/grouplogo.php:202 actions/grouplogo.php:262 +msgid "Original" +msgstr "Original" + +#: actions/avatarsettings.php:142 actions/avatarsettings.php:217 +#: actions/grouplogo.php:213 actions/grouplogo.php:274 +msgid "Preview" +msgstr "Forhåndsvisning" + +#: actions/avatarsettings.php:149 actions/showapplication.php:252 +#: lib/deleteuserform.php:66 lib/noticelist.php:656 +msgid "Delete" +msgstr "Slet" + +#: actions/avatarsettings.php:166 actions/grouplogo.php:236 +msgid "Upload" +msgstr "Oplægge" + +#: actions/avatarsettings.php:231 actions/grouplogo.php:289 +msgid "Crop" +msgstr "Beskær" + +#: actions/avatarsettings.php:305 +msgid "No file uploaded." +msgstr "Ingen fil uploaded." + +#: actions/avatarsettings.php:332 +msgid "Pick a square area of the image to be your avatar" +msgstr "Vælg en firkantet område af billedet til at være din avatar" + +#: actions/avatarsettings.php:347 actions/grouplogo.php:380 +msgid "Lost our file data." +msgstr "Mistede vores fil data." + +#: actions/avatarsettings.php:370 +msgid "Avatar updated." +msgstr "Avatar opdateret." + +#: actions/avatarsettings.php:373 +msgid "Failed updating avatar." +msgstr "Mislykket ajourføring af Avatar." + +#: actions/avatarsettings.php:397 +msgid "Avatar deleted." +msgstr "Avatar slettet." + +#: actions/block.php:69 +msgid "You already blocked that user." +msgstr "Du har allerede blokeret for denne bruger." + +#: actions/block.php:107 actions/block.php:136 actions/groupblock.php:158 +msgid "Block user" +msgstr "Bloker bruger" + +#: actions/block.php:138 +msgid "" +"Are you sure you want to block this user? Afterwards, they will be " +"unsubscribed from you, unable to subscribe to you in the future, and you " +"will not be notified of any @-replies from them." +msgstr "" +"Er du sikker på du vil blokere denne bruger? Bagefter vil de blive afmeldt " +"fra dig, ude af stand til at abonnere på dig i fremtiden, og du vil ikke " +"blive underrettet om nogen @-svar fra dem." + +#. TRANS: Button label on the user block form. +#. TRANS: Button label on the delete application form. +#. TRANS: Button label on the delete notice form. +#. TRANS: Button label on the delete user form. +#. TRANS: Button label on the form to block a user from a group. +#: actions/block.php:153 actions/deleteapplication.php:154 +#: actions/deletenotice.php:147 actions/deleteuser.php:152 +#: actions/groupblock.php:178 +msgctxt "BUTTON" +msgid "No" +msgstr "Nej" + +#. TRANS: Submit button title for 'No' when blocking a user. +#. TRANS: Submit button title for 'No' when deleting a user. +#: actions/block.php:157 actions/deleteuser.php:156 +msgid "Do not block this user" +msgstr "Bloker ikke denne bruger" + +#. TRANS: Button label on the user block form. +#. TRANS: Button label on the delete application form. +#. TRANS: Button label on the delete notice form. +#. TRANS: Button label on the delete user form. +#. TRANS: Button label on the form to block a user from a group. +#: actions/block.php:160 actions/deleteapplication.php:161 +#: actions/deletenotice.php:154 actions/deleteuser.php:159 +#: actions/groupblock.php:185 +msgctxt "BUTTON" +msgid "Yes" +msgstr "Ja" + +#. TRANS: Submit button title for 'Yes' when blocking a user. +#: actions/block.php:164 actions/groupmembers.php:392 lib/blockform.php:80 +msgid "Block this user" +msgstr "Bloker denne bruger" + +#: actions/block.php:187 +msgid "Failed to save block information." +msgstr "Kunne ikke gemme blokerings oplysninger." + +#: 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:166 +#: lib/command.php:368 +msgid "No such group." +msgstr "Ingen sådan gruppe." + +#: actions/blockedfromgroup.php:97 +#, php-format +msgid "%s blocked profiles" +msgstr "%s blokerede profiler" + +#: actions/blockedfromgroup.php:100 +#, php-format +msgid "%1$s blocked profiles, page %2$d" +msgstr "%1$s blokerede profiler, side %2$d" + +#: actions/blockedfromgroup.php:115 +msgid "A list of the users blocked from joining this group." +msgstr "En liste over brugere blokeret fra at deltage i denne gruppe." + +#: actions/blockedfromgroup.php:288 +msgid "Unblock user from group" +msgstr "Ophæv blokering af bruger fra gruppe" + +#: actions/blockedfromgroup.php:320 lib/unblockform.php:69 +msgid "Unblock" +msgstr "Fjern blokering" + +#: actions/blockedfromgroup.php:320 lib/unblockform.php:80 +msgid "Unblock this user" +msgstr "Fjern blokeringen af denne bruger" + +#. TRANS: Title for mini-posting window loaded from bookmarklet. +#: actions/bookmarklet.php:51 +#, php-format +msgid "Post to %s" +msgstr "Post til %s" + +#: actions/confirmaddress.php:75 +msgid "No confirmation code." +msgstr "Ingen bekræftelseskode." + +#: actions/confirmaddress.php:80 +msgid "Confirmation code not found." +msgstr "Bekræftelseskode ikke fundet." + +#: actions/confirmaddress.php:85 +msgid "That confirmation code is not for you!" +msgstr "Denne bekræftelseskode er ikke til dig!" + +#. TRANS: Server error for an unknow address type, which can be 'email', 'jabber', or 'sms'. +#: actions/confirmaddress.php:91 +#, php-format +msgid "Unrecognized address type %s." +msgstr "Ukendte adresse type %s." + +#. TRANS: Client error for an already confirmed email/jabbel/sms address. +#: actions/confirmaddress.php:96 +msgid "That address has already been confirmed." +msgstr "Denne adresse er allerede blevet bekræftet." + +#. TRANS: Server error thrown on database error updating e-mail preferences. +#. TRANS: Server error thrown on database error removing a registered e-mail address. +#. TRANS: Server error thrown on database error updating IM preferences. +#. TRANS: Server error thrown on database error removing a registered IM address. +#. TRANS: Server error thrown on database error updating SMS preferences. +#. TRANS: Server error thrown on database error removing a registered SMS phone number. +#: actions/confirmaddress.php:116 actions/emailsettings.php:327 +#: actions/emailsettings.php:473 actions/imsettings.php:280 +#: actions/imsettings.php:439 actions/othersettings.php:174 +#: actions/profilesettings.php:283 actions/smssettings.php:308 +#: actions/smssettings.php:464 +msgid "Couldn't update user." +msgstr "Kunne ikke opdatere brugeren." + +#. TRANS: Server error thrown on database error canceling e-mail address confirmation. +#. TRANS: Server error thrown on database error canceling SMS phone number confirmation. +#: actions/confirmaddress.php:128 actions/emailsettings.php:433 +#: actions/smssettings.php:422 +msgid "Couldn't delete email confirmation." +msgstr "Kunne ikke slette e-mail bekræftelse." + +#: actions/confirmaddress.php:146 +msgid "Confirm address" +msgstr "Bekræft adresse" + +#: actions/confirmaddress.php:161 +#, php-format +msgid "The address \"%s\" has been confirmed for your account." +msgstr "Adressen \"%s\" er blevet bekræftet for din konto." + +#: actions/conversation.php:99 +msgid "Conversation" +msgstr "Samtale" + +#: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87 +#: lib/profileaction.php:229 lib/searchgroupnav.php:82 +msgid "Notices" +msgstr "Bekendtgørelser" + +#: actions/deleteapplication.php:63 +msgid "You must be logged in to delete an application." +msgstr "Du skal være logget ind for at slette et program." + +#: actions/deleteapplication.php:71 +msgid "Application not found." +msgstr "Program ikke fundet." + +#: actions/deleteapplication.php:78 actions/editapplication.php:77 +#: actions/showapplication.php:94 +msgid "You are not the owner of this application." +msgstr "Du er ikke ejer af dette program." + +#: actions/deleteapplication.php:102 actions/editapplication.php:127 +#: actions/newapplication.php:110 actions/showapplication.php:118 +#: lib/action.php:1263 +msgid "There was a problem with your session token." +msgstr "Der var et problem med din session token." + +#: actions/deleteapplication.php:123 actions/deleteapplication.php:147 +msgid "Delete application" +msgstr "Slet program" + +#: actions/deleteapplication.php:149 +msgid "" +"Are you sure you want to delete this application? This will clear all data " +"about the application from the database, including all existing user " +"connections." +msgstr "" +"Er du sikker på du vil slette dette program? Dette vil slette alle data om " +"anvendelsen fra databasen, herunder alle eksisterende bruger indstillinger." + +#. TRANS: Submit button title for 'No' when deleting an application. +#: actions/deleteapplication.php:158 +msgid "Do not delete this application" +msgstr "Slet ikke dette program" + +#. TRANS: Submit button title for 'Yes' when deleting an application. +#: actions/deleteapplication.php:164 +msgid "Delete this application" +msgstr "Slet dette program" + +#. TRANS: Client error message thrown when trying to access the admin panel while not logged in. +#: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 +#: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 +#: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 +#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:96 +#: actions/tagother.php:33 actions/unsubscribe.php:52 +#: lib/adminpanelaction.php:73 lib/profileformaction.php:64 +#: lib/settingsaction.php:72 +msgid "Not logged in." +msgstr "Ikke logget ind" + +#: actions/deletenotice.php:71 +msgid "Can't delete this notice." +msgstr "Kan ikke slette denne meddelelse." + +#: actions/deletenotice.php:103 +msgid "" +"You are about to permanently delete a notice. Once this is done, it cannot " +"be undone." +msgstr "" +"Du er ved permanent at slette en meddelelse. Når dette er gjort, kan det " +"ikke fortrydes." + +#: actions/deletenotice.php:109 actions/deletenotice.php:141 +msgid "Delete notice" +msgstr "Slet meddelelse" + +#: actions/deletenotice.php:144 +msgid "Are you sure you want to delete this notice?" +msgstr "Er du sikker på du vil slette denne meddelelse?" + +#. TRANS: Submit button title for 'No' when deleting a notice. +#: actions/deletenotice.php:151 +msgid "Do not delete this notice" +msgstr "Slet ikke denne meddelelse" + +#. TRANS: Submit button title for 'Yes' when deleting a notice. +#: actions/deletenotice.php:158 lib/noticelist.php:656 +msgid "Delete this notice" +msgstr "Slet denne meddelelse" + +#: actions/deleteuser.php:67 +msgid "You cannot delete users." +msgstr "Du kan ikke slette brugere." + +#: actions/deleteuser.php:74 +msgid "You can only delete local users." +msgstr "Du kan kun slette de lokale brugere." + +#: actions/deleteuser.php:110 actions/deleteuser.php:133 +msgid "Delete user" +msgstr "Slet bruger" + +#: actions/deleteuser.php:136 +msgid "" +"Are you sure you want to delete this user? This will clear all data about " +"the user from the database, without a backup." +msgstr "" +"Er du sikker på du vil slette denne bruger? Dette vil slette alle data om " +"brugeren fra databasen, uden en sikkerhedskopi." + +#. TRANS: Submit button title for 'Yes' when deleting a user. +#: actions/deleteuser.php:163 lib/deleteuserform.php:77 +msgid "Delete this user" +msgstr "Slet denne bruger" + +#. TRANS: Message used as title for design settings for the site. +#. TRANS: Link description in user account settings menu. +#: actions/designadminpanel.php:63 lib/accountsettingsaction.php:139 +#: lib/groupnav.php:119 +msgid "Design" +msgstr "Design" + +#: actions/designadminpanel.php:74 +msgid "Design settings for this StatusNet site." +msgstr "Design indstillinger for dette StatusNet site." + +#: actions/designadminpanel.php:318 +msgid "Invalid logo URL." +msgstr "Ugyldig logo URL." + +#: actions/designadminpanel.php:322 +#, php-format +msgid "Theme not available: %s." +msgstr "Tema ikke tilgængelige: %s." + +#: actions/designadminpanel.php:426 +msgid "Change logo" +msgstr "Skift logo" + +#: actions/designadminpanel.php:431 +msgid "Site logo" +msgstr "Site logo" + +#: actions/designadminpanel.php:443 +msgid "Change theme" +msgstr "Skift tema" + +#: actions/designadminpanel.php:460 +msgid "Site theme" +msgstr "Site tema" + +#: actions/designadminpanel.php:461 +msgid "Theme for the site." +msgstr "Tema for webstedet." + +#: actions/designadminpanel.php:467 +msgid "Custom theme" +msgstr "Brugerdefineret tema" + +#: actions/designadminpanel.php:471 +msgid "You can upload a custom StatusNet theme as a .ZIP archive." +msgstr "Du kan uploade en brugerdefineret StatusNet tema som en. ZIP arkiv." + +#: actions/designadminpanel.php:486 lib/designsettings.php:101 +msgid "Change background image" +msgstr "Skift baggrundsbillede" + +#: actions/designadminpanel.php:491 actions/designadminpanel.php:574 +#: lib/designsettings.php:178 +msgid "Background" +msgstr "Baggrund" + +#: actions/designadminpanel.php:496 +#, php-format +msgid "" +"You can upload a background image for the site. The maximum file size is %1" +"$s." +msgstr "" +"Du kan uploade et baggrundsbillede til webstedet. Den maksimale filstørrelse " +"er %1$s." + +#. TRANS: Used as radio button label to add a background image. +#: actions/designadminpanel.php:527 lib/designsettings.php:139 +msgid "On" +msgstr "Til" + +#. TRANS: Used as radio button label to not add a background image. +#: actions/designadminpanel.php:544 lib/designsettings.php:155 +msgid "Off" +msgstr "Fra" + +#: actions/designadminpanel.php:545 lib/designsettings.php:156 +msgid "Turn background image on or off." +msgstr "Slå baggrundsbilledet til eller fra." + +#: actions/designadminpanel.php:550 lib/designsettings.php:161 +msgid "Tile background image" +msgstr "Tile baggrundsbillede" + +#: actions/designadminpanel.php:564 lib/designsettings.php:170 +msgid "Change colours" +msgstr "Skift farver" + +#: actions/designadminpanel.php:587 lib/designsettings.php:191 +msgid "Content" +msgstr "Indhold" + +#: actions/designadminpanel.php:600 lib/designsettings.php:204 +msgid "Sidebar" +msgstr "Sidebar" + +#: actions/designadminpanel.php:613 lib/designsettings.php:217 +msgid "Text" +msgstr "Tekst" + +#: actions/designadminpanel.php:626 lib/designsettings.php:230 +msgid "Links" +msgstr "Henvisninger" + +#: actions/designadminpanel.php:651 +msgid "Advanced" +msgstr "Avanceret" + +#: actions/designadminpanel.php:655 +msgid "Custom CSS" +msgstr "Personlig CSS" + +#: actions/designadminpanel.php:676 lib/designsettings.php:247 +msgid "Use defaults" +msgstr "Brug standardindstillinger" + +#: actions/designadminpanel.php:677 lib/designsettings.php:248 +msgid "Restore default designs" +msgstr "Gendan standard indstillinger" + +#: actions/designadminpanel.php:683 lib/designsettings.php:254 +msgid "Reset back to default" +msgstr "Nulstil til standard værdier" + +#. TRANS: Submit button title +#: actions/designadminpanel.php:685 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:351 actions/profilesettings.php:174 +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292 +#: actions/sitenoticeadminpanel.php:195 actions/snapshotadminpanel.php:245 +#: actions/subscriptions.php:226 actions/tagother.php:154 +#: actions/useradminpanel.php:294 lib/applicationeditform.php:363 +#: lib/designsettings.php:256 lib/groupeditform.php:202 +msgid "Save" +msgstr "Gem" + +#: actions/designadminpanel.php:686 lib/designsettings.php:257 +msgid "Save design" +msgstr "Gem design" + +#: actions/disfavor.php:81 +msgid "This notice is not a favorite!" +msgstr "Denne meddelelse er ikke en favorit!" + +#: actions/disfavor.php:94 +msgid "Add to favorites" +msgstr "Tilføj til favoritter" + +#: actions/doc.php:158 +#, php-format +msgid "No such document \"%s\"" +msgstr "Ingen sådan dokument \"%s\"" + +#: actions/editapplication.php:54 +msgid "Edit Application" +msgstr "Rediger program" + +#: actions/editapplication.php:66 +msgid "You must be logged in to edit an application." +msgstr "Du skal være logget ind for at redigere et program." + +#: actions/editapplication.php:81 actions/oauthconnectionssettings.php:166 +#: actions/showapplication.php:87 +msgid "No such application." +msgstr "Ingen sådan program" + +#: actions/editapplication.php:161 +msgid "Use this form to edit your application." +msgstr "Brug denne formular til at redigere dit program." + +#: actions/editapplication.php:177 actions/newapplication.php:159 +msgid "Name is required." +msgstr "Navn er påkrævet." + +#: actions/editapplication.php:180 actions/newapplication.php:165 +msgid "Name is too long (max 255 chars)." +msgstr "Navnet er for langt (max 255 tegn)." + +#: actions/editapplication.php:183 actions/newapplication.php:162 +msgid "Name already in use. Try another one." +msgstr "Navn allerede i brug. Prøv et andet." + +#: actions/editapplication.php:186 actions/newapplication.php:168 +msgid "Description is required." +msgstr "Beskrivelse er påkrævet." + +#: actions/editapplication.php:194 +msgid "Source URL is too long." +msgstr "Kilde-URL er for lang." + +#: actions/editapplication.php:200 actions/newapplication.php:185 +msgid "Source URL is not valid." +msgstr "Kilde-URL er ikke gyldig." + +#: actions/editapplication.php:203 actions/newapplication.php:188 +msgid "Organization is required." +msgstr "Organisationen er påkrævet." + +#: actions/editapplication.php:206 actions/newapplication.php:191 +msgid "Organization is too long (max 255 chars)." +msgstr "Organisationen er for lang (max 255 tegn)." + +#: actions/editapplication.php:209 actions/newapplication.php:194 +msgid "Organization homepage is required." +msgstr "Organisationens hjemmeside er påkrævet." + +#: actions/editapplication.php:218 actions/newapplication.php:206 +msgid "Callback is too long." +msgstr "Callback er for lang." + +#: actions/editapplication.php:225 actions/newapplication.php:215 +msgid "Callback URL is not valid." +msgstr "Tilbagekaldswebadresse er ikke gyldig." + +#: actions/editapplication.php:258 +msgid "Could not update application." +msgstr "Kunne ikke opdatere programmet." + +#: actions/editgroup.php:56 +#, php-format +msgid "Edit %s group" +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 skal være logget ind for at oprette en gruppe." + +#: 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 skal være administrator for at redigere gruppen." + +#: actions/editgroup.php:158 +msgid "Use this form to edit the group." +msgstr "Brug denne formular til at redigere gruppen." + +#: actions/editgroup.php:205 actions/newgroup.php:145 +#, php-format +msgid "description is too long (max %d chars)." +msgstr "Beskrivelsen er for lang (max %d tegn)." + +#: actions/editgroup.php:228 actions/newgroup.php:168 +#, php-format +msgid "Invalid alias: \"%s\"" +msgstr "Ugyldigt alias: \"%s\"." + +#: actions/editgroup.php:258 +msgid "Could not update group." +msgstr "Kunne ikke opdatere gruppe." + +#. TRANS: Server exception thrown when creating group aliases failed. +#: actions/editgroup.php:264 classes/User_group.php:514 +msgid "Could not create aliases." +msgstr "Kunne ikke oprette aliaser." + +#: actions/editgroup.php:280 +msgid "Options saved." +msgstr "Valg gemt." + +#. TRANS: Title for e-mail settings. +#: actions/emailsettings.php:61 +msgid "Email settings" +msgstr "Email indstillinger" + +#. TRANS: E-mail settings page instructions. +#. TRANS: %%site.name%% is the name of the site. +#: actions/emailsettings.php:76 +#, php-format +msgid "Manage how you get email from %%site.name%%." +msgstr "Administrer hvordan du får e-mail fra %%site.name%%." + +#. TRANS: Form legend for e-mail settings form. +#. TRANS: Field label for e-mail address input in e-mail settings form. +#: actions/emailsettings.php:106 actions/emailsettings.php:132 +msgid "Email address" +msgstr "E-mail adresse" + +#. TRANS: Form note in e-mail settings form. +#: actions/emailsettings.php:112 +msgid "Current confirmed email address." +msgstr "Nuværende bekræftet email-adresse." + +#. TRANS: Button label to remove a confirmed e-mail address. +#. TRANS: Button label for removing a set sender e-mail address to post notices from. +#. TRANS: Button label to remove a confirmed IM address. +#. TRANS: Button label to remove a confirmed SMS address. +#. TRANS: Button label for removing a set sender SMS e-mail address to post notices from. +#: actions/emailsettings.php:115 actions/emailsettings.php:158 +#: actions/imsettings.php:116 actions/smssettings.php:124 +#: actions/smssettings.php:180 +msgctxt "BUTTON" +msgid "Remove" +msgstr "Fjern" + +#: actions/emailsettings.php:122 +msgid "" +"Awaiting confirmation on this address. Check your inbox (and spam box!) for " +"a message with further instructions." +msgstr "" +"Afventer bekræftelse på denne adresse. Tjek din indbakke (og spam box!) for " +"en besked med yderligere instruktioner." + +#. TRANS: Button label to cancel an e-mail address confirmation procedure. +#. TRANS: Button label to cancel an IM address confirmation procedure. +#. TRANS: Button label to cancel a SMS address confirmation procedure. +#. TRANS: Button label +#: actions/emailsettings.php:127 actions/imsettings.php:131 +#: actions/smssettings.php:137 lib/applicationeditform.php:357 +msgctxt "BUTTON" +msgid "Cancel" +msgstr "Afbryd" + +#. TRANS: Instructions for e-mail address input form. +#: actions/emailsettings.php:135 +msgid "Email address, like \"UserName@example.org\"" +msgstr "E-mail adresse, som \"UserName@example.org\"" + +#. TRANS: Button label for adding an e-mail address in e-mail settings form. +#. TRANS: Button label for adding an IM address in IM settings form. +#. TRANS: Button label for adding a SMS phone number in SMS settings form. +#: actions/emailsettings.php:139 actions/imsettings.php:148 +#: actions/smssettings.php:162 +msgctxt "BUTTON" +msgid "Add" +msgstr "Tilføj" + +#. TRANS: Form legend for incoming e-mail settings form. +#. TRANS: Form legend for incoming SMS settings form. +#: actions/emailsettings.php:147 actions/smssettings.php:171 +msgid "Incoming email" +msgstr "Indgående e-mail" + +#. TRANS: Form instructions for incoming e-mail form in e-mail settings. +#. TRANS: Form instructions for incoming SMS e-mail address form in SMS settings. +#: actions/emailsettings.php:155 actions/smssettings.php:178 +msgid "Send email to this address to post new notices." +msgstr "Send e-mail til denne adresse for at skrive nye bekendtgørelser." + +#. TRANS: Instructions for incoming e-mail address input form. +#. TRANS: Instructions for incoming SMS e-mail address input form. +#: actions/emailsettings.php:164 actions/smssettings.php:186 +msgid "Make a new email address for posting to; cancels the old one." +msgstr "" +"Opret en ny e-mail adresse til postering af beskeder; annullerer den gamle." + +#. TRANS: Button label for adding an e-mail address to send notices from. +#. TRANS: Button label for adding an SMS e-mail address to send notices from. +#: actions/emailsettings.php:168 actions/smssettings.php:189 +msgctxt "BUTTON" +msgid "New" +msgstr "Ny" + +#. TRANS: Form legend for e-mail preferences form. +#: actions/emailsettings.php:174 +msgid "Email preferences" +msgstr "Email indstillinger" + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:180 +msgid "Send me notices of new subscriptions through email." +msgstr "Send mig meddelelser om nye abonnementer via e-mail." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:186 +msgid "Send me email when someone adds my notice as a favorite." +msgstr "Send mig email, når nogen har tilføjet min meddelelse som en favorit." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:193 +msgid "Send me email when someone sends me a private message." +msgstr "Send mig email, når nogen sender mig en privat besked." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:199 +msgid "Send me email when someone sends me an \"@-reply\"." +msgstr "Send mig email, når nogen sender mig et \"@-svar\"." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:205 +msgid "Allow friends to nudge me and send me an email." +msgstr "Tillad venner at puffe mig og at sende mig en e-mail." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:212 +msgid "I want to post notices by email." +msgstr "Jeg ønsker at sende meddelelser via e-mail." + +#. TRANS: Checkbox label in e-mail preferences form. +#: actions/emailsettings.php:219 +msgid "Publish a MicroID for my email address." +msgstr "Udgiv et MicroID til min email adresse." + +#. TRANS: Confirmation message for successful e-mail preferences save. +#: actions/emailsettings.php:334 +msgid "Email preferences saved." +msgstr "Email indstillinger gemt." + +#. TRANS: Message given saving e-mail address without having provided one. +#: actions/emailsettings.php:353 +msgid "No email address." +msgstr "Ingen e-mail-adresse." + +#. TRANS: Message given saving e-mail address that cannot be normalised. +#: actions/emailsettings.php:361 +msgid "Cannot normalize that email address" +msgstr "Kan ikke normalisere denne e-mail adresse" + +#. TRANS: Message given saving e-mail address that not valid. +#: actions/emailsettings.php:366 actions/register.php:208 +#: actions/siteadminpanel.php:144 +msgid "Not a valid email address." +msgstr "Ikke en gyldig e-mail adresse." + +#. TRANS: Message given saving e-mail address that is already set. +#: actions/emailsettings.php:370 +msgid "That is already your email address." +msgstr "Det er allerede din e-mail adresse." + +#. TRANS: Message given saving e-mail address that is already set for another user. +#: actions/emailsettings.php:374 +msgid "That email address already belongs to another user." +msgstr "Denne e-mail adresse tilhører allerede en anden bruger." + +#. TRANS: Server error thrown on database error adding e-mail confirmation code. +#. TRANS: Server error thrown on database error adding IM confirmation code. +#. TRANS: Server error thrown on database error adding SMS confirmation code. +#: actions/emailsettings.php:391 actions/imsettings.php:348 +#: actions/smssettings.php:373 +msgid "Couldn't insert confirmation code." +msgstr "Kunne ikke indsætte bekræftelseskode." + +#. TRANS: Message given saving valid e-mail address that is to be confirmed. +#: actions/emailsettings.php:398 +msgid "" +"A confirmation code was sent to the email address you added. Check your " +"inbox (and spam box!) for the code and instructions on how to use it." +msgstr "" +"En bekræftelse kode blev sendt til den e-mail adresse, du har tilføjet. Tjek " +"din indbakke (og spam box!) for koden og vejledning om, hvordan man bruger " +"den." + +#. TRANS: Message given canceling e-mail address confirmation that is not pending. +#. TRANS: Message given canceling IM address confirmation that is not pending. +#. TRANS: Message given canceling SMS phone number confirmation that is not pending. +#: actions/emailsettings.php:419 actions/imsettings.php:383 +#: actions/smssettings.php:408 +msgid "No pending confirmation to cancel." +msgstr "Ingen afventende bekræftelse at annullere." + +#. TRANS: Message given canceling e-mail address confirmation for the wrong e-mail address. +#: actions/emailsettings.php:424 +msgid "That is the wrong email address." +msgstr "Det er den forkerte e-mail adresse." + +#. TRANS: Message given after successfully canceling e-mail address confirmation. +#: actions/emailsettings.php:438 +msgid "Email confirmation cancelled." +msgstr "Email bekræftelse aflyst." + +#. TRANS: Message given trying to remove an e-mail address that is not +#. TRANS: registered for the active user. +#: actions/emailsettings.php:458 +msgid "That is not your email address." +msgstr "Det er ikke din e-mail adresse." + +#. TRANS: Message given after successfully removing a registered e-mail address. +#: actions/emailsettings.php:479 +msgid "The email address was removed." +msgstr "E-mail adressen blev fjernet." + +#: actions/emailsettings.php:493 actions/smssettings.php:568 +msgid "No incoming email address." +msgstr "Ingen indkommende e-mail adresse." + +#. TRANS: Server error thrown on database error removing incoming e-mail address. +#. TRANS: Server error thrown on database error adding incoming e-mail address. +#: actions/emailsettings.php:504 actions/emailsettings.php:528 +#: actions/smssettings.php:578 actions/smssettings.php:602 +msgid "Couldn't update user record." +msgstr "Kunne ikke opdatere bruger oplysninger." + +#. TRANS: Message given after successfully removing an incoming e-mail address. +#: actions/emailsettings.php:508 actions/smssettings.php:581 +msgid "Incoming email address removed." +msgstr "Indgående e-mail adresse fjernet." + +#. TRANS: Message given after successfully adding an incoming e-mail address. +#: actions/emailsettings.php:532 actions/smssettings.php:605 +msgid "New incoming email address added." +msgstr "Ny indkommende e-mail adresse tilføjet." + +#: actions/favor.php:79 +msgid "This notice is already a favorite!" +msgstr "Denne meddelelse er allerede en favorit!" + +#: actions/favor.php:92 lib/disfavorform.php:140 +msgid "Disfavor favorite" +msgstr "Fjern markering som favorit" + +#: actions/favorited.php:65 lib/popularnoticesection.php:91 +#: lib/publicgroupnav.php:93 +msgid "Popular notices" +msgstr "Populære bekendtgørelser" + +#: actions/favorited.php:67 +#, php-format +msgid "Popular notices, page %d" +msgstr "Populære bekendtgørelser, side %d" + +#: actions/favorited.php:79 +msgid "The most popular notices on the site right now." +msgstr "De mest populære opslag på hjemmesiden lige nu." + +#: actions/favorited.php:150 +msgid "Favorite notices appear on this page but no one has favorited one yet." +msgstr "" +"Favorit bekendtgørelser vises på denne side, men ingen har markeret en " +"favorit endnu." + +#: actions/favorited.php:153 +msgid "" +"Be the first to add a notice to your favorites by clicking the fave button " +"next to any notice you like." +msgstr "" +"Vær den første til at tilføje en meddelelse til dine favoritter ved at " +"klikke på favorit knappen ved siden af en meddelelse, du syntes om." + +#: actions/favorited.php:156 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to add a " +"notice to your favorites!" +msgstr "" +"Hvorfor ikke [registrere en konto] (%%action.register%%), og vær den første " +"til at tilføje en meddelelse til dine favoritter!" + +#: actions/favoritesrss.php:111 actions/showfavorites.php:77 +#: lib/personalgroupnav.php:115 +#, php-format +msgid "%s's favorite notices" +msgstr "%s's favorit bekendtgørelser" + +#: actions/favoritesrss.php:115 +#, php-format +msgid "Updates favored by %1$s on %2$s!" +msgstr "Opdateringer markeret som favorit af %1$s på %2$s!" + +#: actions/featured.php:69 lib/featureduserssection.php:87 +#: lib/publicgroupnav.php:89 +msgid "Featured users" +msgstr "Udvalgte brugere" + +#: actions/featured.php:71 +#, php-format +msgid "Featured users, page %d" +msgstr "Udvalgte brugere, side %d" + +#: actions/featured.php:99 +#, php-format +msgid "A selection of some great users on %s" +msgstr "Et udvalg af nogle top brugere på %s" + +#: actions/file.php:34 +msgid "No notice ID." +msgstr "Ingen meddelelses ID." + +#: actions/file.php:38 +msgid "No notice." +msgstr "Ingen meddelelse." + +#: actions/file.php:42 +msgid "No attachments." +msgstr "Ingen vedhæftede filer." + +#: actions/file.php:51 +msgid "No uploaded attachments." +msgstr "Ingen uploaded vedhæftede filer." + +#: actions/finishremotesubscribe.php:69 +msgid "Not expecting this response!" +msgstr "Forventer ikke dette svar!" + +#: actions/finishremotesubscribe.php:80 +msgid "User being listened to does not exist." +msgstr "Brugeren som lyttes til, findes ikke." + +#: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59 +msgid "You can use the local subscription!" +msgstr "Du kan bruge det lokale abonnement!" + +#: actions/finishremotesubscribe.php:99 +msgid "That user has blocked you from subscribing." +msgstr "Denne bruger har blokeret dig fra at abonnere." + +#: actions/finishremotesubscribe.php:110 +msgid "You are not authorized." +msgstr "Du har ikke tilladelse." + +#: actions/finishremotesubscribe.php:113 +msgid "Could not convert request token to access token." +msgstr "Kunne ikke konvertere anmodnings-token til et adgangs-token." + +#: actions/finishremotesubscribe.php:118 +msgid "Remote service uses unknown version of OMB protocol." +msgstr "Fjerntjenesten bruger en ukendt version af 0MB protokol." + +#: actions/finishremotesubscribe.php:138 +msgid "Error updating remote profile." +msgstr "Fejl ved opdatering af fjernbetjeningsprofil." + +#: actions/getfile.php:79 +msgid "No such file." +msgstr "Ingen sådan fil." + +#: actions/getfile.php:83 +msgid "Cannot read file." +msgstr "Kan ikke læse filen." + +#: actions/grantrole.php:62 actions/revokerole.php:62 +msgid "Invalid role." +msgstr "Ugyldig rolle." + +#: actions/grantrole.php:66 actions/revokerole.php:66 +msgid "This role is reserved and cannot be set." +msgstr "Denne rolle er reserveret og kan ikke indstilles." + +#: actions/grantrole.php:75 +msgid "You cannot grant user roles on this site." +msgstr "Du kan ikke tildele brugerroller på dette site." + +#: actions/grantrole.php:82 +msgid "User already has this role." +msgstr "Bruger har allerede denne rolle." + +#: actions/groupblock.php:71 actions/groupunblock.php:71 +#: actions/makeadmin.php:71 actions/subedit.php:46 +#: lib/profileformaction.php:79 +msgid "No profile specified." +msgstr "Ingen profil specificeret." + +#: actions/groupblock.php:76 actions/groupunblock.php:76 +#: actions/makeadmin.php:76 actions/subedit.php:53 actions/tagother.php:46 +#: actions/unsubscribe.php:84 lib/profileformaction.php:86 +msgid "No profile with that ID." +msgstr "Ingen profil med det ID." + +#: actions/groupblock.php:81 actions/groupunblock.php:81 +#: actions/makeadmin.php:81 +msgid "No group specified." +msgstr "Ingen gruppe angivet." + +#: actions/groupblock.php:91 +msgid "Only an admin can block group members." +msgstr "Kun en administrator kan blokere gruppens medlemmer." + +#: actions/groupblock.php:95 +msgid "User is already blocked from group." +msgstr "Bruger er allerede blokeret fra gruppen." + +#: actions/groupblock.php:100 +msgid "User is not a member of group." +msgstr "Brugeren er ikke medlem af gruppen." + +#: actions/groupblock.php:134 actions/groupmembers.php:360 +msgid "Block user from group" +msgstr "Bloker bruger fra gruppe" + +#: actions/groupblock.php:160 +#, php-format +msgid "" +"Are you sure you want to block user \"%1$s\" from the group \"%2$s\"? They " +"will be removed from the group, unable to post, and unable to subscribe to " +"the group in the future." +msgstr "" +"Er du sikker på du vil blokere bruger \"%1$s\" fra gruppen \"%2$s\"? De vil " +"blive fjernet fra gruppen, ude af stand til at postere, og ude af stand til " +"at tilmelde sig gruppen i fremtiden." + +#. TRANS: Submit button title for 'No' when blocking a user from a group. +#: actions/groupblock.php:182 +msgid "Do not block this user from this group" +msgstr "Bloker ikke denne bruger fra denne gruppe" + +#. TRANS: Submit button title for 'Yes' when blocking a user from a group. +#: actions/groupblock.php:189 +msgid "Block this user from this group" +msgstr "Bloker denne bruger fra denne gruppe" + +#: actions/groupblock.php:206 +msgid "Database error blocking user from group." +msgstr "Database fejl ved blokering af bruger fra gruppen." + +#: actions/groupbyid.php:74 actions/userbyid.php:70 +msgid "No ID." +msgstr "Ingen ID." + +#: actions/groupdesignsettings.php:68 +msgid "You must be logged in to edit a group." +msgstr "Du skal være logget på for at redigere en gruppe." + +#: actions/groupdesignsettings.php:144 +msgid "Group design" +msgstr "Gruppe design" + +#: actions/groupdesignsettings.php:155 +msgid "" +"Customize the way your group looks with a background image and a colour " +"palette of your choice." +msgstr "" +"Tilpas den måde din gruppe vises på, med et baggrundsbillede og en " +"farvepalet efter dit valg." + +#: actions/groupdesignsettings.php:266 actions/userdesignsettings.php:186 +#: lib/designsettings.php:391 lib/designsettings.php:413 +msgid "Couldn't update your design." +msgstr "Kunne ikke opdatere dit design." + +#: actions/groupdesignsettings.php:311 actions/userdesignsettings.php:231 +msgid "Design preferences saved." +msgstr "Design præferencer gemt." + +#: actions/grouplogo.php:142 actions/grouplogo.php:195 +msgid "Group logo" +msgstr "Gruppe logo" + +#: actions/grouplogo.php:153 +#, php-format +msgid "" +"You can upload a logo image for your group. The maximum file size is %s." +msgstr "" +"Du kan uploade et logo billede til din gruppe. Den maksimale filstørrelse er " +"%s." + +#: actions/grouplogo.php:365 +msgid "Pick a square area of the image to be the logo." +msgstr "Vælg en firkantet område af billedet, der skal logoet." + +#: actions/grouplogo.php:399 +msgid "Logo updated." +msgstr "Logo opdateret." + +#: actions/grouplogo.php:401 +msgid "Failed updating logo." +msgstr "Mislykket ajourføring af logo." + +#: actions/groupmembers.php:100 lib/groupnav.php:92 +#, php-format +msgid "%s group members" +msgstr "%s gruppe medlemmer" + +#: actions/groupmembers.php:103 +#, php-format +msgid "%1$s group members, page %2$d" +msgstr "" + +#: actions/groupmembers.php:118 +msgid "A list of the users in this group." +msgstr "" + +#: actions/groupmembers.php:182 lib/groupnav.php:107 +msgid "Admin" +msgstr "" + +#: actions/groupmembers.php:392 lib/blockform.php:69 +msgid "Block" +msgstr "" + +#: actions/groupmembers.php:487 +msgid "Make user an admin of the group" +msgstr "" + +#: actions/groupmembers.php:519 +msgid "Make Admin" +msgstr "" + +#: actions/groupmembers.php:519 +msgid "Make this user an admin" +msgstr "" + +#. TRANS: Message is used as link title. %s is a user nickname. +#. TRANS: Title in atom group notice feed. %s is a group name. +#. TRANS: Title in atom user notice feed. %s is a user name. +#: actions/grouprss.php:139 actions/userrss.php:94 +#: lib/atomgroupnoticefeed.php:63 lib/atomusernoticefeed.php:69 +#, php-format +msgid "%s timeline" +msgstr "" + +#. TRANS: Message is used as link description. %1$s is a username, %2$s is a site name. +#: actions/grouprss.php:142 +#, php-format +msgid "Updates from members of %1$s on %2$s!" +msgstr "" + +#: actions/groups.php:62 lib/profileaction.php:223 lib/profileaction.php:249 +#: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98 +msgid "Groups" +msgstr "" + +#: actions/groups.php:64 +#, php-format +msgid "Groups, page %d" +msgstr "" + +#: actions/groups.php:90 +#, php-format +msgid "" +"%%%%site.name%%%% groups let you find and talk with people of similar " +"interests. After you join a group you can send messages to all other members " +"using the syntax \"!groupname\". Don't see a group you like? Try [searching " +"for one](%%%%action.groupsearch%%%%) or [start your own!](%%%%action.newgroup" +"%%%%)" +msgstr "" + +#: actions/groups.php:107 actions/usergroups.php:126 lib/groupeditform.php:122 +msgid "Create a new group" +msgstr "" + +#: actions/groupsearch.php:52 +#, php-format +msgid "" +"Search for groups on %%site.name%% by their name, location, or description. " +"Separate the terms by spaces; they must be 3 characters or more." +msgstr "" + +#: actions/groupsearch.php:58 +msgid "Group search" +msgstr "" + +#: actions/groupsearch.php:79 actions/noticesearch.php:117 +#: actions/peoplesearch.php:83 +msgid "No results." +msgstr "" + +#: actions/groupsearch.php:82 +#, php-format +msgid "" +"If you can't find the group you're looking for, you can [create it](%%action." +"newgroup%%) yourself." +msgstr "" + +#: actions/groupsearch.php:85 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and [create the group](%%" +"action.newgroup%%) yourself!" +msgstr "" + +#: actions/groupunblock.php:91 +msgid "Only an admin can unblock group members." +msgstr "" + +#: actions/groupunblock.php:95 +msgid "User is not blocked from group." +msgstr "" + +#: actions/groupunblock.php:128 actions/unblock.php:86 +msgid "Error removing the block." +msgstr "" + +#. TRANS: Title for instance messaging settings. +#: actions/imsettings.php:60 +msgid "IM settings" +msgstr "" + +#. TRANS: Instant messaging settings page instructions. +#. TRANS: [instant messages] is link text, "(%%doc.im%%)" is the link. +#. TRANS: the order and formatting of link text and link should remain unchanged. +#: actions/imsettings.php:74 +#, php-format +msgid "" +"You can send and receive notices through Jabber/GTalk [instant messages](%%" +"doc.im%%). Configure your address and settings below." +msgstr "" + +#. TRANS: Message given in the IM settings if XMPP is not enabled on the site. +#: actions/imsettings.php:94 +msgid "IM is not available." +msgstr "" + +#. TRANS: Form legend for IM settings form. +#. TRANS: Field label for IM address input in IM settings form. +#: actions/imsettings.php:106 actions/imsettings.php:136 +msgid "IM address" +msgstr "" + +#: actions/imsettings.php:113 +msgid "Current confirmed Jabber/GTalk address." +msgstr "" + +#. TRANS: Form note in IM settings form. +#. TRANS: %s is the IM address set for the site. +#: actions/imsettings.php:124 +#, php-format +msgid "" +"Awaiting confirmation on this address. Check your Jabber/GTalk account for a " +"message with further instructions. (Did you add %s to your buddy list?)" +msgstr "" + +#. TRANS: IM address input field instructions in IM settings form. +#. TRANS: %s is the IM address set for the site. +#: actions/imsettings.php:140 +#, php-format +msgid "" +"Jabber or GTalk address, like \"UserName@example.org\". First, make sure to " +"add %s to your buddy list in your IM client or on GTalk." +msgstr "" + +#. TRANS: Form legend for IM preferences form. +#: actions/imsettings.php:155 +msgid "IM preferences" +msgstr "" + +#. TRANS: Checkbox label in IM preferences form. +#: actions/imsettings.php:160 +msgid "Send me notices through Jabber/GTalk." +msgstr "" + +#. TRANS: Checkbox label in IM preferences form. +#: actions/imsettings.php:166 +msgid "Post a notice when my Jabber/GTalk status changes." +msgstr "" + +#. TRANS: Checkbox label in IM preferences form. +#: actions/imsettings.php:172 +msgid "Send me replies through Jabber/GTalk from people I'm not subscribed to." +msgstr "" + +#. TRANS: Checkbox label in IM preferences form. +#: actions/imsettings.php:179 +msgid "Publish a MicroID for my Jabber/GTalk address." +msgstr "" + +#. TRANS: Confirmation message for successful IM preferences save. +#: actions/imsettings.php:287 actions/othersettings.php:180 +msgid "Preferences saved." +msgstr "" + +#. TRANS: Message given saving IM address without having provided one. +#: actions/imsettings.php:309 +msgid "No Jabber ID." +msgstr "" + +#. TRANS: Message given saving IM address that cannot be normalised. +#: actions/imsettings.php:317 +msgid "Cannot normalize that Jabber ID" +msgstr "" + +#. TRANS: Message given saving IM address that not valid. +#: actions/imsettings.php:322 +msgid "Not a valid Jabber ID" +msgstr "" + +#. TRANS: Message given saving IM address that is already set. +#: actions/imsettings.php:326 +msgid "That is already your Jabber ID." +msgstr "" + +#. TRANS: Message given saving IM address that is already set for another user. +#: actions/imsettings.php:330 +msgid "Jabber ID already belongs to another user." +msgstr "" + +#. TRANS: Message given saving valid IM address that is to be confirmed. +#. TRANS: %s is the IM address set for the site. +#: actions/imsettings.php:358 +#, php-format +msgid "" +"A confirmation code was sent to the IM address you added. You must approve %" +"s for sending messages to you." +msgstr "" + +#. TRANS: Message given canceling IM address confirmation for the wrong IM address. +#: actions/imsettings.php:388 +msgid "That is the wrong IM address." +msgstr "" + +#. TRANS: Server error thrown on database error canceling IM address confirmation. +#: actions/imsettings.php:397 +msgid "Couldn't delete IM confirmation." +msgstr "" + +#. TRANS: Message given after successfully canceling IM address confirmation. +#: actions/imsettings.php:402 +msgid "IM confirmation cancelled." +msgstr "" + +#. TRANS: Message given trying to remove an IM address that is not +#. TRANS: registered for the active user. +#: actions/imsettings.php:424 +msgid "That is not your Jabber ID." +msgstr "" + +#. TRANS: Message given after successfully removing a registered IM address. +#: actions/imsettings.php:447 +msgid "The IM address was removed." +msgstr "" + +#: actions/inbox.php:59 +#, php-format +msgid "Inbox for %1$s - page %2$d" +msgstr "" + +#: actions/inbox.php:62 +#, php-format +msgid "Inbox for %s" +msgstr "" + +#: actions/inbox.php:115 +msgid "This is your inbox, which lists your incoming private messages." +msgstr "" + +#: actions/invite.php:39 +msgid "Invites have been disabled." +msgstr "" + +#: actions/invite.php:41 +#, php-format +msgid "You must be logged in to invite other users to use %s." +msgstr "" + +#: actions/invite.php:72 +#, php-format +msgid "Invalid email address: %s" +msgstr "" + +#: actions/invite.php:110 +msgid "Invitation(s) sent" +msgstr "" + +#: actions/invite.php:112 +msgid "Invite new users" +msgstr "" + +#: actions/invite.php:128 +msgid "You are already subscribed to these users:" +msgstr "" + +#. TRANS: Whois output. +#. TRANS: %1$s nickname of the queried user, %2$s is their profile URL. +#: actions/invite.php:131 actions/invite.php:139 lib/command.php:414 +#, php-format +msgid "%1$s (%2$s)" +msgstr "" + +#: actions/invite.php:136 +msgid "" +"These people are already users and you were automatically subscribed to them:" +msgstr "" + +#: actions/invite.php:144 +msgid "Invitation(s) sent to the following people:" +msgstr "" + +#: actions/invite.php:150 +msgid "" +"You will be notified when your invitees accept the invitation and register " +"on the site. Thanks for growing the community!" +msgstr "" + +#: actions/invite.php:162 +msgid "" +"Use this form to invite your friends and colleagues to use this service." +msgstr "" + +#: actions/invite.php:187 +msgid "Email addresses" +msgstr "" + +#: actions/invite.php:189 +msgid "Addresses of friends to invite (one per line)" +msgstr "" + +#: actions/invite.php:192 +msgid "Personal message" +msgstr "" + +#: actions/invite.php:194 +msgid "Optionally add a personal message to the invitation." +msgstr "" + +#. TRANS: Send button for inviting friends +#: actions/invite.php:198 +msgctxt "BUTTON" +msgid "Send" +msgstr "" + +#. TRANS: Subject for invitation email. Note that 'them' is correct as a gender-neutral singular 3rd-person pronoun in English. +#: actions/invite.php:228 +#, php-format +msgid "%1$s has invited you to join them on %2$s" +msgstr "" + +#. TRANS: Body text for invitation email. Note that 'them' is correct as a gender-neutral singular 3rd-person pronoun in English. +#: actions/invite.php:231 +#, php-format +msgid "" +"%1$s has invited you to join them on %2$s (%3$s).\n" +"\n" +"%2$s is a micro-blogging service that lets you keep up-to-date with people " +"you know and people who interest you.\n" +"\n" +"You can also share news about yourself, your thoughts, or your life online " +"with people who know about you. It's also great for meeting new people who " +"share your interests.\n" +"\n" +"%1$s said:\n" +"\n" +"%4$s\n" +"\n" +"You can see %1$s's profile page on %2$s here:\n" +"\n" +"%5$s\n" +"\n" +"If you'd like to try the service, click on the link below to accept the " +"invitation.\n" +"\n" +"%6$s\n" +"\n" +"If not, you can ignore this message. Thanks for your patience and your " +"time.\n" +"\n" +"Sincerely, %2$s\n" +msgstr "" + +#: actions/joingroup.php:60 +msgid "You must be logged in to join a group." +msgstr "" + +#: actions/joingroup.php:88 actions/leavegroup.php:88 +msgid "No nickname or ID." +msgstr "" + +#. TRANS: Message given having added a user to a group. +#. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. +#: actions/joingroup.php:141 lib/command.php:346 +#, php-format +msgid "%1$s joined group %2$s" +msgstr "" + +#: actions/leavegroup.php:60 +msgid "You must be logged in to leave a group." +msgstr "" + +#: actions/leavegroup.php:100 lib/command.php:373 +msgid "You are not a member of that group." +msgstr "" + +#. TRANS: Message given having removed a user from a group. +#. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. +#: actions/leavegroup.php:137 lib/command.php:392 +#, php-format +msgid "%1$s left group %2$s" +msgstr "" + +#: actions/login.php:102 actions/otp.php:62 actions/register.php:144 +msgid "Already logged in." +msgstr "" + +#: actions/login.php:148 +msgid "Incorrect username or password." +msgstr "" + +#: actions/login.php:154 actions/otp.php:120 +msgid "Error setting user. You are probably not authorized." +msgstr "" + +#: actions/login.php:210 actions/login.php:263 lib/logingroupnav.php:79 +msgid "Login" +msgstr "" + +#: actions/login.php:249 +msgid "Login to site" +msgstr "" + +#: actions/login.php:258 actions/register.php:485 +msgid "Remember me" +msgstr "" + +#: actions/login.php:259 actions/register.php:487 +msgid "Automatically login in the future; not for shared computers!" +msgstr "" + +#: actions/login.php:269 +msgid "Lost or forgotten password?" +msgstr "" + +#: actions/login.php:288 +msgid "" +"For security reasons, please re-enter your user name and password before " +"changing your settings." +msgstr "" + +#: actions/login.php:292 +msgid "Login with your username and password." +msgstr "" + +#: actions/login.php:295 +#, php-format +msgid "" +"Don't have a username yet? [Register](%%action.register%%) a new account." +msgstr "" + +#: actions/makeadmin.php:92 +msgid "Only an admin can make another user an admin." +msgstr "" + +#: actions/makeadmin.php:96 +#, php-format +msgid "%1$s is already an admin for group \"%2$s\"." +msgstr "" + +#: actions/makeadmin.php:133 +#, php-format +msgid "Can't get membership record for %1$s in group %2$s." +msgstr "" + +#: actions/makeadmin.php:146 +#, php-format +msgid "Can't make %1$s an admin for group %2$s." +msgstr "" + +#: actions/microsummary.php:69 +msgid "No current status." +msgstr "" + +#: actions/newapplication.php:52 +msgid "New Application" +msgstr "" + +#: actions/newapplication.php:64 +msgid "You must be logged in to register an application." +msgstr "" + +#: actions/newapplication.php:143 +msgid "Use this form to register a new application." +msgstr "" + +#: actions/newapplication.php:176 +msgid "Source URL is required." +msgstr "" + +#: actions/newapplication.php:258 actions/newapplication.php:267 +msgid "Could not create application." +msgstr "" + +#: actions/newgroup.php:53 +msgid "New group" +msgstr "" + +#: actions/newgroup.php:110 +msgid "Use this form to create a new group." +msgstr "" + +#: actions/newmessage.php:71 actions/newmessage.php:231 +msgid "New message" +msgstr "" + +#: actions/newmessage.php:121 actions/newmessage.php:161 lib/command.php:481 +msgid "You can't send a message to this user." +msgstr "" + +#: actions/newmessage.php:144 actions/newnotice.php:136 lib/command.php:463 +#: lib/command.php:555 +msgid "No content!" +msgstr "" + +#: actions/newmessage.php:158 +msgid "No recipient specified." +msgstr "" + +#: actions/newmessage.php:164 lib/command.php:484 +msgid "" +"Don't send a message to yourself; just say it to yourself quietly instead." +msgstr "" + +#: actions/newmessage.php:181 +msgid "Message sent" +msgstr "" + +#: actions/newmessage.php:185 +#, php-format +msgid "Direct message to %s sent." +msgstr "" + +#: actions/newmessage.php:210 actions/newnotice.php:251 lib/channel.php:189 +msgid "Ajax Error" +msgstr "" + +#: actions/newnotice.php:69 +msgid "New notice" +msgstr "" + +#: actions/newnotice.php:217 +msgid "Notice posted" +msgstr "" + +#: actions/noticesearch.php:68 +#, php-format +msgid "" +"Search for notices on %%site.name%% by their contents. Separate search terms " +"by spaces; they must be 3 characters or more." +msgstr "" + +#: actions/noticesearch.php:78 +msgid "Text search" +msgstr "" + +#: actions/noticesearch.php:91 +#, php-format +msgid "Search results for \"%1$s\" on %2$s" +msgstr "" + +#: actions/noticesearch.php:121 +#, php-format +msgid "" +"Be the first to [post on this topic](%%%%action.newnotice%%%%?" +"status_textarea=%s)!" +msgstr "" + +#: actions/noticesearch.php:124 +#, php-format +msgid "" +"Why not [register an account](%%%%action.register%%%%) and be the first to " +"[post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!" +msgstr "" + +#: actions/noticesearchrss.php:96 +#, php-format +msgid "Updates with \"%s\"" +msgstr "" + +#: actions/noticesearchrss.php:98 +#, php-format +msgid "Updates matching search term \"%1$s\" on %2$s!" +msgstr "" + +#: actions/nudge.php:85 +msgid "" +"This user doesn't allow nudges or hasn't confirmed or set their email yet." +msgstr "" + +#: actions/nudge.php:94 +msgid "Nudge sent" +msgstr "" + +#: actions/nudge.php:97 +msgid "Nudge sent!" +msgstr "" + +#: actions/oauthappssettings.php:59 +msgid "You must be logged in to list your applications." +msgstr "" + +#: actions/oauthappssettings.php:74 +msgid "OAuth applications" +msgstr "" + +#: actions/oauthappssettings.php:85 +msgid "Applications you have registered" +msgstr "" + +#: actions/oauthappssettings.php:135 +#, php-format +msgid "You have not registered any applications yet." +msgstr "" + +#: actions/oauthconnectionssettings.php:72 +msgid "Connected applications" +msgstr "" + +#: actions/oauthconnectionssettings.php:83 +msgid "You have allowed the following applications to access you account." +msgstr "" + +#: actions/oauthconnectionssettings.php:175 +msgid "You are not a user of that application." +msgstr "" + +#: actions/oauthconnectionssettings.php:186 +#, php-format +msgid "Unable to revoke access for app: %s." +msgstr "" + +#: actions/oauthconnectionssettings.php:198 +msgid "You have not authorized any applications to use your account." +msgstr "" + +#: actions/oauthconnectionssettings.php:211 +msgid "Developers can edit the registration settings for their applications " +msgstr "" + +#: actions/oembed.php:80 actions/shownotice.php:100 +msgid "Notice has no profile." +msgstr "" + +#: actions/oembed.php:87 actions/shownotice.php:175 +#, php-format +msgid "%1$s's status on %2$s" +msgstr "" + +#. TRANS: Error message displaying attachments. %s is a raw MIME type (eg 'image/png') +#: actions/oembed.php:159 +#, php-format +msgid "Content type %s not supported." +msgstr "" + +#. TRANS: Error message displaying attachments. %s is the site's base URL. +#: actions/oembed.php:163 +#, php-format +msgid "Only %s URLs over plain HTTP please." +msgstr "" + +#. TRANS: Client error on an API request with an unsupported data format. +#: actions/oembed.php:184 actions/oembed.php:203 lib/apiaction.php:1204 +#: lib/apiaction.php:1232 lib/apiaction.php:1355 +msgid "Not a supported data format." +msgstr "" + +#: actions/opensearch.php:64 +msgid "People Search" +msgstr "" + +#: actions/opensearch.php:67 +msgid "Notice Search" +msgstr "" + +#: actions/othersettings.php:60 +msgid "Other settings" +msgstr "" + +#: actions/othersettings.php:71 +msgid "Manage various other options." +msgstr "" + +#: actions/othersettings.php:108 +msgid " (free service)" +msgstr "" + +#: actions/othersettings.php:116 +msgid "Shorten URLs with" +msgstr "" + +#: actions/othersettings.php:117 +msgid "Automatic shortening service to use." +msgstr "" + +#: actions/othersettings.php:122 +msgid "View profile designs" +msgstr "" + +#: actions/othersettings.php:123 +msgid "Show or hide profile designs." +msgstr "" + +#: actions/othersettings.php:153 +msgid "URL shortening service is too long (max 50 chars)." +msgstr "" + +#: actions/otp.php:69 +msgid "No user ID specified." +msgstr "" + +#: actions/otp.php:83 +msgid "No login token specified." +msgstr "" + +#: actions/otp.php:90 +msgid "No login token requested." +msgstr "" + +#: actions/otp.php:95 +msgid "Invalid login token specified." +msgstr "" + +#: actions/otp.php:104 +msgid "Login token expired." +msgstr "" + +#: actions/outbox.php:58 +#, php-format +msgid "Outbox for %1$s - page %2$d" +msgstr "" + +#: actions/outbox.php:61 +#, php-format +msgid "Outbox for %s" +msgstr "" + +#: actions/outbox.php:116 +msgid "This is your outbox, which lists private messages you have sent." +msgstr "" + +#: actions/passwordsettings.php:58 +msgid "Change password" +msgstr "" + +#: actions/passwordsettings.php:69 +msgid "Change your password." +msgstr "" + +#: actions/passwordsettings.php:96 actions/recoverpassword.php:231 +msgid "Password change" +msgstr "" + +#: actions/passwordsettings.php:104 +msgid "Old password" +msgstr "" + +#: actions/passwordsettings.php:108 actions/recoverpassword.php:235 +msgid "New password" +msgstr "" + +#: actions/passwordsettings.php:109 +msgid "6 or more characters" +msgstr "" + +#: actions/passwordsettings.php:112 actions/recoverpassword.php:239 +#: actions/register.php:440 +msgid "Confirm" +msgstr "" + +#: actions/passwordsettings.php:113 actions/recoverpassword.php:240 +msgid "Same as password above" +msgstr "" + +#: actions/passwordsettings.php:117 +msgid "Change" +msgstr "" + +#: actions/passwordsettings.php:154 actions/register.php:237 +msgid "Password must be 6 or more characters." +msgstr "" + +#: actions/passwordsettings.php:157 actions/register.php:240 +msgid "Passwords don't match." +msgstr "" + +#: actions/passwordsettings.php:165 +msgid "Incorrect old password" +msgstr "" + +#: actions/passwordsettings.php:181 +msgid "Error saving user; invalid." +msgstr "" + +#: actions/passwordsettings.php:186 actions/recoverpassword.php:381 +msgid "Can't save new password." +msgstr "" + +#: actions/passwordsettings.php:192 actions/recoverpassword.php:211 +msgid "Password saved." +msgstr "" + +#. TRANS: Menu item for site administration +#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:384 +msgid "Paths" +msgstr "" + +#: actions/pathsadminpanel.php:70 +msgid "Path and server settings for this StatusNet site." +msgstr "" + +#: actions/pathsadminpanel.php:157 +#, php-format +msgid "Theme directory not readable: %s." +msgstr "" + +#: actions/pathsadminpanel.php:163 +#, php-format +msgid "Avatar directory not writable: %s." +msgstr "" + +#: actions/pathsadminpanel.php:169 +#, php-format +msgid "Background directory not writable: %s." +msgstr "" + +#: actions/pathsadminpanel.php:177 +#, php-format +msgid "Locales directory not readable: %s." +msgstr "" + +#: actions/pathsadminpanel.php:183 +msgid "Invalid SSL server. The maximum length is 255 characters." +msgstr "" + +#: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 +msgid "Site" +msgstr "" + +#: actions/pathsadminpanel.php:238 +msgid "Server" +msgstr "" + +#: actions/pathsadminpanel.php:238 +msgid "Site's server hostname." +msgstr "" + +#: actions/pathsadminpanel.php:242 +msgid "Path" +msgstr "" + +#: actions/pathsadminpanel.php:242 +msgid "Site path" +msgstr "" + +#: actions/pathsadminpanel.php:246 +msgid "Path to locales" +msgstr "" + +#: actions/pathsadminpanel.php:246 +msgid "Directory path to locales" +msgstr "" + +#: actions/pathsadminpanel.php:250 +msgid "Fancy URLs" +msgstr "" + +#: actions/pathsadminpanel.php:252 +msgid "Use fancy (more readable and memorable) URLs?" +msgstr "" + +#: actions/pathsadminpanel.php:259 +msgid "Theme" +msgstr "" + +#: actions/pathsadminpanel.php:264 +msgid "Theme server" +msgstr "" + +#: actions/pathsadminpanel.php:268 +msgid "Theme path" +msgstr "" + +#: actions/pathsadminpanel.php:272 +msgid "Theme directory" +msgstr "" + +#: actions/pathsadminpanel.php:279 +msgid "Avatars" +msgstr "" + +#: actions/pathsadminpanel.php:284 +msgid "Avatar server" +msgstr "" + +#: actions/pathsadminpanel.php:288 +msgid "Avatar path" +msgstr "" + +#: actions/pathsadminpanel.php:292 +msgid "Avatar directory" +msgstr "" + +#: actions/pathsadminpanel.php:301 +msgid "Backgrounds" +msgstr "" + +#: actions/pathsadminpanel.php:305 +msgid "Background server" +msgstr "" + +#: actions/pathsadminpanel.php:309 +msgid "Background path" +msgstr "" + +#: actions/pathsadminpanel.php:313 +msgid "Background directory" +msgstr "" + +#: actions/pathsadminpanel.php:320 +msgid "SSL" +msgstr "" + +#: actions/pathsadminpanel.php:323 actions/snapshotadminpanel.php:202 +msgid "Never" +msgstr "" + +#: actions/pathsadminpanel.php:324 +msgid "Sometimes" +msgstr "" + +#: actions/pathsadminpanel.php:325 +msgid "Always" +msgstr "" + +#: actions/pathsadminpanel.php:329 +msgid "Use SSL" +msgstr "" + +#: actions/pathsadminpanel.php:330 +msgid "When to use SSL" +msgstr "" + +#: actions/pathsadminpanel.php:335 +msgid "SSL server" +msgstr "" + +#: actions/pathsadminpanel.php:336 +msgid "Server to direct SSL requests to" +msgstr "" + +#: actions/pathsadminpanel.php:352 +msgid "Save paths" +msgstr "" + +#: actions/peoplesearch.php:52 +#, php-format +msgid "" +"Search for people on %%site.name%% by their name, location, or interests. " +"Separate the terms by spaces; they must be 3 characters or more." +msgstr "" + +#: actions/peoplesearch.php:58 +msgid "People search" +msgstr "" + +#: actions/peopletag.php:68 +#, php-format +msgid "Not a valid people tag: %s." +msgstr "" + +#: actions/peopletag.php:142 +#, php-format +msgid "Users self-tagged with %1$s - page %2$d" +msgstr "" + +#: actions/postnotice.php:95 +msgid "Invalid notice content." +msgstr "" + +#: actions/postnotice.php:101 +#, php-format +msgid "Notice license ‘%1$s’ is not compatible with site license ‘%2$s’." +msgstr "" + +#: actions/profilesettings.php:60 +msgid "Profile settings" +msgstr "" + +#: actions/profilesettings.php:71 +msgid "" +"You can update your personal profile info here so people know more about you." +msgstr "" + +#: actions/profilesettings.php:99 +msgid "Profile information" +msgstr "" + +#: actions/profilesettings.php:108 lib/groupeditform.php:154 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces" +msgstr "" + +#: actions/profilesettings.php:111 actions/register.php:455 +#: actions/showgroup.php:256 actions/tagother.php:104 +#: lib/groupeditform.php:157 lib/userprofile.php:150 +msgid "Full name" +msgstr "" + +#. TRANS: Form input field label. +#: actions/profilesettings.php:115 actions/register.php:460 +#: lib/applicationeditform.php:244 lib/groupeditform.php:161 +msgid "Homepage" +msgstr "" + +#: actions/profilesettings.php:117 actions/register.php:462 +msgid "URL of your homepage, blog, or profile on another site" +msgstr "" + +#: actions/profilesettings.php:122 actions/register.php:468 +#, php-format +msgid "Describe yourself and your interests in %d chars" +msgstr "" + +#: actions/profilesettings.php:125 actions/register.php:471 +msgid "Describe yourself and your interests" +msgstr "" + +#: actions/profilesettings.php:127 actions/register.php:473 +msgid "Bio" +msgstr "" + +#: actions/profilesettings.php:132 actions/register.php:478 +#: actions/showgroup.php:265 actions/tagother.php:112 +#: actions/userauthorization.php:166 lib/groupeditform.php:177 +#: lib/userprofile.php:165 +msgid "Location" +msgstr "" + +#: actions/profilesettings.php:134 actions/register.php:480 +msgid "Where you are, like \"City, State (or Region), Country\"" +msgstr "" + +#: actions/profilesettings.php:138 +msgid "Share my current location when posting notices" +msgstr "" + +#: actions/profilesettings.php:145 actions/tagother.php:149 +#: actions/tagother.php:209 lib/subscriptionlist.php:106 +#: lib/subscriptionlist.php:108 lib/userprofile.php:210 +msgid "Tags" +msgstr "" + +#: actions/profilesettings.php:147 +msgid "" +"Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated" +msgstr "" + +#: actions/profilesettings.php:151 +msgid "Language" +msgstr "" + +#: actions/profilesettings.php:152 +msgid "Preferred language" +msgstr "" + +#: actions/profilesettings.php:161 +msgid "Timezone" +msgstr "" + +#: actions/profilesettings.php:162 +msgid "What timezone are you normally in?" +msgstr "" + +#: actions/profilesettings.php:167 +msgid "" +"Automatically subscribe to whoever subscribes to me (best for non-humans)" +msgstr "" + +#: actions/profilesettings.php:228 actions/register.php:230 +#, php-format +msgid "Bio is too long (max %d chars)." +msgstr "" + +#: actions/profilesettings.php:235 actions/siteadminpanel.php:151 +msgid "Timezone not selected." +msgstr "" + +#: actions/profilesettings.php:241 +msgid "Language is too long (max 50 chars)." +msgstr "" + +#: actions/profilesettings.php:253 actions/tagother.php:178 +#, php-format +msgid "Invalid tag: \"%s\"" +msgstr "" + +#: actions/profilesettings.php:306 +msgid "Couldn't update user for autosubscribe." +msgstr "" + +#: actions/profilesettings.php:363 +msgid "Couldn't save location prefs." +msgstr "" + +#: actions/profilesettings.php:375 +msgid "Couldn't save profile." +msgstr "" + +#: actions/profilesettings.php:383 +msgid "Couldn't save tags." +msgstr "" + +#. TRANS: Message after successful saving of administrative settings. +#: actions/profilesettings.php:391 lib/adminpanelaction.php:141 +msgid "Settings saved." +msgstr "" + +#: actions/public.php:83 +#, php-format +msgid "Beyond the page limit (%s)." +msgstr "" + +#: actions/public.php:92 +msgid "Could not retrieve public stream." +msgstr "" + +#: actions/public.php:130 +#, php-format +msgid "Public timeline, page %d" +msgstr "" + +#: actions/public.php:132 lib/publicgroupnav.php:79 +msgid "Public timeline" +msgstr "" + +#: actions/public.php:160 +msgid "Public Stream Feed (RSS 1.0)" +msgstr "" + +#: actions/public.php:164 +msgid "Public Stream Feed (RSS 2.0)" +msgstr "" + +#: actions/public.php:168 +msgid "Public Stream Feed (Atom)" +msgstr "" + +#: actions/public.php:188 +#, php-format +msgid "" +"This is the public timeline for %%site.name%% but no one has posted anything " +"yet." +msgstr "" + +#: actions/public.php:191 +msgid "Be the first to post!" +msgstr "" + +#: actions/public.php:195 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to post!" +msgstr "" + +#: actions/public.php:242 +#, php-format +msgid "" +"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" +"blogging) service based on the Free Software [StatusNet](http://status.net/) " +"tool. [Join now](%%action.register%%) to share notices about yourself with " +"friends, family, and colleagues! ([Read more](%%doc.help%%))" +msgstr "" + +#: actions/public.php:247 +#, php-format +msgid "" +"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" +"blogging) service based on the Free Software [StatusNet](http://status.net/) " +"tool." +msgstr "" + +#: actions/publictagcloud.php:57 +msgid "Public tag cloud" +msgstr "" + +#: actions/publictagcloud.php:63 +#, php-format +msgid "These are most popular recent tags on %s " +msgstr "" + +#: actions/publictagcloud.php:69 +#, php-format +msgid "No one has posted a notice with a [hashtag](%%doc.tags%%) yet." +msgstr "" + +#: actions/publictagcloud.php:72 +msgid "Be the first to post one!" +msgstr "" + +#: actions/publictagcloud.php:75 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to post " +"one!" +msgstr "" + +#: actions/publictagcloud.php:134 +msgid "Tag cloud" +msgstr "" + +#: actions/recoverpassword.php:36 +msgid "You are already logged in!" +msgstr "" + +#: actions/recoverpassword.php:62 +msgid "No such recovery code." +msgstr "" + +#: actions/recoverpassword.php:66 +msgid "Not a recovery code." +msgstr "" + +#: actions/recoverpassword.php:73 +msgid "Recovery code for unknown user." +msgstr "" + +#: actions/recoverpassword.php:86 +msgid "Error with confirmation code." +msgstr "" + +#: actions/recoverpassword.php:97 +msgid "This confirmation code is too old. Please start again." +msgstr "" + +#: actions/recoverpassword.php:111 +msgid "Could not update user with confirmed email address." +msgstr "" + +#: actions/recoverpassword.php:152 +msgid "" +"If you have forgotten or lost your password, you can get a new one sent to " +"the email address you have stored in your account." +msgstr "" + +#: actions/recoverpassword.php:158 +msgid "You have been identified. Enter a new password below. " +msgstr "" + +#: actions/recoverpassword.php:188 +msgid "Password recovery" +msgstr "" + +#: actions/recoverpassword.php:191 +msgid "Nickname or email address" +msgstr "" + +#: actions/recoverpassword.php:193 +msgid "Your nickname on this server, or your registered email address." +msgstr "" + +#: actions/recoverpassword.php:199 actions/recoverpassword.php:200 +msgid "Recover" +msgstr "" + +#: actions/recoverpassword.php:208 +msgid "Reset password" +msgstr "" + +#: actions/recoverpassword.php:209 +msgid "Recover password" +msgstr "" + +#: actions/recoverpassword.php:210 actions/recoverpassword.php:335 +msgid "Password recovery requested" +msgstr "" + +#: actions/recoverpassword.php:213 +msgid "Unknown action" +msgstr "" + +#: actions/recoverpassword.php:236 +msgid "6 or more characters, and don't forget it!" +msgstr "" + +#: actions/recoverpassword.php:243 +msgid "Reset" +msgstr "" + +#: actions/recoverpassword.php:252 +msgid "Enter a nickname or email address." +msgstr "" + +#: actions/recoverpassword.php:282 +msgid "No user with that email address or username." +msgstr "" + +#: actions/recoverpassword.php:299 +msgid "No registered email address for that user." +msgstr "" + +#: actions/recoverpassword.php:313 +msgid "Error saving address confirmation." +msgstr "" + +#: actions/recoverpassword.php:338 +msgid "" +"Instructions for recovering your password have been sent to the email " +"address registered to your account." +msgstr "" + +#: actions/recoverpassword.php:357 +msgid "Unexpected password reset." +msgstr "" + +#: actions/recoverpassword.php:365 +msgid "Password must be 6 chars or more." +msgstr "" + +#: actions/recoverpassword.php:369 +msgid "Password and confirmation do not match." +msgstr "" + +#: actions/recoverpassword.php:388 actions/register.php:255 +msgid "Error setting user." +msgstr "" + +#: actions/recoverpassword.php:395 +msgid "New password successfully saved. You are now logged in." +msgstr "" + +#: actions/register.php:92 actions/register.php:196 actions/register.php:412 +msgid "Sorry, only invited people can register." +msgstr "" + +#: actions/register.php:99 +msgid "Sorry, invalid invitation code." +msgstr "" + +#: actions/register.php:119 +msgid "Registration successful" +msgstr "" + +#: actions/register.php:121 actions/register.php:506 lib/logingroupnav.php:85 +msgid "Register" +msgstr "" + +#: actions/register.php:142 +msgid "Registration not allowed." +msgstr "" + +#: actions/register.php:205 +msgid "You can't register if you don't agree to the license." +msgstr "" + +#: actions/register.php:219 +msgid "Email address already exists." +msgstr "" + +#: actions/register.php:250 actions/register.php:272 +msgid "Invalid username or password." +msgstr "" + +#: actions/register.php:350 +msgid "" +"With this form you can create a new account. You can then post notices and " +"link up to friends and colleagues. " +msgstr "" + +#: actions/register.php:432 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required." +msgstr "" + +#: actions/register.php:437 +msgid "6 or more characters. Required." +msgstr "" + +#: actions/register.php:441 +msgid "Same as password above. Required." +msgstr "" + +#. TRANS: Link description in user account settings menu. +#: actions/register.php:445 actions/register.php:449 +#: actions/siteadminpanel.php:238 lib/accountsettingsaction.php:132 +msgid "Email" +msgstr "" + +#: actions/register.php:446 actions/register.php:450 +msgid "Used only for updates, announcements, and password recovery" +msgstr "" + +#: actions/register.php:457 +msgid "Longer name, preferably your \"real\" name" +msgstr "" + +#: actions/register.php:518 +#, php-format +msgid "" +"I understand that content and data of %1$s are private and confidential." +msgstr "" + +#: actions/register.php:528 +#, php-format +msgid "My text and files are copyright by %1$s." +msgstr "" + +#. TRANS: Copyright checkbox label in registration dialog, for all rights reserved with ownership left to contributors. +#: actions/register.php:532 +msgid "My text and files remain under my own copyright." +msgstr "" + +#. TRANS: Copyright checkbox label in registration dialog, for all rights reserved. +#: actions/register.php:535 +msgid "All rights reserved." +msgstr "" + +#. TRANS: Copyright checkbox label in registration dialog, for Creative Commons-style licenses. +#: actions/register.php:540 +#, php-format +msgid "" +"My text and files are available under %s except this private data: password, " +"email address, IM address, and phone number." +msgstr "" + +#: actions/register.php:583 +#, php-format +msgid "" +"Congratulations, %1$s! And welcome to %%%%site.name%%%%. From here, you may " +"want to...\n" +"\n" +"* Go to [your profile](%2$s) and post your first message.\n" +"* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send " +"notices through instant messages.\n" +"* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that " +"share your interests. \n" +"* Update your [profile settings](%%%%action.profilesettings%%%%) to tell " +"others more about you. \n" +"* Read over the [online docs](%%%%doc.help%%%%) for features you may have " +"missed. \n" +"\n" +"Thanks for signing up and we hope you enjoy using this service." +msgstr "" + +#: actions/register.php:607 +msgid "" +"(You should receive a message by email momentarily, with instructions on how " +"to confirm your email address.)" +msgstr "" + +#: actions/remotesubscribe.php:98 +#, php-format +msgid "" +"To subscribe, you can [login](%%action.login%%), or [register](%%action." +"register%%) a new account. If you already have an account on a [compatible " +"microblogging site](%%doc.openmublog%%), enter your profile URL below." +msgstr "" + +#: actions/remotesubscribe.php:112 +msgid "Remote subscribe" +msgstr "" + +#: actions/remotesubscribe.php:124 +msgid "Subscribe to a remote user" +msgstr "" + +#: actions/remotesubscribe.php:129 +msgid "User nickname" +msgstr "" + +#: actions/remotesubscribe.php:130 +msgid "Nickname of the user you want to follow" +msgstr "" + +#: actions/remotesubscribe.php:133 +msgid "Profile URL" +msgstr "" + +#: actions/remotesubscribe.php:134 +msgid "URL of your profile on another compatible microblogging service" +msgstr "" + +#: actions/remotesubscribe.php:137 lib/subscribeform.php:139 +#: lib/userprofile.php:406 +msgid "Subscribe" +msgstr "" + +#: actions/remotesubscribe.php:159 +msgid "Invalid profile URL (bad format)" +msgstr "" + +#: actions/remotesubscribe.php:168 +msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)." +msgstr "" + +#: actions/remotesubscribe.php:176 +msgid "That’s a local profile! Login to subscribe." +msgstr "" + +#: actions/remotesubscribe.php:183 +msgid "Couldn’t get a request token." +msgstr "" + +#: actions/repeat.php:57 +msgid "Only logged-in users can repeat notices." +msgstr "" + +#: actions/repeat.php:64 actions/repeat.php:71 +msgid "No notice specified." +msgstr "" + +#: actions/repeat.php:76 +msgid "You can't repeat your own notice." +msgstr "" + +#: actions/repeat.php:90 +msgid "You already repeated that notice." +msgstr "" + +#: actions/repeat.php:114 lib/noticelist.php:675 +msgid "Repeated" +msgstr "" + +#: actions/repeat.php:119 +msgid "Repeated!" +msgstr "" + +#: actions/replies.php:126 actions/repliesrss.php:68 +#: lib/personalgroupnav.php:105 +#, php-format +msgid "Replies to %s" +msgstr "" + +#: actions/replies.php:128 +#, php-format +msgid "Replies to %1$s, page %2$d" +msgstr "" + +#: actions/replies.php:145 +#, php-format +msgid "Replies feed for %s (RSS 1.0)" +msgstr "" + +#: actions/replies.php:152 +#, php-format +msgid "Replies feed for %s (RSS 2.0)" +msgstr "" + +#: actions/replies.php:159 +#, php-format +msgid "Replies feed for %s (Atom)" +msgstr "" + +#: actions/replies.php:199 +#, php-format +msgid "" +"This is the timeline showing replies to %1$s but %2$s hasn't received a " +"notice to their attention yet." +msgstr "" + +#: actions/replies.php:204 +#, php-format +msgid "" +"You can engage other users in a conversation, subscribe to more people or " +"[join groups](%%action.groups%%)." +msgstr "" + +#: actions/replies.php:206 +#, php-format +msgid "" +"You can try to [nudge %1$s](../%2$s) or [post something to their attention](%" +"%%%action.newnotice%%%%?status_textarea=%3$s)." +msgstr "" + +#: actions/repliesrss.php:72 +#, php-format +msgid "Replies to %1$s on %2$s!" +msgstr "" + +#: actions/revokerole.php:75 +msgid "You cannot revoke user roles on this site." +msgstr "" + +#: actions/revokerole.php:82 +msgid "User doesn't have this role." +msgstr "" + +#: actions/rsd.php:146 actions/version.php:159 +msgid "StatusNet" +msgstr "" + +#: actions/sandbox.php:65 actions/unsandbox.php:65 +msgid "You cannot sandbox users on this site." +msgstr "" + +#: actions/sandbox.php:72 +msgid "User is already sandboxed." +msgstr "" + +#. TRANS: Menu item for site administration +#: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170 +#: lib/adminpanelaction.php:392 +msgid "Sessions" +msgstr "" + +#: actions/sessionsadminpanel.php:65 +msgid "Session settings for this StatusNet site." +msgstr "" + +#: actions/sessionsadminpanel.php:175 +msgid "Handle sessions" +msgstr "" + +#: actions/sessionsadminpanel.php:177 +msgid "Whether to handle sessions ourselves." +msgstr "" + +#: actions/sessionsadminpanel.php:181 +msgid "Session debugging" +msgstr "" + +#: actions/sessionsadminpanel.php:183 +msgid "Turn on debugging output for sessions." +msgstr "" + +#: actions/sessionsadminpanel.php:199 actions/siteadminpanel.php:292 +#: actions/useradminpanel.php:294 +msgid "Save site settings" +msgstr "" + +#: actions/showapplication.php:82 +msgid "You must be logged in to view an application." +msgstr "" + +#: actions/showapplication.php:157 +msgid "Application profile" +msgstr "" + +#. TRANS: Form input field label for application icon. +#: actions/showapplication.php:159 lib/applicationeditform.php:182 +msgid "Icon" +msgstr "" + +#. TRANS: Form input field label for application name. +#: actions/showapplication.php:169 actions/version.php:197 +#: lib/applicationeditform.php:199 +msgid "Name" +msgstr "" + +#. TRANS: Form input field label. +#: actions/showapplication.php:178 lib/applicationeditform.php:235 +msgid "Organization" +msgstr "" + +#. TRANS: Form input field label. +#: actions/showapplication.php:187 actions/version.php:200 +#: lib/applicationeditform.php:216 lib/groupeditform.php:172 +msgid "Description" +msgstr "" + +#: actions/showapplication.php:192 actions/showgroup.php:436 +#: lib/profileaction.php:187 +msgid "Statistics" +msgstr "" + +#: actions/showapplication.php:203 +#, php-format +msgid "Created by %1$s - %2$s access by default - %3$d users" +msgstr "" + +#: actions/showapplication.php:213 +msgid "Application actions" +msgstr "" + +#: actions/showapplication.php:236 +msgid "Reset key & secret" +msgstr "" + +#: actions/showapplication.php:261 +msgid "Application info" +msgstr "" + +#: actions/showapplication.php:263 +msgid "Consumer key" +msgstr "" + +#: actions/showapplication.php:268 +msgid "Consumer secret" +msgstr "" + +#: actions/showapplication.php:273 +msgid "Request token URL" +msgstr "" + +#: actions/showapplication.php:278 +msgid "Access token URL" +msgstr "" + +#: actions/showapplication.php:283 +msgid "Authorize URL" +msgstr "" + +#: actions/showapplication.php:288 +msgid "" +"Note: We support HMAC-SHA1 signatures. We do not support the plaintext " +"signature method." +msgstr "" + +#: actions/showapplication.php:309 +msgid "Are you sure you want to reset your consumer key and secret?" +msgstr "" + +#: actions/showfavorites.php:79 +#, php-format +msgid "%1$s's favorite notices, page %2$d" +msgstr "" + +#: actions/showfavorites.php:132 +msgid "Could not retrieve favorite notices." +msgstr "" + +#: actions/showfavorites.php:171 +#, php-format +msgid "Feed for favorites of %s (RSS 1.0)" +msgstr "" + +#: actions/showfavorites.php:178 +#, php-format +msgid "Feed for favorites of %s (RSS 2.0)" +msgstr "" + +#: actions/showfavorites.php:185 +#, php-format +msgid "Feed for favorites of %s (Atom)" +msgstr "" + +#: actions/showfavorites.php:206 +msgid "" +"You haven't chosen any favorite notices yet. Click the fave button on " +"notices you like to bookmark them for later or shed a spotlight on them." +msgstr "" + +#: actions/showfavorites.php:208 +#, php-format +msgid "" +"%s hasn't added any favorite notices yet. Post something interesting they " +"would add to their favorites :)" +msgstr "" + +#: actions/showfavorites.php:212 +#, php-format +msgid "" +"%s hasn't added any favorite notices yet. Why not [register an account](%%%%" +"action.register%%%%) and then post something interesting they would add to " +"their favorites :)" +msgstr "" + +#: actions/showfavorites.php:243 +msgid "This is a way to share what you like." +msgstr "" + +#: actions/showgroup.php:82 lib/groupnav.php:86 +#, php-format +msgid "%s group" +msgstr "" + +#: actions/showgroup.php:84 +#, php-format +msgid "%1$s group, page %2$d" +msgstr "" + +#: actions/showgroup.php:227 +msgid "Group profile" +msgstr "" + +#: actions/showgroup.php:272 actions/tagother.php:118 +#: actions/userauthorization.php:175 lib/userprofile.php:178 +msgid "URL" +msgstr "" + +#: actions/showgroup.php:283 actions/tagother.php:128 +#: actions/userauthorization.php:187 lib/userprofile.php:195 +msgid "Note" +msgstr "" + +#: actions/showgroup.php:293 lib/groupeditform.php:184 +msgid "Aliases" +msgstr "" + +#: actions/showgroup.php:302 +msgid "Group actions" +msgstr "" + +#: actions/showgroup.php:338 +#, php-format +msgid "Notice feed for %s group (RSS 1.0)" +msgstr "" + +#: actions/showgroup.php:344 +#, php-format +msgid "Notice feed for %s group (RSS 2.0)" +msgstr "" + +#: actions/showgroup.php:350 +#, php-format +msgid "Notice feed for %s group (Atom)" +msgstr "" + +#: actions/showgroup.php:355 +#, php-format +msgid "FOAF for %s group" +msgstr "" + +#: actions/showgroup.php:393 actions/showgroup.php:445 lib/groupnav.php:91 +msgid "Members" +msgstr "" + +#: actions/showgroup.php:398 lib/profileaction.php:117 +#: lib/profileaction.php:152 lib/profileaction.php:255 lib/section.php:95 +#: lib/subscriptionlist.php:127 lib/tagcloudsection.php:71 +msgid "(None)" +msgstr "" + +#: actions/showgroup.php:404 +msgid "All members" +msgstr "" + +#: actions/showgroup.php:439 +msgid "Created" +msgstr "" + +#: actions/showgroup.php:455 +#, php-format +msgid "" +"**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. Its members share short messages about " +"their life and interests. [Join now](%%%%action.register%%%%) to become part " +"of this group and many more! ([Read more](%%%%doc.help%%%%))" +msgstr "" + +#: actions/showgroup.php:461 +#, php-format +msgid "" +"**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. Its members share short messages about " +"their life and interests. " +msgstr "" + +#: actions/showgroup.php:489 +msgid "Admins" +msgstr "" + +#: actions/showmessage.php:81 +msgid "No such message." +msgstr "" + +#: actions/showmessage.php:98 +msgid "Only the sender and recipient may read this message." +msgstr "" + +#: actions/showmessage.php:108 +#, php-format +msgid "Message to %1$s on %2$s" +msgstr "" + +#: actions/showmessage.php:113 +#, php-format +msgid "Message from %1$s on %2$s" +msgstr "" + +#: actions/shownotice.php:90 +msgid "Notice deleted." +msgstr "" + +#: actions/showstream.php:73 +#, php-format +msgid " tagged %s" +msgstr "" + +#: actions/showstream.php:79 +#, php-format +msgid "%1$s, page %2$d" +msgstr "" + +#: actions/showstream.php:122 +#, php-format +msgid "Notice feed for %1$s tagged %2$s (RSS 1.0)" +msgstr "" + +#: actions/showstream.php:129 +#, php-format +msgid "Notice feed for %s (RSS 1.0)" +msgstr "" + +#: actions/showstream.php:136 +#, php-format +msgid "Notice feed for %s (RSS 2.0)" +msgstr "" + +#: actions/showstream.php:143 +#, php-format +msgid "Notice feed for %s (Atom)" +msgstr "" + +#: actions/showstream.php:148 +#, php-format +msgid "FOAF for %s" +msgstr "" + +#: actions/showstream.php:200 +#, php-format +msgid "This is the timeline for %1$s but %2$s hasn't posted anything yet." +msgstr "" + +#: actions/showstream.php:205 +msgid "" +"Seen anything interesting recently? You haven't posted any notices yet, now " +"would be a good time to start :)" +msgstr "" + +#: actions/showstream.php:207 +#, php-format +msgid "" +"You can try to nudge %1$s or [post something to their attention](%%%%action." +"newnotice%%%%?status_textarea=%2$s)." +msgstr "" + +#: actions/showstream.php:243 +#, php-format +msgid "" +"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. [Join now](%%%%action.register%%%%) to " +"follow **%s**'s notices and many more! ([Read more](%%%%doc.help%%%%))" +msgstr "" + +#: actions/showstream.php:248 +#, php-format +msgid "" +"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. " +msgstr "" + +#: actions/showstream.php:305 +#, php-format +msgid "Repeat of %s" +msgstr "" + +#: actions/silence.php:65 actions/unsilence.php:65 +msgid "You cannot silence users on this site." +msgstr "" + +#: actions/silence.php:72 +msgid "User is already silenced." +msgstr "" + +#: actions/siteadminpanel.php:69 +msgid "Basic settings for this StatusNet site" +msgstr "" + +#: actions/siteadminpanel.php:133 +msgid "Site name must have non-zero length." +msgstr "" + +#: actions/siteadminpanel.php:141 +msgid "You must have a valid contact email address." +msgstr "" + +#: actions/siteadminpanel.php:159 +#, php-format +msgid "Unknown language \"%s\"." +msgstr "" + +#: actions/siteadminpanel.php:165 +msgid "Minimum text limit is 0 (unlimited)." +msgstr "" + +#: actions/siteadminpanel.php:171 +msgid "Dupe limit must be one or more seconds." +msgstr "" + +#: actions/siteadminpanel.php:221 +msgid "General" +msgstr "" + +#: actions/siteadminpanel.php:224 +msgid "Site name" +msgstr "" + +#: actions/siteadminpanel.php:225 +msgid "The name of your site, like \"Yourcompany Microblog\"" +msgstr "" + +#: actions/siteadminpanel.php:229 +msgid "Brought by" +msgstr "" + +#: actions/siteadminpanel.php:230 +msgid "Text used for credits link in footer of each page" +msgstr "" + +#: actions/siteadminpanel.php:234 +msgid "Brought by URL" +msgstr "" + +#: actions/siteadminpanel.php:235 +msgid "URL used for credits link in footer of each page" +msgstr "" + +#: actions/siteadminpanel.php:239 +msgid "Contact email address for your site" +msgstr "" + +#: actions/siteadminpanel.php:245 +msgid "Local" +msgstr "" + +#: actions/siteadminpanel.php:256 +msgid "Default timezone" +msgstr "" + +#: actions/siteadminpanel.php:257 +msgid "Default timezone for the site; usually UTC." +msgstr "" + +#: actions/siteadminpanel.php:262 +msgid "Default language" +msgstr "" + +#: actions/siteadminpanel.php:263 +msgid "Site language when autodetection from browser settings is not available" +msgstr "" + +#: actions/siteadminpanel.php:271 +msgid "Limits" +msgstr "" + +#: actions/siteadminpanel.php:274 +msgid "Text limit" +msgstr "" + +#: actions/siteadminpanel.php:274 +msgid "Maximum number of characters for notices." +msgstr "" + +#: actions/siteadminpanel.php:278 +msgid "Dupe limit" +msgstr "" + +#: actions/siteadminpanel.php:278 +msgid "How long users must wait (in seconds) to post the same thing again." +msgstr "" + +#: actions/sitenoticeadminpanel.php:56 +msgid "Site Notice" +msgstr "" + +#: actions/sitenoticeadminpanel.php:67 +msgid "Edit site-wide message" +msgstr "" + +#: actions/sitenoticeadminpanel.php:103 +msgid "Unable to save site notice." +msgstr "" + +#: actions/sitenoticeadminpanel.php:113 +msgid "Max length for the site-wide notice is 255 chars." +msgstr "" + +#: actions/sitenoticeadminpanel.php:176 +msgid "Site notice text" +msgstr "" + +#: actions/sitenoticeadminpanel.php:178 +msgid "Site-wide notice text (255 chars max; HTML okay)" +msgstr "" + +#: actions/sitenoticeadminpanel.php:198 +msgid "Save site notice" +msgstr "" + +#. TRANS: Title for SMS settings. +#: actions/smssettings.php:59 +msgid "SMS settings" +msgstr "" + +#. TRANS: SMS settings page instructions. +#. TRANS: %%site.name%% is the name of the site. +#: actions/smssettings.php:74 +#, php-format +msgid "You can receive SMS messages through email from %%site.name%%." +msgstr "" + +#. TRANS: Message given in the SMS settings if SMS is not enabled on the site. +#: actions/smssettings.php:97 +msgid "SMS is not available." +msgstr "" + +#. TRANS: Form legend for SMS settings form. +#: actions/smssettings.php:111 +msgid "SMS address" +msgstr "" + +#. TRANS: Form guide in SMS settings form. +#: actions/smssettings.php:120 +msgid "Current confirmed SMS-enabled phone number." +msgstr "" + +#. TRANS: Form guide in IM settings form. +#: actions/smssettings.php:133 +msgid "Awaiting confirmation on this phone number." +msgstr "" + +#. TRANS: Field label for SMS address input in SMS settings form. +#: actions/smssettings.php:142 +msgid "Confirmation code" +msgstr "" + +#. TRANS: Form field instructions in SMS settings form. +#: actions/smssettings.php:144 +msgid "Enter the code you received on your phone." +msgstr "" + +#. TRANS: Button label to confirm SMS confirmation code in SMS settings. +#: actions/smssettings.php:148 +msgctxt "BUTTON" +msgid "Confirm" +msgstr "" + +#. TRANS: Field label for SMS phone number input in SMS settings form. +#: actions/smssettings.php:153 +msgid "SMS phone number" +msgstr "" + +#. TRANS: SMS phone number input field instructions in SMS settings form. +#: actions/smssettings.php:156 +msgid "Phone number, no punctuation or spaces, with area code" +msgstr "" + +#. TRANS: Form legend for SMS preferences form. +#: actions/smssettings.php:195 +msgid "SMS preferences" +msgstr "" + +#. TRANS: Checkbox label in SMS preferences form. +#: actions/smssettings.php:201 +msgid "" +"Send me notices through SMS; I understand I may incur exorbitant charges " +"from my carrier." +msgstr "" + +#. TRANS: Confirmation message for successful SMS preferences save. +#: actions/smssettings.php:315 +msgid "SMS preferences saved." +msgstr "" + +#. TRANS: Message given saving SMS phone number without having provided one. +#: actions/smssettings.php:338 +msgid "No phone number." +msgstr "" + +#. TRANS: Message given saving SMS phone number without having selected a carrier. +#: actions/smssettings.php:344 +msgid "No carrier selected." +msgstr "" + +#. TRANS: Message given saving SMS phone number that is already set. +#: actions/smssettings.php:352 +msgid "That is already your phone number." +msgstr "" + +#. TRANS: Message given saving SMS phone number that is already set for another user. +#: actions/smssettings.php:356 +msgid "That phone number already belongs to another user." +msgstr "" + +#. TRANS: Message given saving valid SMS phone number that is to be confirmed. +#: actions/smssettings.php:384 +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 "" + +#. TRANS: Message given canceling SMS phone number confirmation for the wrong phone number. +#: actions/smssettings.php:413 +msgid "That is the wrong confirmation number." +msgstr "" + +#. TRANS: Message given after successfully canceling SMS phone number confirmation. +#: actions/smssettings.php:427 +msgid "SMS confirmation cancelled." +msgstr "" + +#. TRANS: Message given trying to remove an SMS phone number that is not +#. TRANS: registered for the active user. +#: actions/smssettings.php:448 +msgid "That is not your phone number." +msgstr "" + +#. TRANS: Message given after successfully removing a registered SMS phone number. +#: actions/smssettings.php:470 +msgid "The SMS phone number was removed." +msgstr "" + +#. TRANS: Label for mobile carrier dropdown menu in SMS settings. +#: actions/smssettings.php:511 +msgid "Mobile carrier" +msgstr "" + +#. TRANS: Default option for mobile carrier dropdown menu in SMS settings. +#: actions/smssettings.php:516 +msgid "Select a carrier" +msgstr "" + +#. TRANS: Form instructions for mobile carrier dropdown menu in SMS settings. +#. TRANS: %s is an administrative contact's e-mail address. +#: actions/smssettings.php:525 +#, 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 "" + +#. TRANS: Message given saving SMS phone number confirmation code without having provided one. +#: actions/smssettings.php:548 +msgid "No code entered" +msgstr "" + +#. TRANS: Menu item for site administration +#: actions/snapshotadminpanel.php:54 actions/snapshotadminpanel.php:196 +#: lib/adminpanelaction.php:408 +msgid "Snapshots" +msgstr "" + +#: actions/snapshotadminpanel.php:65 +msgid "Manage snapshot configuration" +msgstr "" + +#: actions/snapshotadminpanel.php:127 +msgid "Invalid snapshot run value." +msgstr "" + +#: actions/snapshotadminpanel.php:133 +msgid "Snapshot frequency must be a number." +msgstr "" + +#: actions/snapshotadminpanel.php:144 +msgid "Invalid snapshot report URL." +msgstr "" + +#: actions/snapshotadminpanel.php:200 +msgid "Randomly during web hit" +msgstr "" + +#: actions/snapshotadminpanel.php:201 +msgid "In a scheduled job" +msgstr "" + +#: actions/snapshotadminpanel.php:206 +msgid "Data snapshots" +msgstr "" + +#: actions/snapshotadminpanel.php:208 +msgid "When to send statistical data to status.net servers" +msgstr "" + +#: actions/snapshotadminpanel.php:217 +msgid "Frequency" +msgstr "" + +#: actions/snapshotadminpanel.php:218 +msgid "Snapshots will be sent once every N web hits" +msgstr "" + +#: actions/snapshotadminpanel.php:226 +msgid "Report URL" +msgstr "" + +#: actions/snapshotadminpanel.php:227 +msgid "Snapshots will be sent to this URL" +msgstr "" + +#: actions/snapshotadminpanel.php:248 +msgid "Save snapshot settings" +msgstr "" + +#: actions/subedit.php:70 +msgid "You are not subscribed to that profile." +msgstr "" + +#. TRANS: Exception thrown when a subscription could not be stored on the server. +#: actions/subedit.php:83 classes/Subscription.php:136 +msgid "Could not save subscription." +msgstr "" + +#: actions/subscribe.php:77 +msgid "This action only accepts POST requests." +msgstr "" + +#: actions/subscribe.php:107 +msgid "No such profile." +msgstr "" + +#: actions/subscribe.php:117 +msgid "You cannot subscribe to an OMB 0.1 remote profile with this action." +msgstr "" + +#: actions/subscribe.php:145 +msgid "Subscribed" +msgstr "" + +#: actions/subscribers.php:50 +#, php-format +msgid "%s subscribers" +msgstr "" + +#: actions/subscribers.php:52 +#, php-format +msgid "%1$s subscribers, page %2$d" +msgstr "" + +#: actions/subscribers.php:63 +msgid "These are the people who listen to your notices." +msgstr "" + +#: actions/subscribers.php:67 +#, php-format +msgid "These are the people who listen to %s's notices." +msgstr "" + +#: actions/subscribers.php:108 +msgid "" +"You have no subscribers. Try subscribing to people you know and they might " +"return the favor" +msgstr "" + +#: actions/subscribers.php:110 +#, php-format +msgid "%s has no subscribers. Want to be the first?" +msgstr "" + +#: actions/subscribers.php:114 +#, php-format +msgid "" +"%s has no subscribers. Why not [register an account](%%%%action.register%%%" +"%) and be the first?" +msgstr "" + +#: actions/subscriptions.php:52 +#, php-format +msgid "%s subscriptions" +msgstr "" + +#: actions/subscriptions.php:54 +#, php-format +msgid "%1$s subscriptions, page %2$d" +msgstr "" + +#: actions/subscriptions.php:65 +msgid "These are the people whose notices you listen to." +msgstr "" + +#: actions/subscriptions.php:69 +#, php-format +msgid "These are the people whose notices %s listens to." +msgstr "" + +#: actions/subscriptions.php:126 +#, php-format +msgid "" +"You're not listening to anyone's notices right now, try subscribing to " +"people you know. Try [people search](%%action.peoplesearch%%), look for " +"members in groups you're interested in and in our [featured users](%%action." +"featured%%). If you're a [Twitter user](%%action.twittersettings%%), you can " +"automatically subscribe to people you already follow there." +msgstr "" + +#: actions/subscriptions.php:128 actions/subscriptions.php:132 +#, php-format +msgid "%s is not listening to anyone." +msgstr "" + +#: actions/subscriptions.php:208 +msgid "Jabber" +msgstr "" + +#: actions/subscriptions.php:222 lib/connectsettingsaction.php:115 +msgid "SMS" +msgstr "" + +#: actions/tag.php:69 +#, php-format +msgid "Notices tagged with %1$s, page %2$d" +msgstr "" + +#: actions/tag.php:87 +#, php-format +msgid "Notice feed for tag %s (RSS 1.0)" +msgstr "" + +#: actions/tag.php:93 +#, php-format +msgid "Notice feed for tag %s (RSS 2.0)" +msgstr "" + +#: actions/tag.php:99 +#, php-format +msgid "Notice feed for tag %s (Atom)" +msgstr "" + +#: actions/tagother.php:39 +msgid "No ID argument." +msgstr "" + +#: actions/tagother.php:65 +#, php-format +msgid "Tag %s" +msgstr "" + +#: actions/tagother.php:77 lib/userprofile.php:76 +msgid "User profile" +msgstr "" + +#: actions/tagother.php:81 actions/userauthorization.php:132 +#: lib/userprofile.php:103 +msgid "Photo" +msgstr "" + +#: actions/tagother.php:141 +msgid "Tag user" +msgstr "" + +#: actions/tagother.php:151 +msgid "" +"Tags for this user (letters, numbers, -, ., and _), comma- or space- " +"separated" +msgstr "" + +#: actions/tagother.php:193 +msgid "" +"You can only tag people you are subscribed to or who are subscribed to you." +msgstr "" + +#: actions/tagother.php:200 +msgid "Could not save tags." +msgstr "" + +#: actions/tagother.php:236 +msgid "Use this form to add tags to your subscribers or subscriptions." +msgstr "" + +#: actions/tagrss.php:35 +msgid "No such tag." +msgstr "" + +#: actions/unblock.php:59 +msgid "You haven't blocked that user." +msgstr "" + +#: actions/unsandbox.php:72 +msgid "User is not sandboxed." +msgstr "" + +#: actions/unsilence.php:72 +msgid "User is not silenced." +msgstr "" + +#: actions/unsubscribe.php:77 +msgid "No profile ID in request." +msgstr "" + +#: actions/unsubscribe.php:98 +msgid "Unsubscribed" +msgstr "" + +#: actions/updateprofile.php:64 actions/userauthorization.php:337 +#, php-format +msgid "" +"Listenee stream license ‘%1$s’ is not compatible with site license ‘%2$s’." +msgstr "" + +#. TRANS: User admin panel title +#: actions/useradminpanel.php:59 +msgctxt "TITLE" +msgid "User" +msgstr "" + +#: actions/useradminpanel.php:70 +msgid "User settings for this StatusNet site." +msgstr "" + +#: actions/useradminpanel.php:149 +msgid "Invalid bio limit. Must be numeric." +msgstr "" + +#: actions/useradminpanel.php:155 +msgid "Invalid welcome text. Max length is 255 characters." +msgstr "" + +#: actions/useradminpanel.php:165 +#, php-format +msgid "Invalid default subscripton: '%1$s' is not user." +msgstr "" + +#. TRANS: Link description in user account settings menu. +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:111 +#: lib/personalgroupnav.php:109 +msgid "Profile" +msgstr "" + +#: actions/useradminpanel.php:222 +msgid "Bio Limit" +msgstr "" + +#: actions/useradminpanel.php:223 +msgid "Maximum length of a profile bio in characters." +msgstr "" + +#: actions/useradminpanel.php:231 +msgid "New users" +msgstr "" + +#: actions/useradminpanel.php:235 +msgid "New user welcome" +msgstr "" + +#: actions/useradminpanel.php:236 +msgid "Welcome text for new users (Max 255 chars)." +msgstr "" + +#: actions/useradminpanel.php:241 +msgid "Default subscription" +msgstr "" + +#: actions/useradminpanel.php:242 +msgid "Automatically subscribe new users to this user." +msgstr "" + +#: actions/useradminpanel.php:251 +msgid "Invitations" +msgstr "" + +#: actions/useradminpanel.php:256 +msgid "Invitations enabled" +msgstr "" + +#: actions/useradminpanel.php:258 +msgid "Whether to allow users to invite new users." +msgstr "" + +#: actions/userauthorization.php:105 +msgid "Authorize subscription" +msgstr "" + +#: actions/userauthorization.php:110 +msgid "" +"Please check these details to make sure that you want to subscribe to this " +"user’s notices. If you didn’t just ask to subscribe to someone’s notices, " +"click “Reject”." +msgstr "" + +#: actions/userauthorization.php:196 actions/version.php:167 +msgid "License" +msgstr "" + +#: actions/userauthorization.php:217 +msgid "Accept" +msgstr "" + +#: actions/userauthorization.php:218 lib/subscribeform.php:115 +#: lib/subscribeform.php:139 +msgid "Subscribe to this user" +msgstr "" + +#: actions/userauthorization.php:219 +msgid "Reject" +msgstr "" + +#: actions/userauthorization.php:220 +msgid "Reject this subscription" +msgstr "" + +#: actions/userauthorization.php:232 +msgid "No authorization request!" +msgstr "" + +#: actions/userauthorization.php:254 +msgid "Subscription authorized" +msgstr "" + +#: actions/userauthorization.php:256 +msgid "" +"The subscription has been authorized, but no callback URL was passed. Check " +"with the site’s instructions for details on how to authorize the " +"subscription. Your subscription token is:" +msgstr "" + +#: actions/userauthorization.php:266 +msgid "Subscription rejected" +msgstr "" + +#: actions/userauthorization.php:268 +msgid "" +"The subscription has been rejected, but no callback URL was passed. Check " +"with the site’s instructions for details on how to fully reject the " +"subscription." +msgstr "" + +#: actions/userauthorization.php:303 +#, php-format +msgid "Listener URI ‘%s’ not found here." +msgstr "" + +#: actions/userauthorization.php:308 +#, php-format +msgid "Listenee URI ‘%s’ is too long." +msgstr "" + +#: actions/userauthorization.php:314 +#, php-format +msgid "Listenee URI ‘%s’ is a local user." +msgstr "" + +#: actions/userauthorization.php:329 +#, php-format +msgid "Profile URL ‘%s’ is for a local user." +msgstr "" + +#: actions/userauthorization.php:345 +#, php-format +msgid "Avatar URL ‘%s’ is not valid." +msgstr "" + +#: actions/userauthorization.php:350 +#, php-format +msgid "Can’t read avatar URL ‘%s’." +msgstr "" + +#: actions/userauthorization.php:355 +#, php-format +msgid "Wrong image type for avatar URL ‘%s’." +msgstr "" + +#: actions/userdesignsettings.php:76 lib/designsettings.php:65 +msgid "Profile design" +msgstr "" + +#: actions/userdesignsettings.php:87 lib/designsettings.php:76 +msgid "" +"Customize the way your profile looks with a background image and a colour " +"palette of your choice." +msgstr "" + +#: actions/userdesignsettings.php:282 +msgid "Enjoy your hotdog!" +msgstr "" + +#. TRANS: Message is used as a page title. %1$s is a nick name, %2$d is a page number. +#: actions/usergroups.php:66 +#, php-format +msgid "%1$s groups, page %2$d" +msgstr "" + +#: actions/usergroups.php:132 +msgid "Search for more groups" +msgstr "" + +#: actions/usergroups.php:159 +#, php-format +msgid "%s is not a member of any group." +msgstr "" + +#: actions/usergroups.php:164 +#, php-format +msgid "Try [searching for groups](%%action.groupsearch%%) and joining them." +msgstr "" + +#. TRANS: Message is used as link description. %1$s is a username, %2$s is a site name. +#. TRANS: Message is used as a subtitle in atom group notice feed. +#. TRANS: %1$s is a group name, %2$s is a site name. +#. TRANS: Message is used as a subtitle in atom user notice feed. +#. TRANS: %1$s is a user name, %2$s is a site name. +#: actions/userrss.php:97 lib/atomgroupnoticefeed.php:70 +#: lib/atomusernoticefeed.php:76 +#, php-format +msgid "Updates from %1$s on %2$s!" +msgstr "" + +#: actions/version.php:75 +#, php-format +msgid "StatusNet %s" +msgstr "" + +#: actions/version.php:155 +#, php-format +msgid "" +"This site is powered by %1$s version %2$s, Copyright 2008-2010 StatusNet, " +"Inc. and contributors." +msgstr "" + +#: actions/version.php:163 +msgid "Contributors" +msgstr "" + +#: actions/version.php:170 +msgid "" +"StatusNet is free software: you can redistribute it and/or modify it under " +"the terms of the GNU Affero General Public License as published by the Free " +"Software Foundation, either version 3 of the License, or (at your option) " +"any later version. " +msgstr "" + +#: actions/version.php:176 +msgid "" +"This program is distributed in the hope that it will be useful, but WITHOUT " +"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or " +"FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License " +"for more details. " +msgstr "" + +#: actions/version.php:182 +#, php-format +msgid "" +"You should have received a copy of the GNU Affero General Public License " +"along with this program. If not, see %s." +msgstr "" + +#: actions/version.php:191 +msgid "Plugins" +msgstr "" + +#. TRANS: Secondary navigation menu option leading to version information on the StatusNet site. +#: actions/version.php:198 lib/action.php:789 +msgid "Version" +msgstr "" + +#: actions/version.php:199 +msgid "Author(s)" +msgstr "" + +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + +#. TRANS: Server exception thrown when... Robin thinks something is impossible! +#: classes/File.php:175 +msgid "Robin thinks something is impossible." +msgstr "" + +#. TRANS: Message given if an upload is larger than the configured maximum. +#. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. +#: classes/File.php:190 +#, php-format +msgid "" +"No file may be larger than %1$d bytes and the file you sent was %2$d bytes. " +"Try to upload a smaller version." +msgstr "" + +#. TRANS: Message given if an upload would exceed user quota. +#. TRANS: %d (number) is the user quota in bytes. +#: classes/File.php:202 +#, php-format +msgid "A file this large would exceed your user quota of %d bytes." +msgstr "" + +#. TRANS: Message given id an upload would exceed a user's monthly quota. +#. TRANS: $d (number) is the monthly user quota in bytes. +#: classes/File.php:211 +#, php-format +msgid "A file this large would exceed your monthly quota of %d bytes." +msgstr "" + +#. TRANS: Client exception thrown if a file upload does not have a valid name. +#: classes/File.php:248 classes/File.php:263 +msgid "Invalid filename." +msgstr "" + +#. TRANS: Exception thrown when joining a group fails. +#: classes/Group_member.php:42 +msgid "Group join failed." +msgstr "" + +#. TRANS: Exception thrown when trying to leave a group the user is not a member of. +#: classes/Group_member.php:55 +msgid "Not part of group." +msgstr "" + +#. TRANS: Exception thrown when trying to leave a group fails. +#: classes/Group_member.php:63 +msgid "Group leave failed." +msgstr "" + +#. TRANS: Server exception thrown when updating a local group fails. +#: classes/Local_group.php:42 +msgid "Could not update local group." +msgstr "" + +#. TRANS: Exception thrown when trying creating a login token failed. +#. TRANS: %s is the user nickname for which token creation failed. +#: classes/Login_token.php:78 +#, php-format +msgid "Could not create login token for %s" +msgstr "" + +#. TRANS: Exception thrown when database name or Data Source Name could not be found. +#: classes/Memcached_DataObject.php:533 +msgid "No database name or DSN found anywhere." +msgstr "" + +#. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. +#: classes/Message.php:46 +msgid "You are banned from sending direct messages." +msgstr "" + +#. TRANS: Message given when a message could not be stored on the server. +#: classes/Message.php:63 +msgid "Could not insert message." +msgstr "" + +#. TRANS: Message given when a message could not be updated on the server. +#: classes/Message.php:74 +msgid "Could not update message with new URI." +msgstr "" + +#. TRANS: Server exception thrown when a user profile for a notice cannot be found. +#. TRANS: %1$d is a profile ID (number), %2$d is a notice ID (number). +#: classes/Notice.php:98 +#, php-format +msgid "No such profile (%1$d) for notice (%2$d)." +msgstr "" + +#. TRANS: Server exception. %s are the error details. +#: classes/Notice.php:190 +#, php-format +msgid "Database error inserting hashtag: %s" +msgstr "" + +#. TRANS: Client exception thrown if a notice contains too many characters. +#: classes/Notice.php:260 +msgid "Problem saving notice. Too long." +msgstr "" + +#. TRANS: Client exception thrown when trying to save a notice for an unknown user. +#: classes/Notice.php:265 +msgid "Problem saving notice. Unknown user." +msgstr "" + +#. TRANS: Client exception thrown when a user tries to post too many notices in a given time frame. +#: classes/Notice.php:271 +msgid "" +"Too many notices too fast; take a breather and post again in a few minutes." +msgstr "" + +#. TRANS: Client exception thrown when a user tries to post too many duplicate notices in a given time frame. +#: classes/Notice.php:278 +msgid "" +"Too many duplicate messages too quickly; take a breather and post again in a " +"few minutes." +msgstr "" + +#. TRANS: Client exception thrown when a user tries to post while being banned. +#: classes/Notice.php:286 +msgid "You are banned from posting notices on this site." +msgstr "" + +#. TRANS: Server exception thrown when a notice cannot be saved. +#. TRANS: Server exception thrown when a notice cannot be updated. +#: classes/Notice.php:353 classes/Notice.php:380 +msgid "Problem saving notice." +msgstr "" + +#. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). +#: classes/Notice.php:892 +msgid "Bad type provided to saveKnownGroups" +msgstr "" + +#. TRANS: Server exception thrown when an update for a group inbox fails. +#: classes/Notice.php:991 +msgid "Problem saving group inbox." +msgstr "" + +#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. +#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. +#: classes/Notice.php:1600 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "" + +#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). +#: classes/Profile.php:740 +#, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." +msgstr "" + +#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). +#: classes/Profile.php:749 +#, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." +msgstr "" + +#. TRANS: Exception thrown when a right for a non-existing user profile is checked. +#: classes/Remote_profile.php:54 +msgid "Missing profile." +msgstr "" + +#. TRANS: Exception thrown when a tag cannot be saved. +#: classes/Status_network.php:346 +msgid "Unable to save tag." +msgstr "" + +#. TRANS: Exception thrown when trying to subscribe while being banned from subscribing. +#: classes/Subscription.php:75 lib/oauthstore.php:465 +msgid "You have been banned from subscribing." +msgstr "" + +#. TRANS: Exception thrown when trying to subscribe while already subscribed. +#: classes/Subscription.php:80 +msgid "Already subscribed!" +msgstr "" + +#. TRANS: Exception thrown when trying to subscribe to a user who has blocked the subscribing user. +#: classes/Subscription.php:85 +msgid "User has blocked you." +msgstr "" + +#. TRANS: Exception thrown when trying to unsibscribe without a subscription. +#: classes/Subscription.php:171 +msgid "Not subscribed!" +msgstr "" + +#. TRANS: Exception thrown when trying to unsubscribe a user from themselves. +#: classes/Subscription.php:178 +msgid "Could not delete self-subscription." +msgstr "" + +#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. +#: classes/Subscription.php:206 +msgid "Could not delete subscription OMB token." +msgstr "" + +#. TRANS: Exception thrown when a subscription could not be deleted on the server. +#: classes/Subscription.php:218 +msgid "Could not delete subscription." +msgstr "" + +#. TRANS: Notice given on user registration. +#. TRANS: %1$s is the sitename, $2$s is the registering user's nickname. +#: classes/User.php:365 +#, php-format +msgid "Welcome to %1$s, @%2$s!" +msgstr "" + +#. TRANS: Server exception thrown when creating a group failed. +#: classes/User_group.php:496 +msgid "Could not create group." +msgstr "" + +#. TRANS: Server exception thrown when updating a group URI failed. +#: classes/User_group.php:506 +msgid "Could not set group URI." +msgstr "" + +#. TRANS: Server exception thrown when setting group membership failed. +#: classes/User_group.php:529 +msgid "Could not set group membership." +msgstr "" + +#. TRANS: Server exception thrown when saving local group information failed. +#: classes/User_group.php:544 +msgid "Could not save local group info." +msgstr "" + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:109 +msgid "Change your profile settings" +msgstr "" + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:116 +msgid "Upload an avatar" +msgstr "" + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:123 +msgid "Change your password" +msgstr "" + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:130 +msgid "Change email handling" +msgstr "" + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:137 +msgid "Design your profile" +msgstr "" + +#. TRANS: Link title attribute in user account settings menu. +#: lib/accountsettingsaction.php:144 +msgid "Other options" +msgstr "" + +#. TRANS: Link description in user account settings menu. +#: lib/accountsettingsaction.php:146 +msgid "Other" +msgstr "" + +#. TRANS: Page title. %1$s is the title, %2$s is the site name. +#: lib/action.php:145 +#, php-format +msgid "%1$s - %2$s" +msgstr "" + +#. TRANS: Page title for a page without a title set. +#: lib/action.php:161 +msgid "Untitled page" +msgstr "" + +#. TRANS: DT element for primary navigation menu. String is hidden in default CSS. +#: lib/action.php:436 +msgid "Primary site navigation" +msgstr "" + +#. TRANS: Tooltip for main menu option "Personal" +#: lib/action.php:442 +msgctxt "TOOLTIP" +msgid "Personal profile and friends timeline" +msgstr "" + +#. TRANS: Main menu option when logged in for access to personal profile and friends timeline +#: lib/action.php:445 +msgctxt "MENU" +msgid "Personal" +msgstr "" + +#. TRANS: Tooltip for main menu option "Account" +#: lib/action.php:447 +msgctxt "TOOLTIP" +msgid "Change your email, avatar, password, profile" +msgstr "" + +#. TRANS: Tooltip for main menu option "Services" +#: lib/action.php:452 +msgctxt "TOOLTIP" +msgid "Connect to services" +msgstr "" + +#. TRANS: Main menu option when logged in and connection are possible for access to options to connect to other services +#: lib/action.php:455 +msgid "Connect" +msgstr "" + +#. TRANS: Tooltip for menu option "Admin" +#: lib/action.php:458 +msgctxt "TOOLTIP" +msgid "Change site configuration" +msgstr "" + +#. TRANS: Main menu option when logged in and site admin for access to site configuration +#: lib/action.php:461 +msgctxt "MENU" +msgid "Admin" +msgstr "" + +#. TRANS: Tooltip for main menu option "Invite" +#: lib/action.php:465 +#, php-format +msgctxt "TOOLTIP" +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + +#. TRANS: Main menu option when logged in and invitations are allowed for inviting new users +#: lib/action.php:468 +msgctxt "MENU" +msgid "Invite" +msgstr "" + +#. TRANS: Tooltip for main menu option "Logout" +#: lib/action.php:474 +msgctxt "TOOLTIP" +msgid "Logout from the site" +msgstr "" + +#. TRANS: Main menu option when logged in to log out the current user +#: lib/action.php:477 +msgctxt "MENU" +msgid "Logout" +msgstr "" + +#. TRANS: Tooltip for main menu option "Register" +#: lib/action.php:482 +msgctxt "TOOLTIP" +msgid "Create an account" +msgstr "" + +#. TRANS: Main menu option when not logged in to register a new account +#: lib/action.php:485 +msgctxt "MENU" +msgid "Register" +msgstr "" + +#. TRANS: Tooltip for main menu option "Login" +#: lib/action.php:488 +msgctxt "TOOLTIP" +msgid "Login to the site" +msgstr "" + +#: lib/action.php:491 +msgctxt "MENU" +msgid "Login" +msgstr "" + +#. TRANS: Tooltip for main menu option "Help" +#: lib/action.php:494 +msgctxt "TOOLTIP" +msgid "Help me!" +msgstr "" + +#: lib/action.php:497 +msgctxt "MENU" +msgid "Help" +msgstr "" + +#. TRANS: Tooltip for main menu option "Search" +#: lib/action.php:500 +msgctxt "TOOLTIP" +msgid "Search for people or text" +msgstr "" + +#: lib/action.php:503 +msgctxt "MENU" +msgid "Search" +msgstr "" + +#. TRANS: DT element for site notice. String is hidden in default CSS. +#. TRANS: Menu item for site administration +#: lib/action.php:525 lib/adminpanelaction.php:400 +msgid "Site notice" +msgstr "" + +#. TRANS: DT element for local views block. String is hidden in default CSS. +#: lib/action.php:592 +msgid "Local views" +msgstr "" + +#. TRANS: DT element for page notice. String is hidden in default CSS. +#: lib/action.php:659 +msgid "Page notice" +msgstr "" + +#. TRANS: DT element for secondary navigation menu. String is hidden in default CSS. +#: lib/action.php:762 +msgid "Secondary site navigation" +msgstr "" + +#. TRANS: Secondary navigation menu option leading to help on StatusNet. +#: lib/action.php:768 +msgid "Help" +msgstr "" + +#. TRANS: Secondary navigation menu option leading to text about StatusNet site. +#: lib/action.php:771 +msgid "About" +msgstr "" + +#. TRANS: Secondary navigation menu option leading to Frequently Asked Questions. +#: lib/action.php:774 +msgid "FAQ" +msgstr "" + +#. TRANS: Secondary navigation menu option leading to Terms of Service. +#: lib/action.php:779 +msgid "TOS" +msgstr "" + +#. TRANS: Secondary navigation menu option leading to privacy policy. +#: lib/action.php:783 +msgid "Privacy" +msgstr "" + +#. TRANS: Secondary navigation menu option. +#: lib/action.php:786 +msgid "Source" +msgstr "" + +#. TRANS: Secondary navigation menu option leading to contact information on the StatusNet site. +#: lib/action.php:792 +msgid "Contact" +msgstr "" + +#: lib/action.php:794 +msgid "Badge" +msgstr "" + +#. TRANS: DT element for StatusNet software license. +#: lib/action.php:823 +msgid "StatusNet software license" +msgstr "" + +#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is set. +#: lib/action.php:827 +#, php-format +msgid "" +"**%%site.name%%** is a microblogging service brought to you by [%%site." +"broughtby%%](%%site.broughtbyurl%%)." +msgstr "" + +#. TRANS: First sentence of the StatusNet site license. Used if 'broughtby' is not set. +#: lib/action.php:830 +#, php-format +msgid "**%%site.name%%** is a microblogging service." +msgstr "" + +#. TRANS: Second sentence of the StatusNet site license. Mentions the StatusNet source code license. +#: lib/action.php:834 +#, php-format +msgid "" +"It runs the [StatusNet](http://status.net/) microblogging software, version %" +"s, available under the [GNU Affero General Public License](http://www.fsf." +"org/licensing/licenses/agpl-3.0.html)." +msgstr "" + +#. TRANS: DT element for StatusNet site content license. +#: lib/action.php:850 +msgid "Site content license" +msgstr "" + +#. TRANS: Content license displayed when license is set to 'private'. +#. TRANS: %1$s is the site name. +#: lib/action.php:857 +#, php-format +msgid "Content and data of %1$s are private and confidential." +msgstr "" + +#. TRANS: Content license displayed when license is set to 'allrightsreserved'. +#. TRANS: %1$s is the copyright owner. +#: lib/action.php:864 +#, php-format +msgid "Content and data copyright by %1$s. All rights reserved." +msgstr "" + +#. TRANS: Content license displayed when license is set to 'allrightsreserved' and no owner is set. +#: lib/action.php:868 +msgid "Content and data copyright by contributors. All rights reserved." +msgstr "" + +#. TRANS: license message in footer. %1$s is the site name, %2$s is a link to the license URL, with a licence name set in configuration. +#: lib/action.php:881 +#, php-format +msgid "All %1$s content and data are available under the %2$s license." +msgstr "" + +#. TRANS: DT element for pagination (previous/next, etc.). +#: lib/action.php:1192 +msgid "Pagination" +msgstr "" + +#. TRANS: Pagination message to go to a page displaying information more in the +#. TRANS: present than the currently displayed information. +#: lib/action.php:1203 +msgid "After" +msgstr "" + +#. TRANS: Pagination message to go to a page displaying information more in the +#. TRANS: past than the currently displayed information. +#: lib/action.php:1213 +msgid "Before" +msgstr "" + +#. TRANS: Client exception thrown when a feed instance is a DOMDocument. +#: lib/activity.php:122 +msgid "Expecting a root feed element but got a whole XML document." +msgstr "" + +#: lib/activityutils.php:208 +msgid "Can't handle remote content yet." +msgstr "" + +#: lib/activityutils.php:244 +msgid "Can't handle embedded XML content yet." +msgstr "" + +#: lib/activityutils.php:248 +msgid "Can't handle embedded Base64 content yet." +msgstr "" + +#. TRANS: Client error message thrown when a user tries to change admin settings but has no access rights. +#: lib/adminpanelaction.php:98 +msgid "You cannot make changes to this site." +msgstr "" + +#. TRANS: Client error message throw when a certain panel's settings cannot be changed. +#: lib/adminpanelaction.php:110 +msgid "Changes to that panel are not allowed." +msgstr "" + +#. TRANS: Client error message. +#: lib/adminpanelaction.php:229 +msgid "showForm() not implemented." +msgstr "" + +#. TRANS: Client error message +#: lib/adminpanelaction.php:259 +msgid "saveSettings() not implemented." +msgstr "" + +#. TRANS: Client error message thrown if design settings could not be deleted in +#. TRANS: the admin panel Design. +#: lib/adminpanelaction.php:284 +msgid "Unable to delete design setting." +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:350 +msgid "Basic site configuration" +msgstr "" + +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:352 +msgctxt "MENU" +msgid "Site" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:358 +msgid "Design configuration" +msgstr "" + +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:360 +msgctxt "MENU" +msgid "Design" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:366 +msgid "User configuration" +msgstr "" + +#. TRANS: Menu item for site administration +#: lib/adminpanelaction.php:368 lib/personalgroupnav.php:115 +msgid "User" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:374 +msgid "Access configuration" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:382 +msgid "Paths configuration" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:390 +msgid "Sessions configuration" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:398 +msgid "Edit site notice" +msgstr "" + +#. TRANS: Menu item title/tooltip +#: lib/adminpanelaction.php:406 +msgid "Snapshots configuration" +msgstr "" + +#. TRANS: Client error 401. +#: lib/apiauth.php:113 +msgid "API resource requires read-write access, but you only have read access." +msgstr "" + +#. TRANS: Form legend. +#: lib/applicationeditform.php:137 +msgid "Edit application" +msgstr "" + +#. TRANS: Form guide. +#: lib/applicationeditform.php:187 +msgid "Icon for this application" +msgstr "" + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:209 +#, php-format +msgid "Describe your application in %d characters" +msgstr "" + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:213 +msgid "Describe your application" +msgstr "" + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:224 +msgid "URL of the homepage of this application" +msgstr "" + +#. TRANS: Form input field label. +#: lib/applicationeditform.php:226 +msgid "Source URL" +msgstr "" + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:233 +msgid "Organization responsible for this application" +msgstr "" + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:242 +msgid "URL for the homepage of the organization" +msgstr "" + +#. TRANS: Form input field instructions. +#: lib/applicationeditform.php:251 +msgid "URL to redirect to after authentication" +msgstr "" + +#. TRANS: Radio button label for application type +#: lib/applicationeditform.php:278 +msgid "Browser" +msgstr "" + +#. TRANS: Radio button label for application type +#: lib/applicationeditform.php:295 +msgid "Desktop" +msgstr "" + +#. TRANS: Form guide. +#: lib/applicationeditform.php:297 +msgid "Type of application, browser or desktop" +msgstr "" + +#. TRANS: Radio button label for access type. +#: lib/applicationeditform.php:320 +msgid "Read-only" +msgstr "" + +#. TRANS: Radio button label for access type. +#: lib/applicationeditform.php:339 +msgid "Read-write" +msgstr "" + +#. TRANS: Form guide. +#: lib/applicationeditform.php:341 +msgid "Default access for this application: read-only, or read-write" +msgstr "" + +#. TRANS: Submit button title +#: lib/applicationeditform.php:359 +msgid "Cancel" +msgstr "" + +#. TRANS: Application access type +#: lib/applicationlist.php:136 +msgid "read-write" +msgstr "" + +#. TRANS: Application access type +#: lib/applicationlist.php:138 +msgid "read-only" +msgstr "" + +#. TRANS: Used in application list. %1$s is a modified date, %2$s is access type (read-write or read-only) +#: lib/applicationlist.php:144 +#, php-format +msgid "Approved %1$s - \"%2$s\" access." +msgstr "" + +#. TRANS: Button label +#: lib/applicationlist.php:159 +msgctxt "BUTTON" +msgid "Revoke" +msgstr "" + +#. TRANS: DT element label in attachment list. +#: lib/attachmentlist.php:88 +msgid "Attachments" +msgstr "" + +#. TRANS: DT element label in attachment list item. +#: lib/attachmentlist.php:265 +msgid "Author" +msgstr "" + +#. TRANS: DT element label in attachment list item. +#: lib/attachmentlist.php:279 +msgid "Provider" +msgstr "" + +#: lib/attachmentnoticesection.php:67 +msgid "Notices where this attachment appears" +msgstr "" + +#: lib/attachmenttagcloudsection.php:48 +msgid "Tags for this attachment" +msgstr "" + +#: lib/authenticationplugin.php:221 lib/authenticationplugin.php:226 +msgid "Password changing failed" +msgstr "" + +#: lib/authenticationplugin.php:236 +msgid "Password changing is not allowed" +msgstr "" + +#: lib/channel.php:157 lib/channel.php:177 +msgid "Command results" +msgstr "" + +#: lib/channel.php:229 lib/mailhandler.php:142 +msgid "Command complete" +msgstr "" + +#: lib/channel.php:240 +msgid "Command failed" +msgstr "" + +#: lib/command.php:83 lib/command.php:105 +msgid "Notice with that id does not exist" +msgstr "" + +#: lib/command.php:99 lib/command.php:596 +msgid "User has no last notice" +msgstr "" + +#. TRANS: Message given requesting a profile for a non-existing user. +#. TRANS: %s is the nickname of the user for which the profile could not be found. +#: lib/command.php:127 +#, php-format +msgid "Could not find a user with nickname %s" +msgstr "" + +#. TRANS: Message given getting a non-existing user. +#. TRANS: %s is the nickname of the user that could not be found. +#: lib/command.php:147 +#, php-format +msgid "Could not find a local user with nickname %s" +msgstr "" + +#: lib/command.php:180 +msgid "Sorry, this command is not yet implemented." +msgstr "" + +#: lib/command.php:225 +msgid "It does not make a lot of sense to nudge yourself!" +msgstr "" + +#. TRANS: Message given having nudged another user. +#. TRANS: %s is the nickname of the user that was nudged. +#: lib/command.php:234 +#, php-format +msgid "Nudge sent to %s" +msgstr "" + +#: lib/command.php:260 +#, php-format +msgid "" +"Subscriptions: %1$s\n" +"Subscribers: %2$s\n" +"Notices: %3$s" +msgstr "" + +#: lib/command.php:302 +msgid "Notice marked as fave." +msgstr "" + +#: lib/command.php:323 +msgid "You are already a member of that group" +msgstr "" + +#. TRANS: Message given having failed to add a user to a group. +#. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. +#: lib/command.php:339 +#, php-format +msgid "Could not join user %1$s to group %2$s" +msgstr "" + +#. TRANS: Message given having failed to remove a user from a group. +#. TRANS: %1$s is the nickname of the user, %2$s is the nickname of the group. +#: lib/command.php:385 +#, php-format +msgid "Could not remove user %1$s from group %2$s" +msgstr "" + +#. TRANS: Whois output. %s is the full name of the queried user. +#: lib/command.php:418 +#, php-format +msgid "Fullname: %s" +msgstr "" + +#. TRANS: Whois output. %s is the location of the queried user. +#. TRANS: Profile info line in new-subscriber notification e-mail +#: lib/command.php:422 lib/mail.php:268 +#, php-format +msgid "Location: %s" +msgstr "" + +#. TRANS: Whois output. %s is the homepage of the queried user. +#. TRANS: Profile info line in new-subscriber notification e-mail +#: lib/command.php:426 lib/mail.php:271 +#, php-format +msgid "Homepage: %s" +msgstr "" + +#. TRANS: Whois output. %s is the bio information of the queried user. +#: lib/command.php:430 +#, php-format +msgid "About: %s" +msgstr "" + +#: lib/command.php:457 +#, php-format +msgid "" +"%s is a remote profile; you can only send direct messages to users on the " +"same server." +msgstr "" + +#. TRANS: Message given if content is too long. +#. TRANS: %1$d is the maximum number of characters, %2$d is the number of submitted characters. +#: lib/command.php:472 +#, php-format +msgid "Message too long - maximum is %1$d characters, you sent %2$d" +msgstr "" + +#. TRANS: Message given have sent a direct message to another user. +#. TRANS: %s is the name of the other user. +#: lib/command.php:492 +#, php-format +msgid "Direct message to %s sent" +msgstr "" + +#: lib/command.php:494 +msgid "Error sending direct message." +msgstr "" + +#: lib/command.php:514 +msgid "Cannot repeat your own notice" +msgstr "" + +#: lib/command.php:519 +msgid "Already repeated that notice" +msgstr "" + +#. TRANS: Message given having repeated a notice from another user. +#. TRANS: %s is the name of the user for which the notice was repeated. +#: lib/command.php:529 +#, php-format +msgid "Notice from %s repeated" +msgstr "" + +#: lib/command.php:531 +msgid "Error repeating notice." +msgstr "" + +#: lib/command.php:562 +#, php-format +msgid "Notice too long - maximum is %d characters, you sent %d" +msgstr "" + +#: lib/command.php:571 +#, php-format +msgid "Reply to %s sent" +msgstr "" + +#: lib/command.php:573 +msgid "Error saving notice." +msgstr "" + +#: lib/command.php:620 +msgid "Specify the name of the user to subscribe to" +msgstr "" + +#: lib/command.php:628 +msgid "Can't subscribe to OMB profiles by command." +msgstr "" + +#: lib/command.php:634 +#, php-format +msgid "Subscribed to %s" +msgstr "" + +#: lib/command.php:655 lib/command.php:754 +msgid "Specify the name of the user to unsubscribe from" +msgstr "" + +#: lib/command.php:664 +#, php-format +msgid "Unsubscribed from %s" +msgstr "" + +#: lib/command.php:682 lib/command.php:705 +msgid "Command not yet implemented." +msgstr "" + +#: lib/command.php:685 +msgid "Notification off." +msgstr "" + +#: lib/command.php:687 +msgid "Can't turn off notification." +msgstr "" + +#: lib/command.php:708 +msgid "Notification on." +msgstr "" + +#: lib/command.php:710 +msgid "Can't turn on notification." +msgstr "" + +#: lib/command.php:723 +msgid "Login command is disabled" +msgstr "" + +#: lib/command.php:734 +#, php-format +msgid "This link is useable only once, and is good for only 2 minutes: %s" +msgstr "" + +#: lib/command.php:761 +#, php-format +msgid "Unsubscribed %s" +msgstr "" + +#: lib/command.php:778 +msgid "You are not subscribed to anyone." +msgstr "" + +#: lib/command.php:780 +#, fuzzy +msgid "You are subscribed to this person:" +msgid_plural "You are subscribed to these people:" +msgstr[0] "You are subscribed to this person:" +msgstr[1] "You are subscribed to these people:" + +#: lib/command.php:800 +msgid "No one is subscribed to you." +msgstr "" + +#: lib/command.php:802 +#, fuzzy +msgid "This person is subscribed to you:" +msgid_plural "These people are subscribed to you:" +msgstr[0] "This person is subscribed to you:" +msgstr[1] "These people are subscribed to you:" + +#: lib/command.php:822 +msgid "You are not a member of any groups." +msgstr "" + +#: lib/command.php:824 +#, fuzzy +msgid "You are a member of this group:" +msgid_plural "You are a member of these groups:" +msgstr[0] "You are a member of this group:" +msgstr[1] "You are a member of these groups:" + +#: lib/command.php:838 +msgid "" +"Commands:\n" +"on - turn on notifications\n" +"off - turn off notifications\n" +"help - show this help\n" +"follow - subscribe to user\n" +"groups - lists the groups you have joined\n" +"subscriptions - list the people you follow\n" +"subscribers - list the people that follow you\n" +"leave - unsubscribe from user\n" +"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" +"repeat - repeat the last notice from user\n" +"reply # - reply to notice with a given id\n" +"reply - reply to the last notice from user\n" +"join - join group\n" +"login - Get a link to login to the web interface\n" +"drop - leave group\n" +"stats - get your stats\n" +"stop - same as 'off'\n" +"quit - same as 'off'\n" +"sub - same as 'follow'\n" +"unsub - same as 'leave'\n" +"last - same as 'get'\n" +"on - not yet implemented.\n" +"off - not yet implemented.\n" +"nudge - remind a user to update.\n" +"invite - not yet implemented.\n" +"track - not yet implemented.\n" +"untrack - not yet implemented.\n" +"track off - not yet implemented.\n" +"untrack all - not yet implemented.\n" +"tracks - not yet implemented.\n" +"tracking - not yet implemented.\n" +msgstr "" + +#: lib/common.php:135 +msgid "No configuration file found. " +msgstr "" + +#: lib/common.php:136 +msgid "I looked for configuration files in the following places: " +msgstr "" + +#: lib/common.php:138 +msgid "You may wish to run the installer to fix this." +msgstr "" + +#: lib/common.php:139 +msgid "Go to the installer." +msgstr "" + +#: lib/connectsettingsaction.php:110 +msgid "IM" +msgstr "" + +#: lib/connectsettingsaction.php:111 +msgid "Updates by instant messenger (IM)" +msgstr "" + +#: lib/connectsettingsaction.php:116 +msgid "Updates by SMS" +msgstr "" + +#: lib/connectsettingsaction.php:120 +msgid "Connections" +msgstr "" + +#: lib/connectsettingsaction.php:121 +msgid "Authorized connected applications" +msgstr "" + +#: lib/dberroraction.php:60 +msgid "Database error" +msgstr "" + +#: lib/designsettings.php:105 +msgid "Upload file" +msgstr "" + +#: lib/designsettings.php:109 +msgid "" +"You can upload your personal background image. The maximum file size is 2MB." +msgstr "" + +#: lib/designsettings.php:418 +msgid "Design defaults restored." +msgstr "" + +#: lib/disfavorform.php:114 lib/disfavorform.php:140 +msgid "Disfavor this notice" +msgstr "" + +#: lib/favorform.php:114 lib/favorform.php:140 +msgid "Favor this notice" +msgstr "" + +#: lib/favorform.php:140 +msgid "Favor" +msgstr "" + +#: lib/feed.php:85 +msgid "RSS 1.0" +msgstr "" + +#: lib/feed.php:87 +msgid "RSS 2.0" +msgstr "" + +#: lib/feed.php:89 +msgid "Atom" +msgstr "" + +#: lib/feed.php:91 +msgid "FOAF" +msgstr "" + +#: lib/feedlist.php:64 +msgid "Export data" +msgstr "" + +#: lib/galleryaction.php:121 +msgid "Filter tags" +msgstr "" + +#: lib/galleryaction.php:131 +msgid "All" +msgstr "" + +#: lib/galleryaction.php:139 +msgid "Select tag to filter" +msgstr "" + +#: lib/galleryaction.php:140 +msgid "Tag" +msgstr "" + +#: lib/galleryaction.php:141 +msgid "Choose a tag to narrow list" +msgstr "" + +#: lib/galleryaction.php:143 +msgid "Go" +msgstr "" + +#: lib/grantroleform.php:91 +#, php-format +msgid "Grant this user the \"%s\" role" +msgstr "" + +#: lib/groupeditform.php:163 +msgid "URL of the homepage or blog of the group or topic" +msgstr "" + +#: lib/groupeditform.php:168 +msgid "Describe the group or topic" +msgstr "" + +#: lib/groupeditform.php:170 +#, php-format +msgid "Describe the group or topic in %d characters" +msgstr "" + +#: lib/groupeditform.php:179 +msgid "" +"Location for the group, if any, like \"City, State (or Region), Country\"" +msgstr "" + +#: lib/groupeditform.php:187 +#, php-format +msgid "Extra nicknames for the group, comma- or space- separated, max %d" +msgstr "" + +#: lib/groupnav.php:85 +msgid "Group" +msgstr "" + +#: lib/groupnav.php:101 +msgid "Blocked" +msgstr "" + +#: lib/groupnav.php:102 +#, php-format +msgid "%s blocked users" +msgstr "" + +#: lib/groupnav.php:108 +#, php-format +msgid "Edit %s group properties" +msgstr "" + +#: lib/groupnav.php:113 +msgid "Logo" +msgstr "" + +#: lib/groupnav.php:114 +#, php-format +msgid "Add or edit %s logo" +msgstr "" + +#: lib/groupnav.php:120 +#, php-format +msgid "Add or edit %s design" +msgstr "" + +#: lib/groupsbymemberssection.php:71 +msgid "Groups with most members" +msgstr "" + +#: lib/groupsbypostssection.php:71 +msgid "Groups with most posts" +msgstr "" + +#: lib/grouptagcloudsection.php:56 +#, php-format +msgid "Tags in %s group's notices" +msgstr "" + +#. TRANS: Client exception 406 +#: lib/htmloutputter.php:104 +msgid "This page is not available in a media type you accept" +msgstr "" + +#: lib/imagefile.php:72 +msgid "Unsupported image file format." +msgstr "" + +#: lib/imagefile.php:88 +#, php-format +msgid "That file is too big. The maximum file size is %s." +msgstr "" + +#: lib/imagefile.php:93 +msgid "Partial upload." +msgstr "" + +#: lib/imagefile.php:101 lib/mediafile.php:170 +msgid "System error uploading file." +msgstr "" + +#: lib/imagefile.php:109 +msgid "Not an image or corrupt file." +msgstr "" + +#: lib/imagefile.php:122 +msgid "Lost our file." +msgstr "" + +#: lib/imagefile.php:163 lib/imagefile.php:224 +msgid "Unknown file type" +msgstr "" + +#: lib/imagefile.php:244 +msgid "MB" +msgstr "" + +#: lib/imagefile.php:246 +msgid "kB" +msgstr "" + +#: lib/jabber.php:387 +#, php-format +msgid "[%s]" +msgstr "" + +#: lib/jabber.php:567 +#, php-format +msgid "Unknown inbox source %d." +msgstr "" + +#: lib/joinform.php:114 +msgid "Join" +msgstr "" + +#: lib/leaveform.php:114 +msgid "Leave" +msgstr "" + +#: lib/logingroupnav.php:80 +msgid "Login with a username and password" +msgstr "" + +#: lib/logingroupnav.php:86 +msgid "Sign up for a new account" +msgstr "" + +#. TRANS: Subject for address confirmation email +#: lib/mail.php:174 +msgid "Email address confirmation" +msgstr "" + +#. TRANS: Body for address confirmation email. +#: lib/mail.php:177 +#, php-format +msgid "" +"Hey, %s.\n" +"\n" +"Someone just entered this email address on %s.\n" +"\n" +"If it was you, and you want to confirm your entry, use the URL below:\n" +"\n" +"\t%s\n" +"\n" +"If not, just ignore this message.\n" +"\n" +"Thanks for your time, \n" +"%s\n" +msgstr "" + +#. TRANS: Subject of new-subscriber notification e-mail +#: lib/mail.php:243 +#, php-format +msgid "%1$s is now listening to your notices on %2$s." +msgstr "" + +#: lib/mail.php:248 +#, php-format +msgid "" +"If you believe this account is being used abusively, you can block them from " +"your subscribers list and report as spam to site administrators at %s" +msgstr "" + +#. TRANS: Main body of new-subscriber notification e-mail +#: lib/mail.php:254 +#, php-format +msgid "" +"%1$s is now listening to your notices on %2$s.\n" +"\n" +"\t%3$s\n" +"\n" +"%4$s%5$s%6$s\n" +"Faithfully yours,\n" +"%7$s.\n" +"\n" +"----\n" +"Change your email address or notification options at %8$s\n" +msgstr "" + +#. TRANS: Profile info line in new-subscriber notification e-mail +#: lib/mail.php:274 +#, php-format +msgid "Bio: %s" +msgstr "" + +#. TRANS: Subject of notification mail for new posting email address +#: lib/mail.php:304 +#, php-format +msgid "New email address for posting to %s" +msgstr "" + +#. TRANS: Body of notification mail for new posting email address +#: lib/mail.php:308 +#, php-format +msgid "" +"You have a new posting address on %1$s.\n" +"\n" +"Send email to %2$s to post new messages.\n" +"\n" +"More email instructions at %3$s.\n" +"\n" +"Faithfully yours,\n" +"%4$s" +msgstr "" + +#. TRANS: Subject line for SMS-by-email notification messages +#: lib/mail.php:433 +#, php-format +msgid "%s status" +msgstr "" + +#. TRANS: Subject line for SMS-by-email address confirmation message +#: lib/mail.php:460 +msgid "SMS confirmation" +msgstr "" + +#. TRANS: Main body heading for SMS-by-email address confirmation message +#: lib/mail.php:463 +#, php-format +msgid "%s: confirm you own this phone number with this code:" +msgstr "" + +#. TRANS: Subject for 'nudge' notification email +#: lib/mail.php:484 +#, php-format +msgid "You've been nudged by %s" +msgstr "" + +#. TRANS: Body for 'nudge' notification email +#: lib/mail.php:489 +#, php-format +msgid "" +"%1$s (%2$s) is wondering what you are up to these days and is inviting you " +"to post some news.\n" +"\n" +"So let's hear from you :)\n" +"\n" +"%3$s\n" +"\n" +"Don't reply to this email; it won't get to them.\n" +"\n" +"With kind regards,\n" +"%4$s\n" +msgstr "" + +#. TRANS: Subject for direct-message notification email +#: lib/mail.php:536 +#, php-format +msgid "New private message from %s" +msgstr "" + +#. TRANS: Body for direct-message notification email +#: lib/mail.php:541 +#, php-format +msgid "" +"%1$s (%2$s) sent you a private message:\n" +"\n" +"------------------------------------------------------\n" +"%3$s\n" +"------------------------------------------------------\n" +"\n" +"You can reply to their message here:\n" +"\n" +"%4$s\n" +"\n" +"Don't reply to this email; it won't get to them.\n" +"\n" +"With kind regards,\n" +"%5$s\n" +msgstr "" + +#. TRANS: Subject for favorite notification email +#: lib/mail.php:589 +#, php-format +msgid "%s (@%s) added your notice as a favorite" +msgstr "" + +#. TRANS: Body for favorite notification email +#: lib/mail.php:592 +#, php-format +msgid "" +"%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n" +"\n" +"The URL of your notice is:\n" +"\n" +"%3$s\n" +"\n" +"The text of your notice is:\n" +"\n" +"%4$s\n" +"\n" +"You can see the list of %1$s's favorites here:\n" +"\n" +"%5$s\n" +"\n" +"Faithfully yours,\n" +"%6$s\n" +msgstr "" + +#. TRANS: Line in @-reply notification e-mail. %s is conversation URL. +#: lib/mail.php:651 +#, php-format +msgid "" +"The full conversation can be read here:\n" +"\n" +"\t%s" +msgstr "" + +#: lib/mail.php:657 +#, php-format +msgid "%s (@%s) sent a notice to your attention" +msgstr "" + +#. TRANS: Body of @-reply notification e-mail. +#: lib/mail.php:660 +#, php-format +msgid "" +"%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n" +"\n" +"The notice is here:\n" +"\n" +"\t%3$s\n" +"\n" +"It reads:\n" +"\n" +"\t%4$s\n" +"\n" +"%5$sYou can reply back here:\n" +"\n" +"\t%6$s\n" +"\n" +"The list of all @-replies for you here:\n" +"\n" +"%7$s\n" +"\n" +"Faithfully yours,\n" +"%2$s\n" +"\n" +"P.S. You can turn off these email notifications here: %8$s\n" +msgstr "" + +#: lib/mailbox.php:89 +msgid "Only the user can read their own mailboxes." +msgstr "" + +#: lib/mailbox.php:139 +msgid "" +"You have no private messages. You can send private message to engage other " +"users in conversation. People can send you messages for your eyes only." +msgstr "" + +#: lib/mailbox.php:227 lib/noticelist.php:505 +msgid "from" +msgstr "" + +#: lib/mailhandler.php:37 +msgid "Could not parse message." +msgstr "" + +#: lib/mailhandler.php:42 +msgid "Not a registered user." +msgstr "" + +#: lib/mailhandler.php:46 +msgid "Sorry, that is not your incoming email address." +msgstr "" + +#: lib/mailhandler.php:50 +msgid "Sorry, no incoming email allowed." +msgstr "" + +#: lib/mailhandler.php:228 +#, php-format +msgid "Unsupported message type: %s" +msgstr "" + +#: lib/mediafile.php:98 lib/mediafile.php:123 +msgid "There was a database error while saving your file. Please try again." +msgstr "" + +#: lib/mediafile.php:142 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini." +msgstr "" + +#: lib/mediafile.php:147 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form." +msgstr "" + +#: lib/mediafile.php:152 +msgid "The uploaded file was only partially uploaded." +msgstr "" + +#: lib/mediafile.php:159 +msgid "Missing a temporary folder." +msgstr "" + +#: lib/mediafile.php:162 +msgid "Failed to write file to disk." +msgstr "" + +#: lib/mediafile.php:165 +msgid "File upload stopped by extension." +msgstr "" + +#: lib/mediafile.php:179 lib/mediafile.php:217 +msgid "File exceeds user's quota." +msgstr "" + +#: lib/mediafile.php:197 lib/mediafile.php:234 +msgid "File could not be moved to destination directory." +msgstr "" + +#: lib/mediafile.php:202 lib/mediafile.php:238 +msgid "Could not determine file's MIME type." +msgstr "" + +#: lib/mediafile.php:318 +#, php-format +msgid " Try using another %s format." +msgstr "" + +#: lib/mediafile.php:323 +#, php-format +msgid "%s is not a supported file type on this server." +msgstr "" + +#: lib/messageform.php:120 +msgid "Send a direct notice" +msgstr "" + +#: lib/messageform.php:146 +msgid "To" +msgstr "" + +#: lib/messageform.php:159 lib/noticeform.php:185 +msgid "Available characters" +msgstr "" + +#: lib/messageform.php:178 lib/noticeform.php:236 +msgctxt "Send button for sending notice" +msgid "Send" +msgstr "" + +#: lib/noticeform.php:160 +msgid "Send a notice" +msgstr "" + +#: lib/noticeform.php:173 +#, php-format +msgid "What's up, %s?" +msgstr "" + +#: lib/noticeform.php:192 +msgid "Attach" +msgstr "" + +#: lib/noticeform.php:196 +msgid "Attach a file" +msgstr "" + +#: lib/noticeform.php:212 +msgid "Share my location" +msgstr "" + +#: lib/noticeform.php:215 +msgid "Do not share my location" +msgstr "" + +#: lib/noticeform.php:216 +msgid "" +"Sorry, retrieving your geo location is taking longer than expected, please " +"try again later" +msgstr "" + +#. TRANS: Used in coordinates as abbreviation of north +#: lib/noticelist.php:436 +msgid "N" +msgstr "" + +#. TRANS: Used in coordinates as abbreviation of south +#: lib/noticelist.php:438 +msgid "S" +msgstr "" + +#. TRANS: Used in coordinates as abbreviation of east +#: lib/noticelist.php:440 +msgid "E" +msgstr "" + +#. TRANS: Used in coordinates as abbreviation of west +#: lib/noticelist.php:442 +msgid "W" +msgstr "" + +#: lib/noticelist.php:444 +#, php-format +msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" +msgstr "" + +#: lib/noticelist.php:453 +msgid "at" +msgstr "" + +#: lib/noticelist.php:567 +msgid "in context" +msgstr "" + +#: lib/noticelist.php:602 +msgid "Repeated by" +msgstr "" + +#: lib/noticelist.php:629 +msgid "Reply to this notice" +msgstr "" + +#: lib/noticelist.php:630 +msgid "Reply" +msgstr "" + +#: lib/noticelist.php:674 +msgid "Notice repeated" +msgstr "" + +#: lib/nudgeform.php:116 +msgid "Nudge this user" +msgstr "" + +#: lib/nudgeform.php:128 +msgid "Nudge" +msgstr "" + +#: lib/nudgeform.php:128 +msgid "Send a nudge to this user" +msgstr "" + +#: lib/oauthstore.php:283 +msgid "Error inserting new profile" +msgstr "" + +#: lib/oauthstore.php:291 +msgid "Error inserting avatar" +msgstr "" + +#: lib/oauthstore.php:306 +msgid "Error updating remote profile" +msgstr "" + +#: lib/oauthstore.php:311 +msgid "Error inserting remote profile" +msgstr "" + +#: lib/oauthstore.php:345 +msgid "Duplicate notice" +msgstr "" + +#: lib/oauthstore.php:490 +msgid "Couldn't insert new subscription." +msgstr "" + +#: lib/personalgroupnav.php:99 +msgid "Personal" +msgstr "" + +#: lib/personalgroupnav.php:104 +msgid "Replies" +msgstr "" + +#: lib/personalgroupnav.php:114 +msgid "Favorites" +msgstr "" + +#: lib/personalgroupnav.php:125 +msgid "Inbox" +msgstr "" + +#: lib/personalgroupnav.php:126 +msgid "Your incoming messages" +msgstr "" + +#: lib/personalgroupnav.php:130 +msgid "Outbox" +msgstr "" + +#: lib/personalgroupnav.php:131 +msgid "Your sent messages" +msgstr "" + +#: lib/personaltagcloudsection.php:56 +#, php-format +msgid "Tags in %s's notices" +msgstr "" + +#: lib/plugin.php:115 +msgid "Unknown" +msgstr "" + +#: lib/profileaction.php:109 lib/profileaction.php:205 lib/subgroupnav.php:82 +msgid "Subscriptions" +msgstr "" + +#: lib/profileaction.php:126 +msgid "All subscriptions" +msgstr "" + +#: lib/profileaction.php:144 lib/profileaction.php:214 lib/subgroupnav.php:90 +msgid "Subscribers" +msgstr "" + +#: lib/profileaction.php:161 +msgid "All subscribers" +msgstr "" + +#: lib/profileaction.php:191 +msgid "User ID" +msgstr "" + +#: lib/profileaction.php:196 +msgid "Member since" +msgstr "" + +#. TRANS: Average count of posts made per day since account registration +#: lib/profileaction.php:235 +msgid "Daily average" +msgstr "" + +#: lib/profileaction.php:264 +msgid "All groups" +msgstr "" + +#: lib/profileformaction.php:123 +msgid "Unimplemented method." +msgstr "" + +#: lib/publicgroupnav.php:78 +msgid "Public" +msgstr "" + +#: lib/publicgroupnav.php:82 +msgid "User groups" +msgstr "" + +#: lib/publicgroupnav.php:84 lib/publicgroupnav.php:85 +msgid "Recent tags" +msgstr "" + +#: lib/publicgroupnav.php:88 +msgid "Featured" +msgstr "" + +#: lib/publicgroupnav.php:92 +msgid "Popular" +msgstr "" + +#: lib/redirectingaction.php:95 +msgid "No return-to arguments." +msgstr "" + +#: lib/repeatform.php:107 +msgid "Repeat this notice?" +msgstr "" + +#: lib/repeatform.php:132 +msgid "Yes" +msgstr "" + +#: lib/repeatform.php:132 +msgid "Repeat this notice" +msgstr "" + +#: lib/revokeroleform.php:91 +#, php-format +msgid "Revoke the \"%s\" role from this user" +msgstr "" + +#: lib/router.php:709 +msgid "No single user defined for single-user mode." +msgstr "" + +#: lib/sandboxform.php:67 +msgid "Sandbox" +msgstr "" + +#: lib/sandboxform.php:78 +msgid "Sandbox this user" +msgstr "" + +#: lib/searchaction.php:120 +msgid "Search site" +msgstr "" + +#: lib/searchaction.php:126 +msgid "Keyword(s)" +msgstr "" + +#: lib/searchaction.php:127 +msgid "Search" +msgstr "" + +#: lib/searchaction.php:162 +msgid "Search help" +msgstr "" + +#: lib/searchgroupnav.php:80 +msgid "People" +msgstr "" + +#: lib/searchgroupnav.php:81 +msgid "Find people on this site" +msgstr "" + +#: lib/searchgroupnav.php:83 +msgid "Find content of notices" +msgstr "" + +#: lib/searchgroupnav.php:85 +msgid "Find groups on this site" +msgstr "" + +#: lib/section.php:89 +msgid "Untitled section" +msgstr "" + +#: lib/section.php:106 +msgid "More..." +msgstr "" + +#: lib/silenceform.php:67 +msgid "Silence" +msgstr "" + +#: lib/silenceform.php:78 +msgid "Silence this user" +msgstr "" + +#: lib/subgroupnav.php:83 +#, php-format +msgid "People %s subscribes to" +msgstr "" + +#: lib/subgroupnav.php:91 +#, php-format +msgid "People subscribed to %s" +msgstr "" + +#: lib/subgroupnav.php:99 +#, php-format +msgid "Groups %s is a member of" +msgstr "" + +#: lib/subgroupnav.php:105 +msgid "Invite" +msgstr "" + +#: lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + +#: lib/subscriberspeopleselftagcloudsection.php:48 +#: lib/subscriptionspeopleselftagcloudsection.php:48 +msgid "People Tagcloud as self-tagged" +msgstr "" + +#: lib/subscriberspeopletagcloudsection.php:48 +#: lib/subscriptionspeopletagcloudsection.php:48 +msgid "People Tagcloud as tagged" +msgstr "" + +#: lib/tagcloudsection.php:56 +msgid "None" +msgstr "" + +#: lib/themeuploader.php:50 +msgid "This server cannot handle theme uploads without ZIP support." +msgstr "" + +#: lib/themeuploader.php:58 lib/themeuploader.php:61 +msgid "The theme file is missing or the upload failed." +msgstr "" + +#: lib/themeuploader.php:91 lib/themeuploader.php:102 +#: lib/themeuploader.php:253 lib/themeuploader.php:257 +#: lib/themeuploader.php:265 lib/themeuploader.php:272 +msgid "Failed saving theme." +msgstr "" + +#: lib/themeuploader.php:139 +msgid "Invalid theme: bad directory structure." +msgstr "" + +#: lib/themeuploader.php:166 +#, php-format +msgid "Uploaded theme is too large; must be less than %d bytes uncompressed." +msgstr "" + +#: lib/themeuploader.php:178 +msgid "Invalid theme archive: missing file css/display.css" +msgstr "" + +#: lib/themeuploader.php:205 +msgid "" +"Theme contains invalid file or folder name. Stick with ASCII letters, " +"digits, underscore, and minus sign." +msgstr "" + +#: lib/themeuploader.php:216 +#, php-format +msgid "Theme contains file of type '.%s', which is not allowed." +msgstr "" + +#: lib/themeuploader.php:234 +msgid "Error opening theme archive." +msgstr "" + +#: lib/topposterssection.php:74 +msgid "Top posters" +msgstr "" + +#: lib/unsandboxform.php:69 +msgid "Unsandbox" +msgstr "" + +#: lib/unsandboxform.php:80 +msgid "Unsandbox this user" +msgstr "" + +#: lib/unsilenceform.php:67 +msgid "Unsilence" +msgstr "" + +#: lib/unsilenceform.php:78 +msgid "Unsilence this user" +msgstr "" + +#: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137 +msgid "Unsubscribe from this user" +msgstr "" + +#: lib/unsubscribeform.php:137 +msgid "Unsubscribe" +msgstr "" + +#: lib/usernoprofileexception.php:58 +#, php-format +msgid "User %s (%d) has no profile record." +msgstr "" + +#: lib/userprofile.php:117 +msgid "Edit Avatar" +msgstr "" + +#: lib/userprofile.php:234 lib/userprofile.php:248 +msgid "User actions" +msgstr "" + +#: lib/userprofile.php:237 +msgid "User deletion in progress..." +msgstr "" + +#: lib/userprofile.php:263 +msgid "Edit profile settings" +msgstr "" + +#: lib/userprofile.php:264 +msgid "Edit" +msgstr "" + +#: lib/userprofile.php:287 +msgid "Send a direct message to this user" +msgstr "" + +#: lib/userprofile.php:288 +msgid "Message" +msgstr "" + +#: lib/userprofile.php:326 +msgid "Moderate" +msgstr "" + +#: lib/userprofile.php:364 +msgid "User role" +msgstr "" + +#: lib/userprofile.php:366 +msgctxt "role" +msgid "Administrator" +msgstr "" + +#: lib/userprofile.php:367 +msgctxt "role" +msgid "Moderator" +msgstr "" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1100 +msgid "a few seconds ago" +msgstr "" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1103 +msgid "about a minute ago" +msgstr "" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1107 +#, php-format +msgid "about %d minutes ago" +msgstr "" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1110 +msgid "about an hour ago" +msgstr "" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1114 +#, php-format +msgid "about %d hours ago" +msgstr "" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1117 +msgid "about a day ago" +msgstr "" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1121 +#, php-format +msgid "about %d days ago" +msgstr "" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1124 +msgid "about a month ago" +msgstr "" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1128 +#, php-format +msgid "about %d months ago" +msgstr "" + +#. TRANS: Used in notices to indicate when the notice was made compared to now. +#: lib/util.php:1131 +msgid "about a year ago" +msgstr "" + +#: lib/webcolor.php:82 +#, php-format +msgid "%s is not a valid color!" +msgstr "" + +#: lib/webcolor.php:123 +#, php-format +msgid "%s is not a valid color! Use 3 or 6 hex chars." +msgstr "" + +#: lib/xmppmanager.php:403 +#, php-format +msgid "Message too long - maximum is %1$d characters, you sent %2$d." +msgstr "" diff --git a/locale/de/LC_MESSAGES/statusnet.po b/locale/de/LC_MESSAGES/statusnet.po index f433c2163..b08cd73de 100644 --- a/locale/de/LC_MESSAGES/statusnet.po +++ b/locale/de/LC_MESSAGES/statusnet.po @@ -16,12 +16,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:04+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:50+0000\n" "Language-Team: German\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: de\n" "X-Message-Group: out-statusnet\n" @@ -106,7 +106,7 @@ msgstr "Seite nicht vorhanden" #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -175,17 +175,17 @@ msgstr "" #. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" #: actions/all.php:146 -#, fuzzy, php-format +#, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from their profile or [post something " "to their attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -"Du kannst [%1$s in seinem Profil einen Stups geben](../%2$s) oder [ihm etwas " -"posten](%%%%action.newnotice%%%%?status_textarea=%s) um seine Aufmerksamkeit " -"zu erregen." +"Du kannst versuchen, [%1$s in seinem Profil einen Stups zu geben](../%2$s) " +"oder [ihm etwas posten](%%%%action.newnotice%%%%?status_textarea=%s) um " +"seine Aufmerksamkeit zu erregen." #: actions/all.php:149 actions/replies.php:210 actions/showstream.php:211 -#, fuzzy, php-format +#, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to their attention." @@ -224,7 +224,7 @@ msgstr "Aktualisierungen von %1$s und Freunden auf %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -274,7 +274,7 @@ msgstr "Konnte Profil nicht speichern." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -375,9 +375,8 @@ msgid "Could not delete favorite." msgstr "Konnte Favoriten nicht löschen." #: actions/apifriendshipscreate.php:109 -#, fuzzy msgid "Could not follow user: profile not found." -msgstr "Konnte Nutzer nicht folgen: Nutzer nicht gefunden" +msgstr "Konnte Nutzer nicht folgen: Profil nicht gefunden" #: actions/apifriendshipscreate.php:118 #, php-format @@ -393,9 +392,8 @@ msgid "You cannot unfollow yourself." msgstr "Du kannst dich nicht selbst entfolgen!" #: actions/apifriendshipsexists.php:91 -#, fuzzy msgid "Two valid IDs or screen_names must be supplied." -msgstr "Zwei IDs oder Benutzernamen müssen angegeben werden." +msgstr "Zwei gültige IDs oder Benutzernamen müssen angegeben werden." #: actions/apifriendshipsshow.php:134 msgid "Could not determine source user." @@ -525,6 +523,11 @@ msgstr "%s Gruppen" msgid "groups on %s" msgstr "Gruppen von %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Datei hochladen" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Kein oauth_token Parameter angegeben." @@ -668,18 +671,22 @@ msgstr "Status gelöscht." msgid "No status with that ID found." msgstr "Keine Nachricht mit dieser ID gefunden." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "" "Das war zu lang. Die Länge einer Nachricht ist auf %d Zeichen beschränkt." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Nicht gefunden." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -2523,12 +2530,11 @@ msgid "Updates matching search term \"%1$s\" on %2$s!" msgstr "Alle Aktualisierungen, die den Suchbegriff „%s“ enthalten" #: actions/nudge.php:85 -#, fuzzy msgid "" "This user doesn't allow nudges or hasn't confirmed or set their email yet." msgstr "" "Dieser Benutzer erlaubt keine Stupser oder hat seine E-Mail-Adresse noch " -"nicht bestätigt." +"nicht bestätigt oder eingestellt." #: actions/nudge.php:94 msgid "Nudge sent" @@ -3578,12 +3584,12 @@ msgstr "" "beitreten](%%action.groups%%)." #: actions/replies.php:206 -#, fuzzy, php-format +#, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to their attention](%" "%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -"Du kannst [%1$s in seinem Profil einen Stups geben](../%s) oder [ihm etwas " +"Du kannst versuchen [%1$s einen Stups zu geben](../%s) oder [ihm etwas " "posten](%%%%action.newnotice%%%%?status_textarea=%s) um seine Aufmerksamkeit " "zu erregen." @@ -4844,21 +4850,27 @@ msgstr "Version" msgid "Author(s)" msgstr "Autor(en)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." -msgstr "" +msgstr "Robin denkt, dass etwas unmöglich ist." #. TRANS: Message given if an upload is larger than the configured maximum. #. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. #: classes/File.php:190 -#, fuzzy, php-format +#, php-format msgid "" "No file may be larger than %1$d bytes and the file you sent was %2$d bytes. " "Try to upload a smaller version." msgstr "" "Keine Datei darf größer als %d Bytes sein und die Datei die du verschicken " -"wolltest ist %d Bytes groß. Bitte eine kleinere Datei hoch laden." +"wolltest war %d Bytes groß. Bitte eine kleinere Version hochladen." #. TRANS: Message given if an upload would exceed user quota. #. TRANS: %d (number) is the user quota in bytes. @@ -4878,9 +4890,8 @@ msgstr "" #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Ungültige Größe." +msgstr "Ungültiger Dateiname." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4911,7 +4922,7 @@ msgstr "Konnte keinen Login-Token für %s erstellen" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4970,51 +4981,50 @@ msgstr "" "ein paar Minuten ab." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" "Du wurdest für das Schreiben von Nachrichten auf dieser Seite gesperrt." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problem bei Speichern der Nachricht." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Problem bei Speichern der Nachricht." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." msgstr "Benutzer hat kein Profil." @@ -5059,7 +5069,6 @@ msgstr "Konnte OMB-Abonnement nicht löschen." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." msgstr "Konnte Abonnement nicht löschen." diff --git a/locale/el/LC_MESSAGES/statusnet.po b/locale/el/LC_MESSAGES/statusnet.po index e54a24f99..2f10ab88b 100644 --- a/locale/el/LC_MESSAGES/statusnet.po +++ b/locale/el/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:06+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:52+0000\n" "Language-Team: Greek\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: el\n" "X-Message-Group: out-statusnet\n" @@ -101,7 +101,7 @@ msgstr "Δεν υπάρχει τέτοια σελίδα" #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -213,7 +213,7 @@ msgstr "" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -264,7 +264,7 @@ msgstr "Απέτυχε η αποθήκευση του προφίλ." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -513,6 +513,11 @@ msgstr "" msgid "groups on %s" msgstr "ομάδες του χρήστη %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Αδύνατη η αποθήκευση του προφίλ." + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -656,17 +661,21 @@ msgstr "Η κατάσταση διεγράφη." msgid "No status with that ID found." msgstr "" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "" -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "" -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4720,6 +4729,12 @@ msgstr "Προσωπικά" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4787,7 +4802,7 @@ msgstr "Αδύνατη η αποθήκευση του προφίλ." #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4842,45 +4857,45 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "" #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/en_GB/LC_MESSAGES/statusnet.po b/locale/en_GB/LC_MESSAGES/statusnet.po index d98905db6..a7465aa48 100644 --- a/locale/en_GB/LC_MESSAGES/statusnet.po +++ b/locale/en_GB/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:07+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:53+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 (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: en-gb\n" "X-Message-Group: out-statusnet\n" @@ -100,7 +100,7 @@ msgstr "No such page." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -215,7 +215,7 @@ msgstr "Updates from %1$s and friends on %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -267,7 +267,7 @@ msgstr "Couldn't save profile." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -512,6 +512,11 @@ msgstr "%s groups" msgid "groups on %s" msgstr "groups on %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Upload file" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "No oauth_token parameter provided." @@ -655,17 +660,21 @@ msgstr "Status deleted." msgid "No status with that ID found." msgstr "No status with that ID found." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "That's too long. Max notice size is %d chars." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Not found." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "Max notice size is %d chars, including attachment URL." @@ -4736,6 +4745,12 @@ msgstr "Version" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4799,7 +4814,7 @@ msgstr "Could not create login token for %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4857,45 +4872,45 @@ msgstr "" "few minutes." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "You are banned from posting notices on this site." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problem saving notice." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Problem saving group inbox." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/es/LC_MESSAGES/statusnet.po b/locale/es/LC_MESSAGES/statusnet.po index cc870e85f..109fa206e 100644 --- a/locale/es/LC_MESSAGES/statusnet.po +++ b/locale/es/LC_MESSAGES/statusnet.po @@ -15,12 +15,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:09+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:55+0000\n" "Language-Team: Spanish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: es\n" "X-Message-Group: out-statusnet\n" @@ -104,7 +104,7 @@ msgstr "No existe tal página." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -220,7 +220,7 @@ msgstr "¡Actualizaciones de %1$s y sus amistades en %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -270,7 +270,7 @@ msgstr "No se pudo guardar el perfil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -517,6 +517,11 @@ msgstr "Grupos %s" msgid "groups on %s" msgstr "Grupos en %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Subir archivo" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "No se ha provisto de un parámetro oauth_token." @@ -663,17 +668,21 @@ msgstr "Status borrado." msgid "No status with that ID found." msgstr "No hay estado para ese ID" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "La entrada es muy larga. El tamaño máximo es de %d caracteres." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "No encontrado." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -2296,7 +2305,7 @@ msgstr "Ningún nombre de usuario o ID." #: actions/joingroup.php:141 lib/command.php:346 #, php-format msgid "%1$s joined group %2$s" -msgstr "%1$s se ha unido al grupo %2$" +msgstr "%1$s se ha unido al grupo %2$s" #: actions/leavegroup.php:60 msgid "You must be logged in to leave a group." @@ -4833,6 +4842,12 @@ msgstr "Versión" msgid "Author(s)" msgstr "Autor(es)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4899,7 +4914,7 @@ msgstr "No se pudo crear el token de acceso para %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4958,58 +4973,56 @@ msgstr "" "pasados unos minutos." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Tienes prohibido publicar avisos en este sitio." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Hubo un problema al guardar el aviso." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Hubo un problema al guarda la bandeja de entrada del grupo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." -msgstr "El usuario no tiene un perfil." +msgstr "Perfil ausente." #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 -#, fuzzy msgid "Unable to save tag." -msgstr "No se pudo guarda el aviso del sitio." +msgstr "Incapaz de grabar etiqueta." #. TRANS: Exception thrown when trying to subscribe while being banned from subscribing. #: classes/Subscription.php:75 lib/oauthstore.php:465 @@ -5034,7 +5047,6 @@ msgstr "¡No estás suscrito!" #. TRANS: Exception thrown when trying to unsubscribe a user from themselves. #: classes/Subscription.php:178 -#, fuzzy msgid "Could not delete self-subscription." msgstr "No se pudo eliminar la auto-suscripción." @@ -5046,7 +5058,6 @@ msgstr "No se pudo eliminar el token OMB de suscripción." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." msgstr "No se pudo eliminar la suscripción." diff --git a/locale/fa/LC_MESSAGES/statusnet.po b/locale/fa/LC_MESSAGES/statusnet.po index 4bd582429..ac48f6e9c 100644 --- a/locale/fa/LC_MESSAGES/statusnet.po +++ b/locale/fa/LC_MESSAGES/statusnet.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:14+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:58+0000\n" "Last-Translator: Ahmad Sufi Mahmudi\n" "Language-Team: Persian\n" "MIME-Version: 1.0\n" @@ -22,7 +22,7 @@ msgstr "" "X-Language-Code: fa\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" #. TRANS: Page title @@ -103,7 +103,7 @@ msgstr "چنین صفحه‌ای وجود ندارد." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -217,7 +217,7 @@ msgstr "به روز رسانی از %1$s و دوستان در %2$s" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -266,7 +266,7 @@ msgstr "نمی‌توان نمایه را ذخیره کرد." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -510,6 +510,11 @@ msgstr "%s گروه" msgid "groups on %s" msgstr "گروه‌ها در %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "بارگذاری پرونده" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "هیچ پارامتر oauth_token آماده نشده است." @@ -653,17 +658,21 @@ msgstr "وضعیت حذف شد." msgid "No status with that ID found." msgstr "هیچ وضعیتی با آن شناسه یافت نشد." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "این خیلی طولانی است. بیشینهٔ طول پیام %d نویسه است." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "یافت نشد." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "بیشینهٔ طول پیام %d نویسه که شامل نشانی اینترنتی پیوست هم هست." @@ -4770,6 +4779,12 @@ msgstr "نسخه" msgid "Author(s)" msgstr "مؤلف(ها)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4838,7 +4853,7 @@ msgstr "نمی‌توان رمز ورود را برای %s ایجاد کرد" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4897,45 +4912,45 @@ msgstr "" "ارسال کنید." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "شما از فرستادن پیام در این وب‌گاه منع شده‌اید." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "هنگام ذخیرهٔ پیام مشکلی ایجاد شد." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "هنگام ذخیرهٔ صندوق ورودی گروه مشکلی رخ داد." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/fi/LC_MESSAGES/statusnet.po b/locale/fi/LC_MESSAGES/statusnet.po index d116f9a46..681b58cea 100644 --- a/locale/fi/LC_MESSAGES/statusnet.po +++ b/locale/fi/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:11+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:52:56+0000\n" "Language-Team: Finnish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fi\n" "X-Message-Group: out-statusnet\n" @@ -107,7 +107,7 @@ msgstr "Sivua ei ole." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -221,7 +221,7 @@ msgstr "Käyttäjän %1$s ja kavereiden päivitykset palvelussa %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -272,7 +272,7 @@ msgstr "Ei voitu tallentaa profiilia." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -527,6 +527,11 @@ msgstr "Käyttäjän %s ryhmät" msgid "groups on %s" msgstr "Ryhmän toiminnot" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Lataa" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -675,17 +680,21 @@ msgstr "Päivitys poistettu." msgid "No status with that ID found." msgstr "Käyttäjätunnukselle ei löytynyt statusviestiä." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Päivitys on liian pitkä. Maksimipituus on %d merkkiä." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Ei löytynyt." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "Maksimikoko päivitykselle on %d merkkiä, mukaan lukien URL-osoite." @@ -4891,6 +4900,12 @@ msgstr "Omat" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4958,7 +4973,7 @@ msgstr "Ei voitu lisätä aliasta." #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -5019,46 +5034,46 @@ msgstr "" "päivityksien lähettämista muutaman minuutin päästä." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Päivityksesi tähän palveluun on estetty." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Ongelma päivityksen tallentamisessa." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "Ongelma päivityksen tallentamisessa." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/fr/LC_MESSAGES/statusnet.po b/locale/fr/LC_MESSAGES/statusnet.po index 36d2a2992..1e6bef48f 100644 --- a/locale/fr/LC_MESSAGES/statusnet.po +++ b/locale/fr/LC_MESSAGES/statusnet.po @@ -15,12 +15,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:16+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:00+0000\n" "Language-Team: French\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: out-statusnet\n" @@ -104,7 +104,7 @@ msgstr "Page non trouvée." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -173,7 +173,7 @@ msgstr "" #. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" #: actions/all.php:146 -#, fuzzy, php-format +#, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from their profile or [post something " "to their attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." @@ -183,12 +183,12 @@ msgstr "" "status_textarea=%3$s)." #: actions/all.php:149 actions/replies.php:210 actions/showstream.php:211 -#, fuzzy, php-format +#, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to their attention." msgstr "" -"Pourquoi ne pas [créer un compte](%%%%action.register%%%%) et ensuite faire " +"Pourquoi ne pas [créer un compte](%%%%action.register%%%%) et faire ensuite " "un clin d’œil à %s ou poster un avis à son intention." #. TRANS: H1 text @@ -221,7 +221,7 @@ msgstr "Statuts de %1$s et ses amis dans %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -271,7 +271,7 @@ msgstr "Impossible d’enregistrer le profil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -371,9 +371,8 @@ msgid "Could not delete favorite." msgstr "Impossible de supprimer le favori." #: actions/apifriendshipscreate.php:109 -#, fuzzy msgid "Could not follow user: profile not found." -msgstr "Impossible de suivre l’utilisateur : Utilisateur non trouvé." +msgstr "Impossible de suivre l’utilisateur : profil non trouvé." #: actions/apifriendshipscreate.php:118 #, php-format @@ -389,9 +388,8 @@ msgid "You cannot unfollow yourself." msgstr "Vous ne pouvez pas ne plus vous suivre vous-même." #: actions/apifriendshipsexists.php:91 -#, fuzzy msgid "Two valid IDs or screen_names must be supplied." -msgstr "Vous devez fournir 2 identifiants ou pseudos." +msgstr "Vous devez fournir deux identifiants ou pseudonymes." #: actions/apifriendshipsshow.php:134 msgid "Could not determine source user." @@ -520,6 +518,11 @@ msgstr "Groupes de %s" msgid "groups on %s" msgstr "groupes sur %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Importer un fichier" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Paramètre oauth_token non fourni." @@ -670,17 +673,21 @@ msgstr "Statut supprimé." msgid "No status with that ID found." msgstr "Aucun statut trouvé avec cet identifiant." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "C’est trop long ! La taille maximale de l’avis est de %d caractères." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Non trouvé." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -2530,7 +2537,6 @@ msgid "Updates matching search term \"%1$s\" on %2$s!" msgstr "mises à jour correspondant au(x) terme(s) « %1$s » sur %2$s !" #: actions/nudge.php:85 -#, fuzzy msgid "" "This user doesn't allow nudges or hasn't confirmed or set their email yet." msgstr "" @@ -3568,7 +3574,7 @@ msgid "Replies feed for %s (Atom)" msgstr "Flux des réponses pour %s (Atom)" #: actions/replies.php:199 -#, fuzzy, php-format +#, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to their attention yet." @@ -3587,7 +3593,7 @@ msgstr "" "%)." #: actions/replies.php:206 -#, fuzzy, php-format +#, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to their attention](%" "%%%action.newnotice%%%%?status_textarea=%3$s)." @@ -3771,7 +3777,7 @@ msgstr "" "mettre en lumière." #: actions/showfavorites.php:208 -#, fuzzy, php-format +#, php-format msgid "" "%s hasn't added any favorite notices yet. Post something interesting they " "would add to their favorites :)" @@ -3780,7 +3786,7 @@ msgstr "" "d’intéressant, et cela pourrait être ajouté à ses favoris :)" #: actions/showfavorites.php:212 -#, fuzzy, php-format +#, php-format msgid "" "%s hasn't added any favorite notices yet. Why not [register an account](%%%%" "action.register%%%%) and then post something interesting they would add to " @@ -3788,7 +3794,7 @@ msgid "" msgstr "" "%s n’a pas ajouté d’avis à ses favoris pour le moment. Vous pourriez [créer " "un compte](%%%%action.register%%%%), puis poster quelque chose " -"d’intéressant, qui serait ajouté à ses favoris :)" +"d’intéressant, qu’il pourrait ajouter à ses favoris :)" #: actions/showfavorites.php:243 msgid "This is a way to share what you like." @@ -3971,7 +3977,7 @@ msgstr "" "d’avis pour le moment, vous pourriez commencer maintenant :)" #: actions/showstream.php:207 -#, fuzzy, php-format +#, php-format msgid "" "You can try to nudge %1$s or [post something to their attention](%%%%action." "newnotice%%%%?status_textarea=%2$s)." @@ -4864,21 +4870,27 @@ msgstr "Version" msgid "Author(s)" msgstr "Auteur(s)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." -msgstr "" +msgstr "Robin pense que quelque chose est impossible." #. TRANS: Message given if an upload is larger than the configured maximum. #. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. #: classes/File.php:190 -#, fuzzy, php-format +#, php-format msgid "" "No file may be larger than %1$d bytes and the file you sent was %2$d bytes. " "Try to upload a smaller version." msgstr "" -"Un fichier ne peut pas être plus gros que %d octets et le fichier que vous " -"avez envoyé pesait %d octets. Essayez d’importer une version moins grosse." +"Un fichier ne peut pas peser plus de %1$d octets et le fichier que vous avez " +"envoyé pesait %2$d octets. Essayez d’importer une version moins lourde." #. TRANS: Message given if an upload would exceed user quota. #. TRANS: %d (number) is the user quota in bytes. @@ -4896,9 +4908,8 @@ msgstr "Un fichier aussi gros dépasserai votre quota mensuel de %d octets." #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Taille incorrecte." +msgstr "Nom de fichier non valide." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4929,8 +4940,9 @@ msgstr "Impossible de créer le jeton d’identification pour %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" -msgstr "" +#, fuzzy +msgid "No database name or DSN found anywhere." +msgstr "Aucun nom de base de donnée ou aucun DSN n’a été trouvé." #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. #: classes/Message.php:46 @@ -4952,7 +4964,7 @@ msgstr "Impossible de mettre à jour le message avec un nouvel URI." #: classes/Notice.php:98 #, php-format msgid "No such profile (%1$d) for notice (%2$d)." -msgstr "" +msgstr "Impossible de trouver le profil (%1$d) pour l’avis (%2$d)." #. TRANS: Server exception. %s are the error details. #: classes/Notice.php:190 @@ -4988,58 +5000,60 @@ msgstr "" "dans quelques minutes." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Il vous est interdit de poster des avis sur ce site." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problème lors de l’enregistrement de l’avis." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" -msgstr "" +msgstr "Le type renseigné pour saveKnownGroups n’est pas valable" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Problème lors de l’enregistrement de la boîte de réception du groupe." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 -#, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +#, fuzzy, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" +"Impossible de révoquer le rôle de « %s » pour l'utilisateur #%2$s : " +"l’utilisateur n’existe pas." #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 -#, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +#, fuzzy, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" +"Impossible de révoquer le rôle de « %s » pour l'utilisateur #%2$s : erreur " +"dans la base de données." #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." -msgstr "Aucun profil ne correspond à cet utilisateur." +msgstr "Profil manquant." #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 -#, fuzzy msgid "Unable to save tag." -msgstr "Impossible d'enregistrer l'avis du site." +msgstr "Impossible d’enregistrer l’étiquette." #. TRANS: Exception thrown when trying to subscribe while being banned from subscribing. #: classes/Subscription.php:75 lib/oauthstore.php:465 @@ -5063,21 +5077,18 @@ msgstr "Pas abonné !" #. TRANS: Exception thrown when trying to unsubscribe a user from themselves. #: classes/Subscription.php:178 -#, fuzzy msgid "Could not delete self-subscription." msgstr "Impossible de supprimer l’abonnement à soi-même." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 -#, fuzzy msgid "Could not delete subscription OMB token." -msgstr "Impossible de supprimer le jeton OMB de l'abonnement ." +msgstr "Impossible de supprimer le jeton OMB de l'abonnement." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." -msgstr "Impossible de cesser l’abonnement" +msgstr "Impossible de supprimer l’abonnement" #. TRANS: Notice given on user registration. #. TRANS: %1$s is the sitename, $2$s is the registering user's nickname. diff --git a/locale/ga/LC_MESSAGES/statusnet.po b/locale/ga/LC_MESSAGES/statusnet.po index 19e6cc9f2..ae9ca85c6 100644 --- a/locale/ga/LC_MESSAGES/statusnet.po +++ b/locale/ga/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:17+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:01+0000\n" "Language-Team: Irish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ga\n" "X-Message-Group: out-statusnet\n" @@ -107,7 +107,7 @@ msgstr "Non existe a etiqueta." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -216,7 +216,7 @@ msgstr "Actualizacións dende %1$s e amigos en %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -267,7 +267,7 @@ msgstr "Non se puido gardar o perfil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -524,6 +524,11 @@ msgstr "" msgid "groups on %s" msgstr "Outras opcions" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Subir" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -671,18 +676,22 @@ msgstr "Avatar actualizado." msgid "No status with that ID found." msgstr "Non existe ningún estado con esa ID atopada." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, fuzzy, php-format msgid "That's too long. Max notice size is %d chars." msgstr "" "Iso é demasiado longo. O tamaño máximo para un chío é de 140 caracteres." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Non atopado" -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4947,6 +4956,12 @@ msgstr "Persoal" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -5014,7 +5029,7 @@ msgstr "Non se puido crear o favorito." #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -5076,46 +5091,46 @@ msgstr "" "duns minutos." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Tes restrinxido o envio de chíos neste sitio." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Aconteceu un erro ó gardar o chío." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "Aconteceu un erro ó gardar o chío." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/gl/LC_MESSAGES/statusnet.po b/locale/gl/LC_MESSAGES/statusnet.po index f66a7a7c8..93fd1af4d 100644 --- a/locale/gl/LC_MESSAGES/statusnet.po +++ b/locale/gl/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:23+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:03+0000\n" "Language-Team: Galician\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: gl\n" "X-Message-Group: out-statusnet\n" @@ -98,7 +98,7 @@ msgstr "Esa páxina non existe." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -214,7 +214,7 @@ msgstr "Actualizacións de %1$s e amigos en %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -264,7 +264,7 @@ msgstr "Non se puido gardar o perfil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -511,6 +511,11 @@ msgstr "grupos %s" msgid "groups on %s" msgstr "grupos en %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Cargar un ficheiro" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Non se forneceu o parámetro oauth_token." @@ -656,17 +661,21 @@ msgstr "Borrouse o estado." msgid "No status with that ID found." msgstr "Non se atopou ningún estado con esa ID." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Iso é longo de máis. A nota non pode exceder os %d caracteres." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Non se atopou." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4830,6 +4839,12 @@ msgstr "Versión" msgid "Author(s)" msgstr "Autores" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4896,7 +4911,7 @@ msgstr "Non se puido crear un pase de sesión para %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4955,45 +4970,45 @@ msgstr "" "publicar nuns minutos." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Prohibíuselle publicar notas neste sitio de momento." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Houbo un problema ao gardar a nota." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Houbo un problema ao gardar a caixa de entrada do grupo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "♻ @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/he/LC_MESSAGES/statusnet.po b/locale/he/LC_MESSAGES/statusnet.po index f4e211d3c..34c4072ec 100644 --- a/locale/he/LC_MESSAGES/statusnet.po +++ b/locale/he/LC_MESSAGES/statusnet.po @@ -7,12 +7,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:25+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:05+0000\n" "Language-Team: Hebrew\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: he\n" "X-Message-Group: out-statusnet\n" @@ -104,7 +104,7 @@ msgstr "אין הודעה כזו." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -213,7 +213,7 @@ msgstr "" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -264,7 +264,7 @@ msgstr "שמירת הפרופיל נכשלה." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -516,6 +516,11 @@ msgstr "" msgid "groups on %s" msgstr "" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "ההעלה" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -662,18 +667,22 @@ msgstr "התמונה עודכנה." msgid "No status with that ID found." msgstr "" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, fuzzy, php-format msgid "That's too long. Max notice size is %d chars." msgstr "זה ארוך מידי. אורך מירבי להודעה הוא 140 אותיות." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 #, fuzzy msgid "Not found." msgstr "לא נמצא" -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4795,6 +4804,12 @@ msgstr "אישי" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4862,7 +4877,7 @@ msgstr "שמירת מידע התמונה נכשל" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4919,46 +4934,46 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "בעיה בשמירת ההודעה." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "בעיה בשמירת ההודעה." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/hsb/LC_MESSAGES/statusnet.po b/locale/hsb/LC_MESSAGES/statusnet.po index 8eb615628..52cc544f0 100644 --- a/locale/hsb/LC_MESSAGES/statusnet.po +++ b/locale/hsb/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Upper Sorbian # +# Author@translatewiki.net: Brion # Author@translatewiki.net: McDutchie # Author@translatewiki.net: Michawiki # -- @@ -9,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:26+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:06+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: hsb\n" "X-Message-Group: out-statusnet\n" @@ -99,7 +100,7 @@ msgstr "Strona njeeksistuje." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -207,7 +208,7 @@ msgstr "Aktualizacije wot %1$s a přećelow na %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -255,7 +256,7 @@ msgstr "Profil njeje so składować dał." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -353,9 +354,8 @@ msgid "Could not delete favorite." msgstr "Faworit njeda so zhašeć." #: actions/apifriendshipscreate.php:109 -#, fuzzy msgid "Could not follow user: profile not found." -msgstr "Profil njeje so składować dał." +msgstr "Njebě móžno wužiwarja słědować: profil njenamakany." #: actions/apifriendshipscreate.php:118 #, php-format @@ -371,9 +371,8 @@ msgid "You cannot unfollow yourself." msgstr "Njemóžeš slědowanje swójskich aktiwitow blokować." #: actions/apifriendshipsexists.php:91 -#, fuzzy msgid "Two valid IDs or screen_names must be supplied." -msgstr "Dwaj wužiwarskej ID abo wužiwarskej mjenje dyrbitej so podać." +msgstr "Dyrbitej so dwaj płaćiwej wužiwarskej ID abo wužiwarskej mjenje podać." #: actions/apifriendshipsshow.php:134 msgid "Could not determine source user." @@ -388,6 +387,7 @@ msgstr "Cilowy wužiwar njeda so namakać." #: actions/register.php:212 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "" +"Přimjeno smě jenož małe pismiki a cyfry wobsahować. Mjezery njejsu dowolene." #: actions/apigroupcreate.php:176 actions/editgroup.php:190 #: actions/newgroup.php:130 actions/profilesettings.php:238 @@ -500,6 +500,11 @@ msgstr "%s skupinow" msgid "groups on %s" msgstr "skupiny na %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Dataju nahrać" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -638,17 +643,21 @@ msgstr "Status zničeny." msgid "No status with that ID found." msgstr "Žadyn status z tym ID namakany." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "To je předołho. Maksimalna wulkosć zdźělenki je %d znamješkow." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Njenamakany." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -1110,7 +1119,7 @@ msgstr "Swójski šat" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." -msgstr "" +msgstr "Móžeš swójski šat StatusNet jako .ZIP-archiw nahrać." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -2270,12 +2279,12 @@ msgstr "%1$s je hižo administrator za skupinu \"%2$s\"." #: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." -msgstr "Přistup na datowu sadźbu čłona %1$S w skupinje %2$s móžno njeje." +msgstr "Přistup na datowu sadźbu čłona %1$s w skupinje %2$s móžno njeje." #: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." -msgstr "Njeje móžno %1$S k administratorej w skupinje %2$s činić." +msgstr "Njeje móžno %1$s k administratorej w skupinje %2$s činić." #: actions/microsummary.php:69 msgid "No current status." @@ -4552,6 +4561,12 @@ msgstr "Wersija" msgid "Author(s)" msgstr "Awtorojo" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4582,9 +4597,8 @@ msgstr "" #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Njepłaćiwa wulkosć." +msgstr "Njepłaćiwe datajowe mjeno." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4615,7 +4629,7 @@ msgstr "Njeje móžno było, přizjewjenske znamješko za %s wutworić" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4670,58 +4684,56 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "" #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." -msgstr "Wužiwar nima profil." +msgstr "Falowacy profil." #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 -#, fuzzy msgid "Unable to save tag." -msgstr "Njeje móžno, sydłowu zdźělenku składować." +msgstr "Njeje móžno, tafličku składować." #. TRANS: Exception thrown when trying to subscribe while being banned from subscribing. #: classes/Subscription.php:75 lib/oauthstore.php:465 @@ -4745,21 +4757,18 @@ msgstr "Njeje abonowany!" #. TRANS: Exception thrown when trying to unsubscribe a user from themselves. #: classes/Subscription.php:178 -#, fuzzy msgid "Could not delete self-subscription." -msgstr "Sebjeabonement njeje so dał zničić." +msgstr "Sebjeabonement njeda so zhašeć." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 -#, fuzzy msgid "Could not delete subscription OMB token." msgstr "Znamjo OMB-abonementa njeda so zhašeć." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." -msgstr "Abonoment njeje so dał zničić." +msgstr "Abonoment njeda so zhašeć ." #. TRANS: Notice given on user registration. #. TRANS: %1$s is the sitename, $2$s is the registering user's nickname. diff --git a/locale/ia/LC_MESSAGES/statusnet.po b/locale/ia/LC_MESSAGES/statusnet.po index 105e2455b..cb0c9a828 100644 --- a/locale/ia/LC_MESSAGES/statusnet.po +++ b/locale/ia/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:28+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:08+0000\n" "Language-Team: Interlingua\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: out-statusnet\n" @@ -97,7 +97,7 @@ msgstr "Pagina non existe." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -213,7 +213,7 @@ msgstr "Actualisationes de %1$s e su amicos in %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -263,7 +263,7 @@ msgstr "Non poteva salveguardar le profilo." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -508,6 +508,11 @@ msgstr "Gruppos de %s" msgid "groups on %s" msgstr "gruppos in %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Incargar file" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Nulle parametro oauth_token fornite." @@ -654,18 +659,22 @@ msgstr "Stato delite." msgid "No status with that ID found." msgstr "Nulle stato trovate con iste ID." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "" "Isto es troppo longe. Le longitude maximal del notas es %d characteres." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Non trovate." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4808,6 +4817,12 @@ msgstr "Version" msgid "Author(s)" msgstr "Autor(es)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4873,7 +4888,7 @@ msgstr "Non poteva crear indicio de identification pro %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4932,45 +4947,45 @@ msgstr "" "novo post alcun minutas." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Il te es prohibite publicar notas in iste sito." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problema salveguardar nota." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Problema salveguardar le cassa de entrata del gruppo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/is/LC_MESSAGES/statusnet.po b/locale/is/LC_MESSAGES/statusnet.po index 97aa25425..fd65ba784 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-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:29+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:10+0000\n" "Language-Team: Icelandic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: is\n" "X-Message-Group: out-statusnet\n" @@ -107,7 +107,7 @@ msgstr "Ekkert þannig merki." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -215,7 +215,7 @@ msgstr "Færslur frá %1$s og vinum á %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -266,7 +266,7 @@ msgstr "Gat ekki vistað persónulega síðu." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -519,6 +519,11 @@ msgstr "Hópar %s" msgid "groups on %s" msgstr "Hópsaðgerðir" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Misheppnuð skipun" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -664,17 +669,21 @@ msgstr "" msgid "No status with that ID found." msgstr "Engin staða með þessu kenni fannst." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, fuzzy, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Þetta er of langt. Hámarkslengd babls er 140 tákn." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Fannst ekki." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4846,6 +4855,12 @@ msgstr "Persónulegt" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4913,7 +4928,7 @@ msgstr "Gat ekki búið til uppáhald." #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4971,46 +4986,46 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Það hefur verið lagt bann við babli frá þér á þessari síðu." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Vandamál komu upp við að vista babl." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "Vandamál komu upp við að vista babl." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/it/LC_MESSAGES/statusnet.po b/locale/it/LC_MESSAGES/statusnet.po index 0ebea7778..8d1c95ed3 100644 --- a/locale/it/LC_MESSAGES/statusnet.po +++ b/locale/it/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:31+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:11+0000\n" "Language-Team: Italian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: it\n" "X-Message-Group: out-statusnet\n" @@ -101,7 +101,7 @@ msgstr "Pagina inesistente." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -218,7 +218,7 @@ msgstr "Messaggi da %1$s e amici su %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -268,7 +268,7 @@ msgstr "Impossibile salvare il profilo." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -515,6 +515,11 @@ msgstr "Gruppi di %s" msgid "groups on %s" msgstr "Gruppi su %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Carica file" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Nessun parametro oauth_token fornito." @@ -659,17 +664,21 @@ msgstr "Messaggio eliminato." msgid "No status with that ID found." msgstr "Nessuno stato trovato con quel ID." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Troppo lungo. Lunghezza massima %d caratteri." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Non trovato." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4805,6 +4814,12 @@ msgstr "Versione" msgid "Author(s)" msgstr "Autori" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4872,7 +4887,7 @@ msgstr "Impossibile creare il token di accesso per %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4931,45 +4946,45 @@ msgstr "" "nuovo tra qualche minuto." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Ti è proibito inviare messaggi su questo sito." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problema nel salvare il messaggio." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Problema nel salvare la casella della posta del gruppo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/ja/LC_MESSAGES/statusnet.po b/locale/ja/LC_MESSAGES/statusnet.po index 60edb1a21..f1b554da6 100644 --- a/locale/ja/LC_MESSAGES/statusnet.po +++ b/locale/ja/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:33+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:13+0000\n" "Language-Team: Japanese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ja\n" "X-Message-Group: out-statusnet\n" @@ -103,7 +103,7 @@ msgstr "そのようなページはありません。" #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -217,7 +217,7 @@ msgstr "%2$s に %1$s と友人からの更新があります!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -268,7 +268,7 @@ msgstr "プロフィールを保存できませんでした。" #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -517,6 +517,11 @@ msgstr "%s グループ" msgid "groups on %s" msgstr "%s 上のグループ" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "ファイルアップロード" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "oauth_token パラメータは提供されませんでした。" @@ -657,17 +662,21 @@ msgstr "ステータスを削除しました。" msgid "No status with that ID found." msgstr "そのIDでのステータスはありません。" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "長すぎます。つぶやきは最大 140 字までです。" -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "見つかりません。" -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "つぶやきは URL を含めて最大 %d 字までです。" @@ -4837,6 +4846,12 @@ msgstr "バージョン" msgid "Author(s)" msgstr "作者" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4906,7 +4921,7 @@ msgstr "%s 用のログイン・トークンを作成できませんでした" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4964,45 +4979,45 @@ msgstr "" "い。" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "あなたはこのサイトでつぶやきを投稿するのが禁止されています。" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "つぶやきを保存する際に問題が発生しました。" #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "グループ受信箱を保存する際に問題が発生しました。" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/ko/LC_MESSAGES/statusnet.po b/locale/ko/LC_MESSAGES/statusnet.po index efe3bbebf..ea888538d 100644 --- a/locale/ko/LC_MESSAGES/statusnet.po +++ b/locale/ko/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Korean # +# Author@translatewiki.net: Brion # Author@translatewiki.net: Twkang # -- # This file is distributed under the same license as the StatusNet package. @@ -8,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:34+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:15+0000\n" "Language-Team: Korean\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ko\n" "X-Message-Group: out-statusnet\n" @@ -97,7 +98,7 @@ msgstr "해당하는 페이지 없음" #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -207,7 +208,7 @@ msgstr "%2$s에 있는 %1$s 및 친구들의 업데이트!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -255,7 +256,7 @@ msgstr "프로필을 저장 할 수 없습니다." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -503,6 +504,11 @@ msgstr "%s 그룹" msgid "groups on %s" msgstr "%s 상의 그룹들" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "올리기" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -646,17 +652,21 @@ msgstr "삭제된 소식입니다." msgid "No status with that ID found." msgstr "발견된 ID의 상태가 없습니다." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "너무 깁니다. 통지의 최대 길이는 %d 글자 입니다." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "찾을 수가 없습니다." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "소식의 최대 길이는 첨부 URL을 포함하여 %d 글자입니다." @@ -4815,6 +4825,12 @@ msgstr "버젼" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4881,7 +4897,7 @@ msgstr "%s 에 대한 로그인 토큰을 만들 수 없습니다." #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4943,46 +4959,46 @@ msgstr "" "해보세요." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "이 사이트에 게시글 포스팅으로부터 당신은 금지되었습니다." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "통지를 저장하는데 문제가 발생했습니다." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "통지를 저장하는데 문제가 발생했습니다." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. @@ -6286,7 +6302,7 @@ msgid "" "Faithfully yours,\n" "%4$s" msgstr "" -"포스팅 주소는 %1$s입니다.새 메시지를 등록하려면 %2$ 주소로 이메일을 보내십시" +"포스팅 주소는 %1$s입니다.새 메시지를 등록하려면 %2$s 주소로 이메일을 보내십시" "오.이메일 사용법은 %3$s 페이지를 보십시오.안녕히,%4$s" #. TRANS: Subject line for SMS-by-email notification messages diff --git a/locale/mk/LC_MESSAGES/statusnet.po b/locale/mk/LC_MESSAGES/statusnet.po index 5325a6080..0c3e4c6e8 100644 --- a/locale/mk/LC_MESSAGES/statusnet.po +++ b/locale/mk/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:36+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:17+0000\n" "Language-Team: Macedonian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: out-statusnet\n" @@ -100,7 +100,7 @@ msgstr "Нема таква страница." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -216,7 +216,7 @@ msgstr "Подновувања од %1$s и пријатели на %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -266,7 +266,7 @@ msgstr "Не може да се зачува профил." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -513,6 +513,11 @@ msgstr "%s групи" msgid "groups on %s" msgstr "групи на %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Подигни податотека" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Нема наведено oauth_token параметар." @@ -656,17 +661,21 @@ msgstr "Статусот е избришан." msgid "No status with that ID found." msgstr "Нема пронајдено статус со тој ID." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Ова е предолго. Максималната дозволена должина изнесува %d знаци." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Не е пронајдено." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4825,10 +4834,16 @@ msgstr "Верзија" msgid "Author(s)" msgstr "Автор(и)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." -msgstr "" +msgstr "Робин мисли дека нешто е невозможно." #. TRANS: Message given if an upload is larger than the configured maximum. #. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. @@ -4858,9 +4873,8 @@ msgstr "ВОлку голема податотека ќе ја надмине В #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Погрешна големина." +msgstr "Погрешно податотечно име." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4891,8 +4905,9 @@ msgstr "Не можам да создадам најавен жетон за" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" -msgstr "" +#, fuzzy +msgid "No database name or DSN found anywhere." +msgstr "Никаде не е пронајдено име на базата / DSN" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. #: classes/Message.php:46 @@ -4912,9 +4927,9 @@ msgstr "Не можев да ја подновам пораката со нов #. TRANS: Server exception thrown when a user profile for a notice cannot be found. #. TRANS: %1$d is a profile ID (number), %2$d is a notice ID (number). #: classes/Notice.php:98 -#, fuzzy, php-format +#, php-format msgid "No such profile (%1$d) for notice (%2$d)." -msgstr "Нема таков профил (%d) за забелешката (%d)" +msgstr "Нема таков профил (%1$d) за забелешката (%2$d)." #. TRANS: Server exception. %s are the error details. #: classes/Notice.php:190 @@ -4950,52 +4965,54 @@ msgstr "" "неколку минути." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Забрането Ви е да објавувате забелешки на ова мрежно место." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Проблем во зачувувањето на белешката." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" -msgstr "" +msgstr "На saveKnownGroups му е уакажан грешен тип" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Проблем при зачувувањето на групното приемно сандаче." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 -#, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +#, fuzzy, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" +"Не можам да му ја одземам улогата „%s“ на корисникот #%2$s. Таа не постои." #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 -#, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +#, fuzzy, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" +"Не можам да му ја одземам улогата „%1$s“ на корисникот #%2$s. Има грешка во " +"базата на податоци." #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." -msgstr "Корисникот нема профил." +msgstr "Недостасува профил." #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 @@ -5025,21 +5042,18 @@ msgstr "Не сте претплатени!" #. TRANS: Exception thrown when trying to unsubscribe a user from themselves. #: classes/Subscription.php:178 -#, fuzzy msgid "Could not delete self-subscription." msgstr "Не можам да ја избришам самопретплатата." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 -#, fuzzy msgid "Could not delete subscription OMB token." -msgstr "Не можете да го избришете OMB-жетонот за претплата." +msgstr "Не можам да го избришам OMB-жетонот за претплата." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." -msgstr "Претплата не може да се избрише." +msgstr "Не можам да ја избришам претплатата." #. TRANS: Notice given on user registration. #. TRANS: %1$s is the sitename, $2$s is the registering user's nickname. diff --git a/locale/nb/LC_MESSAGES/statusnet.po b/locale/nb/LC_MESSAGES/statusnet.po index 697949e18..ea4cf9baf 100644 --- a/locale/nb/LC_MESSAGES/statusnet.po +++ b/locale/nb/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:38+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53: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 (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: no\n" "X-Message-Group: out-statusnet\n" @@ -98,7 +98,7 @@ msgstr "Ingen slik side." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -165,7 +165,7 @@ msgstr "" #. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" #: actions/all.php:146 -#, fuzzy, php-format +#, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from their profile or [post something " "to their attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." @@ -175,7 +175,7 @@ msgstr "" "status_textarea=%3$s)." #: actions/all.php:149 actions/replies.php:210 actions/showstream.php:211 -#, fuzzy, php-format +#, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to their attention." @@ -213,7 +213,7 @@ msgstr "Oppdateringer fra %1$s og venner på %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -264,7 +264,7 @@ msgstr "Klarte ikke å lagre profil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -363,9 +363,8 @@ msgid "Could not delete favorite." msgstr "Kunne ikke slette favoritt." #: actions/apifriendshipscreate.php:109 -#, fuzzy msgid "Could not follow user: profile not found." -msgstr "Kunne ikke følge brukeren: Fant ikke brukeren." +msgstr "Kunne ikke følge brukeren: fant ikke profilen." #: actions/apifriendshipscreate.php:118 #, php-format @@ -381,9 +380,8 @@ msgid "You cannot unfollow yourself." msgstr "Du kan ikke slutte å følge deg selv." #: actions/apifriendshipsexists.php:91 -#, fuzzy msgid "Two valid IDs or screen_names must be supplied." -msgstr "To bruker ID-er eller kallenavn må oppgis." +msgstr "To gyldige ID-er eller screen_names må oppgis." #: actions/apifriendshipsshow.php:134 msgid "Could not determine source user." @@ -510,6 +508,11 @@ msgstr "%s grupper" msgid "groups on %s" msgstr "grupper på %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Last opp fil" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Ingen verdi for oauth_token er oppgitt." @@ -651,17 +654,21 @@ msgstr "Status slettet." msgid "No status with that ID found." msgstr "Ingen status med den ID-en funnet." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Det er for langt. Maks notisstørrelse er %d tegn." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Ikke funnet." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "Maks notisstørrelse er %d tegn, inklusive vedleggs-URL." @@ -1127,13 +1134,12 @@ msgid "Theme for the site." msgstr "Tema for nettstedet." #: actions/designadminpanel.php:467 -#, fuzzy msgid "Custom theme" -msgstr "Nettstedstema" +msgstr "Egendefinert tema" #: actions/designadminpanel.php:471 msgid "You can upload a custom StatusNet theme as a .ZIP archive." -msgstr "" +msgstr "Du kan laste opp et egendefinert StatusNet-tema som et .ZIP-arkiv." #: actions/designadminpanel.php:486 lib/designsettings.php:101 msgid "Change background image" @@ -2477,7 +2483,6 @@ msgid "Updates matching search term \"%1$s\" on %2$s!" msgstr "Oppdateringer som samsvarer søkestrengen «%1$s» på %2$s." #: actions/nudge.php:85 -#, fuzzy msgid "" "This user doesn't allow nudges or hasn't confirmed or set their email yet." msgstr "" @@ -3700,24 +3705,24 @@ msgstr "" "du liker for å bokmerke dem for senere eller for å kaste et søkelys på dem." #: actions/showfavorites.php:208 -#, fuzzy, php-format +#, php-format msgid "" "%s hasn't added any favorite notices yet. Post something interesting they " "would add to their favorites :)" msgstr "" -"%s har ikke lagt til noen notiser til sine favoritter ennå. Post noe " -"interessant som de vil legge til sine favoritter :)" +"%s har ikke lagt til noen favorittnotiser ennå. Post noe interessant som de " +"vil legge til sine favoritter :)" #: actions/showfavorites.php:212 -#, fuzzy, php-format +#, php-format msgid "" "%s hasn't added any favorite notices yet. Why not [register an account](%%%%" "action.register%%%%) and then post something interesting they would add to " "their favorites :)" msgstr "" -"%s har ikke lagt noen notiser til sine favoritter ennå. Hvorfor ikke " -"[registrere en konto](%%%%action.register%%%%) og post noe interessant som " -"de vil legge til sine favoritter :)" +"%s har ikke lagt til noen favorittnotiser ennå. Hvorfor ikke [registrere en " +"konto](%%%%action.register%%%%) og post noe interessant som de vil legge til " +"sine favoritter :)" #: actions/showfavorites.php:243 msgid "This is a way to share what you like." @@ -3897,7 +3902,7 @@ msgstr "" "ikke begynne nå? :)" #: actions/showstream.php:207 -#, fuzzy, php-format +#, php-format msgid "" "You can try to nudge %1$s or [post something to their attention](%%%%action." "newnotice%%%%?status_textarea=%2$s)." @@ -4412,9 +4417,9 @@ msgid "No ID argument." msgstr "" #: actions/tagother.php:65 -#, fuzzy, php-format +#, php-format msgid "Tag %s" -msgstr "Tagger" +msgstr "Merk %s" #: actions/tagother.php:77 lib/userprofile.php:76 msgid "User profile" @@ -4426,9 +4431,8 @@ msgid "Photo" msgstr "Foto" #: actions/tagother.php:141 -#, fuzzy msgid "Tag user" -msgstr "Tagger" +msgstr "Merk bruker" #: actions/tagother.php:151 msgid "" @@ -4742,6 +4746,12 @@ msgstr "Versjon" msgid "Author(s)" msgstr "Forfatter(e)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4772,9 +4782,8 @@ msgstr "" #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Ugyldig størrelse" +msgstr "Ugyldig filnavn." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4809,7 +4818,7 @@ msgstr "Klarte ikke å lagre avatar-informasjonen" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4864,45 +4873,45 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problem ved lagring av notis." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Problem ved lagring av gruppeinnboks." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/nl/LC_MESSAGES/statusnet.po b/locale/nl/LC_MESSAGES/statusnet.po index 74cb0bee4..69cd23523 100644 --- a/locale/nl/LC_MESSAGES/statusnet.po +++ b/locale/nl/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Dutch # +# Author@translatewiki.net: Brion # Author@translatewiki.net: Itavero # Author@translatewiki.net: McDutchie # Author@translatewiki.net: Siebrand @@ -10,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:41+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:22+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: out-statusnet\n" @@ -99,7 +100,7 @@ msgstr "Deze pagina bestaat niet." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -216,7 +217,7 @@ msgstr "Updates van %1$s en vrienden op %2$s." #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -266,7 +267,7 @@ msgstr "Het was niet mogelijk het profiel op te slaan." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -518,6 +519,11 @@ msgstr "%s groepen" msgid "groups on %s" msgstr "groepen op %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Bestand uploaden" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Er is geen oauth_token parameter opgegeven." @@ -667,17 +673,21 @@ msgstr "De status is verwijderd." msgid "No status with that ID found." msgstr "Er is geen status gevonden met dit ID." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "De mededeling is te lang. Gebruik maximaal %d tekens." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Niet aangetroffen." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -2527,7 +2537,7 @@ msgstr "Updates die overeenkomen met de zoekterm \"%1$s\" op %2$s." msgid "" "This user doesn't allow nudges or hasn't confirmed or set their email yet." msgstr "" -"Deze gebruiker is niet te porren of heeft nog geen bevestigs e-mailadres." +"Deze gebruiker is niet te porren of heeft nog geen bevestigd e-mailadres." #: actions/nudge.php:94 msgid "Nudge sent" @@ -4804,7 +4814,7 @@ msgid "" "This site is powered by %1$s version %2$s, Copyright 2008-2010 StatusNet, " "Inc. and contributors." msgstr "" -"Deze website wordt aangedreven door %1$2 versie %2$s. Auteursrechten " +"Deze website wordt aangedreven door %1$s versie %2$s. Auteursrechten " "voorbehouden 2008-2010 Statusnet, Inc. en medewerkers." #: actions/version.php:163 @@ -4857,10 +4867,16 @@ msgstr "Versie" msgid "Author(s)" msgstr "Auteur(s)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." -msgstr "" +msgstr "Robin denkt dat iets onmogelijk is." #. TRANS: Message given if an upload is larger than the configured maximum. #. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. @@ -4891,9 +4907,8 @@ msgstr "" #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Ongeldige afmetingen." +msgstr "Ongeldig bestandsnaam." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4924,8 +4939,9 @@ msgstr "Het was niet mogelijk een aanmeldtoken aan te maken voor %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" -msgstr "" +#, fuzzy +msgid "No database name or DSN found anywhere." +msgstr "Geen databasenaam of DNS gevonden" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. #: classes/Message.php:46 @@ -4945,7 +4961,7 @@ msgstr "Het was niet mogelijk het bericht bij te werken met de nieuwe URI." #. TRANS: Server exception thrown when a user profile for a notice cannot be found. #. TRANS: %1$d is a profile ID (number), %2$d is a notice ID (number). #: classes/Notice.php:98 -#, fuzzy, php-format +#, php-format msgid "No such profile (%1$d) for notice (%2$d)." msgstr "Er is geen profiel (%1$d) te vinden bij de mededeling (%2$d)." @@ -4987,24 +5003,24 @@ msgstr "" "plaats over een aantal minuten pas weer een bericht." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" "U bent geblokkeerd en mag geen mededelingen meer achterlaten op deze site." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Er is een probleem opgetreden bij het opslaan van de mededeling." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" -msgstr "" +msgstr "Het gegevenstype dat is opgegeven aan saveKnownGroups is onjuist" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "" "Er is een probleem opgetreden bij het opslaan van het Postvak IN van de " @@ -5012,30 +5028,33 @@ msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 -#, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +#, fuzzy, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" +"De rol \"%1$s\" voor gebruiker #%2$d kan niet ingetrokken worden. Deze " +"gebruiker bestaat niet." #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 -#, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +#, fuzzy, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" +"De rol \"%1$s\" voor gebruiker #%2$d kan niet ingetrokken worden. " +"Databasefout." #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." -msgstr "Deze gebruiker heeft geen profiel." +msgstr "Ontbrekend profiel." #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 @@ -5064,20 +5083,17 @@ msgstr "Niet geabonneerd!" #. TRANS: Exception thrown when trying to unsubscribe a user from themselves. #: classes/Subscription.php:178 -#, fuzzy msgid "Could not delete self-subscription." -msgstr "Het was niet mogelijk het abonnement op uzelf te verwijderen." +msgstr "Kon abonnement op eigen gebruiker niet verwijderen." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 -#, fuzzy msgid "Could not delete subscription OMB token." msgstr "" "Het was niet mogelijk om het OMB-token voor het abonnement te verwijderen." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." msgstr "Kon abonnement niet verwijderen." diff --git a/locale/nn/LC_MESSAGES/statusnet.po b/locale/nn/LC_MESSAGES/statusnet.po index 37780c6be..e5c3c5806 100644 --- a/locale/nn/LC_MESSAGES/statusnet.po +++ b/locale/nn/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:39+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:21+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 (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nn\n" "X-Message-Group: out-statusnet\n" @@ -106,7 +106,7 @@ msgstr "Dette emneord finst ikkje." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -215,7 +215,7 @@ msgstr "Oppdateringar frå %1$s og vener på %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -266,7 +266,7 @@ msgstr "Kan ikkje lagra profil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -521,6 +521,11 @@ msgstr "%s grupper" msgid "groups on %s" msgstr "Gruppe handlingar" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Last opp fil" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -667,17 +672,21 @@ msgstr "Lasta opp brukarbilete." msgid "No status with that ID found." msgstr "Fann ingen status med den ID-en." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, fuzzy, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Det er for langt! Ein notis kan berre innehalde 140 teikn." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Finst ikkje." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4883,6 +4892,12 @@ msgstr "Personleg" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4913,9 +4928,8 @@ msgstr "" #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Ugyldig storleik." +msgstr "Ugyldig filnamn." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4950,7 +4964,7 @@ msgstr "Kunne ikkje lagre favoritt." #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -5010,46 +5024,46 @@ msgstr "" "For mange notisar for raskt; tek ei pause, og prøv igjen om eit par minutt." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Du kan ikkje lengre legge inn notisar på denne sida." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Eit problem oppstod ved lagring av notis." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "Eit problem oppstod ved lagring av notis." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/pl/LC_MESSAGES/statusnet.po b/locale/pl/LC_MESSAGES/statusnet.po index b643ab6f7..eef4bd4b7 100644 --- a/locale/pl/LC_MESSAGES/statusnet.po +++ b/locale/pl/LC_MESSAGES/statusnet.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:43+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:24+0000\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pl\n" "X-Message-Group: out-statusnet\n" @@ -103,7 +103,7 @@ msgstr "Nie ma takiej strony." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -220,7 +220,7 @@ msgstr "Aktualizacje z %1$s i przyjaciół na %2$s." #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -269,7 +269,7 @@ msgstr "Nie można zapisać profilu." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -516,6 +516,11 @@ msgstr "Grupy %s" msgid "groups on %s" msgstr "grupy na %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Wyślij plik" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Nie podano parametru oauth_token." @@ -658,17 +663,21 @@ msgstr "Usunięto stan." msgid "No status with that ID found." msgstr "Nie odnaleziono stanów z tym identyfikatorem." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Wpis jest za długi. Maksymalna długość wynosi %d znaków." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Nie odnaleziono." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "Maksymalny rozmiar wpisu wynosi %d znaków, w tym adres URL załącznika." @@ -4794,6 +4803,12 @@ msgstr "Wersja" msgid "Author(s)" msgstr "Autorzy" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4862,7 +4877,7 @@ msgstr "Nie można utworzyć tokenów loginów dla %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4921,45 +4936,45 @@ msgstr "" "wyślij ponownie za kilka minut." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Zabroniono ci wysyłania wpisów na tej witrynie." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problem podczas zapisywania wpisu." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Problem podczas zapisywania skrzynki odbiorczej grupy." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/pt/LC_MESSAGES/statusnet.po b/locale/pt/LC_MESSAGES/statusnet.po index 14861b9f3..b612861c0 100644 --- a/locale/pt/LC_MESSAGES/statusnet.po +++ b/locale/pt/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:44+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:26+0000\n" "Language-Team: Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt\n" "X-Message-Group: out-statusnet\n" @@ -100,7 +100,7 @@ msgstr "Página não foi encontrada." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -215,7 +215,7 @@ msgstr "Actualizações de %1$s e amigos no %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -264,7 +264,7 @@ msgstr "Não foi possível gravar o perfil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -509,6 +509,11 @@ msgstr "Grupos de %s" msgid "groups on %s" msgstr "Grupos em %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Carregar ficheiro" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Não foi fornecido o parâmetro oauth_token." @@ -650,17 +655,21 @@ msgstr "Estado apagado." msgid "No status with that ID found." msgstr "Não foi encontrado um estado com esse ID." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Demasiado longo. Tamanho máx. das notas é %d caracteres." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Não encontrado." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "Tamanho máx. das notas é %d caracteres, incluíndo a URL do anexo." @@ -4800,6 +4809,12 @@ msgstr "Versão" msgid "Author(s)" msgstr "Autores" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4866,7 +4881,7 @@ msgstr "Não foi possível criar a chave de entrada para %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4925,45 +4940,45 @@ msgstr "" "publicar daqui a alguns minutos." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Está proibido de publicar notas neste site." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problema na gravação da nota." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Problema na gravação da caixa de entrada do grupo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/pt_BR/LC_MESSAGES/statusnet.po b/locale/pt_BR/LC_MESSAGES/statusnet.po index 0c9150517..1daa49fc2 100644 --- a/locale/pt_BR/LC_MESSAGES/statusnet.po +++ b/locale/pt_BR/LC_MESSAGES/statusnet.po @@ -13,12 +13,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:46+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:27+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 (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt-br\n" "X-Message-Group: out-statusnet\n" @@ -102,7 +102,7 @@ msgstr "Esta página não existe." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -219,7 +219,7 @@ msgstr "Atualizações de %1$s e amigos no %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -269,7 +269,7 @@ msgstr "Não foi possível salvar o perfil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -518,6 +518,11 @@ msgstr "Grupos de %s" msgid "groups on %s" msgstr "grupos no %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Enviar arquivo" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Não foi fornecido nenhum parâmetro oauth_token" @@ -665,17 +670,21 @@ msgstr "A mensagem foi excluída." msgid "No status with that ID found." msgstr "Não foi encontrada nenhuma mensagem com esse ID." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Está muito extenso. O tamanho máximo é de %s caracteres." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Não encontrado." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "O tamanho máximo da mensagem é de %s caracteres" @@ -4834,6 +4843,12 @@ msgstr "Versão" msgid "Author(s)" msgstr "Autor(es)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4899,7 +4914,7 @@ msgstr "Não foi possível criar o token de autenticação para %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4958,45 +4973,45 @@ msgstr "" "publique novamente daqui a alguns minutos." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Você está proibido de publicar mensagens neste site." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problema no salvamento da mensagem." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Problema no salvamento das mensagens recebidas do grupo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/ru/LC_MESSAGES/statusnet.po b/locale/ru/LC_MESSAGES/statusnet.po index 415cf0d9a..54aeb3491 100644 --- a/locale/ru/LC_MESSAGES/statusnet.po +++ b/locale/ru/LC_MESSAGES/statusnet.po @@ -13,12 +13,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:48+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:29+0000\n" "Language-Team: Russian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ru\n" "X-Message-Group: out-statusnet\n" @@ -104,7 +104,7 @@ msgstr "Нет такой страницы." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -171,12 +171,12 @@ msgstr "" #. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" #: actions/all.php:146 -#, fuzzy, php-format +#, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from their profile or [post something " "to their attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -"Вы можете попробовать [«подтолкнуть» %1$s](../%2$s) из профиля или [написать " +"Вы можете попробовать «[подтолкнуть %1$s](../%2$s)» из профиля или [написать " "что-нибудь для привлечения его или её внимания](%%%%action.newnotice%%%%?" "status_textarea=%3$s)." @@ -219,7 +219,7 @@ msgstr "Обновлено от %1$s и его друзей на %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -269,7 +269,7 @@ msgstr "Не удаётся сохранить профиль." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -369,11 +369,8 @@ msgid "Could not delete favorite." msgstr "Не удаётся удалить любимую запись." #: actions/apifriendshipscreate.php:109 -#, fuzzy msgid "Could not follow user: profile not found." -msgstr "" -"Не удаётся следовать за пользователем, т. к. такого пользователя не " -"существует." +msgstr "Не удаётся следовать за пользователем: профиль не найден." #: actions/apifriendshipscreate.php:118 #, php-format @@ -391,9 +388,8 @@ msgid "You cannot unfollow yourself." msgstr "Вы не можете перестать следовать за собой." #: actions/apifriendshipsexists.php:91 -#, fuzzy msgid "Two valid IDs or screen_names must be supplied." -msgstr "Надо представить два имени пользователя или кода." +msgstr "Необходимо задать два идентификатора или screen_names." #: actions/apifriendshipsshow.php:134 msgid "Could not determine source user." @@ -521,6 +517,11 @@ msgstr "Группы %s" msgid "groups on %s" msgstr "группы на %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Загрузить файл" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Не задан параметр oauth_token." @@ -664,17 +665,21 @@ msgstr "Статус удалён." msgid "No status with that ID found." msgstr "Не найдено статуса с таким ID." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Слишком длинная запись. Максимальная длина — %d знаков." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Не найдено." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "Максимальная длина записи — %d символов, включая URL вложения." @@ -2513,12 +2518,11 @@ msgid "Updates matching search term \"%1$s\" on %2$s!" msgstr "Все обновления, соответствующие поисковому запросу «%s»" #: actions/nudge.php:85 -#, fuzzy msgid "" "This user doesn't allow nudges or hasn't confirmed or set their email yet." msgstr "" -"Этот пользователь не разрешает \"подталкивать\" его, или ещё не подтверждён " -"или ещё не представил свой электронный адрес." +"Этот пользователь не разрешает «подталкивать» его или ещё не указал свой " +"email-адрес." #: actions/nudge.php:94 msgid "Nudge sent" @@ -3535,12 +3539,13 @@ msgid "Replies feed for %s (Atom)" msgstr "Лента записей для %s (Atom)" #: actions/replies.php:199 -#, fuzzy, php-format +#, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to their attention yet." msgstr "" -"Эта лента содержит ответы на записи %1$s, однако %2$s пока не получал их." +"Эта лента содержит ответы для %1$s, однако %2$s пока не получил запись для " +"привлечения внимания." #: actions/replies.php:204 #, php-format @@ -3552,12 +3557,12 @@ msgstr "" "число людей или [присоединившись к группам](%%action.groups%%)." #: actions/replies.php:206 -#, fuzzy, php-format +#, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to their attention](%" "%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" -"Вы можете попробовать [«подтолкнуть» %1$s](../%2$s) или [написать что-нибудь " +"Вы можете попробовать «[подтолкнуть %1$s](../%2$s)» или [написать что-нибудь " "для привлечения его или её внимания](%%%%action.newnotice%%%%?" "status_textarea=%3$s)." @@ -3736,7 +3741,7 @@ msgstr "" "любимые рядом с понравившейся записью, чтобы позже уделить ей внимание." #: actions/showfavorites.php:208 -#, fuzzy, php-format +#, php-format msgid "" "%s hasn't added any favorite notices yet. Post something interesting they " "would add to their favorites :)" @@ -3745,13 +3750,13 @@ msgstr "" "которую он добавит её в число любимых :)" #: actions/showfavorites.php:212 -#, fuzzy, php-format +#, php-format msgid "" "%s hasn't added any favorite notices yet. Why not [register an account](%%%%" "action.register%%%%) and then post something interesting they would add to " "their favorites :)" msgstr "" -"%s пока не добавил ни одноз записи в любимые. Почему бы не " +"%s пока не добавил ни одной записи в любимые. Почему бы не " "[зарегистрироваться](%%%%action.register%%%%) и не написать что-нибудь " "интересное, что понравилось бы этому пользователю? :)" @@ -3933,7 +3938,7 @@ msgstr "" "сейчас хорошее время для начала :)" #: actions/showstream.php:207 -#, fuzzy, php-format +#, php-format msgid "" "You can try to nudge %1$s or [post something to their attention](%%%%action." "newnotice%%%%?status_textarea=%2$s)." @@ -4820,21 +4825,27 @@ msgstr "Версия" msgid "Author(s)" msgstr "Автор(ы)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." -msgstr "" +msgstr "Робин считает, что это невозможно." #. TRANS: Message given if an upload is larger than the configured maximum. #. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. #: classes/File.php:190 -#, fuzzy, php-format +#, php-format msgid "" "No file may be larger than %1$d bytes and the file you sent was %2$d bytes. " "Try to upload a smaller version." msgstr "" -"Файл не может быть больше %d байт, тогда как отправленный вами файл содержал " -"%d байт. Попробуйте загрузить меньшую версию." +"Файл не может быть больше %1$d байт, тогда как отправленный вами файл " +"содержал %2$d байт. Попробуйте загрузить меньшую версию." #. TRANS: Message given if an upload would exceed user quota. #. TRANS: %d (number) is the user quota in bytes. @@ -4852,9 +4863,8 @@ msgstr "Файл такого размера превысит вашу меся #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Неверный размер." +msgstr "Неверное имя файла." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4885,8 +4895,9 @@ msgstr "Не удаётся создать токен входа для %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" -msgstr "" +#, fuzzy +msgid "No database name or DSN found anywhere." +msgstr "Имя базы данных / DSN не найдено" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. #: classes/Message.php:46 @@ -4908,7 +4919,7 @@ msgstr "Не удаётся обновить сообщение с новым UR #: classes/Notice.php:98 #, php-format msgid "No such profile (%1$d) for notice (%2$d)." -msgstr "" +msgstr "Нет такого профиля (%1$d) для записи (%2$d)." #. TRANS: Server exception. %s are the error details. #: classes/Notice.php:190 @@ -4944,58 +4955,59 @@ msgstr "" "и попробуйте вновь через пару минут." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Вам запрещено поститься на этом сайте (бан)" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Проблемы с сохранением записи." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" -msgstr "" +msgstr "Для saveKnownGroups указан неверный тип" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Проблемы с сохранением входящих сообщений группы." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 -#, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +#, fuzzy, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" +"Не удаётся отозвать право «%s» для пользователя #%2$s; пользователь не " +"существует." #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 -#, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +#, fuzzy, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" +"Не удаётся отозвать право «%1%s» для пользователя #%2$s; ошибка базы данных." #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." -msgstr "У пользователя нет профиля." +msgstr "Отсутствующий профиль." #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 -#, fuzzy msgid "Unable to save tag." -msgstr "Не удаётся сохранить уведомление сайта." +msgstr "Не удаётся сохранить тег." #. TRANS: Exception thrown when trying to subscribe while being banned from subscribing. #: classes/Subscription.php:75 lib/oauthstore.php:465 @@ -5019,19 +5031,16 @@ msgstr "Не подписаны!" #. TRANS: Exception thrown when trying to unsubscribe a user from themselves. #: classes/Subscription.php:178 -#, fuzzy msgid "Could not delete self-subscription." -msgstr "Невозможно удалить самоподписку." +msgstr "Невозможно удалить подписку на самого себя." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 -#, fuzzy msgid "Could not delete subscription OMB token." msgstr "Не удаётся удалить подписочный жетон OMB." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." msgstr "Не удаётся удалить подписку." diff --git a/locale/statusnet.pot b/locale/statusnet.pot index b491645b8..be4b73a2d 100644 --- a/locale/statusnet.pot +++ b/locale/statusnet.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -95,7 +95,7 @@ msgstr "" #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -203,7 +203,7 @@ msgstr "" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -251,7 +251,7 @@ msgstr "" #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -492,6 +492,10 @@ msgstr "" msgid "groups on %s" msgstr "" +#: actions/apimediaupload.php:99 +msgid "Upload failed." +msgstr "" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -630,17 +634,21 @@ msgstr "" msgid "No status with that ID found." msgstr "" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "" -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "" -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4526,6 +4534,12 @@ msgstr "" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4588,7 +4602,7 @@ msgstr "" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4643,45 +4657,45 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "" #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/sv/LC_MESSAGES/statusnet.po b/locale/sv/LC_MESSAGES/statusnet.po index 4da869ece..982234bf4 100644 --- a/locale/sv/LC_MESSAGES/statusnet.po +++ b/locale/sv/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:49+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:31+0000\n" "Language-Team: Swedish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: sv\n" "X-Message-Group: out-statusnet\n" @@ -99,7 +99,7 @@ msgstr "Ingen sådan sida" #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -214,7 +214,7 @@ msgstr "Uppdateringar från %1$s och vänner på %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -262,7 +262,7 @@ msgstr "Kunde inte spara profil." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -508,6 +508,11 @@ msgstr "%s grupper" msgid "groups on %s" msgstr "grupper på %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Ladda upp fil" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Ingen oauth_token-parameter angiven." @@ -649,17 +654,21 @@ msgstr "Status borttagen." msgid "No status with that ID found." msgstr "Ingen status med det ID:t hittades." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Det är för långt. Maximal notisstorlek är %d tecken." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Hittades inte." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "Maximal notisstorlek är %d tecken, inklusive webbadress för bilaga." @@ -4795,6 +4804,12 @@ msgstr "Version" msgid "Author(s)" msgstr "Författare" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4860,7 +4875,7 @@ msgstr "Kunde inte skapa inloggnings-token för %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4919,45 +4934,45 @@ msgstr "" "om ett par minuter." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Du är utestängd från att posta notiser på denna webbplats." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Problem med att spara notis." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Problem med att spara gruppinkorg." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/te/LC_MESSAGES/statusnet.po b/locale/te/LC_MESSAGES/statusnet.po index 5f818c819..fecf3d5ea 100644 --- a/locale/te/LC_MESSAGES/statusnet.po +++ b/locale/te/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:51+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:33+0000\n" "Language-Team: Telugu\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: te\n" "X-Message-Group: out-statusnet\n" @@ -98,7 +98,7 @@ msgstr "అటువంటి పేజీ లేదు." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -207,7 +207,7 @@ msgstr "%2$sలో %1$s మరియు స్నేహితుల నుండ #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -258,7 +258,7 @@ msgstr "ప్రొఫైలుని భద్రపరచలేకున్ #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -503,6 +503,11 @@ msgstr "%s గుంపులు" msgid "groups on %s" msgstr "%s పై గుంపులు" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "ఫైలుని ఎక్కించు" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -644,17 +649,21 @@ msgstr "స్థితిని తొలగించాం." msgid "No status with that ID found." msgstr "ఆ IDతో ఏ నోటీసు కనబడలేదు." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "అది చాలా పొడవుంది. గరిష్ఠ నోటీసు పరిమాణం %d అక్షరాలు." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "కనబడలేదు." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "గరిష్ఠ నోటీసు పొడవు %d అక్షరాలు, జోడింపు URLని కలుపుకుని." @@ -4687,6 +4696,12 @@ msgstr "సంచిక" msgid "Author(s)" msgstr "రచయిత(లు)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4717,9 +4732,8 @@ msgstr "" #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "తప్పుడు పరిమాణం." +msgstr "తప్పుడు దస్త్రపుపేరు.." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4750,7 +4764,7 @@ msgstr "మారుపేర్లని సృష్టించలేకప #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4805,46 +4819,46 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "ఈ సైటులో నోటీసులు రాయడం నుండి మిమ్మల్ని నిషేధించారు." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/tr/LC_MESSAGES/statusnet.po b/locale/tr/LC_MESSAGES/statusnet.po index 636d991f7..5c02224f6 100644 --- a/locale/tr/LC_MESSAGES/statusnet.po +++ b/locale/tr/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:53+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:34+0000\n" "Language-Team: Turkish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: tr\n" "X-Message-Group: out-statusnet\n" @@ -106,7 +106,7 @@ msgstr "Böyle bir durum mesajı yok." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -215,7 +215,7 @@ msgstr "" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -266,7 +266,7 @@ msgstr "Profil kaydedilemedi." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -521,6 +521,11 @@ msgstr "" msgid "groups on %s" msgstr "" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Yükle" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -667,19 +672,23 @@ msgstr "Avatar güncellendi." msgid "No status with that ID found." msgstr "" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, fuzzy, php-format msgid "That's too long. Max notice size is %d chars." msgstr "" "Ah, durumunuz biraz uzun kaçtı. Azami 180 karaktere sığdırmaya ne dersiniz?" -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 #, fuzzy msgid "Not found." msgstr "İstek bulunamadı!" -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4798,6 +4807,12 @@ msgstr "Kişisel" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4865,7 +4880,7 @@ msgstr "Avatar bilgisi kaydedilemedi" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4922,46 +4937,46 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Durum mesajını kaydederken hata oluştu." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "Durum mesajını kaydederken hata oluştu." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/uk/LC_MESSAGES/statusnet.po b/locale/uk/LC_MESSAGES/statusnet.po index e9c9becfb..4283775c6 100644 --- a/locale/uk/LC_MESSAGES/statusnet.po +++ b/locale/uk/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:21:54+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:36+0000\n" "Language-Team: Ukrainian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: out-statusnet\n" @@ -103,7 +103,7 @@ msgstr "Немає такої сторінки." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -217,7 +217,7 @@ msgstr "Оновлення від %1$s та друзів на %2$s!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -266,7 +266,7 @@ msgstr "Не вдалося зберегти профіль." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -512,6 +512,11 @@ msgstr "%s групи" msgid "groups on %s" msgstr "групи на %s" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Завантажити файл" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "Жодного параметру oauth_token не забезпечено." @@ -657,17 +662,21 @@ msgstr "Статус видалено." msgid "No status with that ID found." msgstr "Не знайдено жодних статусів з таким ID." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Надто довго. Максимальний розмір допису — %d знаків." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Не знайдено." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4801,10 +4810,16 @@ msgstr "Версія" msgid "Author(s)" msgstr "Автор(и)" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." -msgstr "" +msgstr "Робін вважає, що це неможливо." #. TRANS: Message given if an upload is larger than the configured maximum. #. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. @@ -4833,9 +4848,8 @@ msgstr "Розміри цього файлу перевищують Вашу м #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Недійсний розмір." +msgstr "Невірне ім’я файлу." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4866,8 +4880,9 @@ msgstr "Не вдалося створити токен входу для %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" -msgstr "" +#, fuzzy +msgid "No database name or DSN found anywhere." +msgstr "Немає імені бази даних / DSN ніде не знайдено" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. #: classes/Message.php:46 @@ -4887,9 +4902,9 @@ msgstr "Не можна оновити повідомлення з новим UR #. TRANS: Server exception thrown when a user profile for a notice cannot be found. #. TRANS: %1$d is a profile ID (number), %2$d is a notice ID (number). #: classes/Notice.php:98 -#, fuzzy, php-format +#, php-format msgid "No such profile (%1$d) for notice (%2$d)." -msgstr "Немає такого профілю (%d) для повідомлення (%d)" +msgstr "Немає такого профілю (%1$d) для повідомлення (%2$d)." #. TRANS: Server exception. %s are the error details. #: classes/Notice.php:190 @@ -4925,52 +4940,52 @@ msgstr "" "повертайтесь за кілька хвилин." #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "Вам заборонено надсилати дописи до цього сайту." #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Проблема при збереженні допису." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" -msgstr "" +msgstr "Задається невірний тип для saveKnownGroups" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 msgid "Problem saving group inbox." msgstr "Проблема при збереженні вхідних дописів для групи." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 -#, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." -msgstr "" +#, fuzzy, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." +msgstr "Не вдалося скасувати роль «%s» для користувача #%2$s; не існує." #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 -#, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +#, fuzzy, php-format +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" +"Не вдалося скасувати роль «%1$s» для користувача #%2$s; помилка бази даних." #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." -msgstr "Користувач не має профілю." +msgstr "Загублений профіль." #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 @@ -4999,19 +5014,16 @@ msgstr "Не підписано!" #. TRANS: Exception thrown when trying to unsubscribe a user from themselves. #: classes/Subscription.php:178 -#, fuzzy msgid "Could not delete self-subscription." msgstr "Не можу видалити самопідписку." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 -#, fuzzy msgid "Could not delete subscription OMB token." msgstr "Не вдається видалити токен підписки OMB." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." msgstr "Не вдалося видалити підписку." diff --git a/locale/vi/LC_MESSAGES/statusnet.po b/locale/vi/LC_MESSAGES/statusnet.po index aa714196f..5a616a574 100644 --- a/locale/vi/LC_MESSAGES/statusnet.po +++ b/locale/vi/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:22:07+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:37+0000\n" "Language-Team: Vietnamese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: vi\n" "X-Message-Group: out-statusnet\n" @@ -101,7 +101,7 @@ msgstr "Không có tin nhắn nào." #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -209,7 +209,7 @@ msgstr "" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -260,7 +260,7 @@ msgstr "Không thể lưu hồ sơ cá nhân." #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -516,6 +516,11 @@ msgstr "%s và nhóm" msgid "groups on %s" msgstr "Mã nhóm" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "Tải file" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -661,17 +666,21 @@ msgstr "Hình đại diện đã được cập nhật." msgid "No status with that ID found." msgstr "Không tìm thấy trạng thái nào tương ứng với ID đó." -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, fuzzy, php-format msgid "That's too long. Max notice size is %d chars." msgstr "Quá dài. Tối đa là 140 ký tự." -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 msgid "Not found." msgstr "Không tìm thấy." -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4938,6 +4947,12 @@ msgstr "Cá nhân" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -5005,7 +5020,7 @@ msgstr "Không thể tạo favorite." #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -5065,46 +5080,46 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "Có lỗi xảy ra khi lưu tin nhắn." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "Có lỗi xảy ra khi lưu tin nhắn." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%s (%s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/zh_CN/LC_MESSAGES/statusnet.po b/locale/zh_CN/LC_MESSAGES/statusnet.po index 286e41e06..1da7214a6 100644 --- a/locale/zh_CN/LC_MESSAGES/statusnet.po +++ b/locale/zh_CN/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:22:09+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:39+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 (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hans\n" "X-Message-Group: out-statusnet\n" @@ -108,7 +108,7 @@ msgstr "没有该页面" #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -216,7 +216,7 @@ msgstr "来自%2$s 上 %1$s 和好友的更新!" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -267,7 +267,7 @@ msgstr "无法保存个人信息。" #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -522,6 +522,11 @@ msgstr "%s 群组" msgid "groups on %s" msgstr "组动作" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "上传" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -668,18 +673,22 @@ msgstr "头像已更新。" msgid "No status with that ID found." msgstr "没有找到此ID的信息。" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, fuzzy, php-format msgid "That's too long. Max notice size is %d chars." msgstr "超出长度限制。不能超过 140 个字符。" -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 #, fuzzy msgid "Not found." msgstr "未找到" -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4881,6 +4890,12 @@ msgstr "个人" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4948,7 +4963,7 @@ msgstr "无法创建收藏。" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -5007,46 +5022,46 @@ msgid "" msgstr "你在短时间里发布了过多的消息,请深呼吸,过几分钟再发消息。" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "在这个网站你被禁止发布消息。" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "保存通告时出错。" #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "保存通告时出错。" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. diff --git a/locale/zh_TW/LC_MESSAGES/statusnet.po b/locale/zh_TW/LC_MESSAGES/statusnet.po index 2f54619b1..82b8b4379 100644 --- a/locale/zh_TW/LC_MESSAGES/statusnet.po +++ b/locale/zh_TW/LC_MESSAGES/statusnet.po @@ -7,12 +7,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-07-29 18:20+0000\n" -"PO-Revision-Date: 2010-07-29 18:22:10+0000\n" +"POT-Creation-Date: 2010-07-31 21:52+0000\n" +"PO-Revision-Date: 2010-07-31 21:53:41+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 (r70152); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70239); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hant\n" "X-Message-Group: out-statusnet\n" @@ -102,7 +102,7 @@ msgstr "無此通知" #: actions/apidirectmessagenew.php:74 actions/apigroupcreate.php:113 #: actions/apigroupismember.php:91 actions/apigroupjoin.php:100 #: actions/apigroupleave.php:100 actions/apigrouplist.php:73 -#: actions/apistatusesupdate.php:228 actions/apisubscriptions.php:87 +#: actions/apistatusesupdate.php:229 actions/apisubscriptions.php:87 #: actions/apitimelinefavorites.php:72 actions/apitimelinefriends.php:174 #: actions/apitimelinehome.php:80 actions/apitimelinementions.php:80 #: actions/apitimelineuser.php:82 actions/avatarbynickname.php:75 @@ -211,7 +211,7 @@ msgstr "" #: actions/apistatusesshow.php:109 actions/apistatusnetconfig.php:141 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 #: actions/apitimelinefavorites.php:174 actions/apitimelinefriends.php:271 -#: actions/apitimelinegroup.php:152 actions/apitimelinehome.php:175 +#: actions/apitimelinegroup.php:154 actions/apitimelinehome.php:175 #: actions/apitimelinementions.php:174 actions/apitimelinepublic.php:241 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:161 @@ -262,7 +262,7 @@ msgstr "無法儲存個人資料" #: actions/apiaccountupdateprofilebackgroundimage.php:108 #: actions/apiaccountupdateprofileimage.php:97 actions/apimediaupload.php:80 -#: actions/apistatusesupdate.php:211 actions/avatarsettings.php:257 +#: actions/apistatusesupdate.php:212 actions/avatarsettings.php:257 #: actions/designadminpanel.php:123 actions/editapplication.php:118 #: actions/newapplication.php:101 actions/newnotice.php:94 #: lib/designsettings.php:283 @@ -512,6 +512,11 @@ msgstr "" msgid "groups on %s" msgstr "" +#: actions/apimediaupload.php:99 +#, fuzzy +msgid "Upload failed." +msgstr "無此通知" + #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." msgstr "" @@ -658,18 +663,22 @@ msgstr "更新個人圖像" msgid "No status with that ID found." msgstr "" -#: actions/apistatusesupdate.php:241 actions/newnotice.php:155 +#: actions/apistatusesupdate.php:221 +msgid "Client must provide a 'status' parameter with a value." +msgstr "" + +#: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 #, php-format msgid "That's too long. Max notice size is %d chars." msgstr "" -#: actions/apistatusesupdate.php:282 actions/apiusershow.php:96 +#: actions/apistatusesupdate.php:283 actions/apiusershow.php:96 #, fuzzy msgid "Not found." msgstr "目前無請求" -#: actions/apistatusesupdate.php:305 actions/newnotice.php:178 +#: actions/apistatusesupdate.php:306 actions/newnotice.php:178 #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" @@ -4706,6 +4715,12 @@ msgstr "地點" msgid "Author(s)" msgstr "" +#. TRANS: Server exception thrown when a URL cannot be processed. +#: classes/File.php:143 +#, php-format +msgid "Cannot process URL '%s'" +msgstr "" + #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." @@ -4773,7 +4788,7 @@ msgstr "無法存取個人圖像資料" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 -msgid "No database name / DSN found anywhere" +msgid "No database name or DSN found anywhere." msgstr "" #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. @@ -4830,46 +4845,46 @@ msgid "" msgstr "" #. TRANS: Client exception thrown when a user tries to post while being banned. -#: classes/Notice.php:285 +#: classes/Notice.php:286 msgid "You are banned from posting notices on this site." msgstr "" #. TRANS: Server exception thrown when a notice cannot be saved. #. TRANS: Server exception thrown when a notice cannot be updated. -#: classes/Notice.php:352 classes/Notice.php:379 +#: classes/Notice.php:353 classes/Notice.php:380 msgid "Problem saving notice." msgstr "" #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). -#: classes/Notice.php:891 +#: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" msgstr "" #. TRANS: Server exception thrown when an update for a group inbox fails. -#: classes/Notice.php:990 +#: classes/Notice.php:991 #, fuzzy msgid "Problem saving group inbox." msgstr "儲存使用者發生錯誤" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1599 +#: classes/Notice.php:1600 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:740 #, php-format -msgid "Cannot revoke role \"%s\" for user #%2$s; does not exist." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. -#. TRANS: %1$s is the role name, %2$s is the user ID. +#. TRANS: %1$s is the role name, %2$s is the user ID (number). #: classes/Profile.php:749 #, php-format -msgid "Cannot revoke role \"%1$s\" for user #%2$s; database error." +msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. -- cgit v1.2.3-54-g00ecf From e603632f13e87aa2671bd5ff732c4858ce44ef6e Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 2 Aug 2010 14:06:14 -0400 Subject: add support for Salmon's new "mentioned" rel value --- classes/Notice.php | 14 ++++++++++++++ lib/activitycontext.php | 5 +++++ 2 files changed, 19 insertions(+) (limited to 'lib') diff --git a/classes/Notice.php b/classes/Notice.php index 3297c7a59..399879e79 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1330,24 +1330,38 @@ class Notice extends Memcached_DataObject foreach ($reply_ids as $id) { $profile = Profile::staticGet('id', $id); if (!empty($profile)) { + // XXX: Deprecate this for 'mentioned' $xs->element( 'link', array( 'rel' => 'ostatus:attention', 'href' => $profile->getUri() ) ); + $xs->element( + 'link', array( + 'rel' => 'mentioned', + 'href' => $profile->getUri() + ) + ); } } $groups = $this->getGroups(); foreach ($groups as $group) { + // XXX: Deprecate this for 'mentioned' $xs->element( 'link', array( 'rel' => 'ostatus:attention', 'href' => $group->permalink() ) ); + $xs->element( + 'link', array( + 'rel' => 'mentioned', + 'href' => $group->permalink() + ) + ); } if (!empty($this->repeat_of)) { diff --git a/lib/activitycontext.php b/lib/activitycontext.php index 2df7613f7..4e97b2ab9 100644 --- a/lib/activitycontext.php +++ b/lib/activitycontext.php @@ -51,6 +51,7 @@ class ActivityContext const POINT = 'point'; const ATTENTION = 'ostatus:attention'; + const MENTIONED = 'mentioned'; const CONVERSATION = 'ostatus:conversation'; function __construct($element) @@ -76,8 +77,12 @@ class ActivityContext $linkRel = $link->getAttribute(ActivityUtils::REL); + // XXX: Deprecate this in favour of "mentioned" from Salmon spec + // http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html#SALR if ($linkRel == self::ATTENTION) { $this->attention[] = $link->getAttribute(self::HREF); + } else if ($linkRel == self:MENTIONED) { + $this->attention[] = $link->getAttribute(self::HREF); } } } -- cgit v1.2.3-54-g00ecf From eaef724c4912ab51a1c6ebc14f1fef382b7ac2a1 Mon Sep 17 00:00:00 2001 From: James Walker Date: Mon, 2 Aug 2010 14:24:50 -0400 Subject: urgh. typo --- lib/activitycontext.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/activitycontext.php b/lib/activitycontext.php index 4e97b2ab9..5afbb7fd2 100644 --- a/lib/activitycontext.php +++ b/lib/activitycontext.php @@ -81,7 +81,7 @@ class ActivityContext // http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html#SALR if ($linkRel == self::ATTENTION) { $this->attention[] = $link->getAttribute(self::HREF); - } else if ($linkRel == self:MENTIONED) { + } elseif ($linkRel == self::MENTIONED) { $this->attention[] = $link->getAttribute(self::HREF); } } -- cgit v1.2.3-54-g00ecf