From 5e0cc07b0e687cf0d28d57ae80e5024b7e711fbd Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 5 Feb 2010 01:13:23 +0000 Subject: [PATCH 01/78] Fix issue with OAuth request parameters being parsed/stored twice when calling /api/account/verify_credentials.:format --- actions/apiaccountverifycredentials.php | 33 ++++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/actions/apiaccountverifycredentials.php b/actions/apiaccountverifycredentials.php index 1095d51626..ea61a32059 100644 --- a/actions/apiaccountverifycredentials.php +++ b/actions/apiaccountverifycredentials.php @@ -66,18 +66,21 @@ class ApiAccountVerifyCredentialsAction extends ApiAuthAction { parent::handle($args); - switch ($this->format) { - case 'xml': - case 'json': - $args['id'] = $this->auth_user->id; - $action_obj = new ApiUserShowAction(); - if ($action_obj->prepare($args)) { - $action_obj->handle($args); - } - break; - default: - header('Content-Type: text/html; charset=utf-8'); - print 'Authorized'; + if (!in_array($this->format, array('xml', 'json'))) { + $this->clientError(_('API method not found.'), $code = 404); + return; + } + + $twitter_user = $this->twitterUserArray($this->auth_user->getProfile(), true); + + if ($this->format == 'xml') { + $this->initDocument('xml'); + $this->showTwitterXmlUser($twitter_user); + $this->endDocument('xml'); + } elseif ($this->format == 'json') { + $this->initDocument('json'); + $this->showJsonObjects($twitter_user); + $this->endDocument('json'); } } @@ -86,14 +89,14 @@ class ApiAccountVerifyCredentialsAction extends ApiAuthAction * Is this action read only? * * @param array $args other arguments - * + * * @return boolean true * **/ - + function isReadOnly($args) { return true; } - + } From 82f11190734c203ed6b2fd4a07cb9460f25b2183 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 5 Feb 2010 01:24:21 +0000 Subject: [PATCH 02/78] OAuth app name should not be null --- classes/statusnet.ini | 2 +- db/statusnet.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/statusnet.ini b/classes/statusnet.ini index 4ace4407b1..2c09033f67 100644 --- a/classes/statusnet.ini +++ b/classes/statusnet.ini @@ -353,7 +353,7 @@ notice_id = K id = 129 owner = 129 consumer_key = 130 -name = 2 +name = 130 description = 2 icon = 130 source_url = 2 diff --git a/db/statusnet.sql b/db/statusnet.sql index 8946f4d7e2..3434648016 100644 --- a/db/statusnet.sql +++ b/db/statusnet.sql @@ -214,7 +214,7 @@ create table oauth_application ( id integer auto_increment primary key comment 'unique identifier', owner integer not null comment 'owner of the application' references profile (id), consumer_key varchar(255) not null comment 'application consumer key' references consumer (consumer_key), - name varchar(255) unique key comment 'name of the application', + name varchar(255) not null unique key comment 'name of the application', description varchar(255) comment 'description of the application', icon varchar(255) not null comment 'application icon', source_url varchar(255) comment 'application homepage - used for source link', From 10dfcde0b2099a169ccd3af0ecfbf2de9da551d6 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 5 Feb 2010 01:38:29 +0000 Subject: [PATCH 03/78] Actually store the timestamp on each nonce --- lib/oauthstore.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/oauthstore.php b/lib/oauthstore.php index b30fb49d57..eabe37f9fa 100644 --- a/lib/oauthstore.php +++ b/lib/oauthstore.php @@ -65,7 +65,7 @@ class StatusNetOAuthDataStore extends OAuthDataStore { $n = new Nonce(); $n->consumer_key = $consumer->key; - $n->ts = $timestamp; + $n->ts = common_sql_date($timestamp); $n->nonce = $nonce; if ($n->find(true)) { return true; @@ -362,7 +362,6 @@ class StatusNetOAuthDataStore extends OAuthDataStore array('is_local' => Notice::REMOTE_OMB, 'uri' => $omb_notice->getIdentifierURI())); - } /** From 52397f14741463cd518512e2f024b3ea7e18e136 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 1 Feb 2010 20:31:56 +0100 Subject: [PATCH 04/78] Sentence case for app statistics --- actions/showapplication.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/actions/showapplication.php b/actions/showapplication.php index a6ff425c7c..090e11882e 100644 --- a/actions/showapplication.php +++ b/actions/showapplication.php @@ -201,7 +201,7 @@ class ShowApplicationAction extends OwnerDesignAction $userCnt = $appUsers->count(); $this->raw(sprintf( - _('created by %1$s - %2$s access by default - %3$d users'), + _('Created by %1$s - %2$s access by default - %3$d users'), $profile->getBestName(), $defaultAccess, $userCnt From 8a0a89196043bc12e1fafea6d4638db5e61a181a Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 1 Feb 2010 20:32:18 +0100 Subject: [PATCH 05/78] Prevents app statistic text from wrapping around avatar --- theme/base/css/display.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 0d6395d057..2240e42afc 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -632,7 +632,8 @@ margin-bottom:18px; .entity_profile .entity_url, .entity_profile .entity_note, .entity_profile .entity_tags, -.entity_profile .entity_aliases { +.entity_profile .entity_aliases, +.entity_profile .entity_statistics { margin-left:113px; margin-bottom:4px; } From dc183f23cf3bd8e0fbd604ad2af4b12f77837bf2 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 1 Feb 2010 20:58:29 +0000 Subject: [PATCH 06/78] OAuth app names should be unique. --- actions/editapplication.php | 24 ++++++++++++++++++++++++ actions/newapplication.php | 20 ++++++++++++++++++++ classes/statusnet.ini | 3 ++- db/statusnet.sql | 2 +- 4 files changed, 47 insertions(+), 2 deletions(-) diff --git a/actions/editapplication.php b/actions/editapplication.php index 9cc3e3cead..029b622e84 100644 --- a/actions/editapplication.php +++ b/actions/editapplication.php @@ -179,6 +179,9 @@ class EditApplicationAction extends OwnerDesignAction } elseif (mb_strlen($name) > 255) { $this->showForm(_('Name is too long (max 255 chars).')); return; + } else if ($this->nameExists($name)) { + $this->showForm(_('Name already in use. Try another one.')); + return; } elseif (empty($description)) { $this->showForm(_('Description is required.')); return; @@ -260,5 +263,26 @@ class EditApplicationAction extends OwnerDesignAction common_redirect(common_local_url('oauthappssettings'), 303); } + /** + * Does the app name already exist? + * + * Checks the DB to see someone has already registered and app + * with the same name. + * + * @param string $name app name to check + * + * @return boolean true if the name already exists + */ + + function nameExists($name) + { + $newapp = Oauth_application::staticGet('name', $name); + if (!$newapp) { + return false; + } else { + return $newapp->id != $this->app->id; + } + } + } diff --git a/actions/newapplication.php b/actions/newapplication.php index c499fe7c76..ba1cca5c92 100644 --- a/actions/newapplication.php +++ b/actions/newapplication.php @@ -158,6 +158,9 @@ class NewApplicationAction extends OwnerDesignAction if (empty($name)) { $this->showForm(_('Name is required.')); return; + } else if ($this->nameExists($name)) { + $this->showForm(_('Name already in use. Try another one.')); + return; } elseif (mb_strlen($name) > 255) { $this->showForm(_('Name is too long (max 255 chars).')); return; @@ -273,5 +276,22 @@ class NewApplicationAction extends OwnerDesignAction } + /** + * Does the app name already exist? + * + * Checks the DB to see someone has already registered and app + * with the same name. + * + * @param string $name app name to check + * + * @return boolean true if the name already exists + */ + + function nameExists($name) + { + $app = Oauth_application::staticGet('name', $name); + return ($app !== false); + } + } diff --git a/classes/statusnet.ini b/classes/statusnet.ini index e28424ce2a..a535159e80 100644 --- a/classes/statusnet.ini +++ b/classes/statusnet.ini @@ -353,7 +353,7 @@ notice_id = K id = 129 owner = 129 consumer_key = 130 -name = 130 +name = 2 description = 2 icon = 130 source_url = 2 @@ -367,6 +367,7 @@ modified = 384 [oauth_application__keys] id = N +name = U [oauth_application_user] profile_id = 129 diff --git a/db/statusnet.sql b/db/statusnet.sql index 17de4fd0d4..71a6e724ca 100644 --- a/db/statusnet.sql +++ b/db/statusnet.sql @@ -214,7 +214,7 @@ create table oauth_application ( id integer auto_increment primary key comment 'unique identifier', owner integer not null comment 'owner of the application' references profile (id), consumer_key varchar(255) not null comment 'application consumer key' references consumer (consumer_key), - name varchar(255) not null comment 'name of the application', + name varchar(255) unique key comment 'name of the application', description varchar(255) comment 'description of the application', icon varchar(255) not null comment 'application icon', source_url varchar(255) comment 'application homepage - used for source link', From e495ac356c10a6abc0e10c81892830b5e198ef60 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 2 Feb 2010 06:26:03 +0000 Subject: [PATCH 07/78] Allow developers to delete OAuth applications --- actions/deleteapplication.php | 176 ++++++++++++++++++++++++++++++++++ actions/showapplication.php | 19 +++- classes/Consumer.php | 30 ++++++ classes/Oauth_application.php | 17 ++++ lib/router.php | 4 + 5 files changed, 244 insertions(+), 2 deletions(-) create mode 100644 actions/deleteapplication.php diff --git a/actions/deleteapplication.php b/actions/deleteapplication.php new file mode 100644 index 0000000000..17526e1118 --- /dev/null +++ b/actions/deleteapplication.php @@ -0,0 +1,176 @@ +. + * + * @category Action + * @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') && !defined('LACONICA')) { + exit(1); +} + +/** + * Delete an OAuth appliction + * + * @category Action + * @package StatusNet + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + */ + +class DeleteapplicationAction extends Action +{ + var $app = null; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + */ + + function prepare($args) + { + if (!parent::prepare($args)) { + return false; + } + + if (!common_logged_in()) { + $this->clientError(_('You must be logged in to delete an application.')); + return false; + } + + $id = (int)$this->arg('id'); + $this->app = Oauth_application::staticGet('id', $id); + + if (empty($this->app)) { + $this->clientError(_('Application not found.')); + return false; + } + + $cur = common_current_user(); + + if ($cur->id != $this->app->owner) { + $this->clientError(_('You are not the owner of this application.'), 401); + return false; + } + + return true; + } + + /** + * Handle request + * + * Shows a page with list of favorite notices + * + * @param array $args $_REQUEST args; handled in prepare() + * + * @return void + */ + + function handle($args) + { + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + + // CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->clientError(_('There was a problem with your session token.')); + return; + } + + if ($this->arg('no')) { + common_redirect(common_local_url('showapplication', + array('id' => $this->app->id)), 303); + } elseif ($this->arg('yes')) { + $this->handlePost(); + common_redirect(common_local_url('oauthappssettings'), 303); + } else { + $this->showPage(); + } + } + } + + function showContent() { + $this->areYouSureForm(); + } + + function title() { + return _('Delete application'); + } + + function showNoticeForm() { + // nop + } + + /** + * Confirm with user. + * + * Shows a confirmation form. + * + * @return void + */ + function areYouSureForm() + { + $id = $this->app->id; + $this->elementStart('form', array('id' => 'deleteapplication-' . $id, + 'method' => 'post', + 'class' => 'form_settings form_entity_block', + 'action' => common_local_url('deleteapplication', + array('id' => $this->app->id)))); + $this->elementStart('fieldset'); + $this->hidden('token', common_session_token()); + $this->element('legend', _('Delete application')); + $this->element('p', null, + _('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.')); + $this->submit('form_action-no', + _('No'), + 'submit form_action-primary', + 'no', + _("Do not delete this application")); + $this->submit('form_action-yes', + _('Yes'), + 'submit form_action-secondary', + 'yes', _('Delete this application')); + $this->elementEnd('fieldset'); + $this->elementEnd('form'); + } + + /** + * Actually delete the app + * + * @return void + */ + + function handlePost() + { + $this->app->delete(); + } +} + diff --git a/actions/showapplication.php b/actions/showapplication.php index 090e11882e..020d62480a 100644 --- a/actions/showapplication.php +++ b/actions/showapplication.php @@ -222,18 +222,33 @@ class ShowApplicationAction extends OwnerDesignAction $this->elementStart('li', 'entity_reset_keysecret'); $this->elementStart('form', array( - 'id' => 'forma_reset_key', + 'id' => 'form_reset_key', 'class' => 'form_reset_key', 'method' => 'POST', 'action' => common_local_url('showapplication', array('id' => $this->application->id)))); - $this->elementStart('fieldset'); $this->hidden('token', common_session_token()); $this->submit('reset', _('Reset key & secret')); $this->elementEnd('fieldset'); $this->elementEnd('form'); $this->elementEnd('li'); + + $this->elementStart('li', 'entity_delete'); + $this->elementStart('form', array( + 'id' => 'form_delete_application', + 'class' => 'form_delete_application', + 'method' => 'POST', + 'action' => common_local_url('deleteapplication', + array('id' => $this->application->id)))); + + $this->elementStart('fieldset'); + $this->hidden('token', common_session_token()); + $this->submit('delete', _('Delete')); + $this->elementEnd('fieldset'); + $this->elementEnd('form'); + $this->elementEnd('li'); + $this->elementEnd('ul'); $this->elementEnd('div'); diff --git a/classes/Consumer.php b/classes/Consumer.php index ad64a8491b..ce399f2783 100644 --- a/classes/Consumer.php +++ b/classes/Consumer.php @@ -36,4 +36,34 @@ class Consumer extends Memcached_DataObject return $cons; } + /** + * Delete a Consumer and related tokens and nonces + * + * XXX: Should this happen in an OAuthDataStore instead? + * + */ + function delete() + { + // XXX: Is there any reason NOT to do this kind of cleanup? + + $this->_deleteTokens(); + $this->_deleteNonces(); + + parent::delete(); + } + + function _deleteTokens() + { + $token = new Token(); + $token->consumer_key = $this->consumer_key; + $token->delete(); + } + + function _deleteNonces() + { + $nonce = new Nonce(); + $nonce->consumer_key = $this->consumer_key; + $nonce->delete(); + } + } diff --git a/classes/Oauth_application.php b/classes/Oauth_application.php index a6b5390872..748b642200 100644 --- a/classes/Oauth_application.php +++ b/classes/Oauth_application.php @@ -137,4 +137,21 @@ class Oauth_application extends Memcached_DataObject } } + function delete() + { + $this->_deleteAppUsers(); + + $consumer = $this->getConsumer(); + $consumer->delete(); + + parent::delete(); + } + + function _deleteAppUsers() + { + $oauser = new Oauth_application_user(); + $oauser->application_id = $this->id; + $oauser->delete(); + } + } diff --git a/lib/router.php b/lib/router.php index 4b5b8d0bb8..5981ef5d7a 100644 --- a/lib/router.php +++ b/lib/router.php @@ -152,6 +152,10 @@ class Router array('action' => 'editapplication'), array('id' => '[0-9]+') ); + $m->connect('settings/oauthapps/delete/:id', + array('action' => 'deleteapplication'), + array('id' => '[0-9]+') + ); // search From b31c79cee1565ca9bca5bcaffcbec04ddb312041 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 2 Feb 2010 07:35:54 +0000 Subject: [PATCH 08/78] Better token revocation --- actions/apioauthauthorize.php | 22 ++++++---------------- actions/oauthconnectionssettings.php | 24 +++++++++++++++--------- db/statusnet.sql | 2 +- lib/apioauthstore.php | 27 +++++++++++++++++++++++++++ 4 files changed, 49 insertions(+), 26 deletions(-) diff --git a/actions/apioauthauthorize.php b/actions/apioauthauthorize.php index 15c3a9dad5..05d925d261 100644 --- a/actions/apioauthauthorize.php +++ b/actions/apioauthauthorize.php @@ -99,24 +99,17 @@ class ApiOauthAuthorizeAction extends ApiOauthAction } else { - // XXX: make better error messages - if (empty($this->oauth_token)) { - - common_debug("No request token found."); - - $this->clientError(_('Bad request.')); + $this->clientError(_('No oauth_token parameter provided.')); return; } if (empty($this->app)) { - common_debug('No app for that token.'); - $this->clientError(_('Bad request.')); + $this->clientError(_('Invalid token.')); return; } $name = $this->app->name; - common_debug("Requesting auth for app: " . $name); $this->showForm(); } @@ -124,8 +117,6 @@ class ApiOauthAuthorizeAction extends ApiOauthAction function handlePost() { - common_debug("handlePost()"); - // check session token for CSRF protection. $token = $this->trimmed('token'); @@ -210,13 +201,9 @@ class ApiOauthAuthorizeAction extends ApiOauthAction if (!empty($this->callback)) { - // XXX: Need better way to build this redirect url. - $target_url = $this->getCallback($this->callback, array('oauth_token' => $this->oauth_token)); - common_debug("Doing callback to $target_url"); - common_redirect($target_url, 303); } else { common_debug("callback was empty!"); @@ -236,9 +223,12 @@ class ApiOauthAuthorizeAction extends ApiOauthAction } else if ($this->arg('deny')) { + $datastore = new ApiStatusNetOAuthDataStore(); + $datastore->revoke_token($this->oauth_token, 0); + $this->elementStart('p'); - $this->raw(sprintf(_("The request token %s has been denied."), + $this->raw(sprintf(_("The request token %s has been denied and revoked."), $this->oauth_token)); $this->elementEnd('p'); diff --git a/actions/oauthconnectionssettings.php b/actions/oauthconnectionssettings.php index c2e8d441b0..b1467f0d04 100644 --- a/actions/oauthconnectionssettings.php +++ b/actions/oauthconnectionssettings.php @@ -33,6 +33,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { require_once INSTALLDIR . '/lib/connectsettingsaction.php'; require_once INSTALLDIR . '/lib/applicationlist.php'; +require_once INSTALLDIR . '/lib/apioauthstore.php'; /** * Show connected OAuth applications @@ -71,11 +72,6 @@ class OauthconnectionssettingsAction extends ConnectSettingsAction return _('Connected applications'); } - function isReadOnly($args) - { - return true; - } - /** * Instructions for use * @@ -153,6 +149,13 @@ class OauthconnectionssettingsAction extends ConnectSettingsAction } } + /** + * Revoke access to an authorized OAuth application + * + * @param int $appId the ID of the application + * + */ + function revokeAccess($appId) { $cur = common_current_user(); @@ -164,6 +167,8 @@ class OauthconnectionssettingsAction extends ConnectSettingsAction return false; } + // XXX: Transaction here? + $appUser = Oauth_application_user::getByKeys($cur, $app); if (empty($appUser)) { @@ -171,12 +176,13 @@ class OauthconnectionssettingsAction extends ConnectSettingsAction return false; } - $orig = clone($appUser); - $appUser->access_type = 0; // No access - $result = $appUser->update(); + $datastore = new ApiStatusNetOAuthDataStore(); + $datastore->revoke_token($appUser->token, 1); + + $result = $appUser->delete(); if (!$result) { - common_log_db_error($orig, 'UPDATE', __FILE__); + common_log_db_error($orig, 'DELETE', __FILE__); $this->clientError(_('Unable to revoke access for app: ' . $app->id)); return false; } diff --git a/db/statusnet.sql b/db/statusnet.sql index 71a6e724ca..8946f4d7e2 100644 --- a/db/statusnet.sql +++ b/db/statusnet.sql @@ -230,7 +230,7 @@ create table oauth_application ( create table oauth_application_user ( profile_id integer not null comment 'user of the application' references profile (id), application_id integer not null comment 'id of the application' references oauth_application (id), - access_type tinyint default 0 comment 'access type, bit 1 = read, bit 2 = write, bit 3 = revoked', + access_type tinyint default 0 comment 'access type, bit 1 = read, bit 2 = write', token varchar(255) comment 'request or access token', created datetime not null comment 'date this record was created', modified timestamp comment 'date this record was modified', diff --git a/lib/apioauthstore.php b/lib/apioauthstore.php index 32110d0575..1bb11cbca5 100644 --- a/lib/apioauthstore.php +++ b/lib/apioauthstore.php @@ -159,5 +159,32 @@ class ApiStatusNetOAuthDataStore extends StatusNetOAuthDataStore } } + /** + * Revoke specified access token + * + * Revokes the token specified by $token_key. + * Throws exceptions in case of error. + * + * @param string $token_key the token to be revoked + * @param int $type type of token (0 = req, 1 = access) + * + * @access public + * + * @return void + */ + + public function revoke_token($token_key, $type = 0) { + $rt = new Token(); + $rt->tok = $token_key; + $rt->type = $type; + $rt->state = 0; + if (!$rt->find(true)) { + throw new Exception('Tried to revoke unknown token'); + } + if (!$rt->delete()) { + throw new Exception('Failed to delete revoked token'); + } + } + } From e9ecd8062a5d8223b7c0914255a24288c317d2a1 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 2 Feb 2010 07:59:28 +0000 Subject: [PATCH 09/78] Suppress notice input box on OAuth authorization page --- actions/apioauthauthorize.php | 36 +++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/actions/apioauthauthorize.php b/actions/apioauthauthorize.php index 05d925d261..2caa8d20b3 100644 --- a/actions/apioauthauthorize.php +++ b/actions/apioauthauthorize.php @@ -67,8 +67,6 @@ class ApiOauthAuthorizeAction extends ApiOauthAction { parent::prepare($args); - common_debug("apioauthauthorize"); - $this->nickname = $this->trimmed('nickname'); $this->password = $this->arg('password'); $this->oauth_token = $this->arg('oauth_token'); @@ -193,8 +191,6 @@ class ApiOauthAuthorizeAction extends ApiOauthAction // A callback specified in the app setup overrides whatever // is passed in with the request. - common_debug("Req token is authorized - doing callback"); - if (!empty($this->app->callback_url)) { $this->callback = $this->app->callback_url; } @@ -295,12 +291,15 @@ class ApiOauthAuthorizeAction extends ApiOauthAction $msg = _('The application %1$s by ' . '%2$s would like the ability ' . - 'to %3$s your account data.'); + 'to %3$s your %4$s account data. ' . + 'You should only give access to your %4$s account ' . + 'to third parties you trust.'); $this->raw(sprintf($msg, $this->app->name, $this->app->organization, - $access)); + $access, + common_config('site', 'name'))); $this->elementEnd('p'); $this->elementEnd('li'); $this->elementEnd('ul'); @@ -362,6 +361,31 @@ class ApiOauthAuthorizeAction extends ApiOauthAction function showLocalNav() { + // NOP + } + + /** + * Show site notice. + * + * @return nothing + */ + + function showSiteNotice() + { + // NOP + } + + /** + * Show notice form. + * + * Show the form for posting a new notice + * + * @return nothing + */ + + function showNoticeForm() + { + // NOP } } From 54171248847e0c535697c6b1e8ff0e89f42f0087 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 2 Feb 2010 08:47:14 +0000 Subject: [PATCH 10/78] Linkify notice source when posting from registered OAuth apps --- lib/api.php | 19 ++++++++++++++++++- lib/noticelist.php | 20 ++++++++++++++++++-- 2 files changed, 36 insertions(+), 3 deletions(-) diff --git a/lib/api.php b/lib/api.php index 10a2fae28c..f819752167 100644 --- a/lib/api.php +++ b/lib/api.php @@ -1249,10 +1249,27 @@ class ApiAction extends Action case 'api': break; default: + + $name = null; + $url = null; + $ns = Notice_source::staticGet($source); + if ($ns) { - $source_name = '' . $ns->name . ''; + $name = $ns->name; + $url = $ns->url; + } else { + $app = Oauth_application::staticGet('name', $source); + if ($app) { + $name = $app->name; + $url = $app->source_url; + } } + + if (!empty($name) && !empty($url)) { + $source_name = '' . $name . ''; + } + break; } return $source_name; diff --git a/lib/noticelist.php b/lib/noticelist.php index 85c169716a..a4a0f2651a 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -486,12 +486,28 @@ class NoticeListItem extends Widget $this->out->element('span', 'device', $source_name); break; default: + + $name = null; + $url = null; + $ns = Notice_source::staticGet($this->notice->source); + if ($ns) { + $name = $ns->name; + $url = $ns->url; + } else { + $app = Oauth_application::staticGet('name', $this->notice->source); + if ($app) { + $name = $app->name; + $url = $app->source_url; + } + } + + if (!empty($name) && !empty($url)) { $this->out->elementStart('span', 'device'); - $this->out->element('a', array('href' => $ns->url, + $this->out->element('a', array('href' => $url, 'rel' => 'external'), - $ns->name); + $name); $this->out->elementEnd('span'); } else { $this->out->element('span', 'device', $source_name); From 4041a59282c5ebb751e3763b5489be2bfef7f74a Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Tue, 2 Feb 2010 23:16:44 +0000 Subject: [PATCH 11/78] Always check for an OAuth request. This allows OAuth clients to set an auth user, similar to how they can set one via http basic auth, even if one is not required. I think I finally got this right. --- lib/apiauth.php | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/apiauth.php b/lib/apiauth.php index 99500404f9..25e2196cf2 100644 --- a/lib/apiauth.php +++ b/lib/apiauth.php @@ -55,6 +55,7 @@ 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, @@ -73,20 +74,18 @@ class ApiAuthAction extends ApiAction // NOTE: $this->auth_user has to get set in prepare(), not handle(), // because subclasses do stuff with it in their prepares. - if ($this->requiresAuth()) { + $oauthReq = $this->getOAuthRequest(); - $oauthReq = $this->getOAuthRequest(); - - if (!$oauthReq) { + if (!$oauthReq) { + if ($this->requiresAuth()) { $this->checkBasicAuthUser(true); } else { - $this->checkOAuthRequest($oauthReq); + // Check to see if a basic auth user is there even + // if one's not required + $this->checkBasicAuthUser(false); } } else { - - // Check to see if a basic auth user is there even - // if one's not required - $this->checkBasicAuthUser(false); + $this->checkOAuthRequest($oauthReq); } // Reject API calls with the wrong access level @@ -108,7 +107,6 @@ class ApiAuthAction extends ApiAction * This is to avoid doign any unnecessary DB lookups. * * @return mixed the OAuthRequest or false - * */ function getOAuthRequest() @@ -137,7 +135,6 @@ class ApiAuthAction extends ApiAction * @param OAuthRequest $request the OAuth Request * * @return nothing - * */ function checkOAuthRequest($request) From 7931875bbbfb127c0fa2f49331c137f0c6f1824a Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 3 Feb 2010 01:43:59 +0000 Subject: [PATCH 12/78] Confirm dialog for reset OAuth consumer key and secret button --- actions/editapplication.php | 2 +- actions/newapplication.php | 2 +- actions/showapplication.php | 54 +++++++++++++++++++++++++++++++++---- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/actions/editapplication.php b/actions/editapplication.php index 029b622e84..ca5dba1e49 100644 --- a/actions/editapplication.php +++ b/actions/editapplication.php @@ -266,7 +266,7 @@ class EditApplicationAction extends OwnerDesignAction /** * Does the app name already exist? * - * Checks the DB to see someone has already registered and app + * Checks the DB to see someone has already registered an app * with the same name. * * @param string $name app name to check diff --git a/actions/newapplication.php b/actions/newapplication.php index ba1cca5c92..c0c5207979 100644 --- a/actions/newapplication.php +++ b/actions/newapplication.php @@ -279,7 +279,7 @@ class NewApplicationAction extends OwnerDesignAction /** * Does the app name already exist? * - * Checks the DB to see someone has already registered and app + * Checks the DB to see someone has already registered an app * with the same name. * * @param string $name app name to check diff --git a/actions/showapplication.php b/actions/showapplication.php index 020d62480a..fa44844816 100644 --- a/actions/showapplication.php +++ b/actions/showapplication.php @@ -149,7 +149,6 @@ class ShowApplicationAction extends OwnerDesignAction function showContent() { - $cur = common_current_user(); $consumer = $this->application->getConsumer(); @@ -229,7 +228,13 @@ class ShowApplicationAction extends OwnerDesignAction array('id' => $this->application->id)))); $this->elementStart('fieldset'); $this->hidden('token', common_session_token()); - $this->submit('reset', _('Reset key & secret')); + + $this->element('input', array('type' => 'submit', + 'id' => 'reset', + 'name' => 'reset', + 'class' => 'submit', + 'value' => _('Reset key & secret'), + 'onClick' => 'return confirmReset()')); $this->elementEnd('fieldset'); $this->elementEnd('form'); $this->elementEnd('li'); @@ -291,14 +296,53 @@ class ShowApplicationAction extends OwnerDesignAction $this->elementEnd('p'); } + /** + * Add a confirm script for Consumer key/secret reset + * + * @return void + */ + + function showScripts() + { + parent::showScripts(); + + $msg = _('Are you sure you want to reset your consumer key and secret?'); + + $js = 'function confirmReset() { '; + $js .= ' var agree = confirm("' . $msg . '"); '; + $js .= ' return agree;'; + $js .= '}'; + + $this->inlineScript($js); + } + + /** + * Reset an application's Consumer key and secret + * + * XXX: Should this be moved to its own page with a confirm? + * + */ + function resetKey() { $this->application->query('BEGIN'); + $oauser = new Oauth_application_user(); + $oauser->application_id = $this->application->id; + $result = $oauser->delete(); + + if ($result === false) { + common_log_db_error($oauser, 'DELETE', __FILE__); + $this->success = false; + $this->msg = ('Unable to reset consumer key and secret.'); + $this->showPage(); + return; + } + $consumer = $this->application->getConsumer(); $result = $consumer->delete(); - if (!$result) { + if ($result === false) { common_log_db_error($consumer, 'DELETE', __FILE__); $this->success = false; $this->msg = ('Unable to reset consumer key and secret.'); @@ -310,7 +354,7 @@ class ShowApplicationAction extends OwnerDesignAction $result = $consumer->insert(); - if (!$result) { + if (empty($result)) { common_log_db_error($consumer, 'INSERT', __FILE__); $this->application->query('ROLLBACK'); $this->success = false; @@ -323,7 +367,7 @@ class ShowApplicationAction extends OwnerDesignAction $this->application->consumer_key = $consumer->consumer_key; $result = $this->application->update($orig); - if (!$result) { + if ($result === false) { common_log_db_error($application, 'UPDATE', __FILE__); $this->application->query('ROLLBACK'); $this->success = false; From 586d8e8524236c2682287f6a3b45fb572b3e3181 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 3 Feb 2010 18:13:21 +0100 Subject: [PATCH 13/78] Added right margin for notice text. Helps Conversation notices look better. --- theme/base/css/display.css | 1 + 1 file changed, 1 insertion(+) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 2240e42afc..ed8853e57e 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -1024,6 +1024,7 @@ float:none; } #content .notice .entry-title { margin-left:59px; +margin-right:7px; } .vcard .url { From af9f23c2d9db2966284e5146026ec05d4bb37367 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 4 Feb 2010 01:53:08 +0000 Subject: [PATCH 14/78] - Fix cache handling in TwitterStatusFetcher - Other stability fixes --- .../daemons/twitterstatusfetcher.php | 53 ++++++++++++++++--- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/plugins/TwitterBridge/daemons/twitterstatusfetcher.php b/plugins/TwitterBridge/daemons/twitterstatusfetcher.php index 36732ce46a..bff657eb68 100755 --- a/plugins/TwitterBridge/daemons/twitterstatusfetcher.php +++ b/plugins/TwitterBridge/daemons/twitterstatusfetcher.php @@ -2,7 +2,7 @@ is_local = Notice::GATEWAY; if (Event::handle('StartNoticeSave', array(&$notice))) { - $id = $notice->insert(); + $notice->insert(); Event::handle('EndNoticeSave', array($notice)); } @@ -270,17 +270,41 @@ class TwitterStatusFetcher extends ParallelizingDaemon Inbox::insertNotice($flink->user_id, $notice->id); - $notice->blowCaches(); + $notice->blowOnInsert(); return $notice; } + /** + * Look up a Profile by profileurl field. Profile::staticGet() was + * not working consistently. + * + * @param string $url the profile url + * + * @return mixed the first profile with that url, or null + */ + + function getProfileByUrl($nickname, $profileurl) + { + $profile = new Profile(); + $profile->nickname = $nickname; + $profile->profileurl = $profileurl; + $profile->limit(1); + + if ($profile->find()) { + $profile->fetch(); + return $profile; + } + + return null; + } + function ensureProfile($user) { // check to see if there's already a profile for this user $profileurl = 'http://twitter.com/' . $user->screen_name; - $profile = Profile::staticGet('profileurl', $profileurl); + $profile = $this->getProfileByUrl($user->screen_name, $profileurl); if (!empty($profile)) { common_debug($this->name() . @@ -292,6 +316,7 @@ class TwitterStatusFetcher extends ParallelizingDaemon return $profile->id; } else { + common_debug($this->name() . ' - Adding profile and remote profile ' . "for Twitter user: $profileurl."); @@ -306,7 +331,11 @@ class TwitterStatusFetcher extends ParallelizingDaemon $profile->profileurl = $profileurl; $profile->created = common_sql_now(); - $id = $profile->insert(); + try { + $id = $profile->insert(); + } catch(Exception $e) { + common_log(LOG_WARNING, $this->name . ' Couldn\'t insert profile - ' . $e->getMessage()); + } if (empty($id)) { common_log_db_error($profile, 'INSERT', __FILE__); @@ -326,7 +355,11 @@ class TwitterStatusFetcher extends ParallelizingDaemon $remote_pro->uri = $profileurl; $remote_pro->created = common_sql_now(); - $rid = $remote_pro->insert(); + try { + $rid = $remote_pro->insert(); + } catch (Exception $e) { + common_log(LOG_WARNING, $this->name() . ' Couldn\'t save remote profile - ' . $e->getMessage()); + } if (empty($rid)) { common_log_db_error($profile, 'INSERT', __FILE__); @@ -446,7 +479,7 @@ class TwitterStatusFetcher extends ParallelizingDaemon if ($this->fetchAvatar($url, $filename)) { $this->newAvatar($id, $size, $mediatype, $filename); } else { - common_log(LOG_WARNING, $this->id() . + common_log(LOG_WARNING, $id() . " - Problem fetching Avatar: $url"); } } @@ -507,7 +540,11 @@ class TwitterStatusFetcher extends ParallelizingDaemon $avatar->created = common_sql_now(); - $id = $avatar->insert(); + try { + $id = $avatar->insert(); + } catch (Exception $e) { + common_log(LOG_WARNING, $this->name() . ' Couldn\'t insert avatar - ' . $e->getMessage()); + } if (empty($id)) { common_log_db_error($avatar, 'INSERT', __FILE__); From 4379027432b4d35b60649624466a4c0e2abb5271 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 5 Feb 2010 01:13:23 +0000 Subject: [PATCH 15/78] Fix issue with OAuth request parameters being parsed/stored twice when calling /api/account/verify_credentials.:format --- actions/apiaccountverifycredentials.php | 33 ++++++++++++++----------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/actions/apiaccountverifycredentials.php b/actions/apiaccountverifycredentials.php index 1095d51626..ea61a32059 100644 --- a/actions/apiaccountverifycredentials.php +++ b/actions/apiaccountverifycredentials.php @@ -66,18 +66,21 @@ class ApiAccountVerifyCredentialsAction extends ApiAuthAction { parent::handle($args); - switch ($this->format) { - case 'xml': - case 'json': - $args['id'] = $this->auth_user->id; - $action_obj = new ApiUserShowAction(); - if ($action_obj->prepare($args)) { - $action_obj->handle($args); - } - break; - default: - header('Content-Type: text/html; charset=utf-8'); - print 'Authorized'; + if (!in_array($this->format, array('xml', 'json'))) { + $this->clientError(_('API method not found.'), $code = 404); + return; + } + + $twitter_user = $this->twitterUserArray($this->auth_user->getProfile(), true); + + if ($this->format == 'xml') { + $this->initDocument('xml'); + $this->showTwitterXmlUser($twitter_user); + $this->endDocument('xml'); + } elseif ($this->format == 'json') { + $this->initDocument('json'); + $this->showJsonObjects($twitter_user); + $this->endDocument('json'); } } @@ -86,14 +89,14 @@ class ApiAccountVerifyCredentialsAction extends ApiAuthAction * Is this action read only? * * @param array $args other arguments - * + * * @return boolean true * **/ - + function isReadOnly($args) { return true; } - + } From 208eec6511b13635b5feb8f100078f401cb0ce20 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 5 Feb 2010 01:24:21 +0000 Subject: [PATCH 16/78] OAuth app name should not be null --- classes/statusnet.ini | 2 +- db/statusnet.sql | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/statusnet.ini b/classes/statusnet.ini index a535159e80..5f8da7cf51 100644 --- a/classes/statusnet.ini +++ b/classes/statusnet.ini @@ -353,7 +353,7 @@ notice_id = K id = 129 owner = 129 consumer_key = 130 -name = 2 +name = 130 description = 2 icon = 130 source_url = 2 diff --git a/db/statusnet.sql b/db/statusnet.sql index 8946f4d7e2..3434648016 100644 --- a/db/statusnet.sql +++ b/db/statusnet.sql @@ -214,7 +214,7 @@ create table oauth_application ( id integer auto_increment primary key comment 'unique identifier', owner integer not null comment 'owner of the application' references profile (id), consumer_key varchar(255) not null comment 'application consumer key' references consumer (consumer_key), - name varchar(255) unique key comment 'name of the application', + name varchar(255) not null unique key comment 'name of the application', description varchar(255) comment 'description of the application', icon varchar(255) not null comment 'application icon', source_url varchar(255) comment 'application homepage - used for source link', From 857494c9c61d872b7decf69de226bba6cd250d99 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 5 Feb 2010 01:38:29 +0000 Subject: [PATCH 17/78] Actually store the timestamp on each nonce --- lib/oauthstore.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/oauthstore.php b/lib/oauthstore.php index b30fb49d57..eabe37f9fa 100644 --- a/lib/oauthstore.php +++ b/lib/oauthstore.php @@ -65,7 +65,7 @@ class StatusNetOAuthDataStore extends OAuthDataStore { $n = new Nonce(); $n->consumer_key = $consumer->key; - $n->ts = $timestamp; + $n->ts = common_sql_date($timestamp); $n->nonce = $nonce; if ($n->find(true)) { return true; @@ -362,7 +362,6 @@ class StatusNetOAuthDataStore extends OAuthDataStore array('is_local' => Notice::REMOTE_OMB, 'uri' => $omb_notice->getIdentifierURI())); - } /** From 875e1a70ce231b6b07765210328656abb353ad5b Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 5 Feb 2010 09:47:56 -0800 Subject: [PATCH 18/78] Don't spew warnings on usage of MEMCACHE_COMPRESSED constant when memcache PHP extension is not present. Switched to a locally-defined Cache::COMPRESSED, translating that to MEMCACHE_COMPRESSED in the plugin. --- classes/Memcached_DataObject.php | 2 +- lib/cache.php | 4 +++- plugins/MemcachePlugin.php | 18 ++++++++++++++++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index ab65c30ce2..dfd06b57e5 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -363,7 +363,7 @@ class Memcached_DataObject extends DB_DataObject $cached[] = clone($inst); } $inst->free(); - $c->set($ckey, $cached, MEMCACHE_COMPRESSED, $expiry); + $c->set($ckey, $cached, Cache::COMPRESSED, $expiry); return new ArrayWrapper($cached); } diff --git a/lib/cache.php b/lib/cache.php index 635c96ad4c..df6fc36493 100644 --- a/lib/cache.php +++ b/lib/cache.php @@ -47,6 +47,8 @@ class Cache var $_items = array(); static $_inst = null; + const COMPRESSED = 1; + /** * Singleton constructor * @@ -133,7 +135,7 @@ class Cache * * @param string $key The key to use for lookups * @param string $value The value to store - * @param integer $flag Flags to use, mostly ignored + * @param integer $flag Flags to use, may include Cache::COMPRESSED * @param integer $expiry Expiry value, mostly ignored * * @return boolean success flag diff --git a/plugins/MemcachePlugin.php b/plugins/MemcachePlugin.php index 2bc4b892bd..c5e74fb416 100644 --- a/plugins/MemcachePlugin.php +++ b/plugins/MemcachePlugin.php @@ -102,7 +102,7 @@ class MemcachePlugin extends Plugin * * @param string &$key in; Key to use for lookups * @param mixed &$value in; Value to associate - * @param integer &$flag in; Flag (passed through to Memcache) + * @param integer &$flag in; Flag empty or Cache::COMPRESSED * @param integer &$expiry in; Expiry (passed through to Memcache) * @param boolean &$success out; Whether the set was successful * @@ -115,7 +115,7 @@ class MemcachePlugin extends Plugin if ($expiry === null) { $expiry = $this->defaultExpiry; } - $success = $this->_conn->set($key, $value, $flag, $expiry); + $success = $this->_conn->set($key, $value, $this->flag(intval($flag)), $expiry); Event::handle('EndCacheSet', array($key, $value, $flag, $expiry)); return false; @@ -197,6 +197,20 @@ class MemcachePlugin extends Plugin } } + /** + * Translate general flags to Memcached-specific flags + * @param int $flag + * @return int + */ + protected function flag($flag) + { + $out = 0; + if ($flag & Cache::COMPRESSED == Cache::COMPRESSED) { + $out |= MEMCACHE_COMPRESSED; + } + return $out; + } + function onPluginVersion(&$versions) { $versions[] = array('name' => 'Memcache', From 558934d1ddc1c1163c6a142bfe1c4232496b25d6 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 5 Feb 2010 21:39:29 -0800 Subject: [PATCH 19/78] Store Twitter screen_name, not name, for foreign_user.nickname when saving Twitter user. --- plugins/TwitterBridge/twitterauthorization.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/TwitterBridge/twitterauthorization.php b/plugins/TwitterBridge/twitterauthorization.php index b2657ff61f..dbef438a4b 100644 --- a/plugins/TwitterBridge/twitterauthorization.php +++ b/plugins/TwitterBridge/twitterauthorization.php @@ -219,7 +219,7 @@ class TwitterauthorizationAction extends Action $user = common_current_user(); $this->saveForeignLink($user->id, $twitter_user->id, $atok); - save_twitter_user($twitter_user->id, $twitter_user->name); + save_twitter_user($twitter_user->id, $twitter_user->screen_name); } else { From 70abea3ac4034cbbfc68cdc8288fc7e2d1cea17c Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Sat, 6 Feb 2010 06:46:00 +0000 Subject: [PATCH 20/78] Delete old Twitter user record when user changes screen name instead of updating. Simpler. --- plugins/TwitterBridge/twitter.php | 54 +++++-------------------------- 1 file changed, 8 insertions(+), 46 deletions(-) diff --git a/plugins/TwitterBridge/twitter.php b/plugins/TwitterBridge/twitter.php index 33dfb788bf..de30d9ebf1 100644 --- a/plugins/TwitterBridge/twitter.php +++ b/plugins/TwitterBridge/twitter.php @@ -26,38 +26,6 @@ define('TWITTER_SERVICE', 1); // Twitter is foreign_service ID 1 require_once INSTALLDIR . '/plugins/TwitterBridge/twitterbasicauthclient.php'; require_once INSTALLDIR . '/plugins/TwitterBridge/twitteroauthclient.php'; -function updateTwitter_user($twitter_id, $screen_name) -{ - $uri = 'http://twitter.com/' . $screen_name; - $fuser = new Foreign_user(); - - $fuser->query('BEGIN'); - - // Dropping down to SQL because regular DB_DataObject udpate stuff doesn't seem - // to work so good with tables that have multiple column primary keys - - // Any time we update the uri for a forein user we have to make sure there - // are no dupe entries first -- unique constraint on the uri column - - $qry = 'UPDATE foreign_user set uri = \'\' WHERE uri = '; - $qry .= '\'' . $uri . '\'' . ' AND service = ' . TWITTER_SERVICE; - - $fuser->query($qry); - - // Update the user - - $qry = 'UPDATE foreign_user SET nickname = '; - $qry .= '\'' . $screen_name . '\'' . ', uri = \'' . $uri . '\' '; - $qry .= 'WHERE id = ' . $twitter_id . ' AND service = ' . TWITTER_SERVICE; - - $fuser->query('COMMIT'); - - $fuser->free(); - unset($fuser); - - return true; -} - function add_twitter_user($twitter_id, $screen_name) { @@ -105,7 +73,6 @@ function add_twitter_user($twitter_id, $screen_name) // Creates or Updates a Twitter user function save_twitter_user($twitter_id, $screen_name) { - // Check to see whether the Twitter user is already in the system, // and update its screen name and uri if so. @@ -115,25 +82,20 @@ function save_twitter_user($twitter_id, $screen_name) $result = true; - // Only update if Twitter screen name has changed + // Delete old record if Twitter user changed screen name if ($fuser->nickname != $screen_name) { - $result = updateTwitter_user($twitter_id, $screen_name); - - common_debug('Twitter bridge - Updated nickname (and URI) for Twitter user ' . - "$fuser->id to $screen_name, was $fuser->nickname"); + $oldname = $fuser->nickname; + $fuser->delete(); + common_log(LOG_INFO, sprintf('Twitter bridge - Updated nickname (and URI) ' . + 'for Twitter user %1$d - %2$s, was %3$s.', + $fuser->id, + $screen_name, + $oldname)); } - return $result; - - } else { return add_twitter_user($twitter_id, $screen_name); } - - $fuser->free(); - unset($fuser); - - return true; } function is_twitter_bound($notice, $flink) { From 5fdcd88176010a72b6a157170784a8aad7bf4131 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 6 Feb 2010 11:36:59 +0100 Subject: [PATCH 21/78] Moderator can make users admins of a group --- actions/groupmembers.php | 4 +++- actions/makeadmin.php | 3 ++- classes/Profile.php | 1 + lib/right.php | 1 + 4 files changed, 7 insertions(+), 2 deletions(-) diff --git a/actions/groupmembers.php b/actions/groupmembers.php index 0f47c268dd..f16e972a41 100644 --- a/actions/groupmembers.php +++ b/actions/groupmembers.php @@ -192,7 +192,9 @@ class GroupMemberListItem extends ProfileListItem { $user = common_current_user(); - if (!empty($user) && $user->id != $this->profile->id && $user->isAdmin($this->group) && + if (!empty($user) && + $user->id != $this->profile->id && + ($user->isAdmin($this->group) || $user->hasRight(Right::MAKEGROUPADMIN)) && !$this->profile->isAdmin($this->group)) { $this->out->elementStart('li', 'entity_make_admin'); $maf = new MakeAdminForm($this->out, $this->profile, $this->group, diff --git a/actions/makeadmin.php b/actions/makeadmin.php index 9ad7d6e7c8..f19348648d 100644 --- a/actions/makeadmin.php +++ b/actions/makeadmin.php @@ -87,7 +87,8 @@ class MakeadminAction extends Action return false; } $user = common_current_user(); - if (!$user->isAdmin($this->group)) { + if (!$user->isAdmin($this->group) && + !$user->hasRight(Right::MAKEGROUPADMIN)) { $this->clientError(_('Only an admin can make another user an admin.'), 401); return false; } diff --git a/classes/Profile.php b/classes/Profile.php index 1076fb2cb3..feabc25087 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -716,6 +716,7 @@ class Profile extends Memcached_DataObject switch ($right) { case Right::DELETEOTHERSNOTICE: + case Right::MAKEGROUPADMIN: case Right::SANDBOXUSER: case Right::SILENCEUSER: case Right::DELETEUSER: diff --git a/lib/right.php b/lib/right.php index 5e66eae0ed..4e9c5a918d 100644 --- a/lib/right.php +++ b/lib/right.php @@ -57,5 +57,6 @@ class Right const EMAILONREPLY = 'emailonreply'; const EMAILONSUBSCRIBE = 'emailonsubscribe'; const EMAILONFAVE = 'emailonfave'; + const MAKEGROUPADMIN = 'makegroupadmin'; } From 3833dc8c1f3f9ba5e3b12bf2715e4a4fb3adabf1 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sun, 7 Feb 2010 21:53:34 +0100 Subject: [PATCH 22/78] Localisation updates for !StatusNet from !translatewiki.net !sntrans --- locale/bg/LC_MESSAGES/statusnet.po | 66 +- locale/ca/LC_MESSAGES/statusnet.po | 5 +- locale/de/LC_MESSAGES/statusnet.po | 43 +- locale/es/LC_MESSAGES/statusnet.po | 155 +++-- locale/fr/LC_MESSAGES/statusnet.po | 6 +- locale/ia/LC_MESSAGES/statusnet.po | 920 +++++++++++++++----------- locale/it/LC_MESSAGES/statusnet.po | 11 +- locale/nl/LC_MESSAGES/statusnet.po | 10 +- locale/pt_BR/LC_MESSAGES/statusnet.po | 7 +- locale/statusnet.po | 2 +- locale/sv/LC_MESSAGES/statusnet.po | 6 +- 11 files changed, 680 insertions(+), 551 deletions(-) diff --git a/locale/bg/LC_MESSAGES/statusnet.po b/locale/bg/LC_MESSAGES/statusnet.po index 3b60491cac..91528d18c3 100644 --- a/locale/bg/LC_MESSAGES/statusnet.po +++ b/locale/bg/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:53:40+0000\n" +"PO-Revision-Date: 2010-02-07 20:31:37+0000\n" "Language-Team: Bulgarian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: bg\n" "X-Message-Group: out-statusnet\n" @@ -30,7 +30,6 @@ msgid "Site access settings" msgstr "Запазване настройките на сайта" #: actions/accessadminpanel.php:158 -#, fuzzy msgid "Registration" msgstr "Регистриране" @@ -107,9 +106,9 @@ msgid "No such user." msgstr "Няма такъв потребител" #: actions/all.php:84 -#, fuzzy, php-format +#, php-format msgid "%1$s and friends, page %2$d" -msgstr "Блокирани за %s, страница %d" +msgstr "%1$s и приятели, страница %2$d" #: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 @@ -425,9 +424,9 @@ msgstr "Неправилен псевдоним: \"%s\"" #: actions/apigroupcreate.php:273 actions/editgroup.php:228 #: actions/newgroup.php:172 -#, fuzzy, php-format +#, php-format msgid "Alias \"%s\" already in use. Try another one." -msgstr "Опитайте друг псевдоним, този вече е зает." +msgstr "Псевдонимът \"%s\" вече е зает. Опитайте друг." #: actions/apigroupcreate.php:286 actions/editgroup.php:234 #: actions/newgroup.php:178 @@ -902,9 +901,8 @@ msgid "Couldn't delete email confirmation." msgstr "Грешка при изтриване потвърждението по е-поща." #: actions/confirmaddress.php:144 -#, fuzzy msgid "Confirm address" -msgstr "Потвърждаване на адреса" +msgstr "Потвърждаване на адрес" #: actions/confirmaddress.php:159 #, php-format @@ -2057,9 +2055,9 @@ msgid "You are not a member of that group." msgstr "Не членувате в тази група." #: actions/leavegroup.php:127 -#, fuzzy, php-format +#, php-format msgid "%1$s left group %2$s" -msgstr "%s напусна групата %s" +msgstr "%1$s напусна групата %2$s" #: actions/login.php:80 actions/otp.php:62 actions/register.php:137 msgid "Already logged in." @@ -2343,7 +2341,6 @@ msgid "Notice Search" msgstr "Търсене на бележки" #: actions/othersettings.php:60 -#, fuzzy msgid "Other settings" msgstr "Други настройки" @@ -2619,7 +2616,6 @@ msgid "When to use SSL" msgstr "Кога да се използва SSL" #: actions/pathsadminpanel.php:335 -#, fuzzy msgid "SSL server" msgstr "SSL-сървър" @@ -3095,7 +3091,7 @@ msgid "" msgstr " освен тези лични данни: парола, е-поща, месинджър, телефон." #: actions/register.php:538 -#, fuzzy, php-format +#, php-format msgid "" "Congratulations, %1$s! And welcome to %%%%site.name%%%%. From here, you may " "want to...\n" @@ -3112,9 +3108,9 @@ msgid "" "\n" "Thanks for signing up and we hope you enjoy using this service." msgstr "" -"Поздравления, %s! И добре дошли в %%%%site.name%%%%! от тук можете да...\n" +"Поздравления, %1$s! И добре дошли в %%%%site.name%%%%! от тук можете да...\n" "\n" -"* Отидете в [профила си](%s) и да публикувате първата си бележка.\n" +"* Отидете в [профила си](%2$s) и да публикувате първата си бележка.\n" "* Добавите [адрес в Jabber/GTalk](%%%%action.imsettings%%%%), за да " "изпращате бележки от програмата си за моментни съобщения.\n" "* [Търсите хора](%%%%action.peoplesearch%%%%), които познавате или с които " @@ -3328,18 +3324,16 @@ msgstr "Бележката няма профил" #: actions/showapplication.php:159 lib/applicationeditform.php:180 msgid "Icon" -msgstr "" +msgstr "Икона" #: actions/showapplication.php:169 actions/version.php:195 #: lib/applicationeditform.php:195 -#, fuzzy msgid "Name" -msgstr "Псевдоним" +msgstr "Име" #: actions/showapplication.php:178 lib/applicationeditform.php:222 -#, fuzzy msgid "Organization" -msgstr "Страниране" +msgstr "Организация" #: actions/showapplication.php:187 actions/version.php:198 #: lib/applicationeditform.php:209 lib/groupeditform.php:172 @@ -3401,9 +3395,9 @@ msgid "Are you sure you want to reset your consumer key and secret?" msgstr "Наистина ли искате да изтриете тази бележка?" #: actions/showfavorites.php:79 -#, fuzzy, php-format +#, php-format msgid "%1$s's favorite notices, page %2$d" -msgstr "Любими бележки на %s" +msgstr "Любими бележки на %1$s, страница %2$d" #: actions/showfavorites.php:132 msgid "Could not retrieve favorite notices." @@ -3466,7 +3460,7 @@ msgstr "Профил на групата" #: actions/showgroup.php:263 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 msgid "URL" -msgstr "" +msgstr "URL" #: actions/showgroup.php:274 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 @@ -3475,7 +3469,7 @@ msgstr "Бележка" #: actions/showgroup.php:284 lib/groupeditform.php:184 msgid "Aliases" -msgstr "" +msgstr "Псевдоними" #: actions/showgroup.php:293 msgid "Group actions" @@ -3661,9 +3655,9 @@ msgid "You must have a valid contact email address." msgstr "Адресът на е-поща за контакт е задължителен" #: actions/siteadminpanel.php:158 -#, fuzzy, php-format +#, php-format msgid "Unknown language \"%s\"." -msgstr "Непознат език \"%s\"" +msgstr "Непознат език \"%s\"." #: actions/siteadminpanel.php:165 msgid "Invalid snapshot report URL." @@ -4300,9 +4294,9 @@ msgid "Try [searching for groups](%%action.groupsearch%%) and joining them." msgstr "" #: actions/version.php:73 -#, fuzzy, php-format +#, php-format msgid "StatusNet %s" -msgstr "Статистики" +msgstr "StatusNet %s" #: actions/version.php:153 #, php-format @@ -4340,17 +4334,15 @@ msgstr "" #: actions/version.php:189 msgid "Plugins" -msgstr "" +msgstr "Приставки" #: actions/version.php:196 lib/action.php:747 -#, fuzzy msgid "Version" -msgstr "Сесии" +msgstr "Версия" #: actions/version.php:197 -#, fuzzy msgid "Author(s)" -msgstr "Автор" +msgstr "Автор(и)" #: classes/File.php:144 #, php-format @@ -5418,11 +5410,9 @@ msgstr "" "Може да смените адреса и настройките за уведомяване по е-поща на %8$s\n" #: lib/mail.php:258 -#, fuzzy, php-format +#, php-format msgid "Bio: %s" -msgstr "" -"Биография: %s\n" -"\n" +msgstr "Биография: %s" #: lib/mail.php:286 #, php-format diff --git a/locale/ca/LC_MESSAGES/statusnet.po b/locale/ca/LC_MESSAGES/statusnet.po index bc6154421b..9eb0feb637 100644 --- a/locale/ca/LC_MESSAGES/statusnet.po +++ b/locale/ca/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:53:45+0000\n" +"PO-Revision-Date: 2010-02-07 20:31:40+0000\n" "Language-Team: Catalan\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ca\n" "X-Message-Group: out-statusnet\n" @@ -5117,6 +5117,7 @@ msgid "You are not a member of any groups." msgstr "No sou membre de cap grup." #: lib/command.php:714 +#, fuzzy msgid "You are a member of this group:" msgid_plural "You are a member of these groups:" msgstr[0] "No sou un membre del grup." diff --git a/locale/de/LC_MESSAGES/statusnet.po b/locale/de/LC_MESSAGES/statusnet.po index 9827cb8bd4..b8917d9d22 100644 --- a/locale/de/LC_MESSAGES/statusnet.po +++ b/locale/de/LC_MESSAGES/statusnet.po @@ -3,6 +3,7 @@ # Author@translatewiki.net: Bavatar # Author@translatewiki.net: Lutzgh # Author@translatewiki.net: March +# Author@translatewiki.net: McDutchie # Author@translatewiki.net: Pill # Author@translatewiki.net: Umherirrender # -- @@ -13,11 +14,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:53:50+0000\n" +"PO-Revision-Date: 2010-02-07 20:31:45+0000\n" "Language-Team: German\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: de\n" "X-Message-Group: out-statusnet\n" @@ -2360,7 +2361,6 @@ msgid "Notice Search" msgstr "Nachrichtensuche" #: actions/othersettings.php:60 -#, fuzzy msgid "Other settings" msgstr "Andere Einstellungen" @@ -2393,9 +2393,8 @@ msgid "URL shortening service is too long (max 50 chars)." msgstr "URL-Auto-Kürzungs-Dienst ist zu lang (max. 50 Zeichen)." #: actions/otp.php:69 -#, fuzzy msgid "No user ID specified." -msgstr "Keine Gruppe angegeben" +msgstr "Keine Benutzer ID angegeben" #: actions/otp.php:83 #, fuzzy @@ -2418,9 +2417,9 @@ msgid "Login token expired." msgstr "An Seite anmelden" #: actions/outbox.php:58 -#, fuzzy, php-format +#, php-format msgid "Outbox for %1$s - page %2$d" -msgstr "Postausgang von %s" +msgstr "Postausgang für %1$s - Seite %2$d" #: actions/outbox.php:61 #, php-format @@ -2531,9 +2530,8 @@ msgid "Site" msgstr "Seite" #: actions/pathsadminpanel.php:238 -#, fuzzy msgid "Server" -msgstr "Wiederherstellung" +msgstr "Server" #: actions/pathsadminpanel.php:238 msgid "Site's server hostname." @@ -2616,9 +2614,8 @@ msgid "SSL" msgstr "SSL" #: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294 -#, fuzzy msgid "Never" -msgstr "Wiederherstellung" +msgstr "Nie" #: actions/pathsadminpanel.php:324 msgid "Sometimes" @@ -2637,7 +2634,6 @@ msgid "When to use SSL" msgstr "Wann soll SSL verwendet werden" #: actions/pathsadminpanel.php:335 -#, fuzzy msgid "SSL server" msgstr "SSL-Server" @@ -2962,7 +2958,7 @@ msgstr "" #: actions/recoverpassword.php:191 msgid "Nickname or email address" -msgstr "" +msgstr "Spitzname oder e-mail Adresse" #: actions/recoverpassword.php:193 msgid "Your nickname on this server, or your registered email address." @@ -3226,20 +3222,16 @@ msgid "Couldn’t get a request token." msgstr "Konnte keinen Anfrage-Token bekommen." #: actions/repeat.php:57 -#, fuzzy msgid "Only logged-in users can repeat notices." -msgstr "Nur der Benutzer selbst kann seinen Posteingang lesen." +msgstr "Nur angemeldete Nutzer können Nachrichten wiederholen." #: actions/repeat.php:64 actions/repeat.php:71 -#, fuzzy msgid "No notice specified." -msgstr "Kein Profil angegeben." +msgstr "Keine Nachricht angegeen." #: actions/repeat.php:76 -#, fuzzy msgid "You can't repeat your own notice." -msgstr "" -"Du kannst dich nicht registrieren, wenn du die Lizenz nicht akzeptierst." +msgstr "Du kannst deine eigene Nachricht nicht wiederholen." #: actions/repeat.php:90 #, fuzzy @@ -3263,9 +3255,9 @@ msgid "Replies to %s" msgstr "Antworten an %s" #: actions/replies.php:127 -#, fuzzy, php-format +#, php-format msgid "Replies to %1$s, page %2$d" -msgstr "Antworten an %1$s auf %2$s!" +msgstr "Antworten an %1$s, Seite %2$d" #: actions/replies.php:144 #, php-format @@ -3314,9 +3306,8 @@ msgid "Replies to %1$s on %2$s!" msgstr "Antworten an %1$s auf %2$s!" #: actions/rsd.php:146 actions/version.php:157 -#, fuzzy msgid "StatusNet" -msgstr "Status gelöscht." +msgstr "StatusNet" #: actions/sandbox.php:65 actions/unsandbox.php:65 #, fuzzy @@ -5137,8 +5128,8 @@ msgstr "Du bist in keiner Gruppe Mitglied." #: lib/command.php:714 msgid "You are a member of this group:" msgid_plural "You are a member of these groups:" -msgstr[0] "Du bist kein Mitglied dieser Gruppe." -msgstr[1] "Du bist kein Mitglied dieser Gruppe." +msgstr[0] "Du bist Mitglied dieser Gruppe:" +msgstr[1] "Du bist Mitglied dieser Gruppen:" #: lib/command.php:728 msgid "" diff --git a/locale/es/LC_MESSAGES/statusnet.po b/locale/es/LC_MESSAGES/statusnet.po index f49587641f..e1d780e982 100644 --- a/locale/es/LC_MESSAGES/statusnet.po +++ b/locale/es/LC_MESSAGES/statusnet.po @@ -13,11 +13,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:53:59+0000\n" +"PO-Revision-Date: 2010-02-07 20:31:54+0000\n" "Language-Team: Spanish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: es\n" "X-Message-Group: out-statusnet\n" @@ -138,6 +138,8 @@ msgstr "Feed de los amigos de %s (Atom)" msgid "" "This is the timeline for %s and friends but no one has posted anything yet." msgstr "" +"Esta es la línea temporal de %s y amistades, pero nadie ha publicado nada " +"todavía." #: actions/all.php:132 #, php-format @@ -145,6 +147,8 @@ msgid "" "Try subscribing to more people, [join a group](%%action.groups%%) or post " "something yourself." msgstr "" +"Esta es la línea temporal de %s y amistades, pero nadie ha publicado nada " +"todavía." #: actions/all.php:134 #, php-format @@ -152,6 +156,8 @@ msgid "" "You can try to [nudge %1$s](../%2$s) from his profile or [post something to " "his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" +"Trata de suscribirte a más personas, [unirte a un grupo] (%%action.groups%%) " +"o publicar algo." #: actions/all.php:137 actions/replies.php:209 actions/showstream.php:211 #, php-format @@ -159,6 +165,8 @@ msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to his or her attention." msgstr "" +"Puede intentar [guiñar a %1$s](../%2$s) desde su perfil o [publicar algo a " +"su atención ](%%%%action.newnotice%%%%?status_textarea=%3$s)." #: actions/all.php:165 msgid "You and friends" @@ -192,9 +200,8 @@ msgstr "¡Actualizaciones de %1$s y amigos en %2$s!" #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 #: actions/apitimelineuser.php:165 actions/apiusershow.php:101 -#, fuzzy msgid "API method not found." -msgstr "¡No se encontró el método de la API!" +msgstr "Método de API no encontrado." #: actions/apiaccountupdatedeliverydevice.php:85 #: actions/apiaccountupdateprofile.php:89 @@ -215,9 +222,10 @@ msgid "" "You must specify a parameter named 'device' with a value of one of: sms, im, " "none" msgstr "" +"Tienes que especificar un parámetro llamdao 'dispositivo' con un valor a " +"elegir entre: sms, im, ninguno" #: actions/apiaccountupdatedeliverydevice.php:132 -#, fuzzy msgid "Could not update user." msgstr "No se pudo actualizar el usuario." @@ -231,7 +239,6 @@ msgid "User has no profile." msgstr "El usuario no tiene un perfil." #: actions/apiaccountupdateprofile.php:147 -#, fuzzy msgid "Could not save profile." msgstr "No se pudo guardar el perfil." @@ -256,15 +263,13 @@ msgstr "" #: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 #: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 #: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 -#, fuzzy msgid "Unable to save your design settings." -msgstr "¡No se pudo guardar tu configuración de Twitter!" +msgstr "No se pudo grabar tu configuración de diseño." #: actions/apiaccountupdateprofilebackgroundimage.php:187 #: actions/apiaccountupdateprofilecolors.php:142 -#, fuzzy msgid "Could not update your design." -msgstr "No se pudo actualizar el usuario." +msgstr "No se pudo actualizar tu diseño." #: actions/apiblockcreate.php:105 msgid "You cannot block yourself!" @@ -418,20 +423,20 @@ msgstr "¡Muchos seudónimos! El máximo es %d." #: actions/apigroupcreate.php:264 actions/editgroup.php:224 #: actions/newgroup.php:168 -#, fuzzy, php-format +#, php-format msgid "Invalid alias: \"%s\"" -msgstr "Tag no válido: '%s' " +msgstr "Alias inválido: \"%s\"" #: actions/apigroupcreate.php:273 actions/editgroup.php:228 #: actions/newgroup.php:172 -#, fuzzy, php-format +#, php-format msgid "Alias \"%s\" already in use. Try another one." -msgstr "El apodo ya existe. Prueba otro." +msgstr "El alias \"%s\" ya está en uso. Intenta usar otro." #: actions/apigroupcreate.php:286 actions/editgroup.php:234 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." -msgstr "" +msgstr "El alias no puede ser el mismo que el apodo." #: actions/apigroupismember.php:95 actions/apigroupjoin.php:104 #: actions/apigroupleave.php:104 actions/apigroupmembership.php:91 @@ -448,18 +453,18 @@ msgid "You have been blocked from that group by the admin." msgstr "Has sido bloqueado de ese grupo por el administrador." #: actions/apigroupjoin.php:138 actions/joingroup.php:124 -#, fuzzy, php-format +#, php-format msgid "Could not join user %1$s to group %2$s." -msgstr "No se puede unir usuario %s a grupo %s" +msgstr "No se pudo unir el usuario %s al grupo %s" #: actions/apigroupleave.php:114 msgid "You are not a member of this group." msgstr "No eres miembro de este grupo." #: actions/apigroupleave.php:124 actions/leavegroup.php:119 -#, fuzzy, php-format +#, php-format msgid "Could not remove user %1$s from group %2$s." -msgstr "No se pudo eliminar a usuario %s de grupo %s" +msgstr "No se pudo eliminar al usuario %1$s del grupo %2$s." #: actions/apigrouplist.php:95 #, php-format @@ -478,12 +483,11 @@ msgstr "Grupos en %s" #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." -msgstr "" +msgstr "No se ha provisto de un parámetro oauth_token." #: actions/apioauthauthorize.php:106 -#, fuzzy msgid "Invalid token." -msgstr "Tamaño inválido." +msgstr "Token inválido." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 @@ -505,19 +509,18 @@ msgstr "" "Hubo un problema con tu clave de sesión. Por favor, intenta nuevamente." #: actions/apioauthauthorize.php:135 -#, fuzzy msgid "Invalid nickname / password!" -msgstr "Usuario o contraseña inválidos." +msgstr "¡Apodo o contraseña inválidos!" #: actions/apioauthauthorize.php:159 -#, fuzzy msgid "Database error deleting OAuth application user." -msgstr "Error al configurar el usuario." +msgstr "" +"Error de la base de datos durante la eliminación del usuario de la " +"aplicación OAuth." #: actions/apioauthauthorize.php:185 -#, fuzzy msgid "Database error inserting OAuth application user." -msgstr "Error de la BD al insertar la etiqueta clave: %s" +msgstr "Error de base de datos al insertar usuario de la aplicación OAuth." #: actions/apioauthauthorize.php:214 #, php-format @@ -525,11 +528,13 @@ msgid "" "The request token %s has been authorized. Please exchange it for an access " "token." msgstr "" +"El token de solicitud %s ha sido autorizado. Por favor, cámbialo por un " +"token de acceso." #: actions/apioauthauthorize.php:227 #, php-format msgid "The request token %s has been denied and revoked." -msgstr "" +msgstr "El token de solicitud %2 ha sido denegado y revocado." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 @@ -542,7 +547,7 @@ msgstr "Envío de formulario inesperado." #: actions/apioauthauthorize.php:259 msgid "An application would like to connect to your account" -msgstr "" +msgstr "Una aplicación quisiera conectarse a tu cuenta" #: actions/apioauthauthorize.php:276 msgid "Allow or deny access" @@ -555,6 +560,9 @@ msgid "" "the ability to %3$s your %4$s account data. You should only " "give access to your %4$s account to third parties you trust." msgstr "" +"La aplicación %1$s por %2$s solicita " +"permiso para %3$s la información de tu cuenta %4$s. Sólo " +"debes dar acceso a tu cuenta %4$s a terceras partes en las que confíes." #: actions/apioauthauthorize.php:310 lib/action.php:441 msgid "Account" @@ -616,9 +624,9 @@ msgstr "No hay estado para ese ID" #: actions/apistatusesupdate.php:161 actions/newnotice.php:155 #: lib/mailhandler.php:60 -#, fuzzy, php-format +#, php-format msgid "That's too long. Max notice size is %d chars." -msgstr "Demasiado largo. La longitud máxima es de 140 caracteres. " +msgstr "La entrada es muy larga. El tamaño máximo es de %d caracteres." #: actions/apistatusesupdate.php:202 msgid "Not found" @@ -628,20 +636,22 @@ msgstr "No encontrado" #, php-format msgid "Max notice size is %d chars, including attachment URL." msgstr "" +"El tamaño máximo de la notificación es %d caracteres, incluyendo el URL " +"adjunto." #: actions/apisubscriptions.php:231 actions/apisubscriptions.php:261 msgid "Unsupported format." msgstr "Formato no soportado." #: actions/apitimelinefavorites.php:108 -#, fuzzy, php-format +#, php-format msgid "%1$s / Favorites from %2$s" -msgstr "%s / Favoritos desde %s" +msgstr "%1$s / Favoritos de %2$s" #: actions/apitimelinefavorites.php:120 -#, fuzzy, php-format +#, php-format msgid "%1$s updates favorited by %2$s / %2$s." -msgstr "%s actualizaciones favoritas por %s / %s." +msgstr "%1$s actualizaciones favoritas de %2$s / %2$s." #: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 #: actions/grouprss.php:131 actions/userrss.php:90 @@ -656,9 +666,9 @@ msgid "Updates from %1$s on %2$s!" msgstr "¡Actualizaciones de %1$s en %2$s!" #: actions/apitimelinementions.php:117 -#, fuzzy, php-format +#, php-format msgid "%1$s / Updates mentioning %2$s" -msgstr "%1$s / Actualizaciones en respuesta a %2$s" +msgstr "%1$s / Actualizaciones que mencionan %2$s" #: actions/apitimelinementions.php:127 #, php-format @@ -676,14 +686,14 @@ msgid "%s updates from everyone!" msgstr "¡Actualizaciones de todos en %s!" #: actions/apitimelineretweetedtome.php:111 -#, fuzzy, php-format +#, php-format msgid "Repeated to %s" -msgstr "Respuestas a %s" +msgstr "Repetido a %s" #: actions/apitimelineretweetsofme.php:112 -#, fuzzy, php-format +#, php-format msgid "Repeats of %s" -msgstr "Respuestas a %s" +msgstr "Repeticiones de %s" #: actions/apitimelinetag.php:102 actions/tag.php:66 #, php-format @@ -691,19 +701,17 @@ msgid "Notices tagged with %s" msgstr "Avisos marcados con %s" #: actions/apitimelinetag.php:108 actions/tagrss.php:64 -#, fuzzy, php-format +#, php-format msgid "Updates tagged with %1$s on %2$s!" -msgstr "¡Actualizaciones de %1$s en %2$s!" +msgstr "Actualizaciones etiquetadas con %1$s en %2$s!" #: actions/apiusershow.php:96 -#, fuzzy msgid "Not found." -msgstr "No se encontró." +msgstr "No encontrado." #: actions/attachment.php:73 -#, fuzzy msgid "No such attachment." -msgstr "No existe ese documento." +msgstr "No existe tal archivo adjunto." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 @@ -727,9 +735,9 @@ msgid "Avatar" msgstr "Avatar" #: actions/avatarsettings.php:78 -#, fuzzy, php-format +#, php-format msgid "You can upload your personal avatar. The maximum file size is %s." -msgstr "Puedes cargar tu avatar personal." +msgstr "Puedes subir tu imagen personal. El tamaño máximo de archivo es %s." #: actions/avatarsettings.php:106 actions/avatarsettings.php:185 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72 @@ -787,9 +795,8 @@ msgid "Avatar deleted." msgstr "Avatar actualizado" #: actions/block.php:69 -#, fuzzy msgid "You already blocked that user." -msgstr "Ya has bloqueado este usuario." +msgstr "Ya has bloqueado a este usuario." #: actions/block.php:105 actions/block.php:128 actions/groupblock.php:160 msgid "Block user" @@ -838,9 +845,9 @@ msgid "No such group." msgstr "No existe ese grupo." #: actions/blockedfromgroup.php:90 -#, fuzzy, php-format +#, php-format msgid "%s blocked profiles" -msgstr "Perfil de usuario" +msgstr "%s perfiles bloqueados" #: actions/blockedfromgroup.php:93 #, fuzzy, php-format @@ -903,7 +910,6 @@ msgid "Couldn't delete email confirmation." msgstr "No se pudo eliminar la confirmación de correo electrónico." #: actions/confirmaddress.php:144 -#, fuzzy msgid "Confirm address" msgstr "Confirmar la dirección" @@ -927,15 +933,13 @@ msgid "You must be logged in to delete an application." msgstr "Debes estar conectado para editar un grupo." #: actions/deleteapplication.php:71 -#, fuzzy msgid "Application not found." -msgstr "Aviso sin perfil" +msgstr "Aplicación no encontrada." #: actions/deleteapplication.php:78 actions/editapplication.php:77 #: actions/showapplication.php:94 -#, fuzzy msgid "You are not the owner of this application." -msgstr "No eres miembro de este grupo." +msgstr "No eres el propietario de esta aplicación." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 @@ -944,9 +948,8 @@ msgid "There was a problem with your session token." msgstr "Hubo problemas con tu clave de sesión." #: actions/deleteapplication.php:123 actions/deleteapplication.php:147 -#, fuzzy msgid "Delete application" -msgstr "No existe ese aviso." +msgstr "Eliminar la aplicación" #: actions/deleteapplication.php:149 msgid "" @@ -961,9 +964,8 @@ msgid "Do not delete this application" msgstr "No se puede eliminar este aviso." #: actions/deleteapplication.php:160 -#, fuzzy msgid "Delete this application" -msgstr "Borrar este aviso" +msgstr "Borrar esta aplicación" #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 @@ -1052,9 +1054,8 @@ msgid "Change logo" msgstr "Cambiar logo" #: actions/designadminpanel.php:380 -#, fuzzy msgid "Site logo" -msgstr "Invitar" +msgstr "Logo del sitio" #: actions/designadminpanel.php:387 #, fuzzy @@ -1067,9 +1068,8 @@ msgid "Site theme" msgstr "Aviso de sitio" #: actions/designadminpanel.php:405 -#, fuzzy msgid "Theme for the site." -msgstr "Salir de sitio" +msgstr "Tema para el sitio." #: actions/designadminpanel.php:417 lib/designsettings.php:101 msgid "Change background image" @@ -3208,9 +3208,8 @@ msgid "Remote subscribe" msgstr "Subscripción remota" #: actions/remotesubscribe.php:124 -#, fuzzy msgid "Subscribe to a remote user" -msgstr "Suscribirse a este usuario" +msgstr "Suscribirse a un usuario remoto" #: actions/remotesubscribe.php:129 msgid "User nickname" @@ -3238,14 +3237,14 @@ msgid "Invalid profile URL (bad format)" msgstr "El URL del perfil es inválido (formato incorrecto)" #: actions/remotesubscribe.php:168 -#, fuzzy msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)." -msgstr "URL de perfil no válido (ningún documento YADIS)." +msgstr "" +"No es un perfil válido URL (no se ha definido un documento YADIS o un XRDS " +"inválido)." #: actions/remotesubscribe.php:176 -#, fuzzy msgid "That’s a local profile! Login to subscribe." -msgstr "¡Es un perfil local! Ingresa para suscribirte" +msgstr "¡Este es un perfil local! Ingresa para suscribirte" #: actions/remotesubscribe.php:183 #, fuzzy @@ -3273,14 +3272,12 @@ msgid "You already repeated that notice." msgstr "Ya has bloqueado este usuario." #: actions/repeat.php:114 lib/noticelist.php:642 -#, fuzzy msgid "Repeated" -msgstr "Crear" +msgstr "Repetido" #: actions/repeat.php:119 -#, fuzzy msgid "Repeated!" -msgstr "Crear" +msgstr "¡Repetido!" #: actions/replies.php:125 actions/repliesrss.php:68 #: lib/personalgroupnav.php:105 @@ -5162,8 +5159,8 @@ msgstr "No eres miembro de ningún grupo" #: lib/command.php:714 msgid "You are a member of this group:" msgid_plural "You are a member of these groups:" -msgstr[0] "No eres miembro de este grupo." -msgstr[1] "No eres miembro de este grupo." +msgstr[0] "Eres miembro de este grupo:" +msgstr[1] "Eres miembro de estos grupos:" #: lib/command.php:728 msgid "" diff --git a/locale/fr/LC_MESSAGES/statusnet.po b/locale/fr/LC_MESSAGES/statusnet.po index 352d6bd706..bd6d1cbe6e 100644 --- a/locale/fr/LC_MESSAGES/statusnet.po +++ b/locale/fr/LC_MESSAGES/statusnet.po @@ -15,11 +15,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:09+0000\n" +"PO-Revision-Date: 2010-02-07 20:32:04+0000\n" "Language-Team: French\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: out-statusnet\n" @@ -4590,7 +4590,7 @@ msgstr "Autres " #: lib/accountsettingsaction.php:128 msgid "Other options" -msgstr "Autres options " +msgstr "Autres options" #: lib/action.php:144 #, php-format diff --git a/locale/ia/LC_MESSAGES/statusnet.po b/locale/ia/LC_MESSAGES/statusnet.po index 39b2a11a5a..e1c7d0a0cd 100644 --- a/locale/ia/LC_MESSAGES/statusnet.po +++ b/locale/ia/LC_MESSAGES/statusnet.po @@ -9,11 +9,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:22+0000\n" +"PO-Revision-Date: 2010-02-07 20:32:16+0000\n" "Language-Team: Interlingua\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: out-statusnet\n" @@ -37,7 +37,7 @@ msgstr "Private" #: actions/accessadminpanel.php:163 msgid "Prohibit anonymous users (not logged in) from viewing site?" -msgstr "Prohiber al usatores anonyme (sin session aperte) de vider le sito?" +msgstr "Prohibir al usatores anonyme (sin session aperte) de vider le sito?" #: actions/accessadminpanel.php:167 msgid "Invite only" @@ -707,7 +707,7 @@ msgstr "Non trovate." #: actions/attachment.php:73 msgid "No such attachment." -msgstr "Attachamento non existe." +msgstr "Annexo non existe." #: actions/avatarbynickname.php:59 actions/blockedfromgroup.php:73 #: actions/editgroup.php:84 actions/groupdesignsettings.php:84 @@ -733,7 +733,8 @@ msgstr "Avatar" #: actions/avatarsettings.php:78 #, php-format msgid "You can upload your personal avatar. The maximum file size is %s." -msgstr "Tu pote cargar tu avatar personal. Le dimension maxime del file es %s." +msgstr "" +"Tu pote incargar tu avatar personal. Le dimension maximal del file es %s." #: actions/avatarsettings.php:106 actions/avatarsettings.php:185 #: actions/remotesubscribe.php:191 actions/userauthorization.php:72 @@ -763,7 +764,7 @@ msgstr "Deler" #: actions/avatarsettings.php:166 actions/grouplogo.php:233 msgid "Upload" -msgstr "Cargar" +msgstr "Incargar" #: actions/avatarsettings.php:231 actions/grouplogo.php:286 msgid "Crop" @@ -1079,8 +1080,8 @@ msgid "" "You can upload a background image for the site. The maximum file size is %1" "$s." msgstr "" -"Tu pote cargar un imagine de fundo pro le sito. Le dimension maxime del file " -"es %1$s." +"Tu pote incargar un imagine de fundo pro le sito. Le dimension maximal del " +"file es %1$s." #: actions/designadminpanel.php:457 lib/designsettings.php:139 msgid "On" @@ -1334,7 +1335,7 @@ msgstr "Inviar me e-mail quando alcuno me invia un message private." #: actions/emailsettings.php:174 msgid "Send me email when someone sends me an \"@-reply\"." -msgstr "Inviar me e-mail quando alcuno me invia un \"@-responsa\"." +msgstr "Inviar me e-mail quando alcuno me invia un \"responsa @\"." #: actions/emailsettings.php:179 msgid "Allow friends to nudge me and send me an email." @@ -1508,11 +1509,11 @@ msgstr "Nulle nota." #: actions/file.php:42 msgid "No attachments." -msgstr "Nulle attachamento." +msgstr "Nulle annexo." #: actions/file.php:51 msgid "No uploaded attachments." -msgstr "Nulle attachamento cargate." +msgstr "Nulle annexo incargate." #: actions/finishremotesubscribe.php:69 msgid "Not expecting this response!" @@ -1648,8 +1649,8 @@ msgstr "Logotypo del gruppo" msgid "" "You can upload a logo image for your group. The maximum file size is %s." msgstr "" -"Tu pote cargar un imagine pro le logotypo de tu gruppo. Le dimension maxime " -"del file es %s." +"Tu pote incargar un imagine pro le logotypo de tu gruppo. Le dimension " +"maximal del file es %s." #: actions/grouplogo.php:178 msgid "User without matching profile." @@ -1923,7 +1924,7 @@ msgstr "Tu es a subscribite a iste usatores:" #: actions/invite.php:131 actions/invite.php:139 lib/command.php:306 #, php-format msgid "%1$s (%2$s)" -msgstr "" +msgstr "%1$s (%2$s)" #: actions/invite.php:136 msgid "" @@ -2105,7 +2106,7 @@ msgid "" "(%%action.register%%) a new account." msgstr "" "Aperi un session con tu nomine de usator e contrasigno. Non ha ancora un " -"nomine de usator? [Registra](%%action.register%%) un nove conto." +"nomine de usator? [Crea](%%action.register%%) un nove conto." #: actions/makeadmin.php:91 msgid "Only an admin can make another user an admin." @@ -2497,7 +2498,7 @@ msgstr "Directorio de localitates non scriptibile: %s" #: actions/pathsadminpanel.php:183 msgid "Invalid SSL server. The maximum length is 255 characters." -msgstr "Servitor SSL invalide. Le longitude maxime es 255 characteres." +msgstr "Servitor SSL invalide. Le longitude maximal es 255 characteres." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 #: lib/adminpanelaction.php:311 @@ -2876,7 +2877,7 @@ msgstr "Istes es le etiquettas recente le plus popular in %s " #, php-format msgid "No one has posted a notice with a [hashtag](%%doc.tags%%) yet." msgstr "" -"Nulle persona ha ancora publicate un nota con un [hashtag](%%doc.tags%%) yet." +"Nulle persona ha ancora publicate un nota con un [hashtag](%%doc.tags%%)." #: actions/publictagcloud.php:72 msgid "Be the first to post one!" @@ -3034,7 +3035,7 @@ msgstr "Registration succedite" #: actions/register.php:114 actions/register.php:503 lib/action.php:463 #: lib/logingroupnav.php:85 msgid "Register" -msgstr "Crear un conto" +msgstr "Crear conto" #: actions/register.php:135 msgid "Registration not allowed." @@ -3042,8 +3043,7 @@ msgstr "Registration non permittite." #: actions/register.php:198 msgid "You can't register if you don't agree to the license." -msgstr "" -"Tu non pote registrar te si tu non te declara de accordo con le licentia." +msgstr "Tu non pote crear un conto si tu non accepta le licentia." #: actions/register.php:212 msgid "Email address already exists." @@ -3063,15 +3063,15 @@ msgstr "" #: actions/register.php:425 msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required." -msgstr "1-64 minusculas o numeros, sin punctuation o spatios. Requisite." +msgstr "1-64 minusculas o numeros, sin punctuation o spatios. Requirite." #: actions/register.php:430 msgid "6 or more characters. Required." -msgstr "6 o plus characteres. Requisite." +msgstr "6 o plus characteres. Requirite." #: actions/register.php:434 msgid "Same as password above. Required." -msgstr "Identic al contrasigno hic supra. Requisite." +msgstr "Identic al contrasigno hic supra. Requirite." #: actions/register.php:438 actions/register.php:442 #: actions/siteadminpanel.php:256 lib/accountsettingsaction.php:120 @@ -3090,7 +3090,7 @@ msgstr "Nomine plus longe, preferibilemente tu nomine \"real\"" #: actions/register.php:494 msgid "My text and files are available under " -msgstr "Mi texto e files es disponibile sub " +msgstr "Mi texto e files es disponibile sub le licentia " #: actions/register.php:496 msgid "Creative Commons Attribution 3.0" @@ -3715,7 +3715,7 @@ msgstr "Le frequentia de instantaneos debe esser un numero." #: actions/siteadminpanel.php:183 msgid "Minimum text limit is 140 characters." -msgstr "Le limite minime del texto es 140 characteres." +msgstr "Le limite minimal del texto es 140 characteres." #: actions/siteadminpanel.php:189 msgid "Dupe limit must 1 or more seconds." @@ -3815,7 +3815,7 @@ msgstr "Limite de texto" #: actions/siteadminpanel.php:318 msgid "Maximum number of characters for notices." -msgstr "Numero maxime de characteres pro notas." +msgstr "Numero maximal de characteres pro notas." #: actions/siteadminpanel.php:322 msgid "Dupe limit" @@ -4348,10 +4348,12 @@ msgid "" "This site is powered by %1$s version %2$s, Copyright 2008-2010 StatusNet, " "Inc. and contributors." msgstr "" +"Iste sito es realisate per %1$s version %2$s, copyright 2008-2010 StatusNet, " +"Inc. e contributores." #: actions/version.php:161 msgid "Contributors" -msgstr "" +msgstr "Contributores" #: actions/version.php:168 msgid "" @@ -4360,6 +4362,10 @@ msgid "" "Software Foundation, either version 3 of the License, or (at your option) " "any later version. " msgstr "" +"StatusNet es software libere: vos pote redistribuer lo e/o modificar lo sub " +"le conditiones del GNU Affero General Public License como publicate per le " +"Free Software Foundation, o version 3 de iste licentia, o (a vostre " +"election) omne version plus recente. " #: actions/version.php:174 msgid "" @@ -4368,6 +4374,10 @@ msgid "" "FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License " "for more details. " msgstr "" +"Iste programma es distribuite in le sperantia que illo essera utile, ma SIN " +"ALCUN GARANTIA; sin mesmo le garantia implicite de COMMERCIABILITATE o de " +"USABILITATE PRO UN PARTICULAR SCOPO. Vide le GNU Affero General Public " +"License pro ulterior detalios. " #: actions/version.php:180 #, php-format @@ -4375,19 +4385,20 @@ msgid "" "You should have received a copy of the GNU Affero General Public License " "along with this program. If not, see %s." msgstr "" +"Un copia del GNU Affero General Public License deberea esser disponibile " +"insimul con iste programma. Si non, vide %s." #: actions/version.php:189 msgid "Plugins" -msgstr "" +msgstr "Plug-ins" #: actions/version.php:196 lib/action.php:747 -#, fuzzy msgid "Version" -msgstr "Conversation" +msgstr "Version" #: actions/version.php:197 msgid "Author(s)" -msgstr "" +msgstr "Autor(es)" #: classes/File.php:144 #, php-format @@ -4395,31 +4406,30 @@ msgid "" "No file may be larger than %d bytes and the file you sent was %d bytes. Try " "to upload a smaller version." msgstr "" +"Nulle file pote esser plus grande que %d bytes e le file que tu inviava ha %" +"d bytes. Tenta incargar un version minus grande." #: classes/File.php:154 #, php-format msgid "A file this large would exceed your user quota of %d bytes." -msgstr "" +msgstr "Un file de iste dimension excederea tu quota de usator de %d bytes." #: classes/File.php:161 #, php-format msgid "A file this large would exceed your monthly quota of %d bytes." -msgstr "" +msgstr "Un file de iste dimension excederea tu quota mensual de %d bytes." #: classes/Group_member.php:41 -#, fuzzy msgid "Group join failed." -msgstr "Profilo del gruppo" +msgstr "Le inscription al gruppo ha fallite." #: classes/Group_member.php:53 -#, fuzzy msgid "Not part of group." -msgstr "Non poteva actualisar gruppo." +msgstr "Non es membro del gruppo." #: classes/Group_member.php:60 -#, fuzzy msgid "Group leave failed." -msgstr "Profilo del gruppo" +msgstr "Le cancellation del membrato del gruppo ha fallite." #: classes/Login_token.php:76 #, php-format @@ -4428,228 +4438,232 @@ msgstr "Non poteva crear indicio de identification pro %s" #: classes/Message.php:45 msgid "You are banned from sending direct messages." -msgstr "" +msgstr "Il te es prohibite inviar messages directe." #: classes/Message.php:61 msgid "Could not insert message." -msgstr "" +msgstr "Non poteva inserer message." #: classes/Message.php:71 msgid "Could not update message with new URI." -msgstr "" +msgstr "Non poteva actualisar message con nove URI." #: classes/Notice.php:157 #, php-format msgid "DB error inserting hashtag: %s" -msgstr "" +msgstr "Error in base de datos durante insertion del marca (hashtag): %s" #: classes/Notice.php:214 msgid "Problem saving notice. Too long." -msgstr "" +msgstr "Problema salveguardar nota. Troppo longe." #: classes/Notice.php:218 msgid "Problem saving notice. Unknown user." -msgstr "" +msgstr "Problema salveguardar nota. Usator incognite." #: classes/Notice.php:223 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" +"Troppo de notas troppo rapidemente; face un pausa e publica de novo post " +"alcun minutas." #: classes/Notice.php:229 msgid "" "Too many duplicate messages too quickly; take a breather and post again in a " "few minutes." msgstr "" +"Troppo de messages duplicate troppo rapidemente; face un pausa e publica de " +"novo post alcun minutas." #: classes/Notice.php:235 msgid "You are banned from posting notices on this site." -msgstr "" +msgstr "Il te es prohibite publicar notas in iste sito." #: classes/Notice.php:294 classes/Notice.php:319 msgid "Problem saving notice." -msgstr "" +msgstr "Problema salveguardar nota." #: classes/Notice.php:788 msgid "Problem saving group inbox." -msgstr "" +msgstr "Problema salveguardar le cassa de entrata del gruppo." #: classes/Notice.php:848 #, php-format msgid "DB error inserting reply: %s" -msgstr "" +msgstr "Error del base de datos durante le insertion del responsa: %s" #: classes/Notice.php:1231 #, php-format msgid "RT @%1$s %2$s" -msgstr "" +msgstr "RT @%1$s %2$s" #: classes/User.php:385 #, php-format msgid "Welcome to %1$s, @%2$s!" -msgstr "" +msgstr "Benvenite a %1$s, @%2$s!" #: classes/User_group.php:380 msgid "Could not create group." -msgstr "" +msgstr "Non poteva crear gruppo." #: classes/User_group.php:409 msgid "Could not set group membership." -msgstr "" +msgstr "Non poteva configurar le membrato del gruppo." #: lib/accountsettingsaction.php:108 msgid "Change your profile settings" -msgstr "" +msgstr "Cambiar le optiones de tu profilo" #: lib/accountsettingsaction.php:112 msgid "Upload an avatar" -msgstr "" +msgstr "Incargar un avatar" #: lib/accountsettingsaction.php:116 msgid "Change your password" -msgstr "" +msgstr "Cambiar tu contrasigno" #: lib/accountsettingsaction.php:120 msgid "Change email handling" -msgstr "" +msgstr "Modificar le tractamento de e-mail" #: lib/accountsettingsaction.php:124 msgid "Design your profile" -msgstr "" +msgstr "Designar tu profilo" #: lib/accountsettingsaction.php:128 msgid "Other" -msgstr "" +msgstr "Altere" #: lib/accountsettingsaction.php:128 msgid "Other options" -msgstr "" +msgstr "Altere optiones" #: lib/action.php:144 -#, fuzzy, php-format +#, php-format msgid "%1$s - %2$s" -msgstr "%s quitava le gruppo %s" +msgstr "%1$s - %2$s" #: lib/action.php:159 msgid "Untitled page" -msgstr "" +msgstr "Pagina sin titulo" #: lib/action.php:433 msgid "Primary site navigation" -msgstr "" +msgstr "Navigation primari del sito" #: lib/action.php:439 msgid "Home" -msgstr "" +msgstr "Initio" #: lib/action.php:439 msgid "Personal profile and friends timeline" -msgstr "" +msgstr "Profilo personal e chronologia de amicos" #: lib/action.php:441 msgid "Change your email, avatar, password, profile" -msgstr "" +msgstr "Cambiar tu e-mail, avatar, contrasigno, profilo" #: lib/action.php:444 msgid "Connect" -msgstr "" +msgstr "Connecter" #: lib/action.php:444 msgid "Connect to services" -msgstr "" +msgstr "Connecter con servicios" #: lib/action.php:448 msgid "Change site configuration" -msgstr "" +msgstr "Modificar le configuration del sito" #: lib/action.php:452 lib/subgroupnav.php:105 msgid "Invite" -msgstr "" +msgstr "Invitar" #: lib/action.php:453 lib/subgroupnav.php:106 #, php-format msgid "Invite friends and colleagues to join you on %s" -msgstr "" +msgstr "Invitar amicos e collegas a accompaniar te in %s" #: lib/action.php:458 msgid "Logout" -msgstr "" +msgstr "Clauder session" #: lib/action.php:458 msgid "Logout from the site" -msgstr "" +msgstr "Terminar le session del sito" #: lib/action.php:463 msgid "Create an account" -msgstr "" +msgstr "Crear un conto" #: lib/action.php:466 msgid "Login to the site" -msgstr "" +msgstr "Identificar te a iste sito" #: lib/action.php:469 lib/action.php:732 msgid "Help" -msgstr "" +msgstr "Adjuta" #: lib/action.php:469 msgid "Help me!" -msgstr "" +msgstr "Adjuta me!" #: lib/action.php:472 lib/searchaction.php:127 msgid "Search" -msgstr "" +msgstr "Cercar" #: lib/action.php:472 msgid "Search for people or text" -msgstr "" +msgstr "Cercar personas o texto" #: lib/action.php:493 msgid "Site notice" -msgstr "" +msgstr "Aviso del sito" #: lib/action.php:559 msgid "Local views" -msgstr "" +msgstr "Vistas local" #: lib/action.php:625 msgid "Page notice" -msgstr "" +msgstr "Aviso de pagina" #: lib/action.php:727 msgid "Secondary site navigation" -msgstr "" +msgstr "Navigation secundari del sito" #: lib/action.php:734 msgid "About" -msgstr "" +msgstr "A proposito" #: lib/action.php:736 msgid "FAQ" -msgstr "" +msgstr "FAQ" #: lib/action.php:740 msgid "TOS" -msgstr "" +msgstr "CdS" #: lib/action.php:743 msgid "Privacy" -msgstr "" +msgstr "Confidentialitate" #: lib/action.php:745 msgid "Source" -msgstr "" +msgstr "Fonte" #: lib/action.php:749 msgid "Contact" -msgstr "" +msgstr "Contacto" #: lib/action.php:751 msgid "Badge" -msgstr "" +msgstr "Insignia" #: lib/action.php:779 msgid "StatusNet software license" -msgstr "" +msgstr "Licentia del software StatusNet" #: lib/action.php:782 #, php-format @@ -4657,11 +4671,13 @@ msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." "broughtby%%](%%site.broughtbyurl%%). " msgstr "" +"**%%site.name%%** es un servicio de microblog offerite per [%%site.broughtby%" +"%](%%site.broughtbyurl%%). " #: lib/action.php:784 #, php-format msgid "**%%site.name%%** is a microblogging service. " -msgstr "" +msgstr "**%%site.name%%** es un servicio de microblog. " #: lib/action.php:786 #, php-format @@ -4670,227 +4686,230 @@ msgid "" "s, available under the [GNU Affero General Public License](http://www.fsf." "org/licensing/licenses/agpl-3.0.html)." msgstr "" +"Le sito functiona con le software de microblog [StatusNet](http://status." +"net/), version %s, disponibile sub le [GNU Affero General Public License]" +"(http://www.fsf.org/licensing/licenses/agpl-3.0.html)." #: lib/action.php:801 msgid "Site content license" -msgstr "" +msgstr "Licentia del contento del sito" #: lib/action.php:806 #, php-format msgid "Content and data of %1$s are private and confidential." -msgstr "" +msgstr "Le contento e datos de %1$s es private e confidential." #: lib/action.php:811 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." -msgstr "" +msgstr "Contento e datos sub copyright de %1$s. Tote le derectos reservate." #: lib/action.php:814 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" +"Contento e datos sub copyright del contributores. Tote le derectos reservate." #: lib/action.php:826 msgid "All " -msgstr "" +msgstr "Totes " #: lib/action.php:831 msgid "license." -msgstr "" +msgstr "licentia." #: lib/action.php:1130 msgid "Pagination" -msgstr "" +msgstr "Pagination" #: lib/action.php:1139 msgid "After" -msgstr "" +msgstr "Post" #: lib/action.php:1147 msgid "Before" -msgstr "" +msgstr "Ante" #: lib/adminpanelaction.php:96 msgid "You cannot make changes to this site." -msgstr "" +msgstr "Tu non pote facer modificationes in iste sito." #: lib/adminpanelaction.php:107 -#, fuzzy msgid "Changes to that panel are not allowed." -msgstr "Registration non permittite." +msgstr "Le modification de iste pannello non es permittite." #: lib/adminpanelaction.php:206 msgid "showForm() not implemented." -msgstr "" +msgstr "showForm() non implementate." #: lib/adminpanelaction.php:235 msgid "saveSettings() not implemented." -msgstr "" +msgstr "saveSettings() non implementate." #: lib/adminpanelaction.php:258 msgid "Unable to delete design setting." -msgstr "" +msgstr "Impossibile deler configuration de apparentia." #: lib/adminpanelaction.php:312 msgid "Basic site configuration" -msgstr "" +msgstr "Configuration basic del sito" #: lib/adminpanelaction.php:317 msgid "Design configuration" -msgstr "" +msgstr "Configuration del apparentia" #: lib/adminpanelaction.php:322 -#, fuzzy msgid "User configuration" -msgstr "Nulle codice de confirmation." +msgstr "Configuration del usator" #: lib/adminpanelaction.php:327 msgid "Access configuration" -msgstr "" +msgstr "Configuration del accesso" #: lib/adminpanelaction.php:332 msgid "Paths configuration" -msgstr "" +msgstr "Configuration del camminos" #: lib/adminpanelaction.php:337 -#, fuzzy msgid "Sessions configuration" -msgstr "Nulle codice de confirmation." +msgstr "Configuration del sessiones" #: lib/apiauth.php:95 msgid "API resource requires read-write access, but you only have read access." msgstr "" +"Le ressource de API require accesso pro lectura e scriptura, ma tu ha " +"solmente accesso pro lectura." #: lib/apiauth.php:273 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" +"Tentativa de authentication al API fallite, pseudonymo = %1$s, proxy = %2$s, " +"IP = %3$s" #: lib/applicationeditform.php:136 msgid "Edit application" -msgstr "" +msgstr "Modificar application" #: lib/applicationeditform.php:184 msgid "Icon for this application" -msgstr "" +msgstr "Icone pro iste application" #: lib/applicationeditform.php:204 -#, fuzzy, php-format +#, php-format msgid "Describe your application in %d characters" -msgstr "Describe te e tu interesses in %d characteres" +msgstr "Describe tu application in %d characteres" #: lib/applicationeditform.php:207 msgid "Describe your application" -msgstr "" +msgstr "Describe tu application" #: lib/applicationeditform.php:216 -#, fuzzy msgid "Source URL" -msgstr "URL pro reporto" +msgstr "URL de origine" #: lib/applicationeditform.php:218 msgid "URL of the homepage of this application" -msgstr "" +msgstr "URL del pagina initial de iste application" #: lib/applicationeditform.php:224 msgid "Organization responsible for this application" -msgstr "" +msgstr "Organisation responsabile de iste application" #: lib/applicationeditform.php:230 msgid "URL for the homepage of the organization" -msgstr "" +msgstr "URL del pagina initial del organisation" #: lib/applicationeditform.php:236 msgid "URL to redirect to after authentication" -msgstr "" +msgstr "URL verso le qual rediriger post authentication" #: lib/applicationeditform.php:258 msgid "Browser" -msgstr "" +msgstr "Navigator" #: lib/applicationeditform.php:274 msgid "Desktop" -msgstr "" +msgstr "Scriptorio" #: lib/applicationeditform.php:275 msgid "Type of application, browser or desktop" -msgstr "" +msgstr "Typo de application, navigator o scriptorio" #: lib/applicationeditform.php:297 msgid "Read-only" -msgstr "" +msgstr "Lectura solmente" #: lib/applicationeditform.php:315 msgid "Read-write" -msgstr "" +msgstr "Lectura e scriptura" #: lib/applicationeditform.php:316 msgid "Default access for this application: read-only, or read-write" msgstr "" +"Accesso predefinite pro iste application: lectura solmente, o lectura e " +"scriptura" #: lib/applicationlist.php:154 -#, fuzzy msgid "Revoke" -msgstr "Remover" +msgstr "Revocar" #: lib/attachmentlist.php:87 msgid "Attachments" -msgstr "" +msgstr "Annexos" #: lib/attachmentlist.php:265 msgid "Author" -msgstr "" +msgstr "Autor" #: lib/attachmentlist.php:278 msgid "Provider" -msgstr "" +msgstr "Providitor" #: lib/attachmentnoticesection.php:67 msgid "Notices where this attachment appears" -msgstr "" +msgstr "Notas ubi iste annexo appare" #: lib/attachmenttagcloudsection.php:48 msgid "Tags for this attachment" -msgstr "" +msgstr "Etiquettas pro iste annexo" #: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 -#, fuzzy msgid "Password changing failed" -msgstr "Cambio del contrasigno" +msgstr "Cambio del contrasigno fallite" #: lib/authenticationplugin.php:233 -#, fuzzy msgid "Password changing is not allowed" -msgstr "Cambio del contrasigno" +msgstr "Cambio del contrasigno non permittite" #: lib/channel.php:138 lib/channel.php:158 msgid "Command results" -msgstr "" +msgstr "Resultatos del commando" #: lib/channel.php:210 lib/mailhandler.php:142 msgid "Command complete" -msgstr "" +msgstr "Commando complete" #: lib/channel.php:221 msgid "Command failed" -msgstr "" +msgstr "Commando fallite" #: lib/command.php:44 msgid "Sorry, this command is not yet implemented." -msgstr "" +msgstr "Pardono, iste commando non es ancora implementate." #: lib/command.php:88 -#, fuzzy, php-format +#, php-format msgid "Could not find a user with nickname %s" -msgstr "Non poteva trovar le usator de destination." +msgstr "Non poteva trovar un usator con pseudonymo %s" #: lib/command.php:92 msgid "It does not make a lot of sense to nudge yourself!" -msgstr "" +msgstr "Non ha multe senso pulsar te mesme!" #: lib/command.php:99 -#, fuzzy, php-format +#, php-format msgid "Nudge sent to %s" -msgstr "Pulsata inviate" +msgstr "Pulsata inviate a %s" #: lib/command.php:126 #, php-format @@ -4899,21 +4918,22 @@ msgid "" "Subscribers: %2$s\n" "Notices: %3$s" msgstr "" +"Subscriptiones: %1$s\n" +"Subscriptores: %2$s\n" +"Notas: %3$s" #: lib/command.php:152 lib/command.php:390 lib/command.php:451 -#, fuzzy msgid "Notice with that id does not exist" -msgstr "Nulle usator existe con iste adresse de e-mail o nomine de usator." +msgstr "Non existe un nota con iste ID" #: lib/command.php:168 lib/command.php:406 lib/command.php:467 #: lib/command.php:523 -#, fuzzy msgid "User has no last notice" -msgstr "Le usator non ha un profilo." +msgstr "Usator non ha ultime nota" #: lib/command.php:190 msgid "Notice marked as fave." -msgstr "" +msgstr "Nota marcate como favorite." #: lib/command.php:217 msgid "You are already a member of that group" @@ -4940,29 +4960,29 @@ msgid "%s left group %s" msgstr "%s quitava le gruppo %s" #: lib/command.php:309 -#, fuzzy, php-format +#, php-format msgid "Fullname: %s" -msgstr "Nomine complete" +msgstr "Nomine complete: %s" #: lib/command.php:312 lib/mail.php:254 #, php-format msgid "Location: %s" -msgstr "" +msgstr "Loco: %s" #: lib/command.php:315 lib/mail.php:256 #, php-format msgid "Homepage: %s" -msgstr "" +msgstr "Pagina personal: %s" #: lib/command.php:318 #, php-format msgid "About: %s" -msgstr "" +msgstr "A proposito: %s" #: lib/command.php:349 #, php-format msgid "Message too long - maximum is %d characters, you sent %d" -msgstr "" +msgstr "Message troppo longe - maximo es %d characteres, tu inviava %d" #: lib/command.php:367 #, php-format @@ -4971,7 +4991,7 @@ msgstr "Message directe a %s inviate" #: lib/command.php:369 msgid "Error sending direct message." -msgstr "" +msgstr "Error durante le invio del message directe." #: lib/command.php:413 msgid "Cannot repeat your own notice" @@ -4982,9 +5002,9 @@ msgid "Already repeated that notice" msgstr "Iste nota ha ja essite repetite" #: lib/command.php:426 -#, fuzzy, php-format +#, php-format msgid "Notice from %s repeated" -msgstr "Nota delite." +msgstr "Nota de %s repetite" #: lib/command.php:428 msgid "Error repeating notice." @@ -4993,93 +5013,95 @@ msgstr "Error durante le repetition del nota." #: lib/command.php:482 #, php-format msgid "Notice too long - maximum is %d characters, you sent %d" -msgstr "" +msgstr "Nota troppo longe - maximo es %d characteres, tu inviava %d" #: lib/command.php:491 -#, fuzzy, php-format +#, php-format msgid "Reply to %s sent" -msgstr "Responsas a %s" +msgstr "Responsa a %s inviate" #: lib/command.php:493 msgid "Error saving notice." -msgstr "" +msgstr "Errur durante le salveguarda del nota." #: lib/command.php:547 msgid "Specify the name of the user to subscribe to" -msgstr "" +msgstr "Specifica le nomine del usator al qual subscriber te" #: lib/command.php:554 #, php-format msgid "Subscribed to %s" -msgstr "" +msgstr "Subscribite a %s" #: lib/command.php:575 msgid "Specify the name of the user to unsubscribe from" -msgstr "" +msgstr "Specifica le nomine del usator al qual cancellar le subscription" #: lib/command.php:582 #, php-format msgid "Unsubscribed from %s" -msgstr "" +msgstr "Subscription a %s cancellate" #: lib/command.php:600 lib/command.php:623 msgid "Command not yet implemented." -msgstr "" +msgstr "Commando non ancora implementate." #: lib/command.php:603 msgid "Notification off." -msgstr "" +msgstr "Notification disactivate." #: lib/command.php:605 msgid "Can't turn off notification." -msgstr "" +msgstr "Non pote disactivar notification." #: lib/command.php:626 msgid "Notification on." -msgstr "" +msgstr "Notification activate." #: lib/command.php:628 msgid "Can't turn on notification." -msgstr "" +msgstr "Non pote activar notification." #: lib/command.php:641 msgid "Login command is disabled" -msgstr "" +msgstr "Le commando de apertura de session es disactivate" #: lib/command.php:652 #, php-format msgid "This link is useable only once, and is good for only 2 minutes: %s" msgstr "" +"Iste ligamine pote esser usate solmente un vice, e es valide durante " +"solmente 2 minutas: %s" #: lib/command.php:668 msgid "You are not subscribed to anyone." -msgstr "" +msgstr "Tu non es subscribite a alcuno." #: lib/command.php:670 msgid "You are subscribed to this person:" msgid_plural "You are subscribed to these people:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Tu es subscribite a iste persona:" +msgstr[1] "Tu es subscribite a iste personas:" #: lib/command.php:690 msgid "No one is subscribed to you." -msgstr "" +msgstr "Necuno es subscribite a te." #: lib/command.php:692 msgid "This person is subscribed to you:" msgid_plural "These people are subscribed to you:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Iste persona es subscribite a te:" +msgstr[1] "Iste personas es subscribite a te:" #: lib/command.php:712 msgid "You are not a member of any groups." -msgstr "" +msgstr "Tu non es membro de alcun gruppo." #: lib/command.php:714 msgid "You are a member of this group:" msgid_plural "You are a member of these groups:" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "Tu es membro de iste gruppo:" +msgstr[1] "Tu es membro de iste gruppos:" #: lib/command.php:728 msgid "" @@ -5121,255 +5143,295 @@ msgid "" "tracks - not yet implemented.\n" "tracking - not yet implemented.\n" msgstr "" +"Commandos:\n" +"on - activar notificationes\n" +"off - disactivar notificationes\n" +"help - monstrar iste adjuta\n" +"follow - subscriber te al usator\n" +"groups - listar le gruppos del quales tu es membro\n" +"subscriptions - listar le personas que tu seque\n" +"subscribers - listar le personas qui te seque\n" +"leave - cancellar subscription al usator\n" +"d - diriger message al usator\n" +"get - obtener ultime nota del usator\n" +"whois - obtener info de profilo del usator\n" +"fav - adder ultime nota del usator como favorite\n" +"fav # - adder nota con le ID date como favorite\n" +"repeat # - repeter le nota con le ID date\n" +"repeat - repeter le ultime nota del usator\n" +"reply # - responder al nota con le ID date\n" +"reply - responder al ultime nota del usator\n" +"join - facer te membro del gruppo\n" +"login - obtener ligamine pro aperir session al interfacie web\n" +"drop - quitar gruppo\n" +"stats - obtener tu statisticas\n" +"stop - como 'off'\n" +"quit - como 'off'\n" +"sub - como 'follow'\n" +"unsub - como 'leave'\n" +"last - como 'get'\n" +"on - non ancora implementate.\n" +"off - non ancora implementate.\n" +"nudge - rememorar un usator de scriber alique.\n" +"invite - non ancora implementate.\n" +"track - non ancora implementate.\n" +"untrack - non ancora implementate.\n" +"track off - non ancora implementate.\n" +"untrack all - non ancora implementate.\n" +"tracks - non ancora implementate.\n" +"tracking - non ancora implementate.\n" #: lib/common.php:135 msgid "No configuration file found. " -msgstr "" +msgstr "Nulle file de configuration trovate. " #: lib/common.php:136 msgid "I looked for configuration files in the following places: " -msgstr "" +msgstr "Io cercava files de configuration in le sequente locos: " #: lib/common.php:138 msgid "You may wish to run the installer to fix this." -msgstr "" +msgstr "Considera executar le installator pro reparar isto." #: lib/common.php:139 msgid "Go to the installer." -msgstr "" +msgstr "Ir al installator." #: lib/connectsettingsaction.php:110 msgid "IM" -msgstr "" +msgstr "MI" #: lib/connectsettingsaction.php:111 msgid "Updates by instant messenger (IM)" -msgstr "" +msgstr "Actualisationes per messageria instantanee (MI)" #: lib/connectsettingsaction.php:116 msgid "Updates by SMS" -msgstr "" +msgstr "Actualisationes per SMS" #: lib/connectsettingsaction.php:120 -#, fuzzy msgid "Connections" -msgstr "Conversation" +msgstr "Connexiones" #: lib/connectsettingsaction.php:121 msgid "Authorized connected applications" -msgstr "" +msgstr "Applicationes autorisate connectite" #: lib/dberroraction.php:60 msgid "Database error" -msgstr "" +msgstr "Error de base de datos" #: lib/designsettings.php:105 msgid "Upload file" -msgstr "" +msgstr "Incargar file" #: lib/designsettings.php:109 msgid "" "You can upload your personal background image. The maximum file size is 2MB." msgstr "" +"Tu pote actualisar tu imagine de fundo personal. Le dimension maximal del " +"file es 2MB." #: lib/designsettings.php:418 msgid "Design defaults restored." -msgstr "" +msgstr "Apparentia predefinite restaurate." #: lib/disfavorform.php:114 lib/disfavorform.php:140 msgid "Disfavor this notice" -msgstr "" +msgstr "Disfavorir iste nota" #: lib/favorform.php:114 lib/favorform.php:140 msgid "Favor this notice" -msgstr "" +msgstr "Favorir iste nota" #: lib/favorform.php:140 msgid "Favor" -msgstr "" +msgstr "Favorir" #: lib/feed.php:85 msgid "RSS 1.0" -msgstr "" +msgstr "RSS 1.0" #: lib/feed.php:87 msgid "RSS 2.0" -msgstr "" +msgstr "RSS 2.0" #: lib/feed.php:89 msgid "Atom" -msgstr "" +msgstr "Atom" #: lib/feed.php:91 msgid "FOAF" -msgstr "" +msgstr "Amico de un amico" #: lib/feedlist.php:64 msgid "Export data" -msgstr "" +msgstr "Exportar datos" #: lib/galleryaction.php:121 msgid "Filter tags" -msgstr "" +msgstr "Filtrar etiquettas" #: lib/galleryaction.php:131 msgid "All" -msgstr "" +msgstr "Totes" #: lib/galleryaction.php:139 msgid "Select tag to filter" -msgstr "" +msgstr "Selige etiquetta a filtrar" #: lib/galleryaction.php:140 msgid "Tag" -msgstr "" +msgstr "Etiquetta" #: lib/galleryaction.php:141 msgid "Choose a tag to narrow list" -msgstr "" +msgstr "Selige etiquetta pro reducer lista" #: lib/galleryaction.php:143 msgid "Go" -msgstr "" +msgstr "Ir" #: lib/groupeditform.php:163 msgid "URL of the homepage or blog of the group or topic" -msgstr "" +msgstr "URL del pagina initial o blog del gruppo o topico" #: lib/groupeditform.php:168 msgid "Describe the group or topic" -msgstr "" +msgstr "Describe le gruppo o topico" #: lib/groupeditform.php:170 #, php-format msgid "Describe the group or topic in %d characters" -msgstr "" +msgstr "Describe le gruppo o topico in %d characteres" #: lib/groupeditform.php:179 msgid "" "Location for the group, if any, like \"City, State (or Region), Country\"" msgstr "" +"Loco del gruppo, si existe, como \"Citate, Provincia (o Region), Pais\"" #: lib/groupeditform.php:187 #, php-format msgid "Extra nicknames for the group, comma- or space- separated, max %d" msgstr "" +"Pseudonymos additional pro le gruppo, separate per commas o spatios, max %d" #: lib/groupnav.php:85 msgid "Group" -msgstr "" +msgstr "Gruppo" #: lib/groupnav.php:101 msgid "Blocked" -msgstr "" +msgstr "Blocate" #: lib/groupnav.php:102 #, php-format msgid "%s blocked users" -msgstr "" +msgstr "%s usatores blocate" #: lib/groupnav.php:108 #, php-format msgid "Edit %s group properties" -msgstr "" +msgstr "Modificar proprietates del gruppo %s" #: lib/groupnav.php:113 msgid "Logo" -msgstr "" +msgstr "Logotypo" #: lib/groupnav.php:114 #, php-format msgid "Add or edit %s logo" -msgstr "" +msgstr "Adder o modificar logotypo de %s" #: lib/groupnav.php:120 #, php-format msgid "Add or edit %s design" -msgstr "" +msgstr "Adder o modificar apparentia de %s" #: lib/groupsbymemberssection.php:71 msgid "Groups with most members" -msgstr "" +msgstr "Gruppos con le plus membros" #: lib/groupsbypostssection.php:71 msgid "Groups with most posts" -msgstr "" +msgstr "Gruppos con le plus messages" #: lib/grouptagcloudsection.php:56 #, php-format msgid "Tags in %s group's notices" -msgstr "" +msgstr "Etiquettas in le notas del gruppo %s" #: lib/htmloutputter.php:103 msgid "This page is not available in a media type you accept" -msgstr "" +msgstr "Iste pagina non es disponibile in un formato que tu accepta" #: lib/imagefile.php:75 #, php-format msgid "That file is too big. The maximum file size is %s." -msgstr "" +msgstr "Iste file es troppo grande. Le dimension maximal es %s." #: lib/imagefile.php:80 msgid "Partial upload." -msgstr "" +msgstr "Incargamento partial." #: lib/imagefile.php:88 lib/mediafile.php:170 msgid "System error uploading file." -msgstr "" +msgstr "Error de systema durante le incargamento del file." #: lib/imagefile.php:96 msgid "Not an image or corrupt file." -msgstr "" +msgstr "Le file non es un imagine o es defecte." #: lib/imagefile.php:105 msgid "Unsupported image file format." -msgstr "" +msgstr "Formato de file de imagine non supportate." #: lib/imagefile.php:118 msgid "Lost our file." -msgstr "" +msgstr "File perdite." #: lib/imagefile.php:150 lib/imagefile.php:197 msgid "Unknown file type" -msgstr "" +msgstr "Typo de file incognite" #: lib/imagefile.php:217 msgid "MB" -msgstr "" +msgstr "MB" #: lib/imagefile.php:219 msgid "kB" -msgstr "" +msgstr "KB" #: lib/jabber.php:220 #, php-format msgid "[%s]" -msgstr "" +msgstr "[%s]" #: lib/jabber.php:400 -#, fuzzy, php-format +#, php-format msgid "Unknown inbox source %d." -msgstr "Lingua \"%s\" incognite" +msgstr "Fonte de cassa de entrata \"%s\" incognite" #: lib/joinform.php:114 msgid "Join" -msgstr "" +msgstr "Inscriber" #: lib/leaveform.php:114 msgid "Leave" -msgstr "" +msgstr "Quitar" #: lib/logingroupnav.php:80 msgid "Login with a username and password" -msgstr "" +msgstr "Aperir session con nomine de usator e contrasigno" #: lib/logingroupnav.php:86 msgid "Sign up for a new account" -msgstr "" +msgstr "Crear un nove conto" #: lib/mail.php:172 msgid "Email address confirmation" -msgstr "" +msgstr "Confirmation del adresse de e-mail" #: lib/mail.php:174 #, php-format @@ -5387,11 +5449,23 @@ msgid "" "Thanks for your time, \n" "%s\n" msgstr "" +"Salute %s,\n" +"\n" +"Alcuno entrava ante un momento iste adresse de e-mail in %s.\n" +"\n" +"Si isto esseva tu, e tu vole confirmar le adresse, usa le URL hic infra:\n" +"\n" +"%s\n" +"\n" +"Si non, simplemente ignora iste message.\n" +"\n" +"Gratias pro tu attention,\n" +"%s\n" #: lib/mail.php:236 #, php-format msgid "%1$s is now listening to your notices on %2$s." -msgstr "" +msgstr "%1$s seque ora tu notas in %2$s." #: lib/mail.php:241 #, php-format @@ -5407,16 +5481,26 @@ msgid "" "----\n" "Change your email address or notification options at %8$s\n" msgstr "" +"%1$s seque ora tu notas in %2$s.\n" +"\n" +"%3$s\n" +"\n" +"%4$s%5$s%6$s\n" +"Cordialmente,\n" +"%7$s.\n" +"\n" +"----\n" +"Cambia tu adresse de e-mail o optiones de notification a %8$s\n" #: lib/mail.php:258 -#, fuzzy, php-format +#, php-format msgid "Bio: %s" -msgstr "Bio" +msgstr "Bio: %s" #: lib/mail.php:286 #, php-format msgid "New email address for posting to %s" -msgstr "" +msgstr "Nove adresse de e-mail pro publicar in %s" #: lib/mail.php:289 #, php-format @@ -5430,20 +5514,28 @@ msgid "" "Faithfully yours,\n" "%4$s" msgstr "" +"Tu ha un nove adresse pro publication in %1$s.\n" +"\n" +"Invia e-mail a %2$s pro publicar nove messages.\n" +"\n" +"Ulterior informationes se trova a %3$s.\n" +"\n" +"Cordialmente,\n" +"%4$s" #: lib/mail.php:413 #, php-format msgid "%s status" -msgstr "" +msgstr "Stato de %s" #: lib/mail.php:439 msgid "SMS confirmation" -msgstr "" +msgstr "Confirmation SMS" #: lib/mail.php:463 #, php-format msgid "You've been nudged by %s" -msgstr "" +msgstr "%s te ha pulsate" #: lib/mail.php:467 #, php-format @@ -5460,11 +5552,22 @@ msgid "" "With kind regards,\n" "%4$s\n" msgstr "" +"%1$s (%2$s) se demanda lo que tu face iste dies e te invita a scriber alique " +"de nove.\n" +"\n" +"Dunque face audir de te :)\n" +"\n" +"%3$s\n" +"\n" +"Non responde a iste message; le responsa non arrivara.\n" +"\n" +"Con salutes cordial,\n" +"%4$s\n" #: lib/mail.php:510 #, php-format msgid "New private message from %s" -msgstr "" +msgstr "Nove message private de %s" #: lib/mail.php:514 #, php-format @@ -5484,11 +5587,25 @@ msgid "" "With kind regards,\n" "%5$s\n" msgstr "" +"%1$s (%2$s) te ha inviate un message private:\n" +"\n" +"------------------------------------------------------\n" +"%3$s\n" +"------------------------------------------------------\n" +"\n" +"Tu pote responder a su message hic:\n" +"\n" +"%4$s\n" +"\n" +"Non responde per e-mail; le responsa non arrivara.\n" +"\n" +"Con salutes cordial,\n" +"%5$s\n" #: lib/mail.php:559 #, php-format msgid "%s (@%s) added your notice as a favorite" -msgstr "" +msgstr "%s (@%s) ha addite tu nota como favorite" #: lib/mail.php:561 #, php-format @@ -5510,11 +5627,28 @@ msgid "" "Faithfully yours,\n" "%6$s\n" msgstr "" +"%1$s (@%7$s) addeva ante un momento tu nota de %2$s como un de su " +"favorites.\n" +"\n" +"Le URL de tu nota es:\n" +"\n" +"%3$s\n" +"\n" +"Le texto de tu nota es:\n" +"\n" +"%4$s\n" +"\n" +"Tu pote vider le lista del favorites de %1$s hic:\n" +"\n" +"%5$s\n" +"\n" +"Cordialmente,\n" +"%6$s\n" #: lib/mail.php:624 #, php-format msgid "%s (@%s) sent a notice to your attention" -msgstr "" +msgstr "%s (@%s) ha inviate un nota a tu attention" #: lib/mail.php:626 #, php-format @@ -5530,168 +5664,185 @@ msgid "" "\t%4$s\n" "\n" msgstr "" +"%1$s (@%9$s) inviava ante un momento un nota a tu attention (un 'responsa " +"@') in %2$s.\n" +"\n" +"Le nota es hic:\n" +"\n" +"%3$s\n" +"\n" +"Le texto:\n" +"\n" +"%4$s\n" +"\n" #: lib/mailbox.php:89 msgid "Only the user can read their own mailboxes." -msgstr "" +msgstr "Solmente le usator pote leger su proprie cassas postal." #: 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 "" +"Tu non ha messages private. Tu pote inviar messages private pro ingagiar " +"altere usatores in conversation. Altere personas pote inviar te messages que " +"solmente tu pote leger." #: lib/mailbox.php:227 lib/noticelist.php:477 msgid "from" -msgstr "" +msgstr "de" #: lib/mailhandler.php:37 msgid "Could not parse message." -msgstr "" +msgstr "Non comprendeva le syntaxe del message." #: lib/mailhandler.php:42 msgid "Not a registered user." -msgstr "" +msgstr "Non un usator registrate." #: lib/mailhandler.php:46 msgid "Sorry, that is not your incoming email address." -msgstr "" +msgstr "Pardono, isto non es tu adresse de e-mail entrante." #: lib/mailhandler.php:50 msgid "Sorry, no incoming email allowed." -msgstr "" +msgstr "Pardono, le reception de e-mail non es permittite." #: lib/mailhandler.php:228 -#, fuzzy, php-format +#, php-format msgid "Unsupported message type: %s" -msgstr "Formato non supportate." +msgstr "Typo de message non supportate: %s" #: lib/mediafile.php:98 lib/mediafile.php:123 msgid "There was a database error while saving your file. Please try again." msgstr "" +"Un error de base de datos occurreva durante le salveguarda de tu file. Per " +"favor reproba." #: lib/mediafile.php:142 msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini." -msgstr "" +msgstr "Le file incargate excede le directiva upload_max_filesize in php.ini." #: lib/mediafile.php:147 msgid "" "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " "the HTML form." msgstr "" +"Le file incargate excede le directiva MAX_FILE_SIZE specificate in le " +"formulario HTML." #: lib/mediafile.php:152 msgid "The uploaded file was only partially uploaded." -msgstr "" +msgstr "Le file incargate ha solmente essite incargate partialmente." #: lib/mediafile.php:159 msgid "Missing a temporary folder." -msgstr "" +msgstr "Manca un dossier temporari." #: lib/mediafile.php:162 msgid "Failed to write file to disk." -msgstr "" +msgstr "Falleva de scriber le file in disco." #: lib/mediafile.php:165 msgid "File upload stopped by extension." -msgstr "" +msgstr "Incargamento de file stoppate per un extension." #: lib/mediafile.php:179 lib/mediafile.php:216 msgid "File exceeds user's quota." -msgstr "" +msgstr "File excede quota del usator." #: lib/mediafile.php:196 lib/mediafile.php:233 msgid "File could not be moved to destination directory." -msgstr "" +msgstr "File non poteva esser displaciate in le directorio de destination." #: lib/mediafile.php:201 lib/mediafile.php:237 -#, fuzzy msgid "Could not determine file's MIME type." -msgstr "Non poteva determinar le usator de origine." +msgstr "Non poteva determinar le typo MIME del file." #: lib/mediafile.php:270 #, php-format msgid " Try using another %s format." -msgstr "" +msgstr " Tenta usar un altere formato %s." #: lib/mediafile.php:275 #, php-format msgid "%s is not a supported file type on this server." -msgstr "" +msgstr "%s non es un typo de file supportate in iste servitor." #: lib/messageform.php:120 msgid "Send a direct notice" -msgstr "" +msgstr "Inviar un nota directe" #: lib/messageform.php:146 msgid "To" -msgstr "" +msgstr "A" #: lib/messageform.php:159 lib/noticeform.php:185 msgid "Available characters" -msgstr "" +msgstr "Characteres disponibile" #: lib/noticeform.php:160 msgid "Send a notice" -msgstr "" +msgstr "Inviar un nota" #: lib/noticeform.php:173 #, php-format msgid "What's up, %s?" -msgstr "" +msgstr "Como sta, %s?" #: lib/noticeform.php:192 msgid "Attach" -msgstr "" +msgstr "Annexar" #: lib/noticeform.php:196 msgid "Attach a file" -msgstr "" +msgstr "Annexar un file" #: lib/noticeform.php:212 -#, fuzzy msgid "Share my location" -msgstr "Non poteva salveguardar le preferentias de loco." +msgstr "Divulgar mi loco" #: lib/noticeform.php:215 -#, fuzzy msgid "Do not share my location" -msgstr "Non poteva salveguardar le preferentias de loco." +msgstr "Non divulgar mi loco" #: lib/noticeform.php:216 msgid "" "Sorry, retrieving your geo location is taking longer than expected, please " "try again later" msgstr "" +"Pardono, le obtention de tu geolocalisation prende plus tempore que " +"previste. Per favor reproba plus tarde." #: lib/noticelist.php:428 #, php-format msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" -msgstr "" +msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" #: lib/noticelist.php:429 msgid "N" -msgstr "" +msgstr "N" #: lib/noticelist.php:429 msgid "S" -msgstr "" +msgstr "S" #: lib/noticelist.php:430 msgid "E" -msgstr "" +msgstr "E" #: lib/noticelist.php:430 msgid "W" -msgstr "" +msgstr "W" #: lib/noticelist.php:436 msgid "at" -msgstr "" +msgstr "a" #: lib/noticelist.php:547 msgid "in context" -msgstr "" +msgstr "in contexto" #: lib/noticelist.php:572 msgid "Repeated by" @@ -5699,151 +5850,148 @@ msgstr "Repetite per" #: lib/noticelist.php:598 msgid "Reply to this notice" -msgstr "" +msgstr "Responder a iste nota" #: lib/noticelist.php:599 msgid "Reply" -msgstr "" +msgstr "Responder" #: lib/noticelist.php:641 -#, fuzzy msgid "Notice repeated" -msgstr "Nota delite." +msgstr "Nota repetite" #: lib/nudgeform.php:116 msgid "Nudge this user" -msgstr "" +msgstr "Pulsar iste usator" #: lib/nudgeform.php:128 msgid "Nudge" -msgstr "" +msgstr "Pulsar" #: lib/nudgeform.php:128 msgid "Send a nudge to this user" -msgstr "" +msgstr "Inviar un pulsata a iste usator" #: lib/oauthstore.php:283 msgid "Error inserting new profile" -msgstr "" +msgstr "Error durante le insertion del nove profilo" #: lib/oauthstore.php:291 msgid "Error inserting avatar" -msgstr "" +msgstr "Error durante le insertion del avatar" #: lib/oauthstore.php:311 msgid "Error inserting remote profile" -msgstr "" +msgstr "Error durante le insertion del profilo remote" #: lib/oauthstore.php:345 msgid "Duplicate notice" -msgstr "" +msgstr "Duplicar nota" #: lib/oauthstore.php:465 lib/subs.php:48 msgid "You have been banned from subscribing." -msgstr "" +msgstr "Tu ha essite blocate del subscription." #: lib/oauthstore.php:490 msgid "Couldn't insert new subscription." -msgstr "" +msgstr "Non poteva inserer nove subscription." #: lib/personalgroupnav.php:99 msgid "Personal" -msgstr "" +msgstr "Personal" #: lib/personalgroupnav.php:104 msgid "Replies" -msgstr "" +msgstr "Responsas" #: lib/personalgroupnav.php:114 msgid "Favorites" -msgstr "" +msgstr "Favorites" #: lib/personalgroupnav.php:125 msgid "Inbox" -msgstr "" +msgstr "Cassa de entrata" #: lib/personalgroupnav.php:126 msgid "Your incoming messages" -msgstr "" +msgstr "Tu messages recipite" #: lib/personalgroupnav.php:130 msgid "Outbox" -msgstr "" +msgstr "Cassa de exito" #: lib/personalgroupnav.php:131 msgid "Your sent messages" -msgstr "" +msgstr "Tu messages inviate" #: lib/personaltagcloudsection.php:56 #, php-format msgid "Tags in %s's notices" -msgstr "" +msgstr "Etiquettas in le notas de %s" #: lib/plugin.php:114 -#, fuzzy msgid "Unknown" -msgstr "Action incognite" +msgstr "Incognite" #: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82 msgid "Subscriptions" -msgstr "" +msgstr "Subscriptiones" #: lib/profileaction.php:126 msgid "All subscriptions" -msgstr "" +msgstr "Tote le subscriptiones" #: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90 msgid "Subscribers" -msgstr "" +msgstr "Subscriptores" #: lib/profileaction.php:157 msgid "All subscribers" -msgstr "" +msgstr "Tote le subscriptores" #: lib/profileaction.php:178 msgid "User ID" -msgstr "" +msgstr "ID del usator" #: lib/profileaction.php:183 msgid "Member since" -msgstr "" +msgstr "Membro depost" #: lib/profileaction.php:245 msgid "All groups" -msgstr "" +msgstr "Tote le gruppos" #: lib/profileformaction.php:123 msgid "No return-to arguments." -msgstr "" +msgstr "Nulle parametro return-to." #: lib/profileformaction.php:137 msgid "Unimplemented method." -msgstr "" +msgstr "Methodo non implementate." #: lib/publicgroupnav.php:78 msgid "Public" -msgstr "" +msgstr "Public" #: lib/publicgroupnav.php:82 msgid "User groups" -msgstr "" +msgstr "Gruppos de usatores" #: lib/publicgroupnav.php:84 lib/publicgroupnav.php:85 msgid "Recent tags" -msgstr "" +msgstr "Etiquettas recente" #: lib/publicgroupnav.php:88 msgid "Featured" -msgstr "" +msgstr "In evidentia" #: lib/publicgroupnav.php:92 msgid "Popular" -msgstr "" +msgstr "Popular" #: lib/repeatform.php:107 -#, fuzzy msgid "Repeat this notice?" -msgstr "Repeter iste nota" +msgstr "Repeter iste nota?" #: lib/repeatform.php:132 msgid "Repeat this notice" @@ -5851,228 +5999,228 @@ msgstr "Repeter iste nota" #: lib/router.php:665 msgid "No single user defined for single-user mode." -msgstr "" +msgstr "Nulle signule usator definite pro le modo de singule usator." #: lib/sandboxform.php:67 msgid "Sandbox" -msgstr "" +msgstr "Cassa de sablo" #: lib/sandboxform.php:78 msgid "Sandbox this user" -msgstr "" +msgstr "Mitter iste usator in le cassa de sablo" #: lib/searchaction.php:120 msgid "Search site" -msgstr "" +msgstr "Cercar in sito" #: lib/searchaction.php:126 msgid "Keyword(s)" -msgstr "" +msgstr "Parola(s)-clave" #: lib/searchaction.php:162 msgid "Search help" -msgstr "" +msgstr "Adjuta super le recerca" #: lib/searchgroupnav.php:80 msgid "People" -msgstr "" +msgstr "Personas" #: lib/searchgroupnav.php:81 msgid "Find people on this site" -msgstr "" +msgstr "Cercar personas in iste sito" #: lib/searchgroupnav.php:83 msgid "Find content of notices" -msgstr "" +msgstr "Cercar in contento de notas" #: lib/searchgroupnav.php:85 msgid "Find groups on this site" -msgstr "" +msgstr "Cercar gruppos in iste sito" #: lib/section.php:89 msgid "Untitled section" -msgstr "" +msgstr "Section sin titulo" #: lib/section.php:106 msgid "More..." -msgstr "" +msgstr "Plus…" #: lib/silenceform.php:67 msgid "Silence" -msgstr "" +msgstr "Silentiar" #: lib/silenceform.php:78 msgid "Silence this user" -msgstr "" +msgstr "Silentiar iste usator" #: lib/subgroupnav.php:83 #, php-format msgid "People %s subscribes to" -msgstr "" +msgstr "Personas que %s seque" #: lib/subgroupnav.php:91 #, php-format msgid "People subscribed to %s" -msgstr "" +msgstr "Personas qui seque %s" #: lib/subgroupnav.php:99 #, php-format msgid "Groups %s is a member of" -msgstr "" +msgstr "Gruppos del quales %s es membro" #: lib/subs.php:52 msgid "Already subscribed!" -msgstr "" +msgstr "Ja subscribite!" #: lib/subs.php:56 msgid "User has blocked you." -msgstr "" +msgstr "Le usator te ha blocate." #: lib/subs.php:63 msgid "Could not subscribe." -msgstr "" +msgstr "Non poteva subscriber te." #: lib/subs.php:82 msgid "Could not subscribe other to you." -msgstr "" +msgstr "Non poteva subcriber altere persona a te." #: lib/subs.php:137 msgid "Not subscribed!" -msgstr "" +msgstr "Non subscribite!" #: lib/subs.php:142 msgid "Couldn't delete self-subscription." -msgstr "" +msgstr "Non poteva deler auto-subscription." #: lib/subs.php:158 msgid "Couldn't delete subscription." -msgstr "" +msgstr "Non poteva deler subscription." #: lib/subscriberspeopleselftagcloudsection.php:48 #: lib/subscriptionspeopleselftagcloudsection.php:48 msgid "People Tagcloud as self-tagged" -msgstr "" +msgstr "Nube de etiquettas de personas como auto-etiquettate" #: lib/subscriberspeopletagcloudsection.php:48 #: lib/subscriptionspeopletagcloudsection.php:48 msgid "People Tagcloud as tagged" -msgstr "" +msgstr "Nube de etiquetta de personas como etiquettate" #: lib/tagcloudsection.php:56 msgid "None" -msgstr "" +msgstr "Nulle" #: lib/topposterssection.php:74 msgid "Top posters" -msgstr "" +msgstr "Qui scribe le plus" #: lib/unsandboxform.php:69 msgid "Unsandbox" -msgstr "" +msgstr "Retirar del cassa de sablo" #: lib/unsandboxform.php:80 msgid "Unsandbox this user" -msgstr "" +msgstr "Retirar iste usator del cassa de sablo" #: lib/unsilenceform.php:67 msgid "Unsilence" -msgstr "" +msgstr "Dissilentiar" #: lib/unsilenceform.php:78 msgid "Unsilence this user" -msgstr "" +msgstr "Non plus silentiar iste usator" #: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137 msgid "Unsubscribe from this user" -msgstr "" +msgstr "Cancellar subscription a iste usator" #: lib/unsubscribeform.php:137 msgid "Unsubscribe" -msgstr "" +msgstr "Cancellar subscription" #: lib/userprofile.php:116 msgid "Edit Avatar" -msgstr "" +msgstr "Modificar avatar" #: lib/userprofile.php:236 msgid "User actions" -msgstr "" +msgstr "Actiones de usator" #: lib/userprofile.php:248 msgid "Edit profile settings" -msgstr "" +msgstr "Modificar configuration de profilo" #: lib/userprofile.php:249 msgid "Edit" -msgstr "" +msgstr "Modificar" #: lib/userprofile.php:272 msgid "Send a direct message to this user" -msgstr "" +msgstr "Inviar un message directe a iste usator" #: lib/userprofile.php:273 msgid "Message" -msgstr "" +msgstr "Message" #: lib/userprofile.php:311 msgid "Moderate" -msgstr "" +msgstr "Moderar" #: lib/util.php:867 msgid "a few seconds ago" -msgstr "" +msgstr "alcun secundas retro" #: lib/util.php:869 msgid "about a minute ago" -msgstr "" +msgstr "circa un minuta retro" #: lib/util.php:871 #, php-format msgid "about %d minutes ago" -msgstr "" +msgstr "circa %d minutas retro" #: lib/util.php:873 msgid "about an hour ago" -msgstr "" +msgstr "circa un hora retro" #: lib/util.php:875 #, php-format msgid "about %d hours ago" -msgstr "" +msgstr "circa %d horas retro" #: lib/util.php:877 msgid "about a day ago" -msgstr "" +msgstr "circa un die retro" #: lib/util.php:879 #, php-format msgid "about %d days ago" -msgstr "" +msgstr "circa %d dies retro" #: lib/util.php:881 msgid "about a month ago" -msgstr "" +msgstr "circa un mense retro" #: lib/util.php:883 #, php-format msgid "about %d months ago" -msgstr "" +msgstr "circa %d menses retro" #: lib/util.php:885 msgid "about a year ago" -msgstr "" +msgstr "circa un anno retro" #: lib/webcolor.php:82 #, php-format msgid "%s is not a valid color!" -msgstr "" +msgstr "%s non es un color valide!" #: lib/webcolor.php:123 #, php-format msgid "%s is not a valid color! Use 3 or 6 hex chars." -msgstr "" +msgstr "%s non es un color valide! Usa 3 o 6 characteres hexadecimal." #: lib/xmppmanager.php:402 #, php-format msgid "Message too long - maximum is %1$d characters, you sent %2$d." -msgstr "" +msgstr "Message troppo longe - maximo es %1$d characteres, tu inviava %2$d." diff --git a/locale/it/LC_MESSAGES/statusnet.po b/locale/it/LC_MESSAGES/statusnet.po index b9a92a4bfe..8bb05d2861 100644 --- a/locale/it/LC_MESSAGES/statusnet.po +++ b/locale/it/LC_MESSAGES/statusnet.po @@ -11,11 +11,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:27+0000\n" +"PO-Revision-Date: 2010-02-07 20:32:22+0000\n" "Language-Team: Italian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: it\n" "X-Message-Group: out-statusnet\n" @@ -4419,7 +4419,7 @@ msgid "" "You should have received a copy of the GNU Affero General Public License " "along with this program. If not, see %s." msgstr "" -"Una copia della GNU Affero General Plublic License dovrebbe essere " +"Una copia della GNU Affero General Public License dovrebbe essere " "disponibile assieme a questo programma. Se così non fosse, consultare %s." #: actions/version.php:189 @@ -5115,6 +5115,7 @@ msgstr "" "minuti: %s" #: lib/command.php:668 +#, fuzzy msgid "You are not subscribed to anyone." msgstr "Il tuo abbonamento è stato annullato." @@ -5141,8 +5142,8 @@ msgstr "Non fai parte di alcun gruppo." #: lib/command.php:714 msgid "You are a member of this group:" msgid_plural "You are a member of these groups:" -msgstr[0] "Non fai parte di questo gruppo:" -msgstr[1] "Non fai parte di questi gruppi:" +msgstr[0] "Sei membro di questo gruppo:" +msgstr[1] "Sei membro di questi gruppi:" #: lib/command.php:728 msgid "" diff --git a/locale/nl/LC_MESSAGES/statusnet.po b/locale/nl/LC_MESSAGES/statusnet.po index cad7721554..cbf50e60c1 100644 --- a/locale/nl/LC_MESSAGES/statusnet.po +++ b/locale/nl/LC_MESSAGES/statusnet.po @@ -11,11 +11,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:45+0000\n" +"PO-Revision-Date: 2010-02-07 20:32:58+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: out-statusnet\n" @@ -4423,9 +4423,9 @@ msgid "" "for more details. " msgstr "" "Dit programma wordt verspreid in de hoop dat het bruikbaar is, maar ZONDER " -"ENIGE GARANTIE; zonder zelfde impliciete garantie van VERMARKTBAARHEID of " -"GESCHIKTHEID VOOR EEN SPECIFIEK DOEL. Zie de GNU Affero General Public " -"License voor meer details. " +"ENIGE GARANTIE; zelfs zonder de impliciete garantie van VERKOOPBAARHEID of " +"GESCHIKTHEID VOOR EEN BEPAALD DOEL. Zie de GNU Affero General Public License " +"voor meer details. " #: actions/version.php:180 #, php-format diff --git a/locale/pt_BR/LC_MESSAGES/statusnet.po b/locale/pt_BR/LC_MESSAGES/statusnet.po index 5470616fe9..726ca3ca5e 100644 --- a/locale/pt_BR/LC_MESSAGES/statusnet.po +++ b/locale/pt_BR/LC_MESSAGES/statusnet.po @@ -2,6 +2,7 @@ # # Author@translatewiki.net: Aracnus # Author@translatewiki.net: Ewout +# Author@translatewiki.net: McDutchie # Author@translatewiki.net: Vuln # -- # This file is distributed under the same license as the StatusNet package. @@ -11,11 +12,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:54+0000\n" +"PO-Revision-Date: 2010-02-07 20:33:07+0000\n" "Language-Team: Brazilian Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt-br\n" "X-Message-Group: out-statusnet\n" @@ -4433,7 +4434,7 @@ msgstr "Versão" #: actions/version.php:197 msgid "Author(s)" -msgstr "Author(es)" +msgstr "Autor(es)" #: classes/File.php:144 #, php-format diff --git a/locale/statusnet.po b/locale/statusnet.po index 987e4ad23d..fbbd0e5c37 100644 --- a/locale/statusnet.po +++ b/locale/statusnet.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" +"POT-Creation-Date: 2010-02-07 20:31+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" diff --git a/locale/sv/LC_MESSAGES/statusnet.po b/locale/sv/LC_MESSAGES/statusnet.po index a2645e8bb2..213be22da5 100644 --- a/locale/sv/LC_MESSAGES/statusnet.po +++ b/locale/sv/LC_MESSAGES/statusnet.po @@ -10,11 +10,11 @@ msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:55:00+0000\n" +"PO-Revision-Date: 2010-02-07 20:33:13+0000\n" "Language-Team: Swedish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: sv\n" "X-Message-Group: out-statusnet\n" @@ -4376,7 +4376,7 @@ msgid "" "along with this program. If not, see %s." msgstr "" "Du bör ha fått en kopia av GNU Affero General Public License tillsammans med " -"detta program. Om inte, se% s." +"detta program. Om inte, se %s." #: actions/version.php:189 msgid "Plugins" From dc09453a77f33c4dfdff306321ce93cf5fbd2d57 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 8 Feb 2010 11:06:03 -0800 Subject: [PATCH 23/78] First steps on converting FeedSub into the pub/sub basis for OStatus communications: * renamed FeedSub plugin to OStatus * now setting avatar on subscriptions * general fixes for subscription * integrated PuSH hub to handle only user timelines on canonical ID url; sends updates directly * set $config['feedsub']['nohub'] = true to test w/ foreign feeds that don't have hubs (won't actually receive updates though) * a few bits of code documentation * HMAC support for verified distributions (safest if sub setup is on HTTPS) And a couple core changes: * minimizing HTML output for exceptions in API requests to aid in debugging * fix for rel=self link in apitimelineuser when id given This does not not yet include any of the individual subscription management (Salmon notifications for sub/unsub, etc) nor a nice UI for user subscriptions. Needs some further cleanup to treat posts as status updates instead of link references. --- actions/apitimelineuser.php | 5 +- lib/api.php | 1 + lib/error.php | 10 +- lib/httpclient.php | 5 +- lib/mysqlschema.php | 1 + lib/statusnet.php | 13 +- plugins/FeedSub/feedinfo.sql | 14 - .../OStatusPlugin.php} | 48 +++- plugins/{FeedSub => OStatus}/README | 0 .../actions/feedsubcallback.php | 9 +- .../actions/feedsubsettings.php | 7 +- plugins/OStatus/actions/hub.php | 176 ++++++++++++ .../classes/Feedinfo.php} | 105 ++++++- plugins/OStatus/classes/HubSub.php | 272 ++++++++++++++++++ plugins/{FeedSub => OStatus}/extlib/README | 0 .../extlib/XML/Feed/Parser.php | 0 .../extlib/XML/Feed/Parser/Atom.php | 0 .../extlib/XML/Feed/Parser/AtomElement.php | 0 .../extlib/XML/Feed/Parser/Exception.php | 0 .../extlib/XML/Feed/Parser/RSS09.php | 0 .../extlib/XML/Feed/Parser/RSS09Element.php | 0 .../extlib/XML/Feed/Parser/RSS1.php | 0 .../extlib/XML/Feed/Parser/RSS11.php | 0 .../extlib/XML/Feed/Parser/RSS11Element.php | 0 .../extlib/XML/Feed/Parser/RSS1Element.php | 0 .../extlib/XML/Feed/Parser/RSS2.php | 0 .../extlib/XML/Feed/Parser/RSS2Element.php | 0 .../extlib/XML/Feed/Parser/Type.php | 0 .../XML/Feed/samples/atom10-entryonly.xml | 0 .../XML/Feed/samples/atom10-example1.xml | 0 .../XML/Feed/samples/atom10-example2.xml | 0 .../extlib/XML/Feed/samples/delicious.feed | 0 .../extlib/XML/Feed/samples/flickr.feed | 0 .../extlib/XML/Feed/samples/grwifi-atom.xml | 0 .../extlib/XML/Feed/samples/hoder.xml | 0 .../XML/Feed/samples/illformed_atom10.xml | 0 .../XML/Feed/samples/rss091-complete.xml | 0 .../XML/Feed/samples/rss091-international.xml | 0 .../extlib/XML/Feed/samples/rss091-simple.xml | 0 .../extlib/XML/Feed/samples/rss092-sample.xml | 0 .../XML/Feed/samples/rss10-example1.xml | 0 .../XML/Feed/samples/rss10-example2.xml | 0 .../extlib/XML/Feed/samples/rss2sample.xml | 0 .../extlib/XML/Feed/samples/sixapart-jp.xml | 0 .../extlib/XML/Feed/samples/technorati.feed | 0 .../extlib/XML/Feed/schemas/atom.rnc | 0 .../extlib/XML/Feed/schemas/rss10.rnc | 0 .../extlib/XML/Feed/schemas/rss11.rnc | 0 .../extlib/xml-feed-parser-bug-16416.patch | 0 .../images/24px-Feed-icon.svg.png | Bin .../images/48px-Feed-icon.svg.png | Bin .../images/96px-Feed-icon.svg.png | Bin plugins/{FeedSub => OStatus}/images/README | 0 .../lib}/feeddiscovery.php | 14 +- .../{FeedSub => OStatus/lib}/feedmunger.php | 38 ++- .../OStatus/lib/hubdistribqueuehandler.php | 87 ++++++ plugins/OStatus/lib/huboutqueuehandler.php | 52 ++++ plugins/OStatus/lib/hubverifyqueuehandler.php | 53 ++++ .../FeedSub.po => OStatus/locale/OStatus.po} | 0 .../locale/fr/LC_MESSAGES/OStatus.po} | 0 .../tests/FeedDiscoveryTest.php | 0 .../tests/FeedMungerTest.php | 0 .../tests/gettext-speedtest.php | 0 63 files changed, 866 insertions(+), 44 deletions(-) delete mode 100644 plugins/FeedSub/feedinfo.sql rename plugins/{FeedSub/FeedSubPlugin.php => OStatus/OStatusPlugin.php} (69%) rename plugins/{FeedSub => OStatus}/README (100%) rename plugins/{FeedSub => OStatus}/actions/feedsubcallback.php (94%) rename plugins/{FeedSub => OStatus}/actions/feedsubsettings.php (97%) create mode 100644 plugins/OStatus/actions/hub.php rename plugins/{FeedSub/feedinfo.php => OStatus/classes/Feedinfo.php} (67%) create mode 100644 plugins/OStatus/classes/HubSub.php rename plugins/{FeedSub => OStatus}/extlib/README (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/Atom.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/AtomElement.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/Exception.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/RSS09.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/RSS09Element.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/RSS1.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/RSS11.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/RSS11Element.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/RSS1Element.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/RSS2.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/RSS2Element.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/Parser/Type.php (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/atom10-entryonly.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/atom10-example1.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/atom10-example2.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/delicious.feed (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/flickr.feed (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/grwifi-atom.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/hoder.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/illformed_atom10.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/rss091-complete.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/rss091-international.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/rss091-simple.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/rss092-sample.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/rss10-example1.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/rss10-example2.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/rss2sample.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/sixapart-jp.xml (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/samples/technorati.feed (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/schemas/atom.rnc (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/schemas/rss10.rnc (100%) rename plugins/{FeedSub => OStatus}/extlib/XML/Feed/schemas/rss11.rnc (100%) rename plugins/{FeedSub => OStatus}/extlib/xml-feed-parser-bug-16416.patch (100%) rename plugins/{FeedSub => OStatus}/images/24px-Feed-icon.svg.png (100%) rename plugins/{FeedSub => OStatus}/images/48px-Feed-icon.svg.png (100%) rename plugins/{FeedSub => OStatus}/images/96px-Feed-icon.svg.png (100%) rename plugins/{FeedSub => OStatus}/images/README (100%) rename plugins/{FeedSub => OStatus/lib}/feeddiscovery.php (94%) rename plugins/{FeedSub => OStatus/lib}/feedmunger.php (87%) create mode 100644 plugins/OStatus/lib/hubdistribqueuehandler.php create mode 100644 plugins/OStatus/lib/huboutqueuehandler.php create mode 100644 plugins/OStatus/lib/hubverifyqueuehandler.php rename plugins/{FeedSub/locale/FeedSub.po => OStatus/locale/OStatus.po} (100%) rename plugins/{FeedSub/locale/fr/LC_MESSAGES/FeedSub.po => OStatus/locale/fr/LC_MESSAGES/OStatus.po} (100%) rename plugins/{FeedSub => OStatus}/tests/FeedDiscoveryTest.php (100%) rename plugins/{FeedSub => OStatus}/tests/FeedMungerTest.php (100%) rename plugins/{FeedSub => OStatus}/tests/gettext-speedtest.php (100%) diff --git a/actions/apitimelineuser.php b/actions/apitimelineuser.php index 830b16941d..ed9104905d 100644 --- a/actions/apitimelineuser.php +++ b/actions/apitimelineuser.php @@ -145,10 +145,11 @@ class ApiTimelineUserAction extends ApiBareAuthAction ); break; case 'atom': - if (isset($apidata['api_arg'])) { + $id = $this->arg('id'); + if ($id) { $selfuri = common_root_url() . 'api/statuses/user_timeline/' . - $apidata['api_arg'] . '.atom'; + rawurlencode($id) . '.atom'; } else { $selfuri = common_root_url() . 'api/statuses/user_timeline.atom'; diff --git a/lib/api.php b/lib/api.php index f819752167..fd07bbbbe0 100644 --- a/lib/api.php +++ b/lib/api.php @@ -77,6 +77,7 @@ class ApiAction extends Action function prepare($args) { + StatusNet::setApi(true); // reduce exception reports to aid in debugging parent::prepare($args); $this->format = $this->arg('format'); diff --git a/lib/error.php b/lib/error.php index 87a4d913b4..a6a29119f7 100644 --- a/lib/error.php +++ b/lib/error.php @@ -56,6 +56,7 @@ class ErrorAction extends Action $this->code = $code; $this->message = $message; + $this->minimal = StatusNet::isApi(); // XXX: hack alert: usually we aren't going to // call this page directly, but because it's @@ -102,7 +103,14 @@ class ErrorAction extends Action function showPage() { - parent::showPage(); + if ($this->minimal) { + // Even more minimal -- we're in a machine API + // and don't want to flood the output. + $this->extraHeaders(); + $this->showContent(); + } else { + parent::showPage(); + } // We don't want to have any more output after this exit(); diff --git a/lib/httpclient.php b/lib/httpclient.php index 3f82620761..4c3af8d7dd 100644 --- a/lib/httpclient.php +++ b/lib/httpclient.php @@ -81,12 +81,13 @@ class HTTPResponse extends HTTP_Request2_Response } /** - * Check if the response is OK, generally a 200 status code. + * Check if the response is OK, generally a 200 or other 2xx status code. * @return bool */ function isOk() { - return ($this->getStatus() == 200); + $status = $this->getStatus(); + return ($status >= 200 && $status < 300); } } diff --git a/lib/mysqlschema.php b/lib/mysqlschema.php index 1f7c3d0926..485096ac42 100644 --- a/lib/mysqlschema.php +++ b/lib/mysqlschema.php @@ -213,6 +213,7 @@ class MysqlSchema extends Schema $sql .= "); "; + common_log(LOG_INFO, $sql); $res = $this->conn->query($sql); if (PEAR::isError($res)) { diff --git a/lib/statusnet.php b/lib/statusnet.php index 29e9030267..4f82fdaa6c 100644 --- a/lib/statusnet.php +++ b/lib/statusnet.php @@ -30,6 +30,7 @@ global $config, $_server, $_path; class StatusNet { protected static $have_config; + protected static $is_api; /** * Configure and instantiate a plugin into the current configuration. @@ -63,7 +64,7 @@ class StatusNet } } if (!class_exists($pluginclass)) { - throw new ServerException(500, "Plugin $name not found."); + throw new ServerException("Plugin $name not found.", 500); } } @@ -147,6 +148,16 @@ class StatusNet return self::$have_config; } + public function isApi() + { + return self::$is_api; + } + + public function setApi($mode) + { + self::$is_api = $mode; + } + /** * Build default configuration array * @return array diff --git a/plugins/FeedSub/feedinfo.sql b/plugins/FeedSub/feedinfo.sql deleted file mode 100644 index e9b53d26eb..0000000000 --- a/plugins/FeedSub/feedinfo.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE TABLE `feedinfo` ( - `id` int(11) NOT NULL auto_increment, - `profile_id` int(11) NOT NULL, - `feeduri` varchar(255) NOT NULL, - `homeuri` varchar(255) NOT NULL, - `huburi` varchar(255) NOT NULL, - `verify_token` varchar(32) default NULL, - `sub_start` datetime default NULL, - `sub_end` datetime default NULL, - `created` datetime NOT NULL, - `lastupdate` datetime NOT NULL, - PRIMARY KEY (`id`), - UNIQUE KEY `feedinfo_feeduri_idx` (`feeduri`) -) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; diff --git a/plugins/FeedSub/FeedSubPlugin.php b/plugins/OStatus/OStatusPlugin.php similarity index 69% rename from plugins/FeedSub/FeedSubPlugin.php rename to plugins/OStatus/OStatusPlugin.php index e49e2a648a..9419121121 100644 --- a/plugins/FeedSub/FeedSubPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -43,7 +43,7 @@ class FeedSubException extends Exception { } -class FeedSubPlugin extends Plugin +class OStatusPlugin extends Plugin { /** * Hook for RouterInitialized event. @@ -53,6 +53,8 @@ class FeedSubPlugin extends Plugin */ function onRouterInitialized($m) { + $m->connect('push/hub', array('action' => 'hub')); + $m->connect('feedsub/callback/:feed', array('action' => 'feedsubcallback'), array('feed' => '[0-9]+')); @@ -61,6 +63,46 @@ class FeedSubPlugin extends Plugin return true; } + /** + * Set up queue handlers for outgoing hub pushes + * @param QueueManager $qm + * @return boolean hook return + */ + function onEndInitializeQueueManager(QueueManager $qm) + { + $qm->connect('hubverify', 'HubVerifyQueueHandler'); + $qm->connect('hubdistrib', 'HubDistribQueueHandler'); + $qm->connect('hubout', 'HubOutQueueHandler'); + return true; + } + + /** + * Put saved notices into the queue for pubsub distribution. + */ + function onStartEnqueueNotice($notice, &$transports) + { + $transports[] = 'hubdistrib'; + return true; + } + + /** + * Set up a PuSH hub link to our internal link for canonical timeline + * Atom feeds for users. + */ + function onStartApiAtom(Action $action) + { + if ($action instanceof ApiTimelineUserAction) { + $id = $action->arg('id'); + if (strval(intval($id)) === strval($id)) { + // Canonical form of id in URL? + // Updates will be handled for our internal PuSH hub. + $action->element('link', array('rel' => 'hub', + 'href' => common_local_url('hub'))); + } + } + return true; + } + /** * Add the feed settings page to the Connect Settings menu * @@ -92,7 +134,8 @@ class FeedSubPlugin extends Plugin { $base = dirname(__FILE__); $lower = strtolower($cls); - $files = array("$base/$lower.php"); + $files = array("$base/classes/$cls.php", + "$base/lib/$lower.php"); if (substr($lower, -6) == 'action') { $files[] = "$base/actions/" . substr($lower, 0, -6) . ".php"; } @@ -110,6 +153,7 @@ class FeedSubPlugin extends Plugin // alter table feedinfo change column id id int(11) not null auto_increment; $schema = Schema::get(); $schema->ensureTable('feedinfo', Feedinfo::schemaDef()); + $schema->ensureTable('hubsub', HubSub::schemaDef()); return true; } } diff --git a/plugins/FeedSub/README b/plugins/OStatus/README similarity index 100% rename from plugins/FeedSub/README rename to plugins/OStatus/README diff --git a/plugins/FeedSub/actions/feedsubcallback.php b/plugins/OStatus/actions/feedsubcallback.php similarity index 94% rename from plugins/FeedSub/actions/feedsubcallback.php rename to plugins/OStatus/actions/feedsubcallback.php index 0c4280c1fa..c57ea5b101 100644 --- a/plugins/FeedSub/actions/feedsubcallback.php +++ b/plugins/OStatus/actions/feedsubcallback.php @@ -52,9 +52,14 @@ class FeedSubCallbackAction extends Action if (!$feedinfo) { throw new ServerException('Unknown feed id ' . $feedid, 400); } - + + $hmac = ''; + if (isset($_SERVER['HTTP_X_HUB_SIGNATURE'])) { + $hmac = $_SERVER['HTTP_X_HUB_SIGNATURE']; + } + $post = file_get_contents('php://input'); - $feedinfo->postUpdates($post); + $feedinfo->postUpdates($post, $hmac); } /** diff --git a/plugins/FeedSub/actions/feedsubsettings.php b/plugins/OStatus/actions/feedsubsettings.php similarity index 97% rename from plugins/FeedSub/actions/feedsubsettings.php rename to plugins/OStatus/actions/feedsubsettings.php index 0fba20a393..4d5b7b60f4 100644 --- a/plugins/FeedSub/actions/feedsubsettings.php +++ b/plugins/OStatus/actions/feedsubsettings.php @@ -184,7 +184,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction $this->munger = $discover->feedMunger(); $this->feedinfo = $this->munger->feedInfo(); - if ($this->feedinfo->huburi == '') { + if ($this->feedinfo->huburi == '' && !common_config('feedsub', 'nohub')) { $this->showForm(_m('Feed is not PuSH-enabled; cannot subscribe.')); return false; } @@ -213,7 +213,10 @@ class FeedSubSettingsAction extends ConnectSettingsAction // And subscribe the current user to the local profile $user = common_current_user(); $profile = $this->feedinfo->getProfile(); - + if (!$profile) { + throw new ServerException("Feed profile was not saved properly."); + } + if ($user->isSubscribed($profile)) { $this->showForm(_m('Already subscribed!')); } elseif ($user->subscribeTo($profile)) { diff --git a/plugins/OStatus/actions/hub.php b/plugins/OStatus/actions/hub.php new file mode 100644 index 0000000000..5caf4b48eb --- /dev/null +++ b/plugins/OStatus/actions/hub.php @@ -0,0 +1,176 @@ +. + */ + +/** + * Integrated PuSH hub; lets us only ping them what need it. + * @package Hub + * @maintainer Brion Vibber + */ + +/** + + +Things to consider... +* should we purge incomplete subscriptions that never get a verification pingback? +* when can we send subscription renewal checks? + - at next send time probably ok +* when can we handle trimming of subscriptions? + - at next send time probably ok +* should we keep a fail count? + +*/ + + +class HubAction extends Action +{ + function arg($arg, $def=null) + { + // PHP converts '.'s in incoming var names to '_'s. + // It also merges multiple values, which'll break hub.verify and hub.topic for publishing + // @fixme handle multiple args + $arg = str_replace('.', '_', $arg); + return parent::arg($arg, $def); + } + + function prepare($args) + { + StatusNet::setApi(true); // reduce exception reports to aid in debugging + return parent::prepare($args); + } + + function handle() + { + $mode = $this->trimmed('hub.mode'); + switch ($mode) { + case "subscribe": + $this->subscribe(); + break; + case "unsubscribe": + $this->unsubscribe(); + break; + case "publish": + throw new ServerException("Publishing outside feeds not supported.", 400); + default: + throw new ServerException("Unrecognized mode '$mode'.", 400); + } + } + + /** + * Process a PuSH feed subscription request. + * + * HTTP return codes: + * 202 Accepted - request saved and awaiting verification + * 204 No Content - already subscribed + * 403 Forbidden - rejecting this (not specifically spec'd) + */ + function subscribe() + { + $feed = $this->argUrl('hub.topic'); + $callback = $this->argUrl('hub.callback'); + + common_log(LOG_DEBUG, __METHOD__ . ": checking sub'd to $feed $callback"); + if ($this->getSub($feed, $callback)) { + // Already subscribed; return 204 per spec. + header('HTTP/1.1 204 No Content'); + common_log(LOG_DEBUG, __METHOD__ . ': already subscribed'); + return; + } + + common_log(LOG_DEBUG, __METHOD__ . ': setting up'); + $sub = new HubSub(); + $sub->topic = $feed; + $sub->callback = $callback; + $sub->secret = $this->arg('hub.secret', null); + $sub->setLease(intval($this->arg('hub.lease_seconds'))); + + // @fixme check for feeds we don't manage + // @fixme check the verification mode, might want a return immediately? + + common_log(LOG_DEBUG, __METHOD__ . ': inserting'); + $ok = $sub->insert(); + + if (!$ok) { + throw new ServerException("Failed to save subscription record", 500); + } + + // @fixme check errors ;) + + $data = array('sub' => $sub, 'mode' => 'subscribe'); + $qm = QueueManager::get(); + $qm->enqueue($data, 'hubverify'); + + header('HTTP/1.1 202 Accepted'); + common_log(LOG_DEBUG, __METHOD__ . ': done'); + } + + /** + * Process a PuSH feed unsubscription request. + * + * HTTP return codes: + * 202 Accepted - request saved and awaiting verification + * 204 No Content - already subscribed + * 400 Bad Request - invalid params or rejected feed + */ + function unsubscribe() + { + $feed = $this->argUrl('hub.topic'); + $callback = $this->argUrl('hub.callback'); + $sub = $this->getSub($feed, $callback); + + if ($sub) { + if ($sub->verify('unsubscribe')) { + $sub->delete(); + common_log(LOG_INFO, "PuSH unsubscribed $feed for $callback"); + } else { + throw new ServerException("Failed PuSH unsubscription: verification failed! $feed for $callback"); + } + } else { + throw new ServerException("Failed PuSH unsubscription: not subscribed! $feed for $callback"); + } + } + + /** + * Grab and validate a URL from POST parameters. + * @throws ServerException for malformed or non-http/https URLs + */ + protected function argUrl($arg) + { + $url = $this->arg($arg); + $params = array('domain_check' => false, // otherwise breaks my local tests :P + 'allowed_schemes' => array('http', 'https')); + if (Validate::uri($url, $params)) { + return $url; + } else { + throw new ServerException("Invalid URL passed for $arg: '$url'", 400); + } + } + + /** + * Get HubSub subscription record for a given feed & subscriber. + * + * @param string $feed + * @param string $callback + * @return mixed HubSub or false + */ + protected function getSub($feed, $callback) + { + return HubSub::staticGet($feed, $callback); + } +} + diff --git a/plugins/FeedSub/feedinfo.php b/plugins/OStatus/classes/Feedinfo.php similarity index 67% rename from plugins/FeedSub/feedinfo.php rename to plugins/OStatus/classes/Feedinfo.php index b166bd6e12..f29d08cb03 100644 --- a/plugins/FeedSub/feedinfo.php +++ b/plugins/OStatus/classes/Feedinfo.php @@ -1,8 +1,29 @@ . + */ + +/** + * @package FeedSubPlugin + * @maintainer Brion Vibber + */ /* - -Subscription flow: +PuSH subscription flow: $feedinfo->subscribe() generate random verification token @@ -16,7 +37,6 @@ Subscription flow: feedsub/callback hub sends us updates via POST - ? */ @@ -43,6 +63,7 @@ class Feedinfo extends Memcached_DataObject public $huburi; // PuSH subscription data + public $secret; public $verify_token; public $sub_start; public $sub_end; @@ -72,6 +93,7 @@ class Feedinfo extends Memcached_DataObject 'feeduri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, 'homeuri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, 'huburi' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, + 'secret' => DB_DATAOBJECT_STR, 'verify_token' => DB_DATAOBJECT_STR, 'sub_start' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME, 'sub_end' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME, @@ -98,6 +120,8 @@ class Feedinfo extends Memcached_DataObject 255, false), new ColumnDef('verify_token', 'varchar', 32, true), + new ColumnDef('secret', 'varchar', + 64, true), new ColumnDef('sub_start', 'datetime', null, true), new ColumnDef('sub_end', 'datetime', @@ -119,7 +143,7 @@ class Feedinfo extends Memcached_DataObject function keys() { - return array('id' => 'P'); //? + return array_keys($this->keyTypes()); } /** @@ -133,7 +157,12 @@ class Feedinfo extends Memcached_DataObject function keyTypes() { - return $this->keys(); + return array('id' => 'K'); // @fixme we'll need a profile_id key at least + } + + function sequenceKey() + { + return array('id', true, false); } /** @@ -161,6 +190,10 @@ class Feedinfo extends Memcached_DataObject $feedinfo->query('BEGIN'); + // Awful hack! Awful hack! + $feedinfo->verify = common_good_rand(16); + $feedinfo->secret = common_good_rand(32); + try { $profile = $munger->profile(); $result = $profile->insert(); @@ -168,6 +201,21 @@ class Feedinfo extends Memcached_DataObject throw new FeedDBException($profile); } + $avatar = $munger->getAvatar(); + if ($avatar) { + // @fixme this should be better encapsulated + // ripped from oauthstore.php (for old OMB client) + $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar'); + copy($avatar, $temp_filename); + $imagefile = new ImageFile($profile->id, $temp_filename); + $filename = Avatar::filename($profile->id, + image_type_to_extension($imagefile->type), + null, + common_timestamp()); + rename($temp_filename, Avatar::path($filename)); + $profile->setOriginal($filename); + } + $feedinfo->profile_id = $profile->id; $result = $feedinfo->insert(); if (empty($result)) { @@ -191,27 +239,38 @@ class Feedinfo extends Memcached_DataObject */ public function subscribe() { + if (common_config('feedsub', 'nohub')) { + // Fake it! We're just testing remote feeds w/o hubs. + return true; + } // @fixme use the verification token #$token = md5(mt_rand() . ':' . $this->feeduri); #$this->verify_token = $token; #$this->update(); // @fixme - try { $callback = common_local_url('feedsubcallback', array('feed' => $this->id)); $headers = array('Content-Type: application/x-www-form-urlencoded'); $post = array('hub.mode' => 'subscribe', 'hub.callback' => $callback, 'hub.verify' => 'async', - //'hub.verify_token' => $token, + 'hub.verify_token' => $this->verify_token, + 'hub.secret' => $this->secret, //'hub.lease_seconds' => 0, 'hub.topic' => $this->feeduri); $client = new HTTPClient(); $response = $client->post($this->huburi, $headers, $post); - if ($response->getStatus() >= 200 && $response->getStatus() < 300) { - common_log(LOG_INFO, __METHOD__ . ': sub req ok'); + $status = $response->getStatus(); + if ($status == 202) { + common_log(LOG_INFO, __METHOD__ . ': sub req ok, awaiting verification callback'); return true; + } else if ($status == 204) { + common_log(LOG_INFO, __METHOD__ . ': sub req ok and verified'); + return true; + } else if ($status >= 200 && $status < 300) { + common_log(LOG_ERR, __METHOD__ . ": sub req returned unexpected HTTP $status: " . $response->getBody()); + return false; } else { - common_log(LOG_INFO, __METHOD__ . ': sub req failed'); + common_log(LOG_ERR, __METHOD__ . ": sub req failed with HTTP $status: " . $response->getBody()); return false; } } catch (Exception $e) { @@ -227,10 +286,29 @@ class Feedinfo extends Memcached_DataObject * coming from a PuSH hub. * * @param string $xml source of Atom or RSS feed + * @param string $hmac X-Hub-Signature header, if present */ - public function postUpdates($xml) + public function postUpdates($xml, $hmac) { - common_log(LOG_INFO, __METHOD__ . ": packet for \"$this->feeduri\"! $xml"); + common_log(LOG_INFO, __METHOD__ . ": packet for \"$this->feeduri\"! $hmac $xml"); + + if ($this->secret) { + if (preg_match('/^sha1=([0-9a-fA-F]{40})$/', $hmac, $matches)) { + $their_hmac = strtolower($matches[1]); + $our_hmac = sha1($xml . $this->secret); + if ($their_hmac !== $our_hmac) { + common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with bad SHA-1 HMAC: got $their_hmac, expected $our_hmac"); + return; + } + } else { + common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with bogus HMAC '$hmac'"); + return; + } + } else if ($hmac) { + common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with unexpected HMAC '$hmac'"); + return; + } + require_once "XML/Feed/Parser.php"; $feed = new XML_Feed_Parser($xml, false, false, true); $munger = new FeedMunger($feed); @@ -246,8 +324,7 @@ class Feedinfo extends Memcached_DataObject // @fixme this could explode horribly for multiple feeds on a blog. sigh $dupe = new Notice(); $dupe->uri = $notice->uri; - $dupe->find(); - if ($dupe->fetch()) { + if ($dupe->find(true)) { common_log(LOG_WARNING, __METHOD__ . ": tried to save dupe notice for entry {$notice->uri} of feed {$this->feeduri}"); continue; } diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php new file mode 100644 index 0000000000..1769f6c941 --- /dev/null +++ b/plugins/OStatus/classes/HubSub.php @@ -0,0 +1,272 @@ +. + */ + +/** + * PuSH feed subscription record + * @package Hub + * @author Brion Vibber + */ +class HubSub extends Memcached_DataObject +{ + public $__table = 'hubsub'; + + public $hashkey; // sha1(topic . '|' . $callback); (topic, callback) key is too long for myisam in utf8 + public $topic; + public $callback; + public $secret; + public $verify_token; + public $challenge; + public $lease; + public $sub_start; + public $sub_end; + public $created; + + public /*static*/ function staticGet($topic, $callback) + { + return parent::staticGet(__CLASS__, 'hashkey', self::hashkey($topic, $callback)); + } + + protected static function hashkey($topic, $callback) + { + return sha1($topic . '|' . $callback); + } + + /** + * return table definition for DB_DataObject + * + * DB_DataObject needs to know something about the table to manipulate + * instances. This method provides all the DB_DataObject needs to know. + * + * @return array array of column definitions + */ + + function table() + { + return array('hashkey' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, + 'topic' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, + 'callback' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, + 'secret' => DB_DATAOBJECT_STR, + 'verify_token' => DB_DATAOBJECT_STR, + 'challenge' => DB_DATAOBJECT_STR, + 'lease' => DB_DATAOBJECT_INT, + 'sub_start' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME, + 'sub_end' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME, + 'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL); + } + + static function schemaDef() + { + return array(new ColumnDef('hashkey', 'char', + /*size*/40, + /*nullable*/false, + /*key*/'PRI'), + new ColumnDef('topic', 'varchar', + /*size*/255, + /*nullable*/false, + /*key*/'KEY'), + new ColumnDef('callback', 'varchar', + 255, false), + new ColumnDef('secret', 'text', + null, true), + new ColumnDef('verify_token', 'text', + null, true), + new ColumnDef('challenge', 'varchar', + 32, true), + new ColumnDef('lease', 'int', + null, true), + new ColumnDef('sub_start', 'datetime', + null, true), + new ColumnDef('sub_end', 'datetime', + null, true), + new ColumnDef('created', 'datetime', + null, false)); + } + + function keys() + { + return array_keys($this->keyTypes()); + } + + function sequenceKeys() + { + return array(false, false, false); + } + + /** + * return key definitions for DB_DataObject + * + * DB_DataObject needs to know about keys that the table has; this function + * defines them. + * + * @return array key definitions + */ + + function keyTypes() + { + return array('hashkey' => 'K'); + } + + /** + * Validates a requested lease length, sets length plus + * subscription start & end dates. + * + * Does not save to database -- use before insert() or update(). + * + * @param int $length in seconds + */ + function setLease($length) + { + assert(is_int($length)); + + $min = 86400; + $max = 86400 * 30; + + if ($length == 0) { + // We want to garbage collect dead subscriptions! + $length = $max; + } elseif( $length < $min) { + $length = $min; + } else if ($length > $max) { + $length = $max; + } + + $this->lease = $length; + $this->start_sub = common_sql_now(); + $this->end_sub = common_sql_date(time() + $length); + } + + /** + * Send a verification ping to subscriber + * @param string $mode 'subscribe' or 'unsubscribe' + */ + function verify($mode) + { + assert($mode == 'subscribe' || $mode == 'unsubscribe'); + + // Is this needed? data object fun... + $clone = clone($this); + $clone->challenge = common_good_rand(16); + $clone->update($this); + $this->challenge = $clone->challenge; + unset($clone); + + $params = array('hub.mode' => $mode, + 'hub.topic' => $this->topic, + 'hub.challenge' => $this->challenge); + if ($mode == 'subscribe') { + $params['hub.lease_seconds'] = $this->lease; + } + if ($this->verify_token) { + $params['hub.verify_token'] = $this->verify_token; + } + $url = $this->callback . '?' . http_build_query($params, '', '&'); // @fixme ugly urls + + try { + $request = new HTTPClient(); + $response = $request->get($url); + $status = $response->getStatus(); + + if ($status >= 200 && $status < 300) { + $fail = false; + } else { + // @fixme how can we schedule a second attempt? + // Or should we? + $fail = "Returned HTTP $status"; + } + } catch (Exception $e) { + $fail = $e->getMessage(); + } + if ($fail) { + // @fixme how can we schedule a second attempt? + // or save a fail count? + // Or should we? + common_log(LOG_ERR, "Failed to verify $mode for $this->topic at $this->callback: $fail"); + return false; + } else { + if ($mode == 'subscribe') { + // Establish or renew the subscription! + // This seems unnecessary... dataobject fun! + $clone = clone($this); + $clone->challenge = null; + $clone->setLease($this->lease); + $clone->update($this); + unset($clone); + + $this->challenge = null; + $this->setLease($this->lease); + common_log(LOG_ERR, "Verified $mode of $this->callback:$this->topic for $this->lease seconds"); + } else if ($mode == 'unsubscribe') { + common_log(LOG_ERR, "Verified $mode of $this->callback:$this->topic"); + $this->delete(); + } + return true; + } + } + + /** + * Insert wrapper; transparently set the hash key from topic and callback columns. + * @return boolean success + */ + function insert() + { + $this->hashkey = self::hashkey($this->topic, $this->callback); + return parent::insert(); + } + + /** + * Send a 'fat ping' to the subscriber's callback endpoint + * containing the given Atom feed chunk. + * + * Determination of which items to send should be done at + * a higher level; don't just shove in a complete feed! + * + * @param string $atom well-formed Atom feed + */ + function push($atom) + { + $headers = array('Content-Type: application/atom+xml'); + if ($this->secret) { + $hmac = sha1($atom . $this->secret); + $headers[] = "X-Hub-Signature: sha1=$hmac"; + } else { + $hmac = '(none)'; + } + common_log(LOG_INFO, "About to push feed to $this->callback for $this->topic, HMAC $hmac"); + try { + $request = new HTTPClient(); + $request->setBody($atom); + $response = $request->post($this->callback, $headers); + + if ($response->isOk()) { + return true; + } + common_log(LOG_ERR, "Error sending PuSH content " . + "to $this->callback for $this->topic: " . + $response->getStatus()); + return false; + + } catch (Exception $e) { + common_log(LOG_ERR, "Error sending PuSH content " . + "to $this->callback for $this->topic: " . + $e->getMessage()); + return false; + } + } +} + diff --git a/plugins/FeedSub/extlib/README b/plugins/OStatus/extlib/README similarity index 100% rename from plugins/FeedSub/extlib/README rename to plugins/OStatus/extlib/README diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser.php b/plugins/OStatus/extlib/XML/Feed/Parser.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser.php rename to plugins/OStatus/extlib/XML/Feed/Parser.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/Atom.php b/plugins/OStatus/extlib/XML/Feed/Parser/Atom.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/Atom.php rename to plugins/OStatus/extlib/XML/Feed/Parser/Atom.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/AtomElement.php b/plugins/OStatus/extlib/XML/Feed/Parser/AtomElement.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/AtomElement.php rename to plugins/OStatus/extlib/XML/Feed/Parser/AtomElement.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/Exception.php b/plugins/OStatus/extlib/XML/Feed/Parser/Exception.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/Exception.php rename to plugins/OStatus/extlib/XML/Feed/Parser/Exception.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/RSS09.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS09.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/RSS09.php rename to plugins/OStatus/extlib/XML/Feed/Parser/RSS09.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/RSS09Element.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS09Element.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/RSS09Element.php rename to plugins/OStatus/extlib/XML/Feed/Parser/RSS09Element.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/RSS1.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS1.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/RSS1.php rename to plugins/OStatus/extlib/XML/Feed/Parser/RSS1.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/RSS11.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS11.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/RSS11.php rename to plugins/OStatus/extlib/XML/Feed/Parser/RSS11.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/RSS11Element.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS11Element.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/RSS11Element.php rename to plugins/OStatus/extlib/XML/Feed/Parser/RSS11Element.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/RSS1Element.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS1Element.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/RSS1Element.php rename to plugins/OStatus/extlib/XML/Feed/Parser/RSS1Element.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/RSS2.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS2.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/RSS2.php rename to plugins/OStatus/extlib/XML/Feed/Parser/RSS2.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/RSS2Element.php b/plugins/OStatus/extlib/XML/Feed/Parser/RSS2Element.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/RSS2Element.php rename to plugins/OStatus/extlib/XML/Feed/Parser/RSS2Element.php diff --git a/plugins/FeedSub/extlib/XML/Feed/Parser/Type.php b/plugins/OStatus/extlib/XML/Feed/Parser/Type.php similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/Parser/Type.php rename to plugins/OStatus/extlib/XML/Feed/Parser/Type.php diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/atom10-entryonly.xml b/plugins/OStatus/extlib/XML/Feed/samples/atom10-entryonly.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/atom10-entryonly.xml rename to plugins/OStatus/extlib/XML/Feed/samples/atom10-entryonly.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/atom10-example1.xml b/plugins/OStatus/extlib/XML/Feed/samples/atom10-example1.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/atom10-example1.xml rename to plugins/OStatus/extlib/XML/Feed/samples/atom10-example1.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/atom10-example2.xml b/plugins/OStatus/extlib/XML/Feed/samples/atom10-example2.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/atom10-example2.xml rename to plugins/OStatus/extlib/XML/Feed/samples/atom10-example2.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/delicious.feed b/plugins/OStatus/extlib/XML/Feed/samples/delicious.feed similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/delicious.feed rename to plugins/OStatus/extlib/XML/Feed/samples/delicious.feed diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/flickr.feed b/plugins/OStatus/extlib/XML/Feed/samples/flickr.feed similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/flickr.feed rename to plugins/OStatus/extlib/XML/Feed/samples/flickr.feed diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/grwifi-atom.xml b/plugins/OStatus/extlib/XML/Feed/samples/grwifi-atom.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/grwifi-atom.xml rename to plugins/OStatus/extlib/XML/Feed/samples/grwifi-atom.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/hoder.xml b/plugins/OStatus/extlib/XML/Feed/samples/hoder.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/hoder.xml rename to plugins/OStatus/extlib/XML/Feed/samples/hoder.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/illformed_atom10.xml b/plugins/OStatus/extlib/XML/Feed/samples/illformed_atom10.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/illformed_atom10.xml rename to plugins/OStatus/extlib/XML/Feed/samples/illformed_atom10.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/rss091-complete.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss091-complete.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/rss091-complete.xml rename to plugins/OStatus/extlib/XML/Feed/samples/rss091-complete.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/rss091-international.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss091-international.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/rss091-international.xml rename to plugins/OStatus/extlib/XML/Feed/samples/rss091-international.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/rss091-simple.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss091-simple.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/rss091-simple.xml rename to plugins/OStatus/extlib/XML/Feed/samples/rss091-simple.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/rss092-sample.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss092-sample.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/rss092-sample.xml rename to plugins/OStatus/extlib/XML/Feed/samples/rss092-sample.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/rss10-example1.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss10-example1.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/rss10-example1.xml rename to plugins/OStatus/extlib/XML/Feed/samples/rss10-example1.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/rss10-example2.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss10-example2.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/rss10-example2.xml rename to plugins/OStatus/extlib/XML/Feed/samples/rss10-example2.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/rss2sample.xml b/plugins/OStatus/extlib/XML/Feed/samples/rss2sample.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/rss2sample.xml rename to plugins/OStatus/extlib/XML/Feed/samples/rss2sample.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/sixapart-jp.xml b/plugins/OStatus/extlib/XML/Feed/samples/sixapart-jp.xml similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/sixapart-jp.xml rename to plugins/OStatus/extlib/XML/Feed/samples/sixapart-jp.xml diff --git a/plugins/FeedSub/extlib/XML/Feed/samples/technorati.feed b/plugins/OStatus/extlib/XML/Feed/samples/technorati.feed similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/samples/technorati.feed rename to plugins/OStatus/extlib/XML/Feed/samples/technorati.feed diff --git a/plugins/FeedSub/extlib/XML/Feed/schemas/atom.rnc b/plugins/OStatus/extlib/XML/Feed/schemas/atom.rnc similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/schemas/atom.rnc rename to plugins/OStatus/extlib/XML/Feed/schemas/atom.rnc diff --git a/plugins/FeedSub/extlib/XML/Feed/schemas/rss10.rnc b/plugins/OStatus/extlib/XML/Feed/schemas/rss10.rnc similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/schemas/rss10.rnc rename to plugins/OStatus/extlib/XML/Feed/schemas/rss10.rnc diff --git a/plugins/FeedSub/extlib/XML/Feed/schemas/rss11.rnc b/plugins/OStatus/extlib/XML/Feed/schemas/rss11.rnc similarity index 100% rename from plugins/FeedSub/extlib/XML/Feed/schemas/rss11.rnc rename to plugins/OStatus/extlib/XML/Feed/schemas/rss11.rnc diff --git a/plugins/FeedSub/extlib/xml-feed-parser-bug-16416.patch b/plugins/OStatus/extlib/xml-feed-parser-bug-16416.patch similarity index 100% rename from plugins/FeedSub/extlib/xml-feed-parser-bug-16416.patch rename to plugins/OStatus/extlib/xml-feed-parser-bug-16416.patch diff --git a/plugins/FeedSub/images/24px-Feed-icon.svg.png b/plugins/OStatus/images/24px-Feed-icon.svg.png similarity index 100% rename from plugins/FeedSub/images/24px-Feed-icon.svg.png rename to plugins/OStatus/images/24px-Feed-icon.svg.png diff --git a/plugins/FeedSub/images/48px-Feed-icon.svg.png b/plugins/OStatus/images/48px-Feed-icon.svg.png similarity index 100% rename from plugins/FeedSub/images/48px-Feed-icon.svg.png rename to plugins/OStatus/images/48px-Feed-icon.svg.png diff --git a/plugins/FeedSub/images/96px-Feed-icon.svg.png b/plugins/OStatus/images/96px-Feed-icon.svg.png similarity index 100% rename from plugins/FeedSub/images/96px-Feed-icon.svg.png rename to plugins/OStatus/images/96px-Feed-icon.svg.png diff --git a/plugins/FeedSub/images/README b/plugins/OStatus/images/README similarity index 100% rename from plugins/FeedSub/images/README rename to plugins/OStatus/images/README diff --git a/plugins/FeedSub/feeddiscovery.php b/plugins/OStatus/lib/feeddiscovery.php similarity index 94% rename from plugins/FeedSub/feeddiscovery.php rename to plugins/OStatus/lib/feeddiscovery.php index 35edaca33a..9bc7892fb2 100644 --- a/plugins/FeedSub/feeddiscovery.php +++ b/plugins/OStatus/lib/feeddiscovery.php @@ -48,6 +48,18 @@ class FeedSubNoFeedException extends FeedSubException { } +/** + * Given a web page or feed URL, discover the final location of the feed + * and return its current contents. + * + * @example + * $feed = new FeedDiscovery(); + * if ($feed->discoverFromURL($url)) { + * print $feed->uri; + * print $feed->type; + * processFeed($feed->body); + * } + */ class FeedDiscovery { public $uri; @@ -64,7 +76,7 @@ class FeedDiscovery /** * @param string $url - * @param bool $htmlOk + * @param bool $htmlOk pass false here if you don't want to follow web pages. * @return string with validated URL * @throws FeedSubBadURLException * @throws FeedSubBadHtmlException diff --git a/plugins/FeedSub/feedmunger.php b/plugins/OStatus/lib/feedmunger.php similarity index 87% rename from plugins/FeedSub/feedmunger.php rename to plugins/OStatus/lib/feedmunger.php index f3618b8eb0..eeb8d2df39 100644 --- a/plugins/FeedSub/feedmunger.php +++ b/plugins/OStatus/lib/feedmunger.php @@ -30,8 +30,8 @@ class FeedSubPreviewNotice extends Notice function __construct($profile) { - //parent::__construct(); // uhhh? $this->profile = $profile; + $this->profile_id = 0; } function getProfile() @@ -56,14 +56,19 @@ class FeedSubPreviewProfile extends Profile { function getAvatar($width, $height=null) { - return new FeedSubPreviewAvatar($width, $height); + return new FeedSubPreviewAvatar($width, $height, $this->avatar); } } class FeedSubPreviewAvatar extends Avatar { + function __construct($width, $height, $remote) + { + $this->remoteImage = $remote; + } + function displayUrl() { - return common_path('plugins/FeedSub/images/48px-Feed-icon.svg.png'); + return $this->remoteImage; } } @@ -150,6 +155,23 @@ class FeedMunger return $this->getAtomLink($this->feed, array('rel' => 'hub')); } + /** + * Get an appropriate avatar image source URL, if available. + * @return mixed string or false + */ + function getAvatar() + { + $logo = $this->feed->logo; + if ($logo) { + return $logo; + } + $icon = $this->feed->icon; + if ($icon) { + return $icon; + } + return common_path('plugins/OStatus/images/48px-Feed-icon.svg.png'); + } + function profile($preview=false) { if ($preview) { @@ -164,6 +186,10 @@ class FeedMunger $profile->homepage = $this->getAltLink($this->feed); $profile->bio = $this->feed->description; $profile->profileurl = $this->getAltLink($this->feed); + + if ($preview) { + $profile->avatar = $this->getAvatar(); + } // @todo tags from categories // @todo lat/lon/location? @@ -186,6 +212,12 @@ class FeedMunger } $link = $this->getAltLink($entry); + if (empty($link)) { + if (preg_match('!^https?://!', $entry->id)) { + $link = $entry->id; + common_log(LOG_DEBUG, "No link on entry, using URL from id: $link"); + } + } $notice->uri = $link; $notice->url = $link; $notice->content = $this->noticeFromEntry($entry); diff --git a/plugins/OStatus/lib/hubdistribqueuehandler.php b/plugins/OStatus/lib/hubdistribqueuehandler.php new file mode 100644 index 0000000000..126f1355f9 --- /dev/null +++ b/plugins/OStatus/lib/hubdistribqueuehandler.php @@ -0,0 +1,87 @@ +. + */ + +/** + * Send a PuSH subscription verification from our internal hub. + * Queue up final distribution for + * @package Hub + * @author Brion Vibber + */ +class HubDistribQueueHandler extends QueueHandler +{ + function transport() + { + return 'hubdistrib'; + } + + function handle($notice) + { + assert($notice instanceof Notice); + + // See if there's any PuSH subscriptions, including OStatus clients. + // @fixme handle group subscriptions as well + // http://identi.ca/api/statuses/user_timeline/1.atom + $feed = common_local_url('ApiTimelineUser', + array('id' => $notice->profile_id, + 'format' => 'atom')); + $sub = new HubSub(); + $sub->topic = $feed; + if ($sub->find()) { + common_log(LOG_INFO, "Preparing $sub->N PuSH distribution(s) for $feed"); + $qm = QueueManager::get(); + $atom = $this->userFeedForNotice($notice); + while ($sub->fetch()) { + common_log(LOG_INFO, "Prepping PuSH distribution to $sub->callback for $feed"); + $data = array('sub' => clone($sub), + 'atom' => $atom); + $qm->enqueue($data, 'hubout'); + } + } else { + common_log(LOG_INFO, "No PuSH subscribers for $feed"); + } + } + + /** + * Build a single-item version of the sending user's Atom feed. + * @param Notice $notice + * @return string + */ + function userFeedForNotice($notice) + { + // @fixme this feels VERY hacky... + // should probably be a cleaner way to do it + + ob_start(); + $api = new ApiTimelineUserAction(); + $api->prepare(array('id' => $notice->profile_id, + 'format' => 'atom', + 'max_id' => $notice->id, + 'since_id' => $notice->id - 1)); + $api->showTimeline(); + $feed = ob_get_clean(); + + // ...and override the content-type back to something normal... eww! + // hope there's no other headers that got set while we weren't looking. + header('Content-Type: text/html; charset=utf-8'); + + common_log(LOG_DEBUG, $feed); + return $feed; + } +} + diff --git a/plugins/OStatus/lib/huboutqueuehandler.php b/plugins/OStatus/lib/huboutqueuehandler.php new file mode 100644 index 0000000000..cb44ad2c4e --- /dev/null +++ b/plugins/OStatus/lib/huboutqueuehandler.php @@ -0,0 +1,52 @@ +. + */ + +/** + * Send a raw PuSH atom update from our internal hub. + * @package Hub + * @author Brion Vibber + */ +class HubOutQueueHandler extends QueueHandler +{ + function transport() + { + return 'hubout'; + } + + function handle($data) + { + $sub = $data['sub']; + $atom = $data['atom']; + + assert($sub instanceof HubSub); + assert(is_string($atom)); + + try { + $sub->push($atom); + } catch (Exception $e) { + common_log(LOG_ERR, "Failed PuSH to $sub->callback for $sub->topic: " . + $e->getMessage()); + // @fixme Reschedule a later delivery? + // Currently we have no way to do this other than 'send NOW' + } + + return true; + } +} + diff --git a/plugins/OStatus/lib/hubverifyqueuehandler.php b/plugins/OStatus/lib/hubverifyqueuehandler.php new file mode 100644 index 0000000000..125d13a777 --- /dev/null +++ b/plugins/OStatus/lib/hubverifyqueuehandler.php @@ -0,0 +1,53 @@ +. + */ + +/** + * Send a PuSH subscription verification from our internal hub. + * @package Hub + * @author Brion Vibber + */ +class HubVerifyQueueHandler extends QueueHandler +{ + function transport() + { + return 'hubverify'; + } + + function handle($data) + { + $sub = $data['sub']; + $mode = $data['mode']; + + assert($sub instanceof HubSub); + assert($mode === 'subscribe' || $mode === 'unsubscribe'); + + common_log(LOG_INFO, __METHOD__ . ": $mode $sub->callback $sub->topic"); + try { + $sub->verify($mode); + } catch (Exception $e) { + common_log(LOG_ERR, "Failed PuSH $mode verify to $sub->callback for $sub->topic: " . + $e->getMessage()); + // @fixme schedule retry? + // @fixme just kill it? + } + + return true; + } +} + diff --git a/plugins/FeedSub/locale/FeedSub.po b/plugins/OStatus/locale/OStatus.po similarity index 100% rename from plugins/FeedSub/locale/FeedSub.po rename to plugins/OStatus/locale/OStatus.po diff --git a/plugins/FeedSub/locale/fr/LC_MESSAGES/FeedSub.po b/plugins/OStatus/locale/fr/LC_MESSAGES/OStatus.po similarity index 100% rename from plugins/FeedSub/locale/fr/LC_MESSAGES/FeedSub.po rename to plugins/OStatus/locale/fr/LC_MESSAGES/OStatus.po diff --git a/plugins/FeedSub/tests/FeedDiscoveryTest.php b/plugins/OStatus/tests/FeedDiscoveryTest.php similarity index 100% rename from plugins/FeedSub/tests/FeedDiscoveryTest.php rename to plugins/OStatus/tests/FeedDiscoveryTest.php diff --git a/plugins/FeedSub/tests/FeedMungerTest.php b/plugins/OStatus/tests/FeedMungerTest.php similarity index 100% rename from plugins/FeedSub/tests/FeedMungerTest.php rename to plugins/OStatus/tests/FeedMungerTest.php diff --git a/plugins/FeedSub/tests/gettext-speedtest.php b/plugins/OStatus/tests/gettext-speedtest.php similarity index 100% rename from plugins/FeedSub/tests/gettext-speedtest.php rename to plugins/OStatus/tests/gettext-speedtest.php From 21c0e75a2e52d63eb46de6f5938b00c4c9ba8323 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 5 Feb 2010 21:39:29 -0800 Subject: [PATCH 24/78] Store Twitter screen_name, not name, for foreign_user.nickname when saving Twitter user. --- plugins/TwitterBridge/twitterauthorization.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/TwitterBridge/twitterauthorization.php b/plugins/TwitterBridge/twitterauthorization.php index b2657ff61f..dbef438a4b 100644 --- a/plugins/TwitterBridge/twitterauthorization.php +++ b/plugins/TwitterBridge/twitterauthorization.php @@ -219,7 +219,7 @@ class TwitterauthorizationAction extends Action $user = common_current_user(); $this->saveForeignLink($user->id, $twitter_user->id, $atok); - save_twitter_user($twitter_user->id, $twitter_user->name); + save_twitter_user($twitter_user->id, $twitter_user->screen_name); } else { From c83d0b5e98fc6e59632a0fa1335b3586996929e2 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Sat, 6 Feb 2010 06:46:00 +0000 Subject: [PATCH 25/78] Delete old Twitter user record when user changes screen name instead of updating. Simpler. --- plugins/TwitterBridge/twitter.php | 54 +++++-------------------------- 1 file changed, 8 insertions(+), 46 deletions(-) diff --git a/plugins/TwitterBridge/twitter.php b/plugins/TwitterBridge/twitter.php index 33dfb788bf..de30d9ebf1 100644 --- a/plugins/TwitterBridge/twitter.php +++ b/plugins/TwitterBridge/twitter.php @@ -26,38 +26,6 @@ define('TWITTER_SERVICE', 1); // Twitter is foreign_service ID 1 require_once INSTALLDIR . '/plugins/TwitterBridge/twitterbasicauthclient.php'; require_once INSTALLDIR . '/plugins/TwitterBridge/twitteroauthclient.php'; -function updateTwitter_user($twitter_id, $screen_name) -{ - $uri = 'http://twitter.com/' . $screen_name; - $fuser = new Foreign_user(); - - $fuser->query('BEGIN'); - - // Dropping down to SQL because regular DB_DataObject udpate stuff doesn't seem - // to work so good with tables that have multiple column primary keys - - // Any time we update the uri for a forein user we have to make sure there - // are no dupe entries first -- unique constraint on the uri column - - $qry = 'UPDATE foreign_user set uri = \'\' WHERE uri = '; - $qry .= '\'' . $uri . '\'' . ' AND service = ' . TWITTER_SERVICE; - - $fuser->query($qry); - - // Update the user - - $qry = 'UPDATE foreign_user SET nickname = '; - $qry .= '\'' . $screen_name . '\'' . ', uri = \'' . $uri . '\' '; - $qry .= 'WHERE id = ' . $twitter_id . ' AND service = ' . TWITTER_SERVICE; - - $fuser->query('COMMIT'); - - $fuser->free(); - unset($fuser); - - return true; -} - function add_twitter_user($twitter_id, $screen_name) { @@ -105,7 +73,6 @@ function add_twitter_user($twitter_id, $screen_name) // Creates or Updates a Twitter user function save_twitter_user($twitter_id, $screen_name) { - // Check to see whether the Twitter user is already in the system, // and update its screen name and uri if so. @@ -115,25 +82,20 @@ function save_twitter_user($twitter_id, $screen_name) $result = true; - // Only update if Twitter screen name has changed + // Delete old record if Twitter user changed screen name if ($fuser->nickname != $screen_name) { - $result = updateTwitter_user($twitter_id, $screen_name); - - common_debug('Twitter bridge - Updated nickname (and URI) for Twitter user ' . - "$fuser->id to $screen_name, was $fuser->nickname"); + $oldname = $fuser->nickname; + $fuser->delete(); + common_log(LOG_INFO, sprintf('Twitter bridge - Updated nickname (and URI) ' . + 'for Twitter user %1$d - %2$s, was %3$s.', + $fuser->id, + $screen_name, + $oldname)); } - return $result; - - } else { return add_twitter_user($twitter_id, $screen_name); } - - $fuser->free(); - unset($fuser); - - return true; } function is_twitter_bound($notice, $flink) { From 9cac8eaae5315f64e024d22119bc627e9bdd6141 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 1 Feb 2010 13:44:06 -0500 Subject: [PATCH 26/78] readme and version for beta5 --- README | 80 ++++++++++++++++++++++++++++++++++++++++++++++++-- lib/common.php | 2 +- 2 files changed, 79 insertions(+), 3 deletions(-) diff --git a/README b/README index 4e576dcdd3..9b4147645b 100644 --- a/README +++ b/README @@ -2,8 +2,8 @@ README ------ -StatusNet 0.9.0 ("Stand") Beta 4 -27 Jan 2010 +StatusNet 0.9.0 ("Stand") Beta 5 +1 Feb 2010 This is the README file for StatusNet (formerly Laconica), the Open Source microblogging platform. It includes installation instructions, @@ -78,6 +78,11 @@ New this version ================ This is a major feature release since version 0.8.2, released Nov 1 2009. +It is also a security release since 0.9.0beta4 January 27 2010. Beta +users are strongly encouraged to upgrade to deal with a security alert. + +http://status.net/wiki/Security_alert_0000002 + Notable changes this version: - Records of deleted notices are stored without the notice content. @@ -198,6 +203,77 @@ Notable changes this version: - Major refactoring of queue handlers to manage very large hosting site (like status.net) - SubscriptionThrottle plugin to prevent subscription spamming +- Don't enqueue into plugin or SMS queues when disabled (breaks unqueuehandler if SMS queue isn't attached) +- Improve name validation checks on local File references +- fix local file include vulnerability in doc.php +- Reusing fixed selector name for 'processing' in util.js +- Removed hAtom pattern from registration page. +- restructuring of User::registerNew() lost password munging +- Add a script to clear the cache for a given key +- buggy fetch for site owner +- Added missing concat of in Realtime response +- Updated XHR binded events to work better in jQuery 1.4.1. Using .live() for event delegation instead of jQuery.data() and checking to see if an element was previously binded. +- Updated jQuery Form Plugin from v2.17 to v2.36 +- Updated jQuery JavaScript Library from v1.3.2 to v1.4.1 +- move schema.type.php to typeschema.php like other files +- Add Really Simple Discovery (RSD) support +- Add a robots.txt URL to the site root +- error clearing tags for profiles from memcached +- on exceptions, stomp logs the error and reenqueues +- add lat, lon, location and remove closing tag from geocode.php +- Use passed-in lat long in geocode.php +- better handling of null responses from geonames.org +- Globalized form notice data geo values +- Using jQuery chaining in FormNoticeXHR +- Using form object instead of form_id and find(). Slightly faster and easier to read. +- removed describeTable from base class, and fixed it up in pgsql +- getTableDef() mostly working in postgres +- move the schema DDL sql off into seperate files for each db we support +- plugin to limit number of registered users +- add hooks for user registration +- live fast, die young in bash scripts +- for single-user mode, retrieve either site owner or defined nickname +- method to get the site owner +- define a constant for the 'owner' role of a site +- add simple cache getter/setter static functions to Memcached_DataObject +- Adds notice author's name to @title in Realtime response +- Hides .author from XHR response in showstream +- Hides .author from XHR response in showstream +- Fix more fatal errors in queue edge cases +- Don't attempt to resend XMPP messages that can't be broadcast due to the profile being deleted. +- Wrap each bit of distrib queue handler's saving operation in a try/catch; log exceptions but let everything else continue. +- Log exceptions from queuedaemon.php if they're not already caught +- Move sessions settings to its own panel +- Fixes for status_network db object .ini and tag setter script +- Add a script to set tags for sites +- Adjust API authentication to also check for OAuth protocol params in the HTTP Authorization header, as defined in OAuth HTTP Authorization Scheme. +- Last-chance distribution if enqueueing fails +- Manual failover for stomp queues. +- lost config in index.php made all traffic go to master +- "Revert "move RW setup above user get in index.php so remember_me works"" +- Revert "move RW setup above user get in index.php so remember_me works" +- move RW setup above user get in index.php so remember_me works +- hide most DB_DataObject errors +- always set up database_rw, regardless, so cached sessions work +- update mysqltimestamps on insert and update +- additional debugging data for Sessions +- 'Sign in with Twitter' button img +- Update to biz theme +- Remove redundant session token field from form (was already being added by base class). +- 'Sign in with Twitter' button img +- Can now set $config['queue']['stomp_persistent'] = false; to explicitly disable persistence when we queue items +- Showing processing indicator for form_repeat on submit instead of form +- Removed avatar from repeat of username (matches noticelist) +- Removed unused variable assignment for avatar URL and added missing fn +- Don't preemptively close existing DB connections for web views (needed to keep # of conns from going insane on multi-site queue daemons, so just doing for CLI) May, or may not, help with mystery session problems +- dropping the setcookie() call from common_ensure_session() since we're pretty sure it's unnecessary +- append '/' on cookie path for now (may still need some refactoring) +- set session cookie correctly +- Fix for Mapstraction plugin's zoomed map links +- debug log line for control channel sub +- Move faceboookapp.js to the Facebook plugin +- fix for fix for bad realtime JS load +- default 24-hour expiry on Memcached objects where not specified. Prerequisites ============= diff --git a/lib/common.php b/lib/common.php index b482464aac..b95cd11752 100644 --- a/lib/common.php +++ b/lib/common.php @@ -22,7 +22,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } //exit with 200 response, if this is checking fancy from the installer if (isset($_REQUEST['p']) && $_REQUEST['p'] == 'check-fancy') { exit; } -define('STATUSNET_VERSION', '0.9.0beta4'); +define('STATUSNET_VERSION', '0.9.0beta5'); define('LACONICA_VERSION', STATUSNET_VERSION); // compatibility define('STATUSNET_CODENAME', 'Stand'); From 384387c9b05aefb438f5dbe7e272b1f234ede172 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 8 Feb 2010 14:06:36 -0800 Subject: [PATCH 27/78] OStatus cleanup... * Treat linkless feed posts as status updates; drop the "New post:" prefix and quotes on them. * Use stable user IDs for atom/rss2 feed links instead of unstable nicknames * Pull Atom feed preferentially when subscribing -- can now put the remote user's profile page straight into the feed subscription form and get to the right place. * Clean up naming for push endpoints --- actions/showstream.php | 4 +- classes/Notice.php | 4 ++ lib/util.php | 3 ++ plugins/OStatus/OStatusPlugin.php | 8 ++-- .../{feedsubcallback.php => pushcallback.php} | 2 +- .../OStatus/actions/{hub.php => pushhub.php} | 2 +- plugins/OStatus/classes/Feedinfo.php | 2 +- plugins/OStatus/lib/feeddiscovery.php | 22 ++++++--- plugins/OStatus/lib/feedmunger.php | 47 ++++++++++++------- 9 files changed, 61 insertions(+), 33 deletions(-) rename plugins/OStatus/actions/{feedsubcallback.php => pushcallback.php} (98%) rename plugins/OStatus/actions/{hub.php => pushhub.php} (99%) diff --git a/actions/showstream.php b/actions/showstream.php index 07cc68b765..f9407e35a1 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -131,14 +131,14 @@ class ShowstreamAction extends ProfileAction new Feed(Feed::RSS2, common_local_url('ApiTimelineUser', array( - 'id' => $this->user->nickname, + 'id' => $this->user->id, 'format' => 'rss')), sprintf(_('Notice feed for %s (RSS 2.0)'), $this->user->nickname)), new Feed(Feed::ATOM, common_local_url('ApiTimelineUser', array( - 'id' => $this->user->nickname, + 'id' => $this->user->id, 'format' => 'atom')), sprintf(_('Notice feed for %s (Atom)'), $this->user->nickname)), diff --git a/classes/Notice.php b/classes/Notice.php index f9f3863579..fca1c599ce 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1176,6 +1176,10 @@ class Notice extends Memcached_DataObject // Figure out who that is. $sender = Profile::staticGet('id', $profile_id); + if (empty($sender)) { + return null; + } + $recipient = common_relative_profile($sender, $nickname, common_sql_now()); if (empty($recipient)) { diff --git a/lib/util.php b/lib/util.php index f0f262dc5e..00c21aeb21 100644 --- a/lib/util.php +++ b/lib/util.php @@ -665,6 +665,9 @@ function common_valid_profile_tag($str) function common_at_link($sender_id, $nickname) { $sender = Profile::staticGet($sender_id); + if (!$sender) { + return $nickname; + } $recipient = common_relative_profile($sender, common_canonical_nickname($nickname)); if ($recipient) { $user = User::staticGet('id', $recipient->id); diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 9419121121..4e8b892c6b 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -53,10 +53,10 @@ class OStatusPlugin extends Plugin */ function onRouterInitialized($m) { - $m->connect('push/hub', array('action' => 'hub')); + $m->connect('main/push/hub', array('action' => 'pushhub')); - $m->connect('feedsub/callback/:feed', - array('action' => 'feedsubcallback'), + $m->connect('main/push/callback/:feed', + array('action' => 'pushcallback'), array('feed' => '[0-9]+')); $m->connect('settings/feedsub', array('action' => 'feedsubsettings')); @@ -97,7 +97,7 @@ class OStatusPlugin extends Plugin // Canonical form of id in URL? // Updates will be handled for our internal PuSH hub. $action->element('link', array('rel' => 'hub', - 'href' => common_local_url('hub'))); + 'href' => common_local_url('pushhub'))); } } return true; diff --git a/plugins/OStatus/actions/feedsubcallback.php b/plugins/OStatus/actions/pushcallback.php similarity index 98% rename from plugins/OStatus/actions/feedsubcallback.php rename to plugins/OStatus/actions/pushcallback.php index c57ea5b101..a5e02e08f1 100644 --- a/plugins/OStatus/actions/feedsubcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -25,7 +25,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } -class FeedSubCallbackAction extends Action +class PushCallbackAction extends Action { function handle() { diff --git a/plugins/OStatus/actions/hub.php b/plugins/OStatus/actions/pushhub.php similarity index 99% rename from plugins/OStatus/actions/hub.php rename to plugins/OStatus/actions/pushhub.php index 5caf4b48eb..901c18f702 100644 --- a/plugins/OStatus/actions/hub.php +++ b/plugins/OStatus/actions/pushhub.php @@ -37,7 +37,7 @@ Things to consider... */ -class HubAction extends Action +class PushHubAction extends Action { function arg($arg, $def=null) { diff --git a/plugins/OStatus/classes/Feedinfo.php b/plugins/OStatus/classes/Feedinfo.php index f29d08cb03..107faf0125 100644 --- a/plugins/OStatus/classes/Feedinfo.php +++ b/plugins/OStatus/classes/Feedinfo.php @@ -248,7 +248,7 @@ class Feedinfo extends Memcached_DataObject #$this->verify_token = $token; #$this->update(); // @fixme try { - $callback = common_local_url('feedsubcallback', array('feed' => $this->id)); + $callback = common_local_url('pushcallback', array('feed' => $this->id)); $headers = array('Content-Type: application/x-www-form-urlencoded'); $post = array('hub.mode' => 'subscribe', 'hub.callback' => $callback, diff --git a/plugins/OStatus/lib/feeddiscovery.php b/plugins/OStatus/lib/feeddiscovery.php index 9bc7892fb2..39985fc902 100644 --- a/plugins/OStatus/lib/feeddiscovery.php +++ b/plugins/OStatus/lib/feeddiscovery.php @@ -168,7 +168,13 @@ class FeedDiscovery } // Ok... now on to the links! + // Types listed in order of priority -- we'll prefer Atom if available. // @fixme merge with the munger link checks + $feeds = array( + 'application/atom+xml' => false, + 'application/rss+xml' => false, + ); + $nodes = $dom->getElementsByTagName('link'); for ($i = 0; $i < $nodes->length; $i++) { $node = $nodes->item($i); @@ -181,17 +187,21 @@ class FeedDiscovery $type = trim($type->value); $href = trim($href->value); - $feedTypes = array( - 'application/rss+xml', - 'application/atom+xml', - ); - if (trim($rel) == 'alternate' && in_array($type, $feedTypes)) { - return $this->resolveURI($href, $base); + if (trim($rel) == 'alternate' && array_key_exists($type, $feeds) && empty($feeds[$type])) { + // Save the first feed found of each type... + $feeds[$type] = $this->resolveURI($href, $base); } } } } + // Return the highest-priority feed found + foreach ($feeds as $type => $url) { + if ($url) { + return $url; + } + } + return false; } diff --git a/plugins/OStatus/lib/feedmunger.php b/plugins/OStatus/lib/feedmunger.php index eeb8d2df39..9480177025 100644 --- a/plugins/OStatus/lib/feedmunger.php +++ b/plugins/OStatus/lib/feedmunger.php @@ -235,34 +235,45 @@ class FeedMunger */ function noticeFromEntry($entry) { + $max = Notice::maxContent(); + $ellipsis = "\xe2\x80\xa6"; // U+2026 HORIZONTAL ELLIPSIS $title = $entry->title; $link = $entry->link; - + // @todo We can get entries like this: // $cats = $entry->getCategory('category', array(0, true)); // but it feels like an awful hack. If it's accessible cleanly, // try adding #hashtags from the categories/tags on a post. - - // @todo Should we force a language here? - $format = _m('New post: "%1$s" %2$s'); + $title = $entry->title; $link = $this->getAltLink($entry); - $out = sprintf($format, $title, $link); - - // Trim link if needed... - $max = Notice::maxContent(); - if (mb_strlen($out) > $max) { - $link = common_shorten_url($link); + if ($link) { + // Blog post or such... + // @todo Should we force a language here? + $format = _m('New post: "%1$s" %2$s'); $out = sprintf($format, $title, $link); - } - // Trim title if needed... - if (mb_strlen($out) > $max) { - $ellipsis = "\xe2\x80\xa6"; // U+2026 HORIZONTAL ELLIPSIS - $used = mb_strlen($out) - mb_strlen($title); - $available = $max - $used - mb_strlen($ellipsis); - $title = mb_substr($title, 0, $available) . $ellipsis; - $out = sprintf($format, $title, $link); + // Trim link if needed... + if (mb_strlen($out) > $max) { + $link = common_shorten_url($link); + $out = sprintf($format, $title, $link); + } + + // Trim title if needed... + if (mb_strlen($out) > $max) { + $used = mb_strlen($out) - mb_strlen($title); + $available = $max - $used - mb_strlen($ellipsis); + $title = mb_substr($title, 0, $available) . $ellipsis; + $out = sprintf($format, $title, $link); + } + } else { + // No link? Consider a bare status update. + if (mb_strlen($title) > $max) { + $available = $max - mb_strlen($ellipsis); + $out = mb_substr($title, 0, $available) . $ellipsis; + } else { + $out = $title; + } } return $out; From 96ef4435b61570dbbf15d921a42543bfb13786c0 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 8 Feb 2010 15:32:20 -0800 Subject: [PATCH 28/78] Allow scripts/decache.php to blow out cache for objects that don't exist (anymore). May miss keys other than the given or primary key, but should work for a lot of common cases where a bad entry's been removed from DB but lingers in cache. --- scripts/decache.php | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/scripts/decache.php b/scripts/decache.php index 7cabd78ada..094bdb5aa0 100644 --- a/scripts/decache.php +++ b/scripts/decache.php @@ -24,6 +24,8 @@ $helptext = << [] Clears the cache for the object in table with id If is specified, use that instead of 'id' + + ENDOFHELP; require_once INSTALLDIR.'/scripts/commandline.inc'; @@ -43,8 +45,10 @@ if (count($args) > 2) { $object = Memcached_DataObject::staticGet($table, $column, $id); if (!$object) { - print "No such '$table' with $column = '$id'.\n"; - exit(1); + print "No such '$table' with $column = '$id'; it's possible some cache keys won't be cleared properly.\n"; + $class = ucfirst($table); + $object = new $class(); + $object->column = $id; } $result = $object->decache(); From b9b0f0410aa688cc3ee77df1563773527a8d59a9 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 8 Feb 2010 15:46:38 -0800 Subject: [PATCH 29/78] Pull GeoRSS locations over OStatus feeds --- plugins/OStatus/lib/feedmunger.php | 37 +++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/plugins/OStatus/lib/feedmunger.php b/plugins/OStatus/lib/feedmunger.php index 9480177025..cbaec67750 100644 --- a/plugins/OStatus/lib/feedmunger.php +++ b/plugins/OStatus/lib/feedmunger.php @@ -225,10 +225,45 @@ class FeedMunger $notice->created = common_sql_date($entry->updated); // @fixme $notice->is_local = Notice::GATEWAY; $notice->source = 'feed'; - + + $location = $this->getLocation($entry); + if ($location) { + if ($location->location_id) { + $notice->location_ns = $location->location_ns; + $notice->location_id = $location->location_id; + } + $notice->lat = $location->lat; + $notice->lon = $location->lon; + } + return $notice; } + /** + * @param feed item $entry + * @return mixed Location or false + */ + function getLocation($entry) + { + $dom = $entry->model; + $points = $dom->getElementsByTagNameNS('http://www.georss.org/georss', 'point'); + + for ($i = 0; $i < $points->length; $i++) { + $point = trim($points->item(0)->textContent); + $coords = explode(' ', $point); + if (count($coords) == 2) { + list($lat, $lon) = $coords; + if (is_numeric($lat) && is_numeric($lon)) { + common_log(LOG_INFO, "Looking up location for $lat $lon from georss"); + return Location::fromLatLon($lat, $lon); + } + } + common_log(LOG_ERR, "Ignoring bogus georss:point value $point"); + } + + return false; + } + /** * @param XML_Feed_Type $entry * @return string notice text, within post size limit From bc4e843f396dc450b04b612e7de14246084469d1 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 8 Feb 2010 19:22:55 -0800 Subject: [PATCH 30/78] Disable deprecated 'since' parameter on public_timeline API; causes performance problems. (since_id will work cleanly) --- actions/apitimelinepublic.php | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/actions/apitimelinepublic.php b/actions/apitimelinepublic.php index 3f4a46c0fa..0fb0788e98 100644 --- a/actions/apitimelinepublic.php +++ b/actions/apitimelinepublic.php @@ -74,6 +74,10 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction parent::prepare($args); $this->notices = $this->getNotices(); + + if ($this->since) { + throw new ServerException("since parameter is disabled for performance; use since_id", 403); + } return true; } @@ -145,7 +149,7 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction $notice = Notice::publicStream( ($this->page - 1) * $this->count, $this->count, $this->since_id, - $this->max_id, $this->since + $this->max_id ); while ($notice->fetch()) { From b56b154b51ede363ee8e49ec5b9b9332b8df923c Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 8 Feb 2010 21:52:05 -0800 Subject: [PATCH 31/78] Better checking for duplicate app names --- actions/editapplication.php | 2 +- actions/newapplication.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/actions/editapplication.php b/actions/editapplication.php index ca5dba1e49..64cf0a5745 100644 --- a/actions/editapplication.php +++ b/actions/editapplication.php @@ -277,7 +277,7 @@ class EditApplicationAction extends OwnerDesignAction function nameExists($name) { $newapp = Oauth_application::staticGet('name', $name); - if (!$newapp) { + if (empty($newapp)) { return false; } else { return $newapp->id != $this->app->id; diff --git a/actions/newapplication.php b/actions/newapplication.php index c0c5207979..0f819b3499 100644 --- a/actions/newapplication.php +++ b/actions/newapplication.php @@ -290,7 +290,7 @@ class NewApplicationAction extends OwnerDesignAction function nameExists($name) { $app = Oauth_application::staticGet('name', $name); - return ($app !== false); + return !empty($app); } } From 2600ad9643cf4bcca291998379b1668f695f9a88 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 8 Feb 2010 21:52:05 -0800 Subject: [PATCH 32/78] Better checking for duplicate app names --- actions/editapplication.php | 2 +- actions/newapplication.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/actions/editapplication.php b/actions/editapplication.php index ca5dba1e49..64cf0a5745 100644 --- a/actions/editapplication.php +++ b/actions/editapplication.php @@ -277,7 +277,7 @@ class EditApplicationAction extends OwnerDesignAction function nameExists($name) { $newapp = Oauth_application::staticGet('name', $name); - if (!$newapp) { + if (empty($newapp)) { return false; } else { return $newapp->id != $this->app->id; diff --git a/actions/newapplication.php b/actions/newapplication.php index c0c5207979..0f819b3499 100644 --- a/actions/newapplication.php +++ b/actions/newapplication.php @@ -290,7 +290,7 @@ class NewApplicationAction extends OwnerDesignAction function nameExists($name) { $app = Oauth_application::staticGet('name', $name); - return ($app !== false); + return !empty($app); } } From 70d5f39ed66cb277e925ea71dcc24ca580110b3d Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 8 Feb 2010 21:52:05 -0800 Subject: [PATCH 33/78] Better checking for duplicate app names --- actions/editapplication.php | 2 +- actions/newapplication.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/actions/editapplication.php b/actions/editapplication.php index ca5dba1e49..64cf0a5745 100644 --- a/actions/editapplication.php +++ b/actions/editapplication.php @@ -277,7 +277,7 @@ class EditApplicationAction extends OwnerDesignAction function nameExists($name) { $newapp = Oauth_application::staticGet('name', $name); - if (!$newapp) { + if (empty($newapp)) { return false; } else { return $newapp->id != $this->app->id; diff --git a/actions/newapplication.php b/actions/newapplication.php index c0c5207979..0f819b3499 100644 --- a/actions/newapplication.php +++ b/actions/newapplication.php @@ -290,7 +290,7 @@ class NewApplicationAction extends OwnerDesignAction function nameExists($name) { $app = Oauth_application::staticGet('name', $name); - return ($app !== false); + return !empty($app); } } From 841981a38140b793b7e950a0d2e057c720816ccb Mon Sep 17 00:00:00 2001 From: James Walker Date: Tue, 9 Feb 2010 01:37:45 -0500 Subject: [PATCH 34/78] discovery piece - hand merged :P --- plugins/OStatus/OStatusPlugin.php | 37 +++- plugins/OStatus/actions/hostmeta.php | 42 +++++ plugins/OStatus/actions/ostatusinit.php | 128 ++++++++++++++ plugins/OStatus/actions/ostatussub.php | 226 ++++++++++++++++++++++++ plugins/OStatus/actions/webfinger.php | 70 ++++++++ plugins/OStatus/lib/Webfinger.php | 139 +++++++++++++++ plugins/OStatus/lib/XRD.php | 183 +++++++++++++++++++ 7 files changed, 824 insertions(+), 1 deletion(-) create mode 100644 plugins/OStatus/actions/hostmeta.php create mode 100644 plugins/OStatus/actions/ostatusinit.php create mode 100644 plugins/OStatus/actions/ostatussub.php create mode 100644 plugins/OStatus/actions/webfinger.php create mode 100644 plugins/OStatus/lib/Webfinger.php create mode 100644 plugins/OStatus/lib/XRD.php diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 4e8b892c6b..ce33344d2c 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -53,6 +53,19 @@ class OStatusPlugin extends Plugin */ function onRouterInitialized($m) { + $m->connect('.well-known/host-meta', + array('action' => 'hostmeta')); + $m->connect('main/webfinger', + array('action' => 'webfinger')); + $m->connect('main/ostatus', + array('action' => 'ostatusinit')); + $m->connect('main/ostatus?nickname=:nickname', + array('action' => 'ostatusinit'), array('nickname' => '[A-Za-z0-9_-]+')); + $m->connect('main/ostatussub', + array('action' => 'ostatussub')); + $m->connect('main/ostatussub', + array('action' => 'ostatussub'), array('feed' => '[A-Za-z0-9\.\/\:]+')); + $m->connect('main/push/hub', array('action' => 'pushhub')); $m->connect('main/push/callback/:feed', @@ -148,6 +161,28 @@ class OStatusPlugin extends Plugin return true; } + /** + * Add in an OStatus subscribe button + */ + function onStartProfilePageActionsElements($output, $profile) + { + $cur = common_current_user(); + + if (empty($cur)) { + // Add an OStatus subscribe + $output->elementStart('li', 'entity_subscribe'); + $url = common_local_url('ostatusinit', + array('nickname' => $profile->nickname)); + $output->element('a', array('href' => $url, + 'class' => 'entity_remote_subscribe'), + _('OStatus')); + + $output->elementEnd('li'); + } + } + + + function onCheckSchema() { // warning: the autoincrement doesn't seem to set. // alter table feedinfo change column id id int(11) not null auto_increment; @@ -155,5 +190,5 @@ class OStatusPlugin extends Plugin $schema->ensureTable('feedinfo', Feedinfo::schemaDef()); $schema->ensureTable('hubsub', HubSub::schemaDef()); return true; - } + } } diff --git a/plugins/OStatus/actions/hostmeta.php b/plugins/OStatus/actions/hostmeta.php new file mode 100644 index 0000000000..850b8a0fe8 --- /dev/null +++ b/plugins/OStatus/actions/hostmeta.php @@ -0,0 +1,42 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer James Walker + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +class HostMetaAction extends Action +{ + + function handle() + { + parent::handle(); + + $w = new Webfinger(); + + + $domain = common_config('site', 'server'); + $url = common_local_url('webfinger'); + $url.= '?uri={uri}'; + print $w->getHostMeta($domain, $url); + } +} diff --git a/plugins/OStatus/actions/ostatusinit.php b/plugins/OStatus/actions/ostatusinit.php new file mode 100644 index 0000000000..bac2c4d438 --- /dev/null +++ b/plugins/OStatus/actions/ostatusinit.php @@ -0,0 +1,128 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer James Walker + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + + +class OStatusInitAction extends Action +{ + + var $nickname; + var $acct; + var $err; + + function prepare($args) + { + parent::prepare($args); + + if (common_logged_in()) { + $this->clientError(_('You can use the local subscription!')); + return false; + } + + $this->nickname = $this->trimmed('nickname'); + $this->acct = $this->trimmed('acct'); + + return true; + } + + function handle($args) + { + parent::handle($args); + + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + /* Use a session token for CSRF protection. */ + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->showForm(_('There was a problem with your session token. '. + 'Try again, please.')); + return; + } + $this->ostatusConnect(); + } else { + $this->showForm(); + } + } + + function showForm($err = null) + { + $this->err = $err; + $this->showPage(); + + } + + function showContent() + { + $this->elementStart('form', array('id' => 'form_ostatus_connect', + 'method' => 'post', + 'class' => 'form_settings', + 'action' => common_local_url('ostatusinit'))); + $this->elementStart('fieldset'); + $this->element('legend', _('Subscribe to a remote user')); + $this->hidden('token', common_session_token()); + + $this->elementStart('ul', 'form_data'); + $this->elementStart('li'); + $this->input('nickname', _('User nickname'), $this->nickname, + _('Nickname of the user you want to follow')); + $this->elementEnd('li'); + $this->elementStart('li'); + $this->input('acct', _('Profile Account'), $this->acct, + _('Your account id (i.e. user@identi.ca)')); + $this->elementEnd('li'); + $this->elementEnd('ul'); + $this->submit('submit', _('Subscribe')); + $this->elementEnd('fieldset'); + $this->elementEnd('form'); + } + + function ostatusConnect() + { + $w = new Webfinger; + + $result = $w->lookup($this->acct); + foreach ($result->links as $link) { + if ($link['rel'] == 'http://ostatus.org/schema/1.0/subscribe') { + // We found a URL - let's redirect! + + $user = User::staticGet('nickname', $this->nickname); + + $feed_url = common_local_url('ApiTimelineUser', + array('id' => $user->id, + 'format' => 'atom')); + $url = $w->applyTemplate($link['template'], $feed_url); + + common_redirect($url, 303); + } + + } + + } + + function title() + { + return _('OStatus Connect'); + } + +} \ No newline at end of file diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php new file mode 100644 index 0000000000..ffc4ae8dfe --- /dev/null +++ b/plugins/OStatus/actions/ostatussub.php @@ -0,0 +1,226 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer James Walker + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +class OStatusSubAction extends Action +{ + + protected $feedurl; + + function title() + { + return _m("OStatus Subscribe"); + } + + function handle($args) + { + if ($this->validateFeed()) { + $this->showForm(); + } + + return true; + + } + + function showForm($err = null) + { + $this->err = $err; + $this->showPage(); + } + + + function showContent() + { + $user = common_current_user(); + + $profile = $user->getProfile(); + + $fuser = null; + + $flink = Foreign_link::getByUserID($user->id, FEEDSUB_SERVICE); + + if (!empty($flink)) { + $fuser = $flink->getForeignUser(); + } + + $this->elementStart('form', array('method' => 'post', + 'id' => 'form_settings_feedsub', + 'class' => 'form_settings', + 'action' => + common_local_url('feedsubsettings'))); + + $this->hidden('token', common_session_token()); + + $this->elementStart('fieldset', array('id' => 'settings_feeds')); + + $this->elementStart('ul', 'form_data'); + $this->elementStart('li', array('id' => 'settings_twitter_login_button')); + $this->input('feedurl', _('Feed URL'), $this->feedurl, _('Enter the URL of a PubSubHubbub-enabled feed')); + $this->elementEnd('li'); + $this->elementEnd('ul'); + + $this->submit('subscribe', _m('Subscribe')); + + $this->elementEnd('fieldset'); + + $this->elementEnd('form'); + + $this->previewFeed(); + } + + /** + * Handle posts to this form + * + * Based on the button that was pressed, muxes out to other functions + * to do the actual task requested. + * + * All sub-functions reload the form with a message -- success or failure. + * + * @return void + */ + + function handlePost() + { + // CSRF protection + $token = $this->trimmed('token'); + if (!$token || $token != common_session_token()) { + $this->showForm(_('There was a problem with your session token. '. + 'Try again, please.')); + return; + } + + if ($this->arg('subscribe')) { + $this->saveFeed(); + } else { + $this->showForm(_('Unexpected form submission.')); + } + } + + + /** + * Set up and add a feed + * + * @return boolean true if feed successfully read + * Sends you back to input form if not. + */ + function validateFeed() + { + $feedurl = $this->trimmed('feed'); + + if ($feedurl == '') { + $this->showForm(_m('Empty feed URL!')); + return; + } + $this->feedurl = $feedurl; + + // Get the canonical feed URI and check it + try { + $discover = new FeedDiscovery(); + $uri = $discover->discoverFromURL($feedurl); + } catch (FeedSubBadURLException $e) { + $this->showForm(_m('Invalid URL or could not reach server.')); + return false; + } catch (FeedSubBadResponseException $e) { + $this->showForm(_m('Cannot read feed; server returned error.')); + return false; + } catch (FeedSubEmptyException $e) { + $this->showForm(_m('Cannot read feed; server returned an empty page.')); + return false; + } catch (FeedSubBadHTMLException $e) { + $this->showForm(_m('Bad HTML, could not find feed link.')); + return false; + } catch (FeedSubNoFeedException $e) { + $this->showForm(_m('Could not find a feed linked from this URL.')); + return false; + } catch (FeedSubUnrecognizedTypeException $e) { + $this->showForm(_m('Not a recognized feed type.')); + return false; + } catch (FeedSubException $e) { + // Any new ones we forgot about + $this->showForm(_m('Bad feed URL.')); + return false; + } + + $this->munger = $discover->feedMunger(); + $this->feedinfo = $this->munger->feedInfo(); + + if ($this->feedinfo->huburi == '') { + $this->showForm(_m('Feed is not PuSH-enabled; cannot subscribe.')); + return false; + } + + return true; + } + + function saveFeed() + { + if ($this->validateFeed()) { + $this->preview = true; + $this->feedinfo = Feedinfo::ensureProfile($this->munger); + + // If not already in use, subscribe to updates via the hub + if ($this->feedinfo->sub_start) { + common_log(LOG_INFO, __METHOD__ . ": double the fun! new sub for {$this->feedinfo->feeduri} last subbed {$this->feedinfo->sub_start}"); + } else { + $ok = $this->feedinfo->subscribe(); + common_log(LOG_INFO, __METHOD__ . ": sub was $ok"); + if (!$ok) { + $this->showForm(_m('Feed subscription failed! Bad response from hub.')); + return; + } + } + + // And subscribe the current user to the local profile + $user = common_current_user(); + $profile = $this->feedinfo->getProfile(); + + if ($user->isSubscribed($profile)) { + $this->showForm(_m('Already subscribed!')); + } elseif ($user->subscribeTo($profile)) { + $this->showForm(_m('Feed subscribed!')); + } else { + $this->showForm(_m('Feed subscription failed!')); + } + } + } + + + function previewFeed() + { + $feedinfo = $this->munger->feedinfo(); + $notice = $this->munger->notice(0, true); // preview + + if ($notice) { + $this->element('b', null, 'Preview of latest post from this feed:'); + + $item = new NoticeList($notice, $this); + $item->show(); + } else { + $this->element('b', null, 'No posts in this feed yet.'); + } + } + + +} \ No newline at end of file diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php new file mode 100644 index 0000000000..ec2dddd534 --- /dev/null +++ b/plugins/OStatus/actions/webfinger.php @@ -0,0 +1,70 @@ +. + */ + +/** + * @package OStatusPlugin + * @maintainer James Walker + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +class WebfingerAction extends Action +{ + + public $uri; + + function prepare($args) + { + parent::prepare($args); + + $this->uri = $this->trimmed('uri'); + + return true; + } + + function handle() + { + $acct = Webfinger::normalize($this->uri); + + $xrd = new XRD(); + + list($nick, $domain) = explode('@', urldecode($acct)); + $nick = common_canonical_nickname($nick); + + $this->user = User::staticGet('nickname', $nick); + if (!$this->user) { + $this->clientError(_('No such user.'), 404); + return false; + } + + $xrd->subject = $this->uri; + $xrd->alias[] = common_profile_url($nick); + $xrd->links[] = array('rel' => 'http://webfinger.net/rel/profile-page', + 'type' => 'text/html', + 'href' => common_profile_url($nick)); + // TODO - finalize where the redirect should go on the publisher + $url = common_local_url('ostatussub') . '?feed={uri}'; + $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe', + 'template' => $url ); + + header('Content-type: text/xml'); + print $xrd->toXML(); + } + +} diff --git a/plugins/OStatus/lib/Webfinger.php b/plugins/OStatus/lib/Webfinger.php new file mode 100644 index 0000000000..7ab6b421bf --- /dev/null +++ b/plugins/OStatus/lib/Webfinger.php @@ -0,0 +1,139 @@ +. + * + * @package StatusNet + * @author James Walker + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +define('WEBFINGER_SERVICE_REL_VALUE', 'lrdd'); + +/** + * Implement the webfinger protocol. + */ +class Webfinger +{ + /** + * Perform a webfinger lookup given an account. + */ + public function lookup($id) + { + $id = $this->normalize($id); + list($name, $domain) = explode('@', $id); + + $links = $this->getServiceLinks($domain); + if (!$links) { + return false; + } + + $services = array(); + foreach ($links as $link) { + if ($link['template']) { + return $this->getServiceDescription($link['template'], $id); + } + if ($link['href']) { + return $this->getServiceDescription($link['href'], $id); + } + } + } + + /** + * Normalize an account ID + */ + function normalize($id) + { + if (substr($id, 0, 7) == 'acct://') { + return substr($id, 7); + } else if (substr($id, 0, 5) == 'acct:') { + return substr($id, 5); + } + + return $id; + } + + function getServiceLinks($domain) + { + $url = 'http://'. $domain .'/.well-known/host-meta'; + $content = $this->fetchURL($url); + $result = XRD::parse($content); + + // Ensure that the host == domain (spec may include signing later) + if ($result->host != $domain) { + return false; + } + + $links = array(); + foreach ($result->links as $link) { + if ($link['rel'] == WEBFINGER_SERVICE_REL_VALUE) { + $links[] = $link; + } + + } + return $links; + } + + function getServiceDescription($template, $id) + { + $url = $this->applyTemplate($template, 'acct:' . $id); + + $content = $this->fetchURL($url); + + return XRD::parse($content); + } + + function fetchURL($url) + { + try { + $client = new HTTPClient(); + $response = $client->get($url); + } catch (HTTP_Request2_Exception $e) { + return false; + } + + if ($response->getStatus() != 200) { + return false; + } + + return $response->getBody(); + } + + function applyTemplate($template, $id) + { + $template = str_replace('{uri}', urlencode($id), $template); + + return $template; + } + + function getHostMeta($domain, $template) { + $xrd = new XRD(); + $xrd->host = $domain; + $xrd->links[] = array('rel' => 'lrdd', + 'template' => $template, + 'title' => array('Resource Descriptor')); + + return $xrd->toXML(); + } +} + + diff --git a/plugins/OStatus/lib/XRD.php b/plugins/OStatus/lib/XRD.php new file mode 100644 index 0000000000..16d27f8eb7 --- /dev/null +++ b/plugins/OStatus/lib/XRD.php @@ -0,0 +1,183 @@ +. + * + * @package StatusNet + * @author James Walker + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + + +class XRD +{ + const XML_NS = 'http://www.w3.org/2000/xmlns/'; + + const XRD_NS = 'http://docs.oasis-open.org/ns/xri/xrd-1.0'; + + const HOST_META_NS = 'http://host-meta.net/xrd/1.0'; + + public $expires; + + public $subject; + + public $host; + + public $alias = array(); + + public $types = array(); + + public $links = array(); + + public static function parse($xml) + { + $xrd = new XRD(); + + $dom = new DOMDocument(); + $dom->loadXML($xml); + $xrd_element = $dom->getElementsByTagName('XRD')->item(0); + + // Check for host-meta host + $host = $xrd_element->getElementsByTagName('Host')->item(0)->nodeValue; + if ($host) { + $xrd->host = $host; + } + + // Loop through other elements + foreach ($xrd_element->childNodes as $node) { + switch ($node->tagName) { + case 'Expires': + $xrd->expires = $node->nodeValue; + break; + case 'Subject': + $xrd->subject = $node->nodeValue; + break; + + case 'Alias': + $xrd->alias[] = $node->nodeValue; + break; + + case 'Link': + $xrd->links[] = $xrd->parseLink($node); + break; + + case 'Type': + $xrd->types[] = $xrd->parseType($node); + break; + + } + } + return $xrd; + } + + public function toXML() + { + $dom = new DOMDocument('1.0', 'UTF-8'); + $dom->formatOutput = true; + + $xrd_dom = $dom->createElementNS(XRD::XRD_NS, 'XRD'); + $dom->appendChild($xrd_dom); + + if ($this->host) { + $host_dom = $dom->createElement('hm:Host', $this->host); + $xrd_dom->setAttributeNS(XRD::XML_NS, 'xmlns:hm', XRD::HOST_META_NS); + $xrd_dom->appendChild($host_dom); + } + + if ($this->expires) { + $expires_dom = $dom->createElement('Expires', $this->expires); + $xrd_dom->appendChild($expires_dom); + } + + if ($this->subject) { + $subject_dom = $dom->createElement('Subject', $this->subject); + $xrd_dom->appendChild($subject_dom); + } + + foreach ($this->alias as $alias) { + $alias_dom = $dom->createElement('Alias', $alias); + $xrd_dom->appendChild($alias_dom); + } + + foreach ($this->types as $type) { + $type_dom = $dom->createElement('Type', $type); + $xrd_dom->appendChild($type_dom); + } + + foreach ($this->links as $link) { + $link_dom = $this->saveLink($dom, $link); + $xrd_dom->appendChild($link_dom); + } + + return $dom->saveXML(); + } + + function parseType($element) + { + return array(); + } + + function parseLink($element) + { + $link = array(); + $link['rel'] = $element->getAttribute('rel'); + $link['type'] = $element->getAttribute('type'); + $link['href'] = $element->getAttribute('href'); + $link['template'] = $element->getAttribute('template'); + foreach ($element->childNodes as $node) { + switch($node->tagName) { + case 'Title': + $link['title'][] = $node->nodeValue; + } + } + + return $link; + } + + function saveLink($doc, $link) + { + $link_element = $doc->createElement('Link'); + if ($link['rel']) { + $link_element->setAttribute('rel', $link['rel']); + } + if ($link['type']) { + $link_element->setAttribute('type', $link['type']); + } + if ($link['href']) { + $link_element->setAttribute('href', $link['href']); + } + if ($link['template']) { + $link_element->setAttribute('template', $link['template']); + } + + if (is_array($link['title'])) { + foreach($link['title'] as $title) { + $title = $doc->createElement('Title', $title); + $link_element->appendChild($title); + } + } + + + return $link_element; + } +} + From c2475f88539ba8053596acd17be39ad0aec98bb4 Mon Sep 17 00:00:00 2001 From: James Walker Date: Tue, 9 Feb 2010 15:37:37 -0500 Subject: [PATCH 35/78] in progress Salmon responses --- plugins/OStatus/OStatusPlugin.php | 60 +++++++++++++++++++++++-- plugins/OStatus/actions/salmon.php | 49 ++++++++++++++++++++ plugins/OStatus/actions/webfinger.php | 7 +++ plugins/OStatus/lib/Salmon.php | 64 +++++++++++++++++++++++++++ plugins/OStatus/lib/Webfinger.php | 4 ++ 5 files changed, 181 insertions(+), 3 deletions(-) create mode 100644 plugins/OStatus/actions/salmon.php create mode 100644 plugins/OStatus/lib/Salmon.php diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index ce33344d2c..60a4e38273 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -53,6 +53,7 @@ class OStatusPlugin extends Plugin */ function onRouterInitialized($m) { + // Discovery actions $m->connect('.well-known/host-meta', array('action' => 'hostmeta')); $m->connect('main/webfinger', @@ -65,7 +66,8 @@ class OStatusPlugin extends Plugin array('action' => 'ostatussub')); $m->connect('main/ostatussub', array('action' => 'ostatussub'), array('feed' => '[A-Za-z0-9\.\/\:]+')); - + + // PuSH actions $m->connect('main/push/hub', array('action' => 'pushhub')); $m->connect('main/push/callback/:feed', @@ -73,6 +75,11 @@ class OStatusPlugin extends Plugin array('feed' => '[0-9]+')); $m->connect('settings/feedsub', array('action' => 'feedsubsettings')); + + // Salmon endpoint + $m->connect('salmon/user/:id', + array('action' => 'salmon'), + array('id' => '[0-9]+')); return true; } @@ -111,11 +118,15 @@ class OStatusPlugin extends Plugin // Updates will be handled for our internal PuSH hub. $action->element('link', array('rel' => 'hub', 'href' => common_local_url('pushhub'))); + + // Also, we'll add in the salmon link + $action->element('link', array('rel' => 'salmon', + 'href' => common_local_url('salmon'))); } } return true; } - + /** * Add the feed settings page to the Connect Settings menu * @@ -180,8 +191,51 @@ class OStatusPlugin extends Plugin $output->elementEnd('li'); } } - + /** + * Check if we've got some Salmon stuff to send + */ + function onEndNoticeSave($notice) + { + $count = preg_match_all('/(\w+\.)*\w+@(\w+\.)*\w+(\w+\-\w+)*\.\w+/', $notice->content, $matches); + if ($count) { + foreach ($matches[0] as $webfinger) { + // Check to see if we've got an actual webfinger + $w = new Webfinger; + + $endpoint_uri = ''; + + $result = $w->lookup($webfinger); + if (empty($result)) { + continue; + } + + foreach ($result->links as $link) { + if ($link['rel'] == 'salmon') { + $endpoint_uri = $link['href']; + } + } + + if (empty($endpoint_uri)) { + continue; + } + + $profile = $notice->getProfile(); + + $acct = $profile->nickname .'@'. common_config('site', 'server'); + + $xml = ''; + $xml .= $notice->asAtomEntry(); + // TODO : need to set author/uri to webfinger acct. more cleanly + $xml = preg_replace('/([^<])*<\/uri>/i', 'acct:'.$acct.'', $xml); + + + $salmon = new Salmon(); + $salmon->post($endpoint_uri, $xml); + } + } + } + function onCheckSchema() { // warning: the autoincrement doesn't seem to set. diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php new file mode 100644 index 0000000000..012869cf73 --- /dev/null +++ b/plugins/OStatus/actions/salmon.php @@ -0,0 +1,49 @@ +. + */ + +/** + * @package OStatusPlugin + * @author James Walker + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +class SalmonAction extends Action +{ + + function handle() + { + parent::handle(); + if ($_SERVER['REQUEST_METHOD'] == 'POST') { + $this->handlePost(); + } + } + + + function handlePost() + { + $user_id = $this->arg('id'); + common_log(LOG_DEBUG, 'Salmon: incoming post for user: '. $user_id); + + $xml = file_get_contents('php://input'); + + // TODO : Insert new $xml -> notice code + + } +} diff --git a/plugins/OStatus/actions/webfinger.php b/plugins/OStatus/actions/webfinger.php index ec2dddd534..75ba16638b 100644 --- a/plugins/OStatus/actions/webfinger.php +++ b/plugins/OStatus/actions/webfinger.php @@ -58,6 +58,13 @@ class WebfingerAction extends Action $xrd->links[] = array('rel' => 'http://webfinger.net/rel/profile-page', 'type' => 'text/html', 'href' => common_profile_url($nick)); + + $salmon_url = common_local_url('salmon', + array('id' => $this->user->id)); + + $xrd->links[] = array('rel' => 'salmon', + 'href' => $salmon_url); + // TODO - finalize where the redirect should go on the publisher $url = common_local_url('ostatussub') . '?feed={uri}'; $xrd->links[] = array('rel' => 'http://ostatus.org/schema/1.0/subscribe', diff --git a/plugins/OStatus/lib/Salmon.php b/plugins/OStatus/lib/Salmon.php new file mode 100644 index 0000000000..8c77222a62 --- /dev/null +++ b/plugins/OStatus/lib/Salmon.php @@ -0,0 +1,64 @@ +. + * + * @package StatusNet + * @author James Walker + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ +class Salmon +{ + public function post($endpoint_uri, $xml) + { + if (empty($endpoint_uri)) { + return FALSE; + } + + $headers = array('Content-type: application/atom+xml'); + + try { + $client = new HTTPClient(); + $client->setBody($xml); + $response = $client->post($endpoint_uri, $headers); + } catch (HTTP_Request2_Exception $e) { + return false; + } + if ($response->getStatus() != 200) { + return false; + } + + } + + public function createMagicEnv($text, $userid) + { + + + } + + + public function verifyMagicEnv($env) + { + + + } +} diff --git a/plugins/OStatus/lib/Webfinger.php b/plugins/OStatus/lib/Webfinger.php index 7ab6b421bf..417d54904b 100644 --- a/plugins/OStatus/lib/Webfinger.php +++ b/plugins/OStatus/lib/Webfinger.php @@ -76,6 +76,10 @@ class Webfinger { $url = 'http://'. $domain .'/.well-known/host-meta'; $content = $this->fetchURL($url); + if (empty($content)) { + common_log(LOG_DEBUG, 'Error fetching host-meta'); + return false; + } $result = XRD::parse($content); // Ensure that the host == domain (spec may include signing later) From cd0f288fa725aebaf6cb9ae240c2b085000f6707 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 9 Feb 2010 12:39:31 -0800 Subject: [PATCH 36/78] Configurable delay between queuedaemon.php spawns/respawns to help stagger out startups and subscriptions. Defaults to 1 second. $config['queue']['spawndelay'] = 1; --- lib/default.php | 1 + lib/spawningdaemon.php | 2 ++ 2 files changed, 3 insertions(+) diff --git a/lib/default.php b/lib/default.php index 485a08ba44..bf4b83718d 100644 --- a/lib/default.php +++ b/lib/default.php @@ -88,6 +88,7 @@ $default = 'stomp_manual_failover' => true, // if multiple servers are listed, treat them as separate (enqueue on one randomly, listen on all) 'monitor' => null, // URL to monitor ping endpoint (work in progress) 'softlimit' => '90%', // total size or % of memory_limit at which to restart queue threads gracefully + 'spawndelay' => 1, // Wait at least N seconds between (re)spawns of child processes to avoid slamming the queue server with subscription startup 'debug_memory' => false, // true to spit memory usage to log 'inboxes' => true, // true to do inbox distribution & output queueing from in background via 'distrib' queue ), diff --git a/lib/spawningdaemon.php b/lib/spawningdaemon.php index b1961d6880..862cbb4fa3 100644 --- a/lib/spawningdaemon.php +++ b/lib/spawningdaemon.php @@ -83,6 +83,7 @@ abstract class SpawningDaemon extends Daemon $this->log(LOG_INFO, "Spawned thread $i as pid $pid"); $children[$i] = $pid; } + sleep(common_config('queue', 'spawndelay')); } $this->log(LOG_INFO, "Waiting for children to complete."); @@ -111,6 +112,7 @@ abstract class SpawningDaemon extends Daemon $this->log(LOG_INFO, "Respawned thread $i as pid $pid"); $children[$i] = $pid; } + sleep(common_config('queue', 'spawndelay')); } else { $this->log(LOG_INFO, "Thread $i pid $pid exited with status $exitCode; closing out thread."); } From e856af34c3ac560a21286ca89019c2249994c080 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 9 Feb 2010 12:39:31 -0800 Subject: [PATCH 37/78] Configurable delay between queuedaemon.php spawns/respawns to help stagger out startups and subscriptions. Defaults to 1 second. $config['queue']['spawndelay'] = 1; --- lib/default.php | 1 + lib/spawningdaemon.php | 2 ++ 2 files changed, 3 insertions(+) diff --git a/lib/default.php b/lib/default.php index 485a08ba44..bf4b83718d 100644 --- a/lib/default.php +++ b/lib/default.php @@ -88,6 +88,7 @@ $default = 'stomp_manual_failover' => true, // if multiple servers are listed, treat them as separate (enqueue on one randomly, listen on all) 'monitor' => null, // URL to monitor ping endpoint (work in progress) 'softlimit' => '90%', // total size or % of memory_limit at which to restart queue threads gracefully + 'spawndelay' => 1, // Wait at least N seconds between (re)spawns of child processes to avoid slamming the queue server with subscription startup 'debug_memory' => false, // true to spit memory usage to log 'inboxes' => true, // true to do inbox distribution & output queueing from in background via 'distrib' queue ), diff --git a/lib/spawningdaemon.php b/lib/spawningdaemon.php index b1961d6880..862cbb4fa3 100644 --- a/lib/spawningdaemon.php +++ b/lib/spawningdaemon.php @@ -83,6 +83,7 @@ abstract class SpawningDaemon extends Daemon $this->log(LOG_INFO, "Spawned thread $i as pid $pid"); $children[$i] = $pid; } + sleep(common_config('queue', 'spawndelay')); } $this->log(LOG_INFO, "Waiting for children to complete."); @@ -111,6 +112,7 @@ abstract class SpawningDaemon extends Daemon $this->log(LOG_INFO, "Respawned thread $i as pid $pid"); $children[$i] = $pid; } + sleep(common_config('queue', 'spawndelay')); } else { $this->log(LOG_INFO, "Thread $i pid $pid exited with status $exitCode; closing out thread."); } From 8449256817f5a2bd7a7cac6bc04e4cb477d7dc49 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 9 Feb 2010 18:32:52 -0800 Subject: [PATCH 38/78] OStatus partial support for group subscriptions: * detection of group feeds is currently a nasty hack based on presence of '/groups/' in URL -- should use some property on the feed? * listing for the remote group is kinda cruddy; needs to be named more cleanly * still need to establish per-author profiles (easier once we have the updated Atom code in) * group delivery probably not right yet * saving of group messages still triggering some weird behavior Added support for since_id and max_id on group timeline feeds as a free extra. Enjoy! --- actions/apitimelinegroup.php | 2 +- actions/showgroup.php | 4 +- classes/Notice.php | 4 +- classes/User_group.php | 4 +- lib/util.php | 2 +- plugins/OStatus/OStatusPlugin.php | 4 +- plugins/OStatus/actions/feedsubsettings.php | 22 ++++-- plugins/OStatus/classes/Feedinfo.php | 55 +++++++++++++-- plugins/OStatus/lib/feedmunger.php | 4 +- .../OStatus/lib/hubdistribqueuehandler.php | 70 ++++++++++++++++--- 10 files changed, 140 insertions(+), 31 deletions(-) diff --git a/actions/apitimelinegroup.php b/actions/apitimelinegroup.php index af414c6804..fd2ed9ff93 100644 --- a/actions/apitimelinegroup.php +++ b/actions/apitimelinegroup.php @@ -130,7 +130,7 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction case 'atom': $selfuri = common_root_url() . 'api/statusnet/groups/timeline/' . - $this->group->nickname . '.atom'; + $this->group->id . '.atom'; $this->showAtomTimeline( $this->notices, $title, diff --git a/actions/showgroup.php b/actions/showgroup.php index 8042a49513..eb12389029 100644 --- a/actions/showgroup.php +++ b/actions/showgroup.php @@ -330,13 +330,13 @@ class ShowgroupAction extends GroupDesignAction new Feed(Feed::RSS2, common_local_url('ApiTimelineGroup', array('format' => 'rss', - 'id' => $this->group->nickname)), + 'id' => $this->group->id)), sprintf(_('Notice feed for %s group (RSS 2.0)'), $this->group->nickname)), new Feed(Feed::ATOM, common_local_url('ApiTimelineGroup', array('format' => 'atom', - 'id' => $this->group->nickname)), + 'id' => $this->group->id)), sprintf(_('Notice feed for %s group (Atom)'), $this->group->nickname)), new Feed(Feed::FOAF, diff --git a/classes/Notice.php b/classes/Notice.php index fca1c599ce..247440f29c 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -783,7 +783,7 @@ class Notice extends Memcached_DataObject $result = $gi->insert(); - if (!result) { + if (!$result) { common_log_db_error($gi, 'INSERT', __FILE__); throw new ServerException(_('Problem saving group inbox.')); } @@ -917,7 +917,7 @@ class Notice extends Memcached_DataObject /** * Same calculation as saveGroups but without the saving * @fixme merge the functions - * @return array of Group objects + * @return array of Group_inbox objects */ function getGroups() { diff --git a/classes/User_group.php b/classes/User_group.php index c86eadf8fa..1fbb50a6eb 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -49,12 +49,12 @@ class User_group extends Memcached_DataObject array('id' => $this->id)); } - function getNotices($offset, $limit) + function getNotices($offset, $limit, $since_id=null, $max_id=null) { $ids = Notice::stream(array($this, '_streamDirect'), array(), 'user_group:notice_ids:' . $this->id, - $offset, $limit); + $offset, $limit, $since_id, $max_id); return Notice::getStreamByIds($ids); } diff --git a/lib/util.php b/lib/util.php index 00c21aeb21..a07fe49e33 100644 --- a/lib/util.php +++ b/lib/util.php @@ -697,7 +697,7 @@ function common_group_link($sender_id, $nickname) { $sender = Profile::staticGet($sender_id); $group = User_group::getForNickname($nickname); - if ($group && $sender->isMember($group)) { + if ($sender && $group && $sender->isMember($group)) { $attrs = array('href' => $group->permalink(), 'class' => 'url'); if (!empty($group->fullname)) { diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 60a4e38273..89b5c4caaa 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -107,11 +107,11 @@ class OStatusPlugin extends Plugin /** * Set up a PuSH hub link to our internal link for canonical timeline - * Atom feeds for users. + * Atom feeds for users and groups. */ function onStartApiAtom(Action $action) { - if ($action instanceof ApiTimelineUserAction) { + if ($action instanceof ApiTimelineUserAction || $action instanceof ApiTimelineGroupAction) { $id = $action->arg('id'); if (strval(intval($id)) === strval($id)) { // Canonical form of id in URL? diff --git a/plugins/OStatus/actions/feedsubsettings.php b/plugins/OStatus/actions/feedsubsettings.php index 4d5b7b60f4..6f592bf5b0 100644 --- a/plugins/OStatus/actions/feedsubsettings.php +++ b/plugins/OStatus/actions/feedsubsettings.php @@ -209,7 +209,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction return; } } - + // And subscribe the current user to the local profile $user = common_current_user(); $profile = $this->feedinfo->getProfile(); @@ -217,12 +217,22 @@ class FeedSubSettingsAction extends ConnectSettingsAction throw new ServerException("Feed profile was not saved properly."); } - if ($user->isSubscribed($profile)) { - $this->showForm(_m('Already subscribed!')); - } elseif ($user->subscribeTo($profile)) { - $this->showForm(_m('Feed subscribed!')); + if ($this->feedinfo->isGroup()) { + if ($user->isMember($profile)) { + $this->showForm(_m('Already a member!')); + } elseif (Group_member::join($this->feedinfo->group_id, $user->id)) { + $this->showForm(_m('Joined remote group!')); + } else { + $this->showForm(_m('Remote group join failed!')); + } } else { - $this->showForm(_m('Feed subscription failed!')); + if ($user->isSubscribed($profile)) { + $this->showForm(_m('Already subscribed!')); + } elseif ($user->subscribeTo($profile)) { + $this->showForm(_m('Feed subscribed!')); + } else { + $this->showForm(_m('Feed subscription failed!')); + } } } } diff --git a/plugins/OStatus/classes/Feedinfo.php b/plugins/OStatus/classes/Feedinfo.php index 107faf0125..792ea60345 100644 --- a/plugins/OStatus/classes/Feedinfo.php +++ b/plugins/OStatus/classes/Feedinfo.php @@ -89,7 +89,8 @@ class Feedinfo extends Memcached_DataObject function table() { return array('id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, - 'profile_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, + 'profile_id' => DB_DATAOBJECT_INT, + 'group_id' => DB_DATAOBJECT_INT, 'feeduri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, 'homeuri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, 'huburi' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, @@ -111,7 +112,9 @@ class Feedinfo extends Memcached_DataObject /*extra*/ null, /*auto_increment*/ true), new ColumnDef('profile_id', 'integer', - null, false), + null, true), + new ColumnDef('group_id', 'integer', + null, true), new ColumnDef('feeduri', 'varchar', 255, false, 'UNI'), new ColumnDef('homeuri', 'varchar', @@ -176,6 +179,7 @@ class Feedinfo extends Memcached_DataObject /** * @param FeedMunger $munger + * @param boolean $isGroup is this a group record? * @return Feedinfo */ public static function ensureProfile($munger) @@ -217,6 +221,22 @@ class Feedinfo extends Memcached_DataObject } $feedinfo->profile_id = $profile->id; + if ($feedinfo->isGroup()) { + $group = new User_group(); + $group->nickname = $profile->nickname . '@remote'; // @fixme + $group->fullname = $profile->fullname; + $group->homepage = $profile->homepage; + $group->location = $profile->location; + $group->created = $profile->created; + $group->insert(); + + if ($avatar) { + $group->setOriginal($filename); + } + + $feedinfo->group_id = $group->id; + } + $result = $feedinfo->insert(); if (empty($result)) { throw new FeedDBException($feedinfo); @@ -231,6 +251,14 @@ class Feedinfo extends Memcached_DataObject return $feedinfo; } + /** + * Damn dirty hack! + */ + function isGroup() + { + return (strpos($this->feeduri, '/groups/') !== false); + } + /** * Send a subscription request to the hub for this feed. * The hub will later send us a confirmation POST to /feedsub/callback. @@ -325,17 +353,34 @@ class Feedinfo extends Memcached_DataObject $dupe = new Notice(); $dupe->uri = $notice->uri; if ($dupe->find(true)) { + // @fixme we might have to do individual and group delivery separately! common_log(LOG_WARNING, __METHOD__ . ": tried to save dupe notice for entry {$notice->uri} of feed {$this->feeduri}"); continue; } - + if (Event::handle('StartNoticeSave', array(&$notice))) { $id = $notice->insert(); Event::handle('EndNoticeSave', array($notice)); } - $notice->addToInboxes(); - common_log(LOG_INFO, __METHOD__ . ": saved notice {$notice->id} for entry $index of update to \"{$this->feeduri}\""); + + common_log(LOG_DEBUG, "going to check group delivery..."); + if ($this->group_id) { + $group = User_group::staticGet($this->group_id); + if ($group) { + common_log(LOG_INFO, __METHOD__ . ": saving to local shadow group $group->id $group->nickname"); + $groups = array($group); + } else { + common_log(LOG_INFO, __METHOD__ . ": lost the local shadow group?"); + } + } else { + common_log(LOG_INFO, __METHOD__ . ": no local shadow groups"); + $groups = array(); + } + common_log(LOG_DEBUG, "going to add to inboxes..."); + $notice->addToInboxes($groups, array()); + common_log(LOG_DEBUG, "added to inboxes."); + $hits++; } if ($hits == 0) { diff --git a/plugins/OStatus/lib/feedmunger.php b/plugins/OStatus/lib/feedmunger.php index cbaec67750..5dce95342e 100644 --- a/plugins/OStatus/lib/feedmunger.php +++ b/plugins/OStatus/lib/feedmunger.php @@ -203,7 +203,7 @@ class FeedMunger if (!$entry) { return null; } - + if ($preview) { $notice = new FeedSubPreviewNotice($this->profile(true)); $notice->id = -1; @@ -221,7 +221,7 @@ class FeedMunger $notice->uri = $link; $notice->url = $link; $notice->content = $this->noticeFromEntry($entry); - $notice->rendered = common_render_content($notice->content, $notice); + $notice->rendered = common_render_content($notice->content, $notice); // @fixme this is failing on group posts $notice->created = common_sql_date($entry->updated); // @fixme $notice->is_local = Notice::GATEWAY; $notice->source = 'feed'; diff --git a/plugins/OStatus/lib/hubdistribqueuehandler.php b/plugins/OStatus/lib/hubdistribqueuehandler.php index 126f1355f9..189ccbedf9 100644 --- a/plugins/OStatus/lib/hubdistribqueuehandler.php +++ b/plugins/OStatus/lib/hubdistribqueuehandler.php @@ -34,6 +34,14 @@ class HubDistribQueueHandler extends QueueHandler { assert($notice instanceof Notice); + $this->pushUser($notice); + foreach ($notice->getGroups() as $group) { + $this->pushGroup($notice, $group->group_id); + } + } + + function pushUser($notice) + { // See if there's any PuSH subscriptions, including OStatus clients. // @fixme handle group subscriptions as well // http://identi.ca/api/statuses/user_timeline/1.atom @@ -43,20 +51,42 @@ class HubDistribQueueHandler extends QueueHandler $sub = new HubSub(); $sub->topic = $feed; if ($sub->find()) { - common_log(LOG_INFO, "Preparing $sub->N PuSH distribution(s) for $feed"); - $qm = QueueManager::get(); $atom = $this->userFeedForNotice($notice); - while ($sub->fetch()) { - common_log(LOG_INFO, "Prepping PuSH distribution to $sub->callback for $feed"); - $data = array('sub' => clone($sub), - 'atom' => $atom); - $qm->enqueue($data, 'hubout'); - } + $this->pushFeeds($atom, $sub); } else { common_log(LOG_INFO, "No PuSH subscribers for $feed"); } } + function pushGroup($notice, $group_id) + { + $feed = common_local_url('ApiTimelineGroup', + array('id' => $group_id, + 'format' => 'atom')); + $sub = new HubSub(); + $sub->topic = $feed; + if ($sub->find()) { + common_log(LOG_INFO, "Building PuSH feed for $feed"); + $atom = $this->groupFeedForNotice($group_id, $notice); + $this->pushFeeds($atom, $sub); + } else { + common_log(LOG_INFO, "No PuSH subscribers for $feed"); + } + } + + + function pushFeeds($atom, $sub) + { + common_log(LOG_INFO, "Preparing $sub->N PuSH distribution(s) for $sub->topic"); + $qm = QueueManager::get(); + while ($sub->fetch()) { + common_log(LOG_INFO, "Prepping PuSH distribution to $sub->callback for $sub->topic"); + $data = array('sub' => clone($sub), + 'atom' => $atom); + $qm->enqueue($data, 'hubout'); + } + } + /** * Build a single-item version of the sending user's Atom feed. * @param Notice $notice @@ -83,5 +113,29 @@ class HubDistribQueueHandler extends QueueHandler common_log(LOG_DEBUG, $feed); return $feed; } + + function groupFeedForNotice($group_id, $notice) + { + // @fixme this feels VERY hacky... + // should probably be a cleaner way to do it + + ob_start(); + $api = new ApiTimelineGroupAction(); + $args = array('id' => $group_id, + 'format' => 'atom', + 'max_id' => $notice->id, + 'since_id' => $notice->id - 1); + $api->prepare($args); + $api->handle($args); + $feed = ob_get_clean(); + + // ...and override the content-type back to something normal... eww! + // hope there's no other headers that got set while we weren't looking. + header('Content-Type: text/html; charset=utf-8'); + + common_log(LOG_DEBUG, $feed); + return $feed; + } + } From 46f90f7b08381eec80c2e895d061af15b5e1c729 Mon Sep 17 00:00:00 2001 From: James Walker Date: Tue, 9 Feb 2010 16:53:51 -0500 Subject: [PATCH 39/78] moving salmon endpoint under 'main/' --- plugins/OStatus/OStatusPlugin.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 89b5c4caaa..f7fed1f0db 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -77,7 +77,7 @@ class OStatusPlugin extends Plugin array('action' => 'feedsubsettings')); // Salmon endpoint - $m->connect('salmon/user/:id', + $m->connect('main/salmon/user/:id', array('action' => 'salmon'), array('id' => '[0-9]+')); return true; From f4ebac503665928fb3102bb957a5c0a0259d5ef9 Mon Sep 17 00:00:00 2001 From: James Walker Date: Tue, 9 Feb 2010 21:50:51 -0500 Subject: [PATCH 40/78] removing the webfinger hack for Notice::asAtomEntry since salmon can use a profile URL --- plugins/OStatus/OStatusPlugin.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index f7fed1f0db..62ecaf6310 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -220,15 +220,8 @@ class OStatusPlugin extends Plugin continue; } - $profile = $notice->getProfile(); - - $acct = $profile->nickname .'@'. common_config('site', 'server'); - $xml = ''; $xml .= $notice->asAtomEntry(); - // TODO : need to set author/uri to webfinger acct. more cleanly - $xml = preg_replace('/([^<])*<\/uri>/i', 'acct:'.$acct.'', $xml); - $salmon = new Salmon(); $salmon->post($endpoint_uri, $xml); From dcd9b2a405eba8861459d1aa5e645c84688e8837 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 10 Feb 2010 11:16:27 +0100 Subject: [PATCH 41/78] Refactored repeat confirmation dialog. Also fixes dialog skipping. --- js/util.js | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/js/util.js b/js/util.js index c6a9682de2..639049668c 100644 --- a/js/util.js +++ b/js/util.js @@ -356,42 +356,44 @@ var SN = { // StatusNet }, NoticeRepeat: function() { - $('.form_repeat').live('click', function() { - SN.U.FormXHR($(this)); + $('.form_repeat').live('click', function(e) { + e.preventDefault(); + SN.U.NoticeRepeatConfirmation($(this)); return false; }); }, NoticeRepeatConfirmation: function(form) { - function NRC() { - form.closest('.notice-options').addClass('opaque'); - form.addClass('dialogbox'); + var submit_i = form.find('.submit'); - form.append(''); - form.find('button.close').click(function(){ - $(this).remove(); + var submit = submit_i.clone(); + submit + .addClass('submit_dialogbox') + .removeClass('submit'); + form.append(submit); + submit.bind('click', function() { SN.U.FormXHR(form); return false; }); - form.closest('.notice-options').removeClass('opaque'); - form.removeClass('dialogbox'); - form.find('.submit_dialogbox').remove(); - form.find('.submit').show(); + submit_i.hide(); - return false; - }); - }; + form + .addClass('dialogbox') + .append('') + .closest('.notice-options') + .addClass('opaque'); - form.find('.submit').bind('click', function(e) { - e.preventDefault(); + form.find('button.close').click(function(){ + $(this).remove(); - var submit = form.find('.submit').clone(); - submit.addClass('submit_dialogbox'); - submit.removeClass('submit'); - form.append(submit); + form + .removeClass('dialogbox') + .closest('.notice-options') + .removeClass('opaque'); - $(this).hide(); + form.find('.submit_dialogbox').remove(); + form.find('.submit').show(); - NRC(); + return false; }); }, From e8428d1d525677fa116236735a43e7b49e8a3fd3 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 10 Feb 2010 11:16:27 +0100 Subject: [PATCH 42/78] Refactored repeat confirmation dialog. Also fixes dialog skipping. --- js/util.js | 48 +++++++++++++++++++++++++----------------------- 1 file changed, 25 insertions(+), 23 deletions(-) diff --git a/js/util.js b/js/util.js index c6a9682de2..639049668c 100644 --- a/js/util.js +++ b/js/util.js @@ -356,42 +356,44 @@ var SN = { // StatusNet }, NoticeRepeat: function() { - $('.form_repeat').live('click', function() { - SN.U.FormXHR($(this)); + $('.form_repeat').live('click', function(e) { + e.preventDefault(); + SN.U.NoticeRepeatConfirmation($(this)); return false; }); }, NoticeRepeatConfirmation: function(form) { - function NRC() { - form.closest('.notice-options').addClass('opaque'); - form.addClass('dialogbox'); + var submit_i = form.find('.submit'); - form.append(''); - form.find('button.close').click(function(){ - $(this).remove(); + var submit = submit_i.clone(); + submit + .addClass('submit_dialogbox') + .removeClass('submit'); + form.append(submit); + submit.bind('click', function() { SN.U.FormXHR(form); return false; }); - form.closest('.notice-options').removeClass('opaque'); - form.removeClass('dialogbox'); - form.find('.submit_dialogbox').remove(); - form.find('.submit').show(); + submit_i.hide(); - return false; - }); - }; + form + .addClass('dialogbox') + .append('') + .closest('.notice-options') + .addClass('opaque'); - form.find('.submit').bind('click', function(e) { - e.preventDefault(); + form.find('button.close').click(function(){ + $(this).remove(); - var submit = form.find('.submit').clone(); - submit.addClass('submit_dialogbox'); - submit.removeClass('submit'); - form.append(submit); + form + .removeClass('dialogbox') + .closest('.notice-options') + .removeClass('opaque'); - $(this).hide(); + form.find('.submit_dialogbox').remove(); + form.find('.submit').show(); - NRC(); + return false; }); }, From 6b10c269b54d452b0a5f55ab5722297f4b889653 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 10 Feb 2010 10:47:46 +0000 Subject: [PATCH 43/78] Fix to Realtime's repeat notice form legend and notice id --- plugins/Realtime/realtimeupdate.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/Realtime/realtimeupdate.js b/plugins/Realtime/realtimeupdate.js index 7adea45a08..2e5851ae53 100644 --- a/plugins/Realtime/realtimeupdate.js +++ b/plugins/Realtime/realtimeupdate.js @@ -209,10 +209,10 @@ RealtimeUpdate = { var rf; rf = "
"+ "
"+ - "Favor this notice"+ + "Repeat this notice?"+ ""+ - ""+ - ""+ + ""+ + ""+ "
"+ ""; From f3c2dfacf4b3b1ce44edcb82d8e76e75e2b7c9fa Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Wed, 10 Feb 2010 10:47:46 +0000 Subject: [PATCH 44/78] Fix to Realtime's repeat notice form legend and notice id --- plugins/Realtime/realtimeupdate.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/Realtime/realtimeupdate.js b/plugins/Realtime/realtimeupdate.js index ab548958a6..0f7a680d73 100644 --- a/plugins/Realtime/realtimeupdate.js +++ b/plugins/Realtime/realtimeupdate.js @@ -209,10 +209,10 @@ console.log(data); var rf; rf = "
"+ "
"+ - "Favor this notice"+ + "Repeat this notice?"+ ""+ - ""+ - ""+ + ""+ + ""+ "
"+ ""; From f37063cd63a30fdcc0948d4710c088ba5e5d0990 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 10 Feb 2010 10:18:47 -0800 Subject: [PATCH 45/78] Filename case fix --- plugins/OStatus/lib/{Salmon.php => salmon.php} | 0 plugins/OStatus/lib/{Webfinger.php => webfinger.php} | 0 plugins/OStatus/lib/{XRD.php => xrd.php} | 0 3 files changed, 0 insertions(+), 0 deletions(-) rename plugins/OStatus/lib/{Salmon.php => salmon.php} (100%) rename plugins/OStatus/lib/{Webfinger.php => webfinger.php} (100%) rename plugins/OStatus/lib/{XRD.php => xrd.php} (100%) diff --git a/plugins/OStatus/lib/Salmon.php b/plugins/OStatus/lib/salmon.php similarity index 100% rename from plugins/OStatus/lib/Salmon.php rename to plugins/OStatus/lib/salmon.php diff --git a/plugins/OStatus/lib/Webfinger.php b/plugins/OStatus/lib/webfinger.php similarity index 100% rename from plugins/OStatus/lib/Webfinger.php rename to plugins/OStatus/lib/webfinger.php diff --git a/plugins/OStatus/lib/XRD.php b/plugins/OStatus/lib/xrd.php similarity index 100% rename from plugins/OStatus/lib/XRD.php rename to plugins/OStatus/lib/xrd.php From d9c9b2a12fe6cbb800440eeb0174d375760e0103 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 10 Feb 2010 10:59:30 -0800 Subject: [PATCH 46/78] Queue daemon fixes: * skip unnecessary unsubscribes on graceful shutdown -- takes a long time for many queues, slows down our restarts when hitting graceful mem limit * fix control channel (was broken when we switched to support multiple queue servers) --- lib/stompqueuemanager.php | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/lib/stompqueuemanager.php b/lib/stompqueuemanager.php index 6730cd213d..cc4c817d8f 100644 --- a/lib/stompqueuemanager.php +++ b/lib/stompqueuemanager.php @@ -107,9 +107,10 @@ class StompQueueManager extends QueueManager $message .= ':' . $param; } $this->_connect(); - $result = $this->_send($this->control, - $message, - array ('created' => common_sql_now())); + $con = $this->cons[$this->defaultIdx]; + $result = $con->send($this->control, + $message, + array ('created' => common_sql_now())); if ($result) { $this->_log(LOG_INFO, "Sent control ping to queue daemons: $message"); return true; @@ -368,17 +369,10 @@ class StompQueueManager extends QueueManager foreach ($this->cons as $i => $con) { if ($con) { $this->rollback($i); - $con->unsubscribe($this->control); + $con->disconnect(); + $this->cons[$i] = null; } } - if ($this->sites) { - foreach ($this->sites as $server) { - StatusNet::init($server); - $this->doUnsubscribe(); - } - } else { - $this->doUnsubscribe(); - } return true; } From 045797331c82b86e03c61f00f4db68a085688520 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Mon, 8 Feb 2010 16:43:37 -0800 Subject: [PATCH 47/78] fix up hub queueing to work w/ stomp queues --- lib/queuemanager.php | 36 +++++++++++++------ lib/stompqueuemanager.php | 26 ++++---------- .../OStatus/lib/hubdistribqueuehandler.php | 1 + plugins/OStatus/lib/huboutqueuehandler.php | 2 +- 4 files changed, 34 insertions(+), 31 deletions(-) diff --git a/lib/queuemanager.php b/lib/queuemanager.php index afe710e884..149617eb50 100644 --- a/lib/queuemanager.php +++ b/lib/queuemanager.php @@ -155,26 +155,26 @@ abstract class QueueManager extends IoManager } /** - * Encode an object for queued storage. - * Next gen may use serialization. + * Encode an object or variable for queued storage. + * Notice objects are currently stored as an id reference; + * other items are serialized. * - * @param mixed $object + * @param mixed $item * @return string */ - protected function encode($object) + protected function encode($item) { - if ($object instanceof Notice) { - return $object->id; - } else if (is_string($object)) { - return $object; + if ($item instanceof Notice) { + // Backwards compat + return $item->id; } else { - throw new ServerException("Can't queue this type", 500); + return serialize($item); } } /** * Decode an object from queued storage. - * Accepts back-compat notice reference entries and strings for now. + * Accepts notice reference entries and serialized items. * * @param string * @return mixed @@ -182,9 +182,23 @@ abstract class QueueManager extends IoManager protected function decode($frame) { if (is_numeric($frame)) { + // Back-compat for notices... return Notice::staticGet(intval($frame)); - } else { + } elseif (substr($frame, 0, 1) == '<') { + // Back-compat for XML source return $frame; + } else { + // Deserialize! + #$old = error_reporting(); + #error_reporting($old & ~E_NOTICE); + $out = unserialize($frame); + #error_reporting($old); + + if ($out === false && $frame !== 'b:0;') { + common_log(LOG_ERR, "Couldn't unserialize queued frame: $frame"); + return false; + } + return $out; } } diff --git a/lib/stompqueuemanager.php b/lib/stompqueuemanager.php index cc4c817d8f..cd62c25bd8 100644 --- a/lib/stompqueuemanager.php +++ b/lib/stompqueuemanager.php @@ -549,26 +549,14 @@ class StompQueueManager extends QueueManager } $host = $this->cons[$idx]->getServer(); - if (is_numeric($frame->body)) { - $id = intval($frame->body); - $info = "notice $id posted at {$frame->headers['created']} in queue $queue from $host"; - - $notice = Notice::staticGet('id', $id); - if (empty($notice)) { - $this->_log(LOG_WARNING, "Skipping missing $info"); - $this->ack($idx, $frame); - $this->commit($idx); - $this->begin($idx); - $this->stats('badnotice', $queue); - return false; - } - - $item = $notice; - } else { - // @fixme should we serialize, or json, or what here? - $info = "string posted at {$frame->headers['created']} in queue $queue from $host"; - $item = $frame->body; + $item = $this->decode($frame->body); + if (empty($item)) { + $this->_log(LOG_ERR, "Skipping empty or deleted item in queue $queue from $host"); + return true; } + $info = $this->logrep($item) . " posted at " . + $frame->headers['created'] . " in queue $queue from $host"; + $this->_log(LOG_DEBUG, "Dequeued $info"); $handler = $this->getHandler($queue); if (!$handler) { diff --git a/plugins/OStatus/lib/hubdistribqueuehandler.php b/plugins/OStatus/lib/hubdistribqueuehandler.php index 189ccbedf9..de3a813858 100644 --- a/plugins/OStatus/lib/hubdistribqueuehandler.php +++ b/plugins/OStatus/lib/hubdistribqueuehandler.php @@ -56,6 +56,7 @@ class HubDistribQueueHandler extends QueueHandler } else { common_log(LOG_INFO, "No PuSH subscribers for $feed"); } + return true; } function pushGroup($notice, $group_id) diff --git a/plugins/OStatus/lib/huboutqueuehandler.php b/plugins/OStatus/lib/huboutqueuehandler.php index cb44ad2c4e..0791c7e5db 100644 --- a/plugins/OStatus/lib/huboutqueuehandler.php +++ b/plugins/OStatus/lib/huboutqueuehandler.php @@ -43,7 +43,7 @@ class HubOutQueueHandler extends QueueHandler common_log(LOG_ERR, "Failed PuSH to $sub->callback for $sub->topic: " . $e->getMessage()); // @fixme Reschedule a later delivery? - // Currently we have no way to do this other than 'send NOW' + return true; } return true; From 7752612ef6c6d00ad3adee178998d997f956f4b5 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 10 Feb 2010 20:47:42 +0000 Subject: [PATCH 48/78] fix hubdistrib --- plugins/OStatus/lib/hubdistribqueuehandler.php | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/OStatus/lib/hubdistribqueuehandler.php b/plugins/OStatus/lib/hubdistribqueuehandler.php index de3a813858..a35b8874c5 100644 --- a/plugins/OStatus/lib/hubdistribqueuehandler.php +++ b/plugins/OStatus/lib/hubdistribqueuehandler.php @@ -38,6 +38,7 @@ class HubDistribQueueHandler extends QueueHandler foreach ($notice->getGroups() as $group) { $this->pushGroup($notice, $group->group_id); } + return true; } function pushUser($notice) From 162868afdb1181a3d6e973a3de9d0abbb5e1c168 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 10 Feb 2010 21:18:53 +0000 Subject: [PATCH 49/78] OStatus update: now using standard save/delivery for incoming ostatus messages -- they get reflected to realtime and everything! woooo Group delivery may still need some munging --- plugins/OStatus/classes/Feedinfo.php | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/plugins/OStatus/classes/Feedinfo.php b/plugins/OStatus/classes/Feedinfo.php index 792ea60345..b4e55c3643 100644 --- a/plugins/OStatus/classes/Feedinfo.php +++ b/plugins/OStatus/classes/Feedinfo.php @@ -344,26 +344,31 @@ class Feedinfo extends Memcached_DataObject $hits = 0; foreach ($feed as $index => $entry) { // @fixme this might sort in wrong order if we get multiple updates - + $notice = $munger->notice($index); $notice->profile_id = $this->profile_id; - + // Double-check for oldies // @fixme this could explode horribly for multiple feeds on a blog. sigh $dupe = new Notice(); $dupe->uri = $notice->uri; if ($dupe->find(true)) { - // @fixme we might have to do individual and group delivery separately! common_log(LOG_WARNING, __METHOD__ . ": tried to save dupe notice for entry {$notice->uri} of feed {$this->feeduri}"); continue; } - if (Event::handle('StartNoticeSave', array(&$notice))) { - $id = $notice->insert(); - Event::handle('EndNoticeSave', array($notice)); - } - common_log(LOG_INFO, __METHOD__ . ": saved notice {$notice->id} for entry $index of update to \"{$this->feeduri}\""); + // @fixme need to ensure that groups get handled correctly + $saved = Notice::saveNew($this->profile_id, + $notice->content, + 'ostatus', + array('is_local' => Notice::REMOTE_OMB, + 'uri' => $notice->uri, + 'lat' => $notice->lat, + 'lon' => $notice->lon, + 'location_ns' => $notice->location_ns, + 'location_id' => $notice->location_id)); + /* common_log(LOG_DEBUG, "going to check group delivery..."); if ($this->group_id) { $group = User_group::staticGet($this->group_id); @@ -380,6 +385,7 @@ class Feedinfo extends Memcached_DataObject common_log(LOG_DEBUG, "going to add to inboxes..."); $notice->addToInboxes($groups, array()); common_log(LOG_DEBUG, "added to inboxes."); + */ $hits++; } From 4ae760cb62657e68b6b2313e64d2bb59fe264df4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 10 Feb 2010 22:58:39 +0000 Subject: [PATCH 50/78] OStatus PuSH fixes: * HMAC now calculated correctly - confirmed interop with Google's public hub * Can optionally use an external PuSH hub, set URL in $config['ostatus']['hub'] (may have issues in replication environment, and will ping the hub for every update rather than just those with subscribers) Internal hub will still function when this is set, but won't be advertised. Warning: setting this, then turning it off later will break subscriptions as that hub will no longer receive pings. --- plugins/OStatus/OStatusPlugin.php | 11 ++- plugins/OStatus/classes/Feedinfo.php | 4 +- plugins/OStatus/classes/HubSub.php | 2 +- .../OStatus/lib/hubdistribqueuehandler.php | 70 +++++++++++++++---- 4 files changed, 67 insertions(+), 20 deletions(-) diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 62ecaf6310..4b9b4d2c32 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -114,10 +114,15 @@ class OStatusPlugin extends Plugin if ($action instanceof ApiTimelineUserAction || $action instanceof ApiTimelineGroupAction) { $id = $action->arg('id'); if (strval(intval($id)) === strval($id)) { - // Canonical form of id in URL? - // Updates will be handled for our internal PuSH hub. + // Canonical form of id in URL? These are used for OStatus syndication. + + $hub = common_config('ostatus', 'hub'); + if (empty($hub)) { + // Updates will be handled through our internal PuSH hub. + $hub = common_local_url('pushhub'); + } $action->element('link', array('rel' => 'hub', - 'href' => common_local_url('pushhub'))); + 'href' => $hub)); // Also, we'll add in the salmon link $action->element('link', array('rel' => 'salmon', diff --git a/plugins/OStatus/classes/Feedinfo.php b/plugins/OStatus/classes/Feedinfo.php index b4e55c3643..2344a4a0ee 100644 --- a/plugins/OStatus/classes/Feedinfo.php +++ b/plugins/OStatus/classes/Feedinfo.php @@ -160,7 +160,7 @@ class Feedinfo extends Memcached_DataObject function keyTypes() { - return array('id' => 'K'); // @fixme we'll need a profile_id key at least + return array('id' => 'K', 'feeduri' => 'U'); // @fixme we'll need a profile_id key at least } function sequenceKey() @@ -323,7 +323,7 @@ class Feedinfo extends Memcached_DataObject if ($this->secret) { if (preg_match('/^sha1=([0-9a-fA-F]{40})$/', $hmac, $matches)) { $their_hmac = strtolower($matches[1]); - $our_hmac = sha1($xml . $this->secret); + $our_hmac = hash_hmac('sha1', $xml, $this->secret); if ($their_hmac !== $our_hmac) { common_log(LOG_ERR, __METHOD__ . ": ignoring PuSH with bad SHA-1 HMAC: got $their_hmac, expected $our_hmac"); return; diff --git a/plugins/OStatus/classes/HubSub.php b/plugins/OStatus/classes/HubSub.php index 1769f6c941..7071ee5b4f 100644 --- a/plugins/OStatus/classes/HubSub.php +++ b/plugins/OStatus/classes/HubSub.php @@ -242,7 +242,7 @@ class HubSub extends Memcached_DataObject { $headers = array('Content-Type: application/atom+xml'); if ($this->secret) { - $hmac = sha1($atom . $this->secret); + $hmac = hash_hmac('sha1', $atom, $this->secret); $headers[] = "X-Hub-Signature: sha1=$hmac"; } else { $hmac = '(none)'; diff --git a/plugins/OStatus/lib/hubdistribqueuehandler.php b/plugins/OStatus/lib/hubdistribqueuehandler.php index a35b8874c5..245a57f720 100644 --- a/plugins/OStatus/lib/hubdistribqueuehandler.php +++ b/plugins/OStatus/lib/hubdistribqueuehandler.php @@ -49,15 +49,7 @@ class HubDistribQueueHandler extends QueueHandler $feed = common_local_url('ApiTimelineUser', array('id' => $notice->profile_id, 'format' => 'atom')); - $sub = new HubSub(); - $sub->topic = $feed; - if ($sub->find()) { - $atom = $this->userFeedForNotice($notice); - $this->pushFeeds($atom, $sub); - } else { - common_log(LOG_INFO, "No PuSH subscribers for $feed"); - } - return true; + $this->pushFeed($feed, array($this, 'userFeedForNotice'), $notice); } function pushGroup($notice, $group_id) @@ -65,19 +57,69 @@ class HubDistribQueueHandler extends QueueHandler $feed = common_local_url('ApiTimelineGroup', array('id' => $group_id, 'format' => 'atom')); + $this->pushFeed($feed, array($this, 'groupFeedForNotice'), $group_id, $notice); + } + + /** + * @param string $feed URI to the feed + * @param callable $callback function to generate Atom feed update if needed + * any additional params are passed to the callback. + */ + function pushFeed($feed, $callback) + { + $hub = common_config('ostatus', 'hub'); + if ($hub) { + $this->pushFeedExternal($feed, $hub); + } + $sub = new HubSub(); $sub->topic = $feed; if ($sub->find()) { - common_log(LOG_INFO, "Building PuSH feed for $feed"); - $atom = $this->groupFeedForNotice($group_id, $notice); - $this->pushFeeds($atom, $sub); + $args = array_slice(func_get_args(), 2); + $atom = call_user_func_array($callback, $args); + $this->pushFeedInternal($atom, $sub); } else { common_log(LOG_INFO, "No PuSH subscribers for $feed"); } + return true; } - - function pushFeeds($atom, $sub) + /** + * Ping external hub about this update. + * The hub will pull the feed and check for new items later. + * Not guaranteed safe in an environment with database replication. + * + * @param string $feed feed topic URI + * @param string $hub PuSH hub URI + * @fixme can consolidate pings for user & group posts + */ + function pushFeedExternal($feed, $hub) + { + $client = new HTTPClient(); + try { + $data = array('hub.mode' => 'publish', + 'hub.url' => $feed); + $response = $client->post($hub, array(), $data); + if ($response->getStatus() == 204) { + common_log(LOG_INFO, "PuSH ping to hub $hub for $feed ok"); + return true; + } else { + common_log(LOG_ERR, "PuSH ping to hub $hub for $feed failed with HTTP " . + $response->getStatus() . ': ' . + $response->getBody()); + } + } catch (Exception $e) { + common_log(LOG_ERR, "PuSH ping to hub $hub for $feed failed: " . $e->getMessage()); + return false; + } + } + + /** + * Queue up direct feed update pushes to subscribers on our internal hub. + * @param string $atom update feed, containing only new/changed items + * @param HubSub $sub open query of subscribers + */ + function pushFeedInternal($atom, $sub) { common_log(LOG_INFO, "Preparing $sub->N PuSH distribution(s) for $sub->topic"); $qm = QueueManager::get(); From 71151b2583d81e28c5f5d42a690c649f4e84f3bf Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 11 Feb 2010 00:09:20 +0000 Subject: [PATCH 51/78] OStatus: garbage collect unused PuSH subscriptions when the last local subscriber unsubs --- plugins/OStatus/OStatusPlugin.php | 23 ++++++++++++++++++++--- plugins/OStatus/actions/pushcallback.php | 19 ++++++++++++------- plugins/OStatus/classes/Feedinfo.php | 22 ++++++++++++++++------ 3 files changed, 48 insertions(+), 16 deletions(-) diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 4b9b4d2c32..ce02393e43 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -234,13 +234,30 @@ class OStatusPlugin extends Plugin } } + + /** + * Garbage collect unused feeds on unsubscribe + */ + function onEndUnsubscribe($user, $other) + { + $feed = Feedinfo::staticGet('profile_id', $other->id); + if ($feed) { + $sub = new Subscription(); + $sub->subscribed = $other->id; + $sub->limit(1); + if (!$sub->find(true)) { + common_log(LOG_INFO, "Unsubscribing from now-unused feed $feed->feeduri on hub $feed->huburi"); + $feed->unsubscribe(); + } + } + return true; + } + function onCheckSchema() { - // warning: the autoincrement doesn't seem to set. - // alter table feedinfo change column id id int(11) not null auto_increment; $schema = Schema::get(); $schema->ensureTable('feedinfo', Feedinfo::schemaDef()); $schema->ensureTable('hubsub', HubSub::schemaDef()); return true; - } + } } diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index a5e02e08f1..471d079ab9 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -91,15 +91,20 @@ class PushCallbackAction extends Action #} // OK! - common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); - $feedinfo->sub_start = common_sql_date(time()); - if ($lease_seconds > 0) { - $feedinfo->sub_end = common_sql_date(time() + $lease_seconds); + if ($mode == 'subscribe') { + common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); + $feedinfo->sub_start = common_sql_date(time()); + if ($lease_seconds > 0) { + $feedinfo->sub_end = common_sql_date(time() + $lease_seconds); + } else { + $feedinfo->sub_end = null; + } + $feedinfo->update(); } else { - $feedinfo->sub_end = null; + common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic"); + $feedinfo->delete(); } - $feedinfo->update(); - + print $challenge; } } diff --git a/plugins/OStatus/classes/Feedinfo.php b/plugins/OStatus/classes/Feedinfo.php index 2344a4a0ee..d3cccd42f0 100644 --- a/plugins/OStatus/classes/Feedinfo.php +++ b/plugins/OStatus/classes/Feedinfo.php @@ -112,9 +112,9 @@ class Feedinfo extends Memcached_DataObject /*extra*/ null, /*auto_increment*/ true), new ColumnDef('profile_id', 'integer', - null, true), + null, true, 'UNI'), new ColumnDef('group_id', 'integer', - null, true), + null, true, 'UNI'), new ColumnDef('feeduri', 'varchar', 255, false, 'UNI'), new ColumnDef('homeuri', 'varchar', @@ -160,7 +160,7 @@ class Feedinfo extends Memcached_DataObject function keyTypes() { - return array('id' => 'K', 'feeduri' => 'U'); // @fixme we'll need a profile_id key at least + return array('id' => 'K', 'profile_id' => 'U', 'group_id' => 'U', 'feeduri' => 'U'); } function sequenceKey() @@ -261,11 +261,11 @@ class Feedinfo extends Memcached_DataObject /** * Send a subscription request to the hub for this feed. - * The hub will later send us a confirmation POST to /feedsub/callback. + * The hub will later send us a confirmation POST to /main/push/callback. * * @return bool true on success, false on failure */ - public function subscribe() + public function subscribe($mode='subscribe') { if (common_config('feedsub', 'nohub')) { // Fake it! We're just testing remote feeds w/o hubs. @@ -278,7 +278,7 @@ class Feedinfo extends Memcached_DataObject try { $callback = common_local_url('pushcallback', array('feed' => $this->id)); $headers = array('Content-Type: application/x-www-form-urlencoded'); - $post = array('hub.mode' => 'subscribe', + $post = array('hub.mode' => $mode, 'hub.callback' => $callback, 'hub.verify' => 'async', 'hub.verify_token' => $this->verify_token, @@ -308,6 +308,16 @@ class Feedinfo extends Memcached_DataObject } } + /** + * Send an unsubscription request to the hub for this feed. + * The hub will later send us a confirmation POST to /main/push/callback. + * + * @return bool true on success, false on failure + */ + public function unsubscribe() { + return $this->subscribe('unsubscribe'); + } + /** * Read and post notices for updates from the feed. * Currently assumes that all items in the feed are new, From fc431e565a61ba137329dff0ea4440ca51947aad Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Thu, 11 Feb 2010 09:36:54 +0100 Subject: [PATCH 52/78] Localisation updates for !StatusNet from !translatewiki.net !sntrans --- locale/ar/LC_MESSAGES/statusnet.po | 54 +-- locale/arz/LC_MESSAGES/statusnet.po | 54 +-- locale/bg/LC_MESSAGES/statusnet.po | 54 +-- locale/ca/LC_MESSAGES/statusnet.po | 60 +-- locale/cs/LC_MESSAGES/statusnet.po | 54 +-- locale/de/LC_MESSAGES/statusnet.po | 54 +-- locale/el/LC_MESSAGES/statusnet.po | 54 +-- locale/en_GB/LC_MESSAGES/statusnet.po | 54 +-- locale/es/LC_MESSAGES/statusnet.po | 572 ++++++++++++-------------- locale/fa/LC_MESSAGES/statusnet.po | 54 +-- locale/fi/LC_MESSAGES/statusnet.po | 54 +-- locale/fr/LC_MESSAGES/statusnet.po | 54 +-- locale/ga/LC_MESSAGES/statusnet.po | 54 +-- locale/he/LC_MESSAGES/statusnet.po | 54 +-- locale/hsb/LC_MESSAGES/statusnet.po | 54 +-- locale/ia/LC_MESSAGES/statusnet.po | 54 +-- locale/is/LC_MESSAGES/statusnet.po | 54 +-- locale/it/LC_MESSAGES/statusnet.po | 352 +++++++--------- locale/ja/LC_MESSAGES/statusnet.po | 54 +-- locale/ko/LC_MESSAGES/statusnet.po | 54 +-- locale/mk/LC_MESSAGES/statusnet.po | 61 +-- locale/nb/LC_MESSAGES/statusnet.po | 54 +-- locale/nl/LC_MESSAGES/statusnet.po | 54 +-- locale/nn/LC_MESSAGES/statusnet.po | 54 +-- locale/pl/LC_MESSAGES/statusnet.po | 54 +-- locale/pt/LC_MESSAGES/statusnet.po | 54 +-- locale/pt_BR/LC_MESSAGES/statusnet.po | 54 +-- locale/ru/LC_MESSAGES/statusnet.po | 54 +-- locale/statusnet.po | 50 +-- locale/sv/LC_MESSAGES/statusnet.po | 66 +-- locale/te/LC_MESSAGES/statusnet.po | 54 +-- locale/tr/LC_MESSAGES/statusnet.po | 54 +-- locale/uk/LC_MESSAGES/statusnet.po | 54 +-- locale/vi/LC_MESSAGES/statusnet.po | 54 +-- locale/zh_CN/LC_MESSAGES/statusnet.po | 54 +-- locale/zh_TW/LC_MESSAGES/statusnet.po | 54 +-- 36 files changed, 1354 insertions(+), 1427 deletions(-) diff --git a/locale/ar/LC_MESSAGES/statusnet.po b/locale/ar/LC_MESSAGES/statusnet.po index 00eac9b283..82eb96e5f2 100644 --- a/locale/ar/LC_MESSAGES/statusnet.po +++ b/locale/ar/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:53:32+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:11+0000\n" "Language-Team: Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ar\n" "X-Message-Group: out-statusnet\n" @@ -192,7 +192,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "لم يتم العثور على وسيلة API." @@ -804,7 +804,7 @@ msgstr "لا تمنع هذا المستخدم" msgid "Yes" msgstr "نعم" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "امنع هذا المستخدم" @@ -1550,7 +1550,7 @@ msgstr "" msgid "User is not a member of group." msgstr "المستخدم ليس عضوًا في المجموعة." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "امنع المستخدم من المجموعة" @@ -1645,19 +1645,19 @@ msgstr "قائمة بمستخدمي هذه المجموعة." msgid "Admin" msgstr "إداري" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "امنع" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "اجعل هذا المستخدم إداريًا" @@ -2005,21 +2005,21 @@ msgid "" "(%%action.register%%) a new account." msgstr "" -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "" -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "لم يمكن الحصول على تسجيل العضوية ل%1$s في المجموعة %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "لم يمكن جعل %1$s إداريا للمجموعة %2$s." @@ -2214,8 +2214,8 @@ msgstr "نوع المحتوى " msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "ليس نسق بيانات مدعوم." @@ -4246,7 +4246,7 @@ msgstr "مشكلة أثناء حفظ الإشعار." msgid "DB error inserting reply: %s" msgstr "" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "آر تي @%1$s %2$s" @@ -5802,47 +5802,47 @@ msgstr "رسالة" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "قبل لحظات قليلة" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "قبل دقيقة تقريبًا" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "قبل ساعة تقريبًا" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "قبل يوم تقريبا" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "قبل شهر تقريبًا" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "قبل سنة تقريبًا" diff --git a/locale/arz/LC_MESSAGES/statusnet.po b/locale/arz/LC_MESSAGES/statusnet.po index e1c638a6c2..a508465430 100644 --- a/locale/arz/LC_MESSAGES/statusnet.po +++ b/locale/arz/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:53:37+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:14+0000\n" "Language-Team: Egyptian Spoken Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: arz\n" "X-Message-Group: out-statusnet\n" @@ -192,7 +192,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "لم يتم العثور على وسيله API." @@ -804,7 +804,7 @@ msgstr "لا تمنع هذا المستخدم" msgid "Yes" msgstr "نعم" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "امنع هذا المستخدم" @@ -1550,7 +1550,7 @@ msgstr "" msgid "User is not a member of group." msgstr "المستخدم ليس عضوًا فى المجموعه." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "امنع المستخدم من المجموعة" @@ -1645,19 +1645,19 @@ msgstr "قائمه بمستخدمى هذه المجموعه." msgid "Admin" msgstr "إداري" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "امنع" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "اجعل هذا المستخدم إداريًا" @@ -2005,21 +2005,21 @@ msgid "" "(%%action.register%%) a new account." msgstr "" -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "" -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "لم يمكن الحصول على تسجيل العضويه ل%1$s فى المجموعه %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "لم يمكن جعل %1$s إداريا للمجموعه %2$s." @@ -2212,8 +2212,8 @@ msgstr "نوع المحتوى " msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr " مش نظام بيانات مدعوم." @@ -4244,7 +4244,7 @@ msgstr "مشكله أثناء حفظ الإشعار." msgid "DB error inserting reply: %s" msgstr "" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "آر تى @%1$s %2$s" @@ -5790,47 +5790,47 @@ msgstr "رسالة" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "قبل لحظات قليلة" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "قبل دقيقه تقريبًا" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "قبل ساعه تقريبًا" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "قبل يوم تقريبا" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "قبل شهر تقريبًا" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "قبل سنه تقريبًا" diff --git a/locale/bg/LC_MESSAGES/statusnet.po b/locale/bg/LC_MESSAGES/statusnet.po index 91528d18c3..efe49b56ab 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-07 20:31:37+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:17+0000\n" "Language-Team: Bulgarian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: bg\n" "X-Message-Group: out-statusnet\n" @@ -190,7 +190,7 @@ msgstr "Бележки от %1$s и приятели в %2$s." #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "Не е открит методът в API." @@ -816,7 +816,7 @@ msgstr "Да не се блокира този потребител" msgid "Yes" msgstr "Да" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Блокиране на потребителя" @@ -1596,7 +1596,7 @@ msgstr "Потребителят вече е блокиран за групат msgid "User is not a member of group." msgstr "Потребителят не членува в групата." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "Блокиране на потребителя" @@ -1699,20 +1699,20 @@ msgstr "Списък с потребителите в тази група." msgid "Admin" msgstr "Настройки" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Блокиране" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 #, fuzzy msgid "Make user an admin of the group" msgstr "За да редактирате групата, трябва да сте й администратор." -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2110,21 +2110,21 @@ msgstr "" "Влезте с име и парола. Нямате такива? [Регистрирайте](%%action.register%%) " "нова сметка или опитайте с [OpenID](%%action.openidlogin%%). " -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "Потребителят вече е блокиран за групата." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Грешка при проследяване — потребителят не е намерен." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "За да редактирате групата, трябва да сте й администратор." @@ -2327,8 +2327,8 @@ msgstr "вид съдържание " msgid "Only " msgstr "Само " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Неподдържан формат на данните" @@ -4442,7 +4442,7 @@ msgstr "Проблем при записване на бележката." msgid "DB error inserting reply: %s" msgstr "Грешка в базата от данни — отговор при вмъкването: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6029,47 +6029,47 @@ msgstr "Съобщение" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "преди няколко секунди" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "преди около минута" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "преди около %d минути" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "преди около час" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "преди около %d часа" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "преди около ден" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "преди около %d дни" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "преди около месец" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "преди около %d месеца" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "преди около година" diff --git a/locale/ca/LC_MESSAGES/statusnet.po b/locale/ca/LC_MESSAGES/statusnet.po index 9eb0feb637..d0b228c08c 100644 --- a/locale/ca/LC_MESSAGES/statusnet.po +++ b/locale/ca/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Catalan # +# Author@translatewiki.net: Aleator # Author@translatewiki.net: McDutchie # Author@translatewiki.net: Toniher # -- @@ -9,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-07 20:31:40+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:20+0000\n" "Language-Team: Catalan\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ca\n" "X-Message-Group: out-statusnet\n" @@ -195,7 +196,7 @@ msgstr "Actualitzacions de %1$s i amics a %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "No s'ha trobat el mètode API!" @@ -833,7 +834,7 @@ msgstr "No bloquis l'usuari" msgid "Yes" msgstr "Sí" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Bloquejar aquest usuari" @@ -1613,7 +1614,7 @@ msgstr "Un usuari t'ha bloquejat." msgid "User is not a member of group." msgstr "L'usuari no és membre del grup." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Bloca l'usuari del grup" @@ -1714,19 +1715,19 @@ msgstr "La llista dels usuaris d'aquest grup." msgid "Admin" msgstr "Admin" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Bloca" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Fes l'usuari un administrador del grup" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Fes-lo administrador" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Fes l'usuari administrador" @@ -2131,21 +2132,21 @@ msgstr "" "tens un nom d'usuari? [Crea](%%action.register%%) un nou compte o prova " "[OpenID] (%%action.openidlogin%%)." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "Només un administrador poc fer a un altre usuari administrador." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%s ja és un administrador del grup «%s»." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "No s'ha pogut eliminar l'usuari %s del grup %s" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "No es pot fer %s un administrador del grup %s" @@ -2349,8 +2350,8 @@ msgstr "tipus de contingut " msgid "Only " msgstr "Només " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Format de data no suportat." @@ -4502,7 +4503,7 @@ msgstr "Problema en guardar l'avís." msgid "DB error inserting reply: %s" msgstr "Error de BD en inserir resposta: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -5117,11 +5118,10 @@ msgid "You are not a member of any groups." msgstr "No sou membre de cap grup." #: lib/command.php:714 -#, fuzzy msgid "You are a member of this group:" msgid_plural "You are a member of these groups:" -msgstr[0] "No sou un membre del grup." -msgstr[1] "No sou un membre del grup." +msgstr[0] "Sou un membre d'aquest grup:" +msgstr[1] "Sou un membre d'aquests grups:" #: lib/command.php:728 msgid "" @@ -6085,47 +6085,47 @@ msgstr "Missatge" msgid "Moderate" msgstr "Modera" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "fa pocs segons" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "fa un minut" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "fa %d minuts" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "fa una hora" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "fa %d hores" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "fa un dia" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "fa %d dies" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "fa un mes" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "fa %d mesos" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "fa un any" diff --git a/locale/cs/LC_MESSAGES/statusnet.po b/locale/cs/LC_MESSAGES/statusnet.po index 81ba42d407..a5d6db6003 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:53:47+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:23+0000\n" "Language-Team: Czech\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: cs\n" "X-Message-Group: out-statusnet\n" @@ -196,7 +196,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Potvrzující kód nebyl nalezen" @@ -834,7 +834,7 @@ msgstr "Žádný takový uživatel." msgid "Yes" msgstr "Ano" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Zablokovat tohoto uživatele" @@ -1619,7 +1619,7 @@ msgstr "Uživatel nemá profil." msgid "User is not a member of group." msgstr "Neodeslal jste nám profil" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "Žádný takový uživatel." @@ -1723,19 +1723,19 @@ msgstr "" msgid "Admin" msgstr "" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2106,21 +2106,21 @@ msgstr "" "[Registrovat](%%action.register%%) nový účet, nebo vyzkoušejte [OpenID](%%" "action.openidlogin%%)." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "Uživatel nemá profil." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Nelze vytvořit OpenID z: %s" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Uživatel nemá profil." @@ -2319,8 +2319,8 @@ msgstr "Připojit" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "" @@ -4444,7 +4444,7 @@ msgstr "Problém při ukládání sdělení" msgid "DB error inserting reply: %s" msgstr "Chyba v DB při vkládání odpovědi: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -6056,47 +6056,47 @@ msgstr "Zpráva" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "před pár sekundami" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "asi před minutou" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "asi před %d minutami" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "asi před hodinou" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "asi před %d hodinami" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "asi přede dnem" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "před %d dny" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "asi před měsícem" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "asi před %d mesíci" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "asi před rokem" diff --git a/locale/de/LC_MESSAGES/statusnet.po b/locale/de/LC_MESSAGES/statusnet.po index b8917d9d22..b9e53e2544 100644 --- a/locale/de/LC_MESSAGES/statusnet.po +++ b/locale/de/LC_MESSAGES/statusnet.po @@ -13,12 +13,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-07 20:31:45+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:26+0000\n" "Language-Team: German\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: de\n" "X-Message-Group: out-statusnet\n" @@ -208,7 +208,7 @@ msgstr "Aktualisierungen von %1$s und Freunden auf %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "API-Methode nicht gefunden." @@ -832,7 +832,7 @@ msgstr "Diesen Benutzer freigeben" msgid "Yes" msgstr "Ja" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Diesen Benutzer blockieren" @@ -1607,7 +1607,7 @@ msgstr "Dieser Nutzer ist bereits von der Gruppe gesperrt" msgid "User is not a member of group." msgstr "Nutzer ist kein Mitglied dieser Gruppe." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Benutzerzugang zu der Gruppe blockieren" @@ -1706,19 +1706,19 @@ msgstr "Liste der Benutzer in dieser Gruppe." msgid "Admin" msgstr "Admin" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Blockieren" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Benutzer zu einem Admin dieser Gruppe ernennen" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Zum Admin ernennen" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Diesen Benutzer zu einem Admin ernennen" @@ -2128,21 +2128,21 @@ msgstr "" "Melde dich mit Nutzernamen und Passwort an. Du hast noch keinen Nutzernamen? " "[Registriere](%%action.register%%) ein neues Konto." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "Nur Administratoren können andere Nutzer zu Administratoren ernennen." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%s ist bereits ein Administrator der Gruppe „%s“." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Konnte Benutzer %s aus der Gruppe %s nicht entfernen" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Konnte %s nicht zum Administrator der Gruppe %s machen" @@ -2347,8 +2347,8 @@ msgstr "Content-Typ " msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Kein unterstütztes Datenformat." @@ -4511,7 +4511,7 @@ msgstr "Problem bei Speichern der Nachricht." msgid "DB error inserting reply: %s" msgstr "Datenbankfehler beim Einfügen der Antwort: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -6161,47 +6161,47 @@ msgstr "Nachricht" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "vor wenigen Sekunden" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "vor einer Minute" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "vor %d Minuten" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "vor einer Stunde" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "vor %d Stunden" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "vor einem Tag" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "vor %d Tagen" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "vor einem Monat" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "vor %d Monaten" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "vor einem Jahr" diff --git a/locale/el/LC_MESSAGES/statusnet.po b/locale/el/LC_MESSAGES/statusnet.po index 4bc58dd6c1..20365e04ad 100644 --- a/locale/el/LC_MESSAGES/statusnet.po +++ b/locale/el/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:53:53+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:30+0000\n" "Language-Team: Greek\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: el\n" "X-Message-Group: out-statusnet\n" @@ -191,7 +191,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Η μέθοδος του ΑΡΙ δε βρέθηκε!" @@ -817,7 +817,7 @@ msgstr "Αδυναμία διαγραφής αυτού του μηνύματος msgid "Yes" msgstr "Ναι" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "" @@ -1594,7 +1594,7 @@ msgstr "" msgid "User is not a member of group." msgstr "" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "" @@ -1692,20 +1692,20 @@ msgstr "" msgid "Admin" msgstr "Διαχειριστής" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 #, fuzzy msgid "Make Admin" msgstr "Διαχειριστής" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2067,21 +2067,21 @@ msgstr "" "ακόμα; Κάντε [εγγραφή](%%action.register%%) για ένα νέο λογαριασμό ή " "δοκιμάστε το [OpenID](%%action.openidlogin%%). " -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "" -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Αδύνατη η αποθήκευση του προφίλ." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Αδύνατη η αποθήκευση του προφίλ." @@ -2277,8 +2277,8 @@ msgstr "Σύνδεση" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "" @@ -4372,7 +4372,7 @@ msgstr "" msgid "DB error inserting reply: %s" msgstr "Σφάλμα βάσης δεδομένων κατά την εισαγωγή απάντησης: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -5933,47 +5933,47 @@ msgstr "Μήνυμα" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "" diff --git a/locale/en_GB/LC_MESSAGES/statusnet.po b/locale/en_GB/LC_MESSAGES/statusnet.po index f896d4e292..6a77520060 100644 --- a/locale/en_GB/LC_MESSAGES/statusnet.po +++ b/locale/en_GB/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:53:56+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:33+0000\n" "Language-Team: British English\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: en-gb\n" "X-Message-Group: out-statusnet\n" @@ -196,7 +196,7 @@ msgstr "Updates from %1$s and friends on %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "API method not found." @@ -819,7 +819,7 @@ msgstr "Do not block this user" msgid "Yes" msgstr "Yes" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Block this user" @@ -1581,7 +1581,7 @@ msgstr "User is already blocked from group." msgid "User is not a member of group." msgstr "User is not a member of group." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "Block user" @@ -1689,21 +1689,21 @@ msgstr "A list of the users in this group." msgid "Admin" msgstr "Admin" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Block" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 #, fuzzy msgid "Make user an admin of the group" msgstr "You must be an admin to edit the group" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 #, fuzzy msgid "Make Admin" msgstr "Admin" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2103,21 +2103,21 @@ msgstr "" "Login with your username and password. Don't have a username yet? [Register]" "(%%action.register%%) a new account." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "User is already blocked from group." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Could not remove user %s to group %s" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "You must be an admin to edit the group" @@ -2323,8 +2323,8 @@ msgstr "Connect" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Not a supported data format." @@ -4501,7 +4501,7 @@ msgstr "Problem saving notice." msgid "DB error inserting reply: %s" msgstr "DB error inserting reply: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -6091,47 +6091,47 @@ msgstr "Message" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "a few seconds ago" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "about a minute ago" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "about %d minutes ago" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "about an hour ago" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "about %d hours ago" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "about a day ago" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "about %d days ago" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "about a month ago" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "about %d months ago" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "about a year ago" diff --git a/locale/es/LC_MESSAGES/statusnet.po b/locale/es/LC_MESSAGES/statusnet.po index e1d780e982..a351c293b2 100644 --- a/locale/es/LC_MESSAGES/statusnet.po +++ b/locale/es/LC_MESSAGES/statusnet.po @@ -12,12 +12,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-07 20:31:54+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:36+0000\n" "Language-Team: Spanish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: es\n" "X-Message-Group: out-statusnet\n" @@ -41,7 +41,7 @@ msgstr "Privado" #: actions/accessadminpanel.php:163 msgid "Prohibit anonymous users (not logged in) from viewing site?" -msgstr "¿Prohibir a los usuarios anónimos (no conectados) ver el sitio ?" +msgstr "¿Prohibir a los usuarios anónimos (no conectados) ver el sitio?" #: actions/accessadminpanel.php:167 msgid "Invite only" @@ -199,7 +199,7 @@ msgstr "¡Actualizaciones de %1$s y amigos en %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "Método de API no encontrado." @@ -375,20 +375,20 @@ msgstr "No se pudo encontrar ningún usuario de destino." #: actions/register.php:205 msgid "Nickname must have only lowercase letters and numbers and no spaces." msgstr "" -"El apodo debe tener solamente letras minúsculas y números y no puede tener " +"El usuario debe tener solamente letras minúsculas y números y no puede tener " "espacios." #: actions/apigroupcreate.php:173 actions/editgroup.php:186 #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." -msgstr "El apodo ya existe. Prueba otro." +msgstr "El usuario ya existe. Prueba con otro." #: actions/apigroupcreate.php:180 actions/editgroup.php:189 #: actions/newgroup.php:133 actions/profilesettings.php:218 #: actions/register.php:210 msgid "Not a valid nickname." -msgstr "Apodo no válido" +msgstr "Usuario inválido" #: actions/apigroupcreate.php:196 actions/editapplication.php:215 #: actions/editgroup.php:195 actions/newapplication.php:203 @@ -436,7 +436,7 @@ msgstr "El alias \"%s\" ya está en uso. Intenta usar otro." #: actions/apigroupcreate.php:286 actions/editgroup.php:234 #: actions/newgroup.php:178 msgid "Alias can't be the same as nickname." -msgstr "El alias no puede ser el mismo que el apodo." +msgstr "El alias no puede ser el mismo que el usuario." #: actions/apigroupismember.php:95 actions/apigroupjoin.php:104 #: actions/apigroupleave.php:104 actions/apigroupmembership.php:91 @@ -790,9 +790,8 @@ msgid "Failed updating avatar." msgstr "Error al actualizar avatar." #: actions/avatarsettings.php:393 -#, fuzzy msgid "Avatar deleted." -msgstr "Avatar actualizado" +msgstr "Avatar borrado." #: actions/block.php:69 msgid "You already blocked that user." @@ -808,6 +807,9 @@ msgid "" "unsubscribed from you, unable to subscribe to you in the future, and you " "will not be notified of any @-replies from them." msgstr "" +"¿Realmente deseas bloquear a este usuario? Una vez que lo hagas, se " +"desuscribirá de tu cuenta, no podrá suscribirse a ella en el futuro y no se " +"te notificará de ninguna de sus respuestas @." #: actions/block.php:143 actions/deleteapplication.php:153 #: actions/deletenotice.php:145 actions/deleteuser.php:147 @@ -816,9 +818,8 @@ msgid "No" msgstr "No" #: actions/block.php:143 actions/deleteuser.php:147 -#, fuzzy msgid "Do not block this user" -msgstr "Desbloquear este usuario" +msgstr "No bloquear a este usuario" #: actions/block.php:144 actions/deleteapplication.php:158 #: actions/deletenotice.php:146 actions/deleteuser.php:148 @@ -826,7 +827,7 @@ msgstr "Desbloquear este usuario" msgid "Yes" msgstr "Sí" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Bloquear este usuario." @@ -850,14 +851,14 @@ msgid "%s blocked profiles" msgstr "%s perfiles bloqueados" #: actions/blockedfromgroup.php:93 -#, fuzzy, php-format +#, php-format msgid "%1$s blocked profiles, page %2$d" -msgstr "%s y amigos, página %d" +msgstr "%1$s perfiles bloqueados, página %2$d" #: actions/blockedfromgroup.php:108 -#, fuzzy msgid "A list of the users blocked from joining this group." -msgstr "Lista de los usuarios en este grupo." +msgstr "" +"Una lista de los usuarios que han sido bloqueados para unirse a este grupo." #: actions/blockedfromgroup.php:281 msgid "Unblock user from group" @@ -928,9 +929,8 @@ msgid "Notices" msgstr "Avisos" #: actions/deleteapplication.php:63 -#, fuzzy msgid "You must be logged in to delete an application." -msgstr "Debes estar conectado para editar un grupo." +msgstr "Debes estar registrado para borrar una aplicación." #: actions/deleteapplication.php:71 msgid "Application not found." @@ -957,11 +957,13 @@ msgid "" "about the application from the database, including all existing user " "connections." msgstr "" +"¿Estás seguro de que quieres eliminar esta aplicación? Esto borrará todos " +"los datos acerca de la aplicación de la base de datos, incluyendo todas las " +"conexiones de usuario existente." #: actions/deleteapplication.php:156 -#, fuzzy msgid "Do not delete this application" -msgstr "No se puede eliminar este aviso." +msgstr "No eliminar esta aplicación" #: actions/deleteapplication.php:160 msgid "Delete this application" @@ -982,13 +984,12 @@ msgid "Can't delete this notice." msgstr "No se puede eliminar este aviso." #: actions/deletenotice.php:103 -#, fuzzy msgid "" "You are about to permanently delete a notice. Once this is done, it cannot " "be undone." msgstr "" -"Estás a punto de eliminar permanentemente un aviso. Si lo hace, no se podrá " -"deshacer" +"Estás a punto de eliminar un mensaje permanentemente. Una vez hecho esto, no " +"lo puedes deshacer." #: actions/deletenotice.php:109 actions/deletenotice.php:141 msgid "Delete notice" @@ -999,9 +1000,8 @@ msgid "Are you sure you want to delete this notice?" msgstr "¿Estás seguro de que quieres eliminar este aviso?" #: actions/deletenotice.php:145 -#, fuzzy msgid "Do not delete this notice" -msgstr "No se puede eliminar este aviso." +msgstr "No eliminar este mensaje" #: actions/deletenotice.php:146 lib/noticelist.php:624 msgid "Delete this notice" @@ -1012,9 +1012,8 @@ msgid "You cannot delete users." msgstr "No puedes borrar usuarios." #: actions/deleteuser.php:74 -#, fuzzy msgid "You can only delete local users." -msgstr "No puedes borrar el estado de otro usuario." +msgstr "Sólo puedes eliminar usuarios locales." #: actions/deleteuser.php:110 actions/deleteuser.php:133 msgid "Delete user" @@ -1025,6 +1024,8 @@ msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" +"¿Realmente deseas eliminar este usuario? Esto borrará de la base de datos " +"todos los datos sobre el usuario, sin dejar una copia de seguridad." #: actions/deleteuser.php:148 lib/deleteuserform.php:77 msgid "Delete this user" @@ -1033,16 +1034,15 @@ msgstr "Borrar este usuario" #: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 #: lib/adminpanelaction.php:316 lib/groupnav.php:119 msgid "Design" -msgstr "" +msgstr "Diseño" #: actions/designadminpanel.php:73 msgid "Design settings for this StatusNet site." -msgstr "" +msgstr "Configuración de diseño de este sitio StatusNet." #: actions/designadminpanel.php:275 -#, fuzzy msgid "Invalid logo URL." -msgstr "Tamaño inválido." +msgstr "URL de logotipo inválido." #: actions/designadminpanel.php:279 #, php-format @@ -1058,14 +1058,12 @@ msgid "Site logo" msgstr "Logo del sitio" #: actions/designadminpanel.php:387 -#, fuzzy msgid "Change theme" -msgstr "Cambiar" +msgstr "Cambiar el tema" #: actions/designadminpanel.php:404 -#, fuzzy msgid "Site theme" -msgstr "Aviso de sitio" +msgstr "Tema del sitio" #: actions/designadminpanel.php:405 msgid "Theme for the site." @@ -1073,35 +1071,37 @@ msgstr "Tema para el sitio." #: actions/designadminpanel.php:417 lib/designsettings.php:101 msgid "Change background image" -msgstr "" +msgstr "Cambiar la imagen de fondo" #: actions/designadminpanel.php:422 actions/designadminpanel.php:497 #: lib/designsettings.php:178 msgid "Background" -msgstr "" +msgstr "Fondo" #: actions/designadminpanel.php:427 -#, fuzzy, php-format +#, php-format msgid "" "You can upload a background image for the site. The maximum file size is %1" "$s." -msgstr "Puedes cargar una imagen de logo para tu grupo." +msgstr "" +"Puedes subir una imagen de fondo para el sitio. El tamaño máximo de archivo " +"es %1$s." #: actions/designadminpanel.php:457 lib/designsettings.php:139 msgid "On" -msgstr "" +msgstr "Activado" #: actions/designadminpanel.php:473 lib/designsettings.php:155 msgid "Off" -msgstr "" +msgstr "Desactivado" #: actions/designadminpanel.php:474 lib/designsettings.php:156 msgid "Turn background image on or off." -msgstr "" +msgstr "Activar o desactivar la imagen de fondo." #: actions/designadminpanel.php:479 lib/designsettings.php:161 msgid "Tile background image" -msgstr "" +msgstr "Imagen de fondo en mosaico" #: actions/designadminpanel.php:488 lib/designsettings.php:170 msgid "Change colours" @@ -1112,9 +1112,8 @@ msgid "Content" msgstr "Contenido" #: actions/designadminpanel.php:523 lib/designsettings.php:204 -#, fuzzy msgid "Sidebar" -msgstr "Buscar" +msgstr "Barra lateral" #: actions/designadminpanel.php:536 lib/designsettings.php:217 msgid "Text" @@ -1126,19 +1125,19 @@ msgstr "Vínculos" #: actions/designadminpanel.php:577 lib/designsettings.php:247 msgid "Use defaults" -msgstr "" +msgstr "Utilizar los valores predeterminados" #: actions/designadminpanel.php:578 lib/designsettings.php:248 msgid "Restore default designs" -msgstr "" +msgstr "Restaurar los diseños predeterminados" #: actions/designadminpanel.php:584 lib/designsettings.php:254 msgid "Reset back to default" -msgstr "" +msgstr "Volver a los valores predeterminados" #: actions/designadminpanel.php:587 lib/designsettings.php:257 msgid "Save design" -msgstr "" +msgstr "Guardar el diseño" #: actions/disfavor.php:81 msgid "This notice is not a favorite!" @@ -1149,85 +1148,74 @@ msgid "Add to favorites" msgstr "Agregar a favoritos" #: actions/doc.php:158 -#, fuzzy, php-format +#, php-format msgid "No such document \"%s\"" -msgstr "No existe ese documento." +msgstr "No existe tal documento \"%s\"" #: actions/editapplication.php:54 -#, fuzzy msgid "Edit Application" -msgstr "Otras opciones" +msgstr "Editar aplicación" #: actions/editapplication.php:66 -#, fuzzy msgid "You must be logged in to edit an application." -msgstr "Debes estar conectado para editar un grupo." +msgstr "Debes haber iniciado sesión para editar una aplicación." #: actions/editapplication.php:81 actions/oauthconnectionssettings.php:166 #: actions/showapplication.php:87 -#, fuzzy msgid "No such application." -msgstr "No existe ese aviso." +msgstr "No existe tal aplicación." #: actions/editapplication.php:161 -#, fuzzy msgid "Use this form to edit your application." -msgstr "Usa este formulario para editar el grupo." +msgstr "Utiliza este formulario para editar tu aplicación." #: actions/editapplication.php:177 actions/newapplication.php:159 -#, fuzzy msgid "Name is required." -msgstr "Igual a la contraseña de arriba. Requerida" +msgstr "Se requiere un nombre" #: actions/editapplication.php:180 actions/newapplication.php:165 -#, fuzzy msgid "Name is too long (max 255 chars)." -msgstr "Tu nombre es demasiado largo (max. 255 carac.)" +msgstr "El nombre es muy largo (máx. 255 carac.)" #: actions/editapplication.php:183 actions/newapplication.php:162 -#, fuzzy msgid "Name already in use. Try another one." -msgstr "El apodo ya existe. Prueba otro." +msgstr "Ese nombre ya está en uso. Prueba con otro." #: actions/editapplication.php:186 actions/newapplication.php:168 -#, fuzzy msgid "Description is required." -msgstr "Descripción" +msgstr "Se requiere una descripción" #: actions/editapplication.php:194 msgid "Source URL is too long." -msgstr "" +msgstr "El URL fuente es muy largo." #: actions/editapplication.php:200 actions/newapplication.php:185 -#, fuzzy msgid "Source URL is not valid." -msgstr "La página de inicio no es un URL válido." +msgstr "La URL fuente es inválida." #: actions/editapplication.php:203 actions/newapplication.php:188 msgid "Organization is required." -msgstr "" +msgstr "Se requiere una organización." #: actions/editapplication.php:206 actions/newapplication.php:191 -#, fuzzy msgid "Organization is too long (max 255 chars)." -msgstr "La ubicación es demasiado larga (máx. 255 caracteres)." +msgstr "El texto de organización es muy largo (máx. 255 caracteres)." #: actions/editapplication.php:209 actions/newapplication.php:194 msgid "Organization homepage is required." -msgstr "" +msgstr "Se requiere una página principal de organización" #: actions/editapplication.php:218 actions/newapplication.php:206 msgid "Callback is too long." -msgstr "" +msgstr "La devolución de llamada es muy larga." #: actions/editapplication.php:225 actions/newapplication.php:215 msgid "Callback URL is not valid." -msgstr "" +msgstr "El URL de devolución de llamada es inválido." #: actions/editapplication.php:258 -#, fuzzy msgid "Could not update application." -msgstr "No se pudo actualizar el grupo." +msgstr "No fue posible actualizar la aplicación." #: actions/editgroup.php:56 #, php-format @@ -1240,36 +1228,33 @@ msgstr "Debes estar conectado para crear un grupo" #: actions/editgroup.php:103 actions/editgroup.php:168 #: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 -#, fuzzy msgid "You must be an admin to edit the group." -msgstr "Debes ser un admin para editar el grupo" +msgstr "Para editar el grupo debes ser administrador." #: actions/editgroup.php:154 msgid "Use this form to edit the group." msgstr "Usa este formulario para editar el grupo." #: actions/editgroup.php:201 actions/newgroup.php:145 -#, fuzzy, php-format +#, php-format msgid "description is too long (max %d chars)." -msgstr "Descripción es demasiado larga (máx. 140 caracteres)." +msgstr "La descripción es muy larga (máx. %d caracteres)." #: actions/editgroup.php:253 msgid "Could not update group." msgstr "No se pudo actualizar el grupo." #: actions/editgroup.php:259 classes/User_group.php:390 -#, fuzzy msgid "Could not create aliases." -msgstr "No se pudo crear favorito." +msgstr "No fue posible crear alias." #: actions/editgroup.php:269 msgid "Options saved." msgstr "Se guardó Opciones." #: actions/emailsettings.php:60 -#, fuzzy msgid "Email settings" -msgstr "Opciones de Email" +msgstr "Configuración del correo electrónico" #: actions/emailsettings.php:71 #, php-format @@ -1306,9 +1291,8 @@ msgid "Cancel" msgstr "Cancelar" #: actions/emailsettings.php:121 -#, fuzzy msgid "Email address" -msgstr "Direcciones de correo electrónico" +msgstr "Dirección de correo electrónico" #: actions/emailsettings.php:123 msgid "Email address, like \"UserName@example.org\"" @@ -1355,10 +1339,9 @@ msgstr "" "Enviarme un correo electrónico cuando alguien me envía un mensaje privado." #: actions/emailsettings.php:174 -#, fuzzy msgid "Send me email when someone sends me an \"@-reply\"." msgstr "" -"Enviarme un correo electrónico cuando alguien me envía un mensaje privado." +"Enviarme un correo electrónico cuando alguien me envíe una \"@-respuesta\"." #: actions/emailsettings.php:179 msgid "Allow friends to nudge me and send me an email." @@ -1462,29 +1445,31 @@ msgstr "Sacar favorito" #: actions/favorited.php:65 lib/popularnoticesection.php:91 #: lib/publicgroupnav.php:93 -#, fuzzy msgid "Popular notices" -msgstr "Avisos populares" +msgstr "Mensajes populares" #: actions/favorited.php:67 -#, fuzzy, php-format +#, php-format msgid "Popular notices, page %d" -msgstr "Avisos populares, página %d" +msgstr "Mensajes populares, página %d" #: actions/favorited.php:79 -#, fuzzy msgid "The most popular notices on the site right now." -msgstr "Ahora se muestran los avisos más populares en el sitio." +msgstr "Los mensajes más populares del sitio en este momento." #: actions/favorited.php:150 msgid "Favorite notices appear on this page but no one has favorited one yet." msgstr "" +"Los mensajes favoritos aparecen en esta página, pero todavía nadie ha " +"marcado algún mensaje como favorito." #: 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 "" +"Se la primera persona en añadir un mensaje a tus favoritos con el botón de " +"favoritos que se encuentra al lado de cualquier mensaje que te guste." #: actions/favorited.php:156 #, php-format @@ -1492,6 +1477,8 @@ msgid "" "Why not [register an account](%%action.register%%) and be the first to add a " "notice to your favorites!" msgstr "" +"¿Por qué no [registrar una cuenta](%%action.register%%) y ser la primera " +"persona en añadir un mensaje a tus favoritos?" #: actions/favoritesrss.php:111 actions/showfavorites.php:77 #: lib/personalgroupnav.php:115 @@ -1500,9 +1487,9 @@ msgid "%s's favorite notices" msgstr "Avisos favoritos de %s" #: actions/favoritesrss.php:115 -#, fuzzy, php-format +#, php-format msgid "Updates favored by %1$s on %2$s!" -msgstr "¡Actualizaciones de %1$s en %2$s!" +msgstr "¡Actualizaciones favorecidas por %1$ s en %2$s!" #: actions/featured.php:69 lib/featureduserssection.php:87 #: lib/publicgroupnav.php:89 @@ -1515,14 +1502,13 @@ msgid "Featured users, page %d" msgstr "Usuarios que figuran, página %d" #: actions/featured.php:99 -#, fuzzy, php-format +#, php-format msgid "A selection of some great users on %s" -msgstr "Una selección de algunos de los grandes usuarios en %s" +msgstr "Una selección de fantásticos usuarios en %s" #: actions/file.php:34 -#, fuzzy msgid "No notice ID." -msgstr "Nuevo aviso" +msgstr "No hay ID de mensaje." #: actions/file.php:38 msgid "No notice." @@ -1557,14 +1543,12 @@ msgid "You are not authorized." msgstr "No estás autorizado." #: actions/finishremotesubscribe.php:113 -#, fuzzy msgid "Could not convert request token to access token." -msgstr "No se pudieron convertir las clavesde petición a claves de acceso." +msgstr "No se pudo convertir el token de solicitud en token de acceso." #: actions/finishremotesubscribe.php:118 -#, fuzzy msgid "Remote service uses unknown version of OMB protocol." -msgstr "Versión desconocida del protocolo OMB." +msgstr "El servicio remoto utiliza una versión desconocida del protocolo OMB." #: actions/finishremotesubscribe.php:138 lib/oauthstore.php:306 msgid "Error updating remote profile" @@ -1597,7 +1581,7 @@ msgstr "Grupo no especificado." #: actions/groupblock.php:91 msgid "Only an admin can block group members." -msgstr "" +msgstr "Sólo un administrador puede bloquear miembros de un grupo." #: actions/groupblock.php:95 msgid "User is already blocked from group." @@ -1607,7 +1591,7 @@ msgstr "Usuario ya está bloqueado del grupo." msgid "User is not a member of group." msgstr "Usuario no es miembro del grupo" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Bloquear usuario de grupo" @@ -1618,6 +1602,9 @@ msgid "" "will be removed from the group, unable to post, and unable to subscribe to " "the group in the future." msgstr "" +"¿Realmente deseas bloquear al usuario \"%1$s\" del grupo \"%2$s\"? Se " +"eliminará del grupo y no podrá publicar ni suscribirse al grupo en lo " +"sucesivo." #: actions/groupblock.php:178 msgid "Do not block this user from this group" @@ -1630,6 +1617,8 @@ msgstr "Bloquear este usuario de este grupo" #: actions/groupblock.php:196 msgid "Database error blocking user from group." msgstr "" +"Se ha producido un error en la base de datos al bloquear el usuario del " +"grupo." #: actions/groupbyid.php:74 actions/userbyid.php:70 msgid "No ID." @@ -1640,56 +1629,53 @@ msgid "You must be logged in to edit a group." msgstr "Debes estar conectado para editar un grupo." #: actions/groupdesignsettings.php:141 -#, fuzzy msgid "Group design" -msgstr "Grupos" +msgstr "Diseño de grupo" #: actions/groupdesignsettings.php:152 msgid "" "Customize the way your group looks with a background image and a colour " "palette of your choice." msgstr "" +"Personaliza el aspecto de tu grupo con una imagen de fondo y la paleta de " +"colores que prefieras." #: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 #: lib/designsettings.php:391 lib/designsettings.php:413 -#, fuzzy msgid "Couldn't update your design." -msgstr "No se pudo actualizar el usuario." +msgstr "No fue posible actualizar tu diseño." #: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 -#, fuzzy msgid "Design preferences saved." -msgstr "Preferencias de sincronización guardadas." +msgstr "Preferencias de diseño guardadas." #: actions/grouplogo.php:139 actions/grouplogo.php:192 msgid "Group logo" msgstr "Logo de grupo" #: actions/grouplogo.php:150 -#, fuzzy, php-format +#, php-format msgid "" "You can upload a logo image for your group. The maximum file size is %s." -msgstr "Puedes cargar una imagen de logo para tu grupo." +msgstr "" +"Puedes subir una imagen de logo para tu grupo. El tamaño máximo del archivo " +"debe ser %s." #: actions/grouplogo.php:178 -#, fuzzy msgid "User without matching profile." -msgstr "Usuario sin perfil equivalente" +msgstr "Usuario sin perfil coincidente." #: actions/grouplogo.php:362 -#, fuzzy msgid "Pick a square area of the image to be the logo." -msgstr "Elige un área cuadrada de la imagen para que sea tu avatar" +msgstr "Elige un área cuadrada de la imagen para que sea tu logo." #: actions/grouplogo.php:396 -#, fuzzy msgid "Logo updated." -msgstr "SE actualizó logo." +msgstr "Logo actualizado." #: actions/grouplogo.php:398 -#, fuzzy msgid "Failed updating logo." -msgstr "Error al actualizar logo." +msgstr "Error al actualizar el logo." #: actions/groupmembers.php:93 lib/groupnav.php:92 #, php-format @@ -1697,9 +1683,9 @@ msgid "%s group members" msgstr "Miembros del grupo %s" #: actions/groupmembers.php:96 -#, fuzzy, php-format +#, php-format msgid "%1$s group members, page %2$d" -msgstr "Miembros del grupo %s, página %d" +msgstr "%1$s miembros de grupo, página %2$d" #: actions/groupmembers.php:111 msgid "A list of the users in this group." @@ -1709,28 +1695,26 @@ msgstr "Lista de los usuarios en este grupo." msgid "Admin" msgstr "Admin" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Bloquear" -#: actions/groupmembers.php:441 -#, fuzzy +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" -msgstr "Debes ser un admin para editar el grupo" +msgstr "Convertir al usuario en administrador del grupo" -#: actions/groupmembers.php:473 -#, fuzzy +#: actions/groupmembers.php:475 msgid "Make Admin" -msgstr "Admin" +msgstr "Convertir en administrador" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" -msgstr "" +msgstr "Convertir a este usuario en administrador" #: actions/grouprss.php:133 -#, fuzzy, php-format +#, php-format msgid "Updates from members of %1$s on %2$s!" -msgstr "¡Actualizaciones de %1$s en %2$s!" +msgstr "¡Actualizaciones de miembros de %1$s en %2$s!" #: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230 #: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98 @@ -1751,30 +1735,33 @@ msgid "" "for one](%%%%action.groupsearch%%%%) or [start your own!](%%%%action.newgroup" "%%%%)" msgstr "" +"Grupos %%%%site.name%%%% te permiten encontrar gente de intereses afines a " +"los tuyo y hablar con ellos. Después de unirte al grupo, podrás enviarle " +"mensajes a todos sus miembros mediante la sintaxis \"!groupname\". ¿No " +"encuentras un grupo que te guste? ¡Intenta [buscar otro](%%%%action." +"groupsearch%%%%) o [crea tú uno!](%%%%action.newgroup%%%%)" #: actions/groups.php:107 actions/usergroups.php:124 lib/groupeditform.php:122 msgid "Create a new group" msgstr "Crear un nuevo grupo" #: actions/groupsearch.php:52 -#, fuzzy, php-format +#, php-format msgid "" "Search for groups on %%site.name%% by their name, location, or description. " "Separate the terms by spaces; they must be 3 characters or more." msgstr "" -"Buscar personas en %%site.name%% por nombre, ubicación o intereses. Separa " -"los términos con espacios; deben tener una longitud mínima de 3 caracteres." +"Busca grupos en %%site.name%% por su nombre, ubicación o descripción. Separa " +"los términos con espacios. Los términos tienen que ser de 3 o más caracteres." #: actions/groupsearch.php:58 -#, fuzzy msgid "Group search" -msgstr "Buscador de grupos" +msgstr "Búsqueda en grupos" #: actions/groupsearch.php:79 actions/noticesearch.php:117 #: actions/peoplesearch.php:83 -#, fuzzy msgid "No results." -msgstr "Ningún resultado" +msgstr "No se obtuvo resultados." #: actions/groupsearch.php:82 #, php-format @@ -1782,6 +1769,8 @@ msgid "" "If you can't find the group you're looking for, you can [create it](%%action." "newgroup%%) yourself." msgstr "" +"Si no puedes encontrar el grupo que estás buscando, puedes [crearlo] (%%" +"action.newgroup%%) tú mismo." #: actions/groupsearch.php:85 #, php-format @@ -1789,23 +1778,22 @@ msgid "" "Why not [register an account](%%action.register%%) and [create the group](%%" "action.newgroup%%) yourself!" msgstr "" +"¿Por qué no [registras una cuenta](%%action.register%%) y [creas el grupo](%%" +"action.newgroup%%) tú mismo?" #: actions/groupunblock.php:91 msgid "Only an admin can unblock group members." -msgstr "" +msgstr "Sólo un administrador puede desbloquear miembros de grupos." #: actions/groupunblock.php:95 -#, fuzzy msgid "User is not blocked from group." -msgstr "El usuario te ha bloqueado." +msgstr "El usuario no está bloqueado del grupo." #: actions/groupunblock.php:128 actions/unblock.php:86 -#, fuzzy msgid "Error removing the block." -msgstr "Error al sacar bloqueo." +msgstr "Se ha producido un error al eliminar el bloque." #: actions/imsettings.php:59 -#, fuzzy msgid "IM settings" msgstr "Configuración de mensajería instantánea" @@ -1819,9 +1807,8 @@ msgstr "" "Jabber/GTalk. Configura tu dirección y opciones abajo." #: actions/imsettings.php:89 -#, fuzzy msgid "IM is not available." -msgstr "Esta página no está disponible en un " +msgstr "La mensajería instantánea no está disponible." #: actions/imsettings.php:106 msgid "Current confirmed Jabber/GTalk address." @@ -1838,7 +1825,6 @@ msgstr "" "de amigos?)" #: actions/imsettings.php:124 -#, fuzzy msgid "IM address" msgstr "Dirección de mensajería instantánea" @@ -1904,9 +1890,9 @@ msgid "That is not your Jabber ID." msgstr "Ese no es tu Jabber ID." #: actions/inbox.php:59 -#, fuzzy, php-format +#, php-format msgid "Inbox for %1$s - page %2$d" -msgstr "Bandeja de entrada para %s" +msgstr "Bandeja de entrada de %1$s - página %2$d" #: actions/inbox.php:62 #, php-format @@ -1920,7 +1906,7 @@ msgstr "" #: actions/invite.php:39 msgid "Invites have been disabled." -msgstr "" +msgstr "Se han inhabilitado las invitaciones." #: actions/invite.php:41 #, php-format @@ -1999,7 +1985,7 @@ msgid "%1$s has invited you to join them on %2$s" msgstr "%1$s te ha invitado a que te unas con el/ellos en %2$s" #: actions/invite.php:228 -#, fuzzy, php-format +#, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" "\n" @@ -2028,55 +2014,54 @@ msgid "" "\n" "Sincerely, %2$s\n" msgstr "" -"%1$s te ha invitado a unirte a ellos en %2$s (%3$s).\n" +"%1$s te ha invitado a unirte a %2$s (%3$s).\n" "\n" -"%2$s es un servicio de microblogueo que te permite estar al tanto de la " -"gente que conoces y que te interesa.\n" +"%2$s es un servicio de microblogueo que te permite mantenerte al corriente " +"de las personas que sigues y que te interesan.\n" "\n" -"Puedes compartir noticias sobre tí mismo, tus pensamientos, o tu vida en " -"línea con gente que te conoce. También es bueno para conocer gente que " -"comparta tus intereses.\n" +"También puedes compartir noticias acerca de tí, tus pensamientos o tu vida " +"en línea con la gente que sabe de tí. También es una excelente herramienta " +"para conocer gente nueva que comparta tus intereses.\n" "\n" -"%1$s dijo:\n" +"%1$s ha dicho:\n" "\n" "%4$s\n" "\n" -"Puedes ver el perfil de %1$s en %2$s aquí:\n" +"Puedes ver el perfil de %1$s aquí en %2$s:\n" "\n" "%5$s\n" "\n" -"Si quieres inscribirte y probar el servicio, haz click en enlace debajo para " +"Si quieres probar el sevicio, haz clic en el vínculo a continuación para " "aceptar la invitación.\n" "\n" "%6$s\n" "\n" -"Si no deseas inscribirte puedes ignorar este mensaje. Gracias por tu " -"paciencia y tiempo.\n" +"Si por el contrario, no quieres, ignora este mensaje. Muchas gracias por tu " +"paciencia y por tu tiempo.\n" "\n" -"Sinceramente, %2$s\n" +"Saludos cordiales, %2$s\n" #: actions/joingroup.php:60 msgid "You must be logged in to join a group." msgstr "Debes estar conectado para unirte a un grupo." #: actions/joingroup.php:131 -#, fuzzy, php-format +#, php-format msgid "%1$s joined group %2$s" -msgstr "%s se unió a grupo %s" +msgstr "%1$s se ha unido al grupo %2$" #: actions/leavegroup.php:60 msgid "You must be logged in to leave a group." msgstr "Debes estar conectado para dejar un grupo." #: actions/leavegroup.php:90 lib/command.php:265 -#, fuzzy msgid "You are not a member of that group." -msgstr "No eres miembro de ese grupo" +msgstr "No eres miembro de este grupo." #: actions/leavegroup.php:127 -#, fuzzy, php-format +#, php-format msgid "%1$s left group %2$s" -msgstr "%s dejó grupo %s" +msgstr "%1$s ha dejado el grupo %2$s" #: actions/login.php:80 actions/otp.php:62 actions/register.php:137 msgid "Already logged in." @@ -2087,9 +2072,8 @@ msgid "Incorrect username or password." msgstr "Nombre de usuario o contraseña incorrectos." #: actions/login.php:132 actions/otp.php:120 -#, fuzzy msgid "Error setting user. You are probably not authorized." -msgstr "No autorizado." +msgstr "Error al configurar el usuario. Posiblemente no tengas autorización." #: actions/login.php:188 actions/login.php:241 lib/action.php:466 #: lib/logingroupnav.php:79 @@ -2123,61 +2107,57 @@ msgstr "" "contraseña antes de cambiar tu configuración." #: actions/login.php:270 -#, fuzzy, php-format +#, php-format msgid "" "Login with your username and password. Don't have a username yet? [Register]" "(%%action.register%%) a new account." msgstr "" -"Inicia una sesión con tu usuario y contraseña. ¿Aún no tienes usuario? [Crea]" -"(%%action.register%%) una cuenta nueva o prueba [OpenID] (%%action." -"openidlogin%%). " +"Inicia sesión con tu usuario y contraseña. ¿Aún no tienes usuario? [Crea](%%" +"action.register%%) una cuenta." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" +"Sólo los administradores pueden convertir a un usuario en administrador." -#: actions/makeadmin.php:95 -#, fuzzy, php-format +#: actions/makeadmin.php:96 +#, php-format msgid "%1$s is already an admin for group \"%2$s\"." -msgstr "Usuario ya está bloqueado del grupo." +msgstr "%1$s ya es un administrador del grupo \"%2$s\"." -#: actions/makeadmin.php:132 -#, fuzzy, php-format +#: actions/makeadmin.php:133 +#, php-format msgid "Can't get membership record for %1$s in group %2$s." -msgstr "No se pudo eliminar a usuario %s de grupo %s" +msgstr "No se puede obtener el registro de membresía de %1$s en el grupo %2$s." -#: actions/makeadmin.php:145 -#, fuzzy, php-format +#: actions/makeadmin.php:146 +#, php-format msgid "Can't make %1$s an admin for group %2$s." -msgstr "Debes ser un admin para editar el grupo" +msgstr "No es posible convertir a %1$s en administrador del grupo %2$s." #: actions/microsummary.php:69 msgid "No current status" msgstr "No existe estado actual" #: actions/newapplication.php:52 -#, fuzzy msgid "New Application" -msgstr "No existe ese aviso." +msgstr "Nueva aplicación" #: actions/newapplication.php:64 -#, fuzzy msgid "You must be logged in to register an application." -msgstr "Debes estar conectado para crear un grupo" +msgstr "Debes conectarte para registrar una aplicación." #: actions/newapplication.php:143 -#, fuzzy msgid "Use this form to register a new application." -msgstr "Usa este formulario para crear un grupo nuevo." +msgstr "Utiliza este formulario para registrar una nueva aplicación." #: actions/newapplication.php:176 msgid "Source URL is required." -msgstr "" +msgstr "Se requiere la URL fuente." #: actions/newapplication.php:258 actions/newapplication.php:267 -#, fuzzy msgid "Could not create application." -msgstr "No se pudo crear favorito." +msgstr "No se pudo crear la aplicación." #: actions/newgroup.php:53 msgid "New group" @@ -2210,14 +2190,13 @@ msgid "" msgstr "No te auto envíes un mensaje; dícetelo a ti mismo." #: actions/newmessage.php:181 -#, fuzzy msgid "Message sent" -msgstr "Mensaje" +msgstr "Mensaje enviado" #: actions/newmessage.php:185 -#, fuzzy, php-format +#, php-format msgid "Direct message to %s sent." -msgstr "Se envió mensaje directo a %s" +msgstr "Se ha enviado un mensaje directo a %s." #: actions/newmessage.php:210 actions/newnotice.php:245 lib/channel.php:170 msgid "Ajax Error" @@ -2228,9 +2207,8 @@ msgid "New notice" msgstr "Nuevo aviso" #: actions/newnotice.php:211 -#, fuzzy msgid "Notice posted" -msgstr "Aviso publicado" +msgstr "Mensaje publicado" #: actions/noticesearch.php:68 #, php-format @@ -2246,9 +2224,9 @@ msgid "Text search" msgstr "Búsqueda de texto" #: actions/noticesearch.php:91 -#, fuzzy, php-format +#, php-format msgid "Search results for \"%1$s\" on %2$s" -msgstr "Busca \"%s\" en la Corriente" +msgstr "Resultados de la búsqueda de \"%1$s\" en %2$s" #: actions/noticesearch.php:121 #, php-format @@ -2256,6 +2234,8 @@ msgid "" "Be the first to [post on this topic](%%%%action.newnotice%%%%?" "status_textarea=%s)!" msgstr "" +"Sé la primera persona en [publicar algo en este tema](%%%%action.newnotice%%%" +"%?status_textarea=%s)!" #: actions/noticesearch.php:124 #, php-format @@ -2263,16 +2243,20 @@ msgid "" "Why not [register an account](%%%%action.register%%%%) and be the first to " "[post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!" msgstr "" +"¿Por qué no [registras una cuenta](%%%%action.register%%%%) y te conviertes " +"en la primera persona en [publicar algo en este tema](%%%%action.newnotice%%%" +"%?status_textarea=%s)?" #: actions/noticesearchrss.php:96 -#, fuzzy, php-format +#, php-format msgid "Updates with \"%s\"" -msgstr "¡Actualizaciones de %1$s en %2$s!" +msgstr "Actualizaciones con \"%s\"" #: actions/noticesearchrss.php:98 -#, fuzzy, php-format +#, php-format msgid "Updates matching search term \"%1$s\" on %2$s!" -msgstr "Todas las actualizaciones que corresponden a la frase a buscar \"%s\"" +msgstr "" +"¡Actualizaciones que contienen el término de búsqueda \"%1$s\" en %2$s!" #: actions/nudge.php:85 msgid "" @@ -2286,54 +2270,52 @@ msgid "Nudge sent" msgstr "Se envió zumbido" #: actions/nudge.php:97 -#, fuzzy msgid "Nudge sent!" -msgstr "¡Zumbido enviado!" +msgstr "¡Codazo enviado!" #: actions/oauthappssettings.php:59 -#, fuzzy msgid "You must be logged in to list your applications." -msgstr "Debes estar conectado para editar un grupo." +msgstr "Debes estar conectado para listar tus aplicaciones." #: actions/oauthappssettings.php:74 -#, fuzzy msgid "OAuth applications" -msgstr "Otras opciones" +msgstr "Aplicaciones OAuth" #: actions/oauthappssettings.php:85 msgid "Applications you have registered" -msgstr "" +msgstr "Aplicaciones que has registrado" #: actions/oauthappssettings.php:135 #, php-format msgid "You have not registered any applications yet." -msgstr "" +msgstr "Aún no has registrado aplicación alguna." #: actions/oauthconnectionssettings.php:72 msgid "Connected applications" -msgstr "" +msgstr "Aplicaciones conectadas" #: actions/oauthconnectionssettings.php:83 msgid "You have allowed the following applications to access you account." -msgstr "" +msgstr "Has permitido a las siguientes aplicaciones acceder a tu cuenta." #: actions/oauthconnectionssettings.php:175 -#, fuzzy msgid "You are not a user of that application." -msgstr "No eres miembro de ese grupo" +msgstr "No eres un usuario de esa aplicación." #: actions/oauthconnectionssettings.php:186 msgid "Unable to revoke access for app: " -msgstr "" +msgstr "No se puede revocar el acceso para la aplicación: " #: actions/oauthconnectionssettings.php:198 #, php-format msgid "You have not authorized any applications to use your account." -msgstr "" +msgstr "No has autorizado a ninguna aplicación utilizar tu cuenta." #: actions/oauthconnectionssettings.php:211 msgid "Developers can edit the registration settings for their applications " msgstr "" +"Los desarrolladores pueden editar la configuración de registro de sus " +"aplicaciones " #: actions/oembed.php:79 actions/shownotice.php:100 msgid "Notice has no profile" @@ -2345,16 +2327,15 @@ msgid "%1$s's status on %2$s" msgstr "estado de %1$s en %2$s" #: actions/oembed.php:157 -#, fuzzy msgid "content type " -msgstr "Conectarse" +msgstr "tipo de contenido " #: actions/oembed.php:160 msgid "Only " -msgstr "" +msgstr "Sólo " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "No es un formato de dato soportado" @@ -2367,9 +2348,8 @@ msgid "Notice Search" msgstr "Búsqueda de avisos" #: actions/othersettings.php:60 -#, fuzzy msgid "Other settings" -msgstr "Otras configuraciones" +msgstr "Otros ajustes" #: actions/othersettings.php:71 msgid "Manage various other options." @@ -2377,29 +2357,27 @@ msgstr "Manejo de varias opciones adicionales." #: actions/othersettings.php:108 msgid " (free service)" -msgstr "" +msgstr "  (servicio gratuito)" #: actions/othersettings.php:116 msgid "Shorten URLs with" -msgstr "" +msgstr "Acortar las URL con" #: actions/othersettings.php:117 msgid "Automatic shortening service to use." msgstr "Servicio de acorte automático a usar." #: actions/othersettings.php:122 -#, fuzzy msgid "View profile designs" -msgstr "Configuración del perfil" +msgstr "Ver diseños de perfil" #: actions/othersettings.php:123 msgid "Show or hide profile designs." -msgstr "" +msgstr "Ocultar o mostrar diseños de perfil." #: actions/othersettings.php:153 -#, fuzzy msgid "URL shortening service is too long (max 50 chars)." -msgstr "Servicio de acorte de URL demasiado largo (máx. 50 caracteres)." +msgstr "El servicio de acortamiento de URL es muy largo (máx. 50 caracteres)." #: actions/otp.php:69 #, fuzzy @@ -2407,14 +2385,12 @@ msgid "No user ID specified." msgstr "Grupo no especificado." #: actions/otp.php:83 -#, fuzzy msgid "No login token specified." -msgstr "No se especificó perfil." +msgstr "No se ha especificado un token de acceso." #: actions/otp.php:90 -#, fuzzy msgid "No login token requested." -msgstr "Ningún perfil de Id en solicitud." +msgstr "Token de acceso solicitado." #: actions/otp.php:95 #, fuzzy @@ -2422,9 +2398,8 @@ msgid "Invalid login token specified." msgstr "El contenido del aviso es inválido" #: actions/otp.php:104 -#, fuzzy msgid "Login token expired." -msgstr "Ingresar a sitio" +msgstr "Token de acceso caducado." #: actions/outbox.php:58 #, fuzzy, php-format @@ -2451,9 +2426,8 @@ msgid "Change your password." msgstr "Cambia tu contraseña." #: actions/passwordsettings.php:96 actions/recoverpassword.php:231 -#, fuzzy msgid "Password change" -msgstr "Cambio de contraseña " +msgstr "Cambio de contraseña" #: actions/passwordsettings.php:104 msgid "Old password" @@ -2538,9 +2512,8 @@ msgstr "" #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 #: lib/adminpanelaction.php:311 -#, fuzzy msgid "Site" -msgstr "Invitar" +msgstr "Sitio" #: actions/pathsadminpanel.php:238 #, fuzzy @@ -2578,11 +2551,11 @@ msgstr "" #: actions/pathsadminpanel.php:259 msgid "Theme" -msgstr "" +msgstr "Tema" #: actions/pathsadminpanel.php:264 msgid "Theme server" -msgstr "" +msgstr "Servidor de los temas" #: actions/pathsadminpanel.php:268 msgid "Theme path" @@ -2590,12 +2563,11 @@ msgstr "" #: actions/pathsadminpanel.php:272 msgid "Theme directory" -msgstr "" +msgstr "Directorio de temas" #: actions/pathsadminpanel.php:279 -#, fuzzy msgid "Avatars" -msgstr "Avatar" +msgstr "Avatares" #: actions/pathsadminpanel.php:284 #, fuzzy @@ -2618,7 +2590,7 @@ msgstr "" #: actions/pathsadminpanel.php:305 msgid "Background server" -msgstr "" +msgstr "Servidor de fondo" #: actions/pathsadminpanel.php:309 msgid "Background path" @@ -2629,23 +2601,20 @@ msgid "Background directory" msgstr "" #: actions/pathsadminpanel.php:320 -#, fuzzy msgid "SSL" -msgstr "SMS" +msgstr "SSL" #: actions/pathsadminpanel.php:323 actions/siteadminpanel.php:294 -#, fuzzy msgid "Never" -msgstr "Recuperar" +msgstr "Nunca" #: actions/pathsadminpanel.php:324 -#, fuzzy msgid "Sometimes" -msgstr "Avisos" +msgstr "A veces" #: actions/pathsadminpanel.php:325 msgid "Always" -msgstr "" +msgstr "Siempre" #: actions/pathsadminpanel.php:329 msgid "Use SSL" @@ -2653,12 +2622,11 @@ msgstr "" #: actions/pathsadminpanel.php:330 msgid "When to use SSL" -msgstr "" +msgstr "Cuándo utilizar SSL" #: actions/pathsadminpanel.php:335 -#, fuzzy msgid "SSL server" -msgstr "Recuperar" +msgstr "Servidor SSL" #: actions/pathsadminpanel.php:336 msgid "Server to direct SSL requests to" @@ -2713,9 +2681,8 @@ msgstr "" "sepa más sobre ti." #: actions/profilesettings.php:99 -#, fuzzy msgid "Profile information" -msgstr "Información de perfil " +msgstr "Información del perfil" #: actions/profilesettings.php:108 lib/groupeditform.php:154 msgid "1-64 lowercase letters or numbers, no punctuation or spaces" @@ -2738,14 +2705,13 @@ msgid "URL of your homepage, blog, or profile on another site" msgstr "El URL de tu página de inicio, blog o perfil en otro sitio" #: actions/profilesettings.php:122 actions/register.php:461 -#, fuzzy, php-format +#, php-format msgid "Describe yourself and your interests in %d chars" -msgstr "Cuéntanos algo sobre ti y tus intereses en 140 caracteres" +msgstr "Descríbete y cuéntanos tus intereses en %d caracteres" #: actions/profilesettings.php:125 actions/register.php:464 -#, fuzzy msgid "Describe yourself and your interests" -msgstr "Descríbete y cuenta de tus " +msgstr "Descríbete y cuéntanos acerca de tus intereses" #: actions/profilesettings.php:127 actions/register.php:466 msgid "Bio" @@ -2801,9 +2767,9 @@ msgstr "" "para no-humanos)" #: actions/profilesettings.php:228 actions/register.php:223 -#, fuzzy, php-format +#, php-format msgid "Bio is too long (max %d chars)." -msgstr "La biografía es demasiado larga (máx. 140 caracteres)." +msgstr "La biografía es muy larga (máx. %d caracteres)." #: actions/profilesettings.php:235 actions/siteadminpanel.php:150 msgid "Timezone not selected." @@ -2823,18 +2789,16 @@ msgid "Couldn't update user for autosubscribe." msgstr "No se pudo actualizar el usuario para autosuscribirse." #: actions/profilesettings.php:359 -#, fuzzy msgid "Couldn't save location prefs." -msgstr "No se pudo guardar tags." +msgstr "No se han podido guardar las preferencias de ubicación." #: actions/profilesettings.php:371 msgid "Couldn't save profile." msgstr "No se pudo guardar el perfil." #: actions/profilesettings.php:379 -#, fuzzy msgid "Couldn't save tags." -msgstr "No se pudo guardar tags." +msgstr "No se pudo guardar las etiquetas." #: actions/profilesettings.php:387 lib/adminpanelaction.php:137 msgid "Settings saved." @@ -2850,9 +2814,9 @@ msgid "Could not retrieve public stream." msgstr "No se pudo acceder a corriente pública." #: actions/public.php:129 -#, fuzzy, php-format +#, php-format msgid "Public timeline, page %d" -msgstr "Línea de tiempo pública, página %d" +msgstr "Línea temporal pública, página %d" #: actions/public.php:131 lib/publicgroupnav.php:79 msgid "Public timeline" @@ -2879,10 +2843,12 @@ msgid "" "This is the public timeline for %%site.name%% but no one has posted anything " "yet." msgstr "" +"Esta es la línea temporal pública de %%site.name%%, pero aún no se ha " +"publicado nada." #: actions/public.php:190 msgid "Be the first to post!" -msgstr "" +msgstr "¡Sé la primera persona en publicar algo!" #: actions/public.php:194 #, php-format @@ -2910,9 +2876,8 @@ msgstr "" "wiki/Micro-blogging) " #: actions/publictagcloud.php:57 -#, fuzzy msgid "Public tag cloud" -msgstr "Nube de tags pública" +msgstr "Nube de etiquetas pública" #: actions/publictagcloud.php:63 #, php-format @@ -3213,11 +3178,11 @@ msgstr "Suscribirse a un usuario remoto" #: actions/remotesubscribe.php:129 msgid "User nickname" -msgstr "Apodo del usuario" +msgstr "Usuario" #: actions/remotesubscribe.php:130 msgid "Nickname of the user you want to follow" -msgstr "Apodo del usuario que quieres seguir" +msgstr "Usuario a quien quieres seguir" #: actions/remotesubscribe.php:133 msgid "Profile URL" @@ -3393,9 +3358,8 @@ msgstr "" #: actions/showapplication.php:169 actions/version.php:195 #: lib/applicationeditform.php:195 -#, fuzzy msgid "Name" -msgstr "Apodo" +msgstr "Nombre" #: actions/showapplication.php:178 lib/applicationeditform.php:222 #, fuzzy @@ -4397,10 +4361,12 @@ msgid "" "This site is powered by %1$s version %2$s, Copyright 2008-2010 StatusNet, " "Inc. and contributors." msgstr "" +"Este sitio ha sido desarrollado con %1$s, versión %2$s, Derechos Reservados " +"2008-2010 StatusNet, Inc. y sus colaboradores." #: actions/version.php:161 msgid "Contributors" -msgstr "" +msgstr "Colaboradores" #: actions/version.php:168 msgid "" @@ -4427,7 +4393,7 @@ msgstr "" #: actions/version.php:189 msgid "Plugins" -msgstr "" +msgstr "Complementos" #: actions/version.php:196 lib/action.php:747 #, fuzzy @@ -4537,7 +4503,7 @@ msgstr "Hubo un problema al guardar el aviso." msgid "DB error inserting reply: %s" msgstr "Error de BD al insertar respuesta: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4753,6 +4719,8 @@ msgstr "" #: lib/action.php:814 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" +"Derechos de autor de contenido y datos por los colaboradores. Todos los " +"derechos reservados." #: lib/action.php:826 msgid "All " @@ -6135,47 +6103,47 @@ msgstr "Mensaje" msgid "Moderate" msgstr "Moderar" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "hace unos segundos" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "hace un minuto" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "hace %d minutos" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "hace una hora" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "hace %d horas" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "hace un día" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "hace %d días" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "hace un mes" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "hace %d meses" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "hace un año" diff --git a/locale/fa/LC_MESSAGES/statusnet.po b/locale/fa/LC_MESSAGES/statusnet.po index ae528ab7bf..c749a41611 100644 --- a/locale/fa/LC_MESSAGES/statusnet.po +++ b/locale/fa/LC_MESSAGES/statusnet.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:05+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:41+0000\n" "Last-Translator: Ahmad Sufi Mahmudi\n" "Language-Team: Persian\n" "MIME-Version: 1.0\n" @@ -20,7 +20,7 @@ msgstr "" "X-Language-Code: fa\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" #: actions/accessadminpanel.php:54 lib/adminpanelaction.php:326 @@ -200,7 +200,7 @@ msgstr "به روز رسانی از %1$ و دوستان در %2$" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "رابط مورد نظر پیدا نشد." @@ -822,7 +822,7 @@ msgstr "کاربر را مسدود نکن" msgid "Yes" msgstr "بله" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "کاربر را مسدود کن" @@ -1597,7 +1597,7 @@ msgstr "هم اکنون دسترسی کاربر به گروه مسدود شده msgid "User is not a member of group." msgstr "کاربر عضو گروه نیست." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "دسترسی کاربر به گروه را مسدود کن" @@ -1693,19 +1693,19 @@ msgstr "یک فهرست از کاربران در این گروه" msgid "Admin" msgstr "مدیر" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "بازداشتن" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "کاربر یک مدیر گروه شود" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "مدیر شود" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "این کاربر یک مدیر شود" @@ -2080,21 +2080,21 @@ msgstr "" "با نام‌کاربری و گذزواژه‌ی خود وارد شوید. نام‌کاربری ندارید؟ یک نام‌کاربری [ثبت ]" "(%%action.register%%) کنید." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "فقط یک مدیر می‌تواند کاربر دیگری را مدیر کند." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%s از قبل مدیر گروه %s بود." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "نمی‌توان اطلاعات عضویت %s را در گروه %s به دست آورد." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "نمی‌توان %s را مدیر گروه %s کرد." @@ -2301,8 +2301,8 @@ msgstr "نوع محتوا " msgid "Only " msgstr " فقط" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "یک قالب دادهٔ پشتیبانی‌شده نیست." @@ -4369,7 +4369,7 @@ msgstr "مشکل در ذخیره کردن آگهی." msgid "DB error inserting reply: %s" msgstr "" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -5917,47 +5917,47 @@ msgstr "پیام" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "چند ثانیه پیش" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "حدود یک دقیقه پیش" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "حدود %d دقیقه پیش" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "حدود یک ساعت پیش" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "حدود %d ساعت پیش" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "حدود یک روز پیش" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "حدود %d روز پیش" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "حدود یک ماه پیش" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "حدود %d ماه پیش" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "حدود یک سال پیش" diff --git a/locale/fi/LC_MESSAGES/statusnet.po b/locale/fi/LC_MESSAGES/statusnet.po index aa53f81cdb..80a85e1d1b 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:02+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:39+0000\n" "Language-Team: Finnish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fi\n" "X-Message-Group: out-statusnet\n" @@ -202,7 +202,7 @@ msgstr "Käyttäjän %1$s ja kavereiden päivitykset palvelussa %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "API-metodia ei löytynyt!" @@ -837,7 +837,7 @@ msgstr "Älä estä tätä käyttäjää" msgid "Yes" msgstr "Kyllä" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Estä tämä käyttäjä" @@ -1628,7 +1628,7 @@ msgstr "Käyttäjä on asettanut eston sinulle." msgid "User is not a member of group." msgstr "Käyttäjä ei kuulu tähän ryhmään." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Estä käyttäjä ryhmästä" @@ -1726,19 +1726,19 @@ msgstr "Lista ryhmän käyttäjistä." msgid "Admin" msgstr "Ylläpito" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Estä" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Tee tästä käyttäjästä ylläpitäjä" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Tee ylläpitäjäksi" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Tee tästä käyttäjästä ylläpitäjä" @@ -2144,21 +2144,21 @@ msgstr "" "käyttäjätunnusta? [Rekisteröi](%%action.register%%) käyttäjätunnus tai " "kokeile [OpenID](%%action.openidlogin%%)-tunnuksella sisään kirjautumista. " -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "Vain ylläpitäjä voi tehdä toisesta käyttäjästä ylläpitäjän." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%s on jo ryhmän \"%s\" ylläpitäjä." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Ei saatu käyttäjän %s jäsenyystietoja ryhmästä %s" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Ei voitu tehdä käyttäjästä %s ylläpitäjää ryhmään %s" @@ -2365,8 +2365,8 @@ msgstr "Yhdistä" msgid "Only " msgstr "Vain " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Tuo ei ole tuettu tietomuoto." @@ -4542,7 +4542,7 @@ msgstr "Ongelma päivityksen tallentamisessa." msgid "DB error inserting reply: %s" msgstr "Tietokantavirhe tallennettaessa vastausta: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -6159,47 +6159,47 @@ msgstr "Viesti" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "muutama sekunti sitten" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "noin minuutti sitten" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "noin %d minuuttia sitten" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "noin tunti sitten" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "noin %d tuntia sitten" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "noin päivä sitten" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "noin %d päivää sitten" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "noin kuukausi sitten" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "noin %d kuukautta sitten" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "noin vuosi sitten" diff --git a/locale/fr/LC_MESSAGES/statusnet.po b/locale/fr/LC_MESSAGES/statusnet.po index bd6d1cbe6e..9fb5e88b2b 100644 --- a/locale/fr/LC_MESSAGES/statusnet.po +++ b/locale/fr/LC_MESSAGES/statusnet.po @@ -14,12 +14,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-07 20:32:04+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:44+0000\n" "Language-Team: French\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: out-statusnet\n" @@ -202,7 +202,7 @@ msgstr "Statuts de %1$s et ses amis dans %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "Méthode API non trouvée !" @@ -838,7 +838,7 @@ msgstr "Ne pas bloquer cet utilisateur" msgid "Yes" msgstr "Oui" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Bloquer cet utilisateur" @@ -1599,7 +1599,7 @@ msgstr "Cet utilisateur est déjà bloqué pour le groupe." msgid "User is not a member of group." msgstr "L’utilisateur n’est pas membre du groupe." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Bloquer cet utilisateur du groupe" @@ -1702,19 +1702,19 @@ msgstr "Liste des utilisateurs inscrits à ce groupe." msgid "Admin" msgstr "Administrer" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Bloquer" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Faire de cet utilisateur un administrateur du groupe" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Faire un administrateur" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Faire de cet utilisateur un administrateur" @@ -2134,24 +2134,24 @@ msgstr "" "pas encore d’identifiant ? [Créez-vous](%%action.register%%) un nouveau " "compte." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" "Seul un administrateur peut faire d’un autre utilisateur un administrateur." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s est déjà administrateur du groupe « %2$s »." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "" "Impossible d’obtenir les enregistrements d’appartenance pour %1$s dans le " "groupe %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Impossible de rendre %1$s administrateur du groupe %2$s." @@ -2356,8 +2356,8 @@ msgstr "type de contenu " msgid "Only " msgstr "Seulement " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Format de données non supporté." @@ -4546,7 +4546,7 @@ msgstr "Problème lors de l’enregistrement de la boîte de réception du group msgid "DB error inserting reply: %s" msgstr "Erreur de base de donnée en insérant la réponse :%s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6231,47 +6231,47 @@ msgstr "Message" msgid "Moderate" msgstr "Modérer" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "il y a quelques secondes" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "il y a 1 minute" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "il y a %d minutes" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "il y a 1 heure" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "il y a %d heures" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "il y a 1 jour" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "il y a %d jours" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "il y a 1 mois" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "il y a %d mois" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "il y a environ 1 an" diff --git a/locale/ga/LC_MESSAGES/statusnet.po b/locale/ga/LC_MESSAGES/statusnet.po index 9bd8a6ff84..0358b8ecd0 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:12+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:47+0000\n" "Language-Team: Irish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ga\n" "X-Message-Group: out-statusnet\n" @@ -197,7 +197,7 @@ msgstr "Actualizacións dende %1$s e amigos en %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Método da API non atopado" @@ -843,7 +843,7 @@ msgstr "Bloquear usuario" msgid "Yes" msgstr "Si" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "Bloquear usuario" @@ -1654,7 +1654,7 @@ msgstr "O usuario bloqueoute." msgid "User is not a member of group." msgstr "%1s non é unha orixe fiable." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "Bloquear usuario" @@ -1760,19 +1760,19 @@ msgstr "" msgid "Admin" msgstr "" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Bloquear" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2176,21 +2176,21 @@ msgstr "" "(%%action.register%%) unha nova conta, ou accede co teu enderezo [OpenID](%%" "action.openidlogin%%). " -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "O usuario bloqueoute." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Non podes seguir a este usuario: o Usuario non se atopa." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "O usuario bloqueoute." @@ -2396,8 +2396,8 @@ msgstr "Conectar" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Non é un formato de datos soportado." @@ -4599,7 +4599,7 @@ msgstr "Aconteceu un erro ó gardar o chío." msgid "DB error inserting reply: %s" msgstr "Erro ó inserir a contestación na BD: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -6336,47 +6336,47 @@ msgstr "Nova mensaxe" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "fai uns segundos" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "fai un minuto" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "fai %d minutos" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "fai unha hora" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "fai %d horas" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "fai un día" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "fai %d días" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "fai un mes" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "fai %d meses" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "fai un ano" diff --git a/locale/he/LC_MESSAGES/statusnet.po b/locale/he/LC_MESSAGES/statusnet.po index 829ca11cf8..fb8f120319 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:15+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:50+0000\n" "Language-Team: Hebrew\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: he\n" "X-Message-Group: out-statusnet\n" @@ -194,7 +194,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "קוד האישור לא נמצא." @@ -833,7 +833,7 @@ msgstr "אין משתמש כזה." msgid "Yes" msgstr "כן" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "אין משתמש כזה." @@ -1626,7 +1626,7 @@ msgstr "למשתמש אין פרופיל." msgid "User is not a member of group." msgstr "לא שלחנו אלינו את הפרופיל הזה" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "אין משתמש כזה." @@ -1731,19 +1731,19 @@ msgstr "" msgid "Admin" msgstr "" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2113,21 +2113,21 @@ msgstr "" "היכנס בעזרת שם המשתמש והסיסמה שלך. עדיין אין לך שם משתמש? [הרשם](%%action." "register%%) לחשבון " -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "למשתמש אין פרופיל." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "נכשלה יצירת OpenID מתוך: %s" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "למשתמש אין פרופיל." @@ -2327,8 +2327,8 @@ msgstr "התחבר" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "" @@ -4444,7 +4444,7 @@ msgstr "בעיה בשמירת ההודעה." msgid "DB error inserting reply: %s" msgstr "שגיאת מסד נתונים בהכנסת התגובה: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -6060,47 +6060,47 @@ msgstr "הודעה חדשה" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "לפני מספר שניות" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "לפני כדקה" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "לפני כ-%d דקות" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "לפני כשעה" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "לפני כ-%d שעות" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "לפני כיום" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "לפני כ-%d ימים" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "לפני כחודש" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "לפני כ-%d חודשים" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "לפני כשנה" diff --git a/locale/hsb/LC_MESSAGES/statusnet.po b/locale/hsb/LC_MESSAGES/statusnet.po index 06cac6471e..daecf17e80 100644 --- a/locale/hsb/LC_MESSAGES/statusnet.po +++ b/locale/hsb/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:18+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:54+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: hsb\n" "X-Message-Group: out-statusnet\n" @@ -192,7 +192,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "API-metoda njenamakana." @@ -805,7 +805,7 @@ msgstr "Tutoho wužiwarja njeblokować" msgid "Yes" msgstr "Haj" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Tutoho wužiwarja blokować" @@ -1553,7 +1553,7 @@ msgstr "Wužiwar je hižo za skupinu zablokowany." msgid "User is not a member of group." msgstr "Wužiwar njeje čłon skupiny." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Wužiwarja za skupinu blokować" @@ -1650,19 +1650,19 @@ msgstr "Lisćina wužiwarjow w tutej skupinje." msgid "Admin" msgstr "Administrator" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Blokować" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Tutoho wužiwarja k administratorej činić" @@ -2012,21 +2012,21 @@ msgid "" "(%%action.register%%) a new account." msgstr "" -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "Jenož administrator móže druheho wužiwarja k administratorej činić." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s je hižo administrator za skupinu \"%2$s\"." -#: actions/makeadmin.php:132 +#: 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." -#: actions/makeadmin.php:145 +#: 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ć." @@ -2219,8 +2219,8 @@ msgstr "" msgid "Only " msgstr "Jenož " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Njeje podpěrany datowy format." @@ -4241,7 +4241,7 @@ msgstr "" msgid "DB error inserting reply: %s" msgstr "" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -5773,47 +5773,47 @@ msgstr "Powěsć" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "před něšto sekundami" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "před něhdźe jednej mjeńšinu" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "před %d mjeńšinami" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "před něhdźe jednej hodźinu" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "před něhdźe %d hodźinami" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "před něhdźe jednym dnjom" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "před něhdźe %d dnjemi" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "před něhdźe jednym měsacom" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "před něhdźe %d měsacami" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "před něhdźe jednym lětom" diff --git a/locale/ia/LC_MESSAGES/statusnet.po b/locale/ia/LC_MESSAGES/statusnet.po index e1c7d0a0cd..698f779dd0 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-07 20:32:16+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:14:57+0000\n" "Language-Team: Interlingua\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: out-statusnet\n" @@ -195,7 +195,7 @@ msgstr "Actualisationes de %1$s e su amicos in %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "Methodo API non trovate." @@ -824,7 +824,7 @@ msgstr "Non blocar iste usator" msgid "Yes" msgstr "Si" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Blocar iste usator" @@ -1584,7 +1584,7 @@ msgstr "Le usator es ja blocate del gruppo." msgid "User is not a member of group." msgstr "Le usator non es membro del gruppo." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Blocar usator del gruppo" @@ -1686,19 +1686,19 @@ msgstr "Un lista de usatores in iste gruppo." msgid "Admin" msgstr "Administrator" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Blocar" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Facer le usator administrator del gruppo" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Facer administrator" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Facer iste usator administrator" @@ -2108,21 +2108,21 @@ msgstr "" "Aperi un session con tu nomine de usator e contrasigno. Non ha ancora un " "nomine de usator? [Crea](%%action.register%%) un nove conto." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "Solmente un administrator pote facer un altere usator administrator." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s es ja administrator del gruppo \"%2$s\"." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Non pote obtener le datos del membrato de %1$s in le gruppo %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Non pote facer %1$s administrator del gruppo %2$s." @@ -2327,8 +2327,8 @@ msgstr "typo de contento " msgid "Only " msgstr "Solmente " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Formato de datos non supportate." @@ -4493,7 +4493,7 @@ msgstr "Problema salveguardar le cassa de entrata del gruppo." msgid "DB error inserting reply: %s" msgstr "Error del base de datos durante le insertion del responsa: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6166,47 +6166,47 @@ msgstr "Message" msgid "Moderate" msgstr "Moderar" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "alcun secundas retro" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "circa un minuta retro" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "circa %d minutas retro" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "circa un hora retro" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "circa %d horas retro" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "circa un die retro" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "circa %d dies retro" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "circa un mense retro" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "circa %d menses retro" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "circa un anno retro" diff --git a/locale/is/LC_MESSAGES/statusnet.po b/locale/is/LC_MESSAGES/statusnet.po index 63432e0dc2..e885830258 100644 --- a/locale/is/LC_MESSAGES/statusnet.po +++ b/locale/is/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:24+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:11+0000\n" "Language-Team: Icelandic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: is\n" "X-Message-Group: out-statusnet\n" @@ -196,7 +196,7 @@ msgstr "Færslur frá %1$s og vinum á %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Aðferð í forritsskilum fannst ekki!" @@ -829,7 +829,7 @@ msgstr "Opna á þennan notanda" msgid "Yes" msgstr "Já" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Loka á þennan notanda" @@ -1616,7 +1616,7 @@ msgstr "" msgid "User is not a member of group." msgstr "" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "" @@ -1713,19 +1713,19 @@ msgstr "Listi yfir notendur í þessum hóp." msgid "Admin" msgstr "Stjórnandi" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Loka" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2128,21 +2128,21 @@ msgstr "" "notendanafn? [Nýskráðu þig](%%action.register%%) eða prófaðu [OpenID](%%" "action.openidlogin%%). " -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "" -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Gat ekki fjarlægt notandann %s úr hópnum %s" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Gat ekki fjarlægt notandann %s úr hópnum %s" @@ -2347,8 +2347,8 @@ msgstr "" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Enginn stuðningur við gagnasnið." @@ -4492,7 +4492,7 @@ msgstr "Vandamál komu upp við að vista babl." msgid "DB error inserting reply: %s" msgstr "Gagnagrunnsvilla við innsetningu svars: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -6088,47 +6088,47 @@ msgstr "Skilaboð" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "fyrir nokkrum sekúndum" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "fyrir um einni mínútu síðan" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "fyrir um %d mínútum síðan" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "fyrir um einum klukkutíma síðan" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "fyrir um %d klukkutímum síðan" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "fyrir um einum degi síðan" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "fyrir um %d dögum síðan" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "fyrir um einum mánuði síðan" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "fyrir um %d mánuðum síðan" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "fyrir um einu ári síðan" diff --git a/locale/it/LC_MESSAGES/statusnet.po b/locale/it/LC_MESSAGES/statusnet.po index 8bb05d2861..37ac228b23 100644 --- a/locale/it/LC_MESSAGES/statusnet.po +++ b/locale/it/LC_MESSAGES/statusnet.po @@ -1,6 +1,5 @@ # Translation of StatusNet to Italian # -# Author@translatewiki.net: McDutchie # Author@translatewiki.net: Milocasagrande # Author@translatewiki.net: Nemo bis # -- @@ -10,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-07 20:32:22+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:14+0000\n" "Language-Team: Italian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: it\n" "X-Message-Group: out-statusnet\n" @@ -200,7 +199,7 @@ msgstr "Messaggi da %1$s e amici su %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "Metodo delle API non trovato." @@ -484,12 +483,11 @@ msgstr "Gruppi su %s" #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." -msgstr "" +msgstr "Nessun parametro oauth_token fornito." #: actions/apioauthauthorize.php:106 -#, fuzzy msgid "Invalid token." -msgstr "Dimensione non valida." +msgstr "Token non valido." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 @@ -532,9 +530,9 @@ msgstr "" "accesso." #: actions/apioauthauthorize.php:227 -#, fuzzy, php-format +#, php-format msgid "The request token %s has been denied and revoked." -msgstr "Il token di richiesta %s è stato rifiutato." +msgstr "Il token di richiesta %s è stato rifiutato o revocato." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 @@ -560,6 +558,9 @@ msgid "" "the ability to %3$s your %4$s account data. You should only " "give access to your %4$s account to third parties you trust." msgstr "" +"L'applicazione %1$s di %2$s vorrebbe poter " +"%3$s ai dati del tuo account %4$s. È consigliato fornire " +"accesso al proprio account %4$s solo ad applicazioni di cui ci si può fidare." #: actions/apioauthauthorize.php:310 lib/action.php:441 msgid "Account" @@ -579,12 +580,10 @@ msgid "Password" msgstr "Password" #: actions/apioauthauthorize.php:328 -#, fuzzy msgid "Deny" msgstr "Nega" #: actions/apioauthauthorize.php:334 -#, fuzzy msgid "Allow" msgstr "Consenti" @@ -826,7 +825,7 @@ msgstr "Non bloccare questo utente" msgid "Yes" msgstr "Sì" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Blocca questo utente" @@ -909,7 +908,6 @@ msgid "Couldn't delete email confirmation." msgstr "Impossibile eliminare l'email di conferma." #: actions/confirmaddress.php:144 -#, fuzzy msgid "Confirm address" msgstr "Conferma indirizzo" @@ -928,20 +926,17 @@ msgid "Notices" msgstr "Messaggi" #: actions/deleteapplication.php:63 -#, fuzzy msgid "You must be logged in to delete an application." -msgstr "Devi eseguire l'accesso per modificare un gruppo." +msgstr "Devi eseguire l'accesso per eliminare un'applicazione." #: actions/deleteapplication.php:71 -#, fuzzy msgid "Application not found." -msgstr "Il messaggio non ha un profilo" +msgstr "Applicazione non trovata." #: actions/deleteapplication.php:78 actions/editapplication.php:77 #: actions/showapplication.php:94 -#, fuzzy msgid "You are not the owner of this application." -msgstr "Non fai parte di questo gruppo." +msgstr "Questa applicazione non è di tua proprietà." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 @@ -950,29 +945,25 @@ msgid "There was a problem with your session token." msgstr "Si è verificato un problema con il tuo token di sessione." #: actions/deleteapplication.php:123 actions/deleteapplication.php:147 -#, fuzzy msgid "Delete application" -msgstr "Nessun messaggio." +msgstr "Elimina applicazione" #: actions/deleteapplication.php:149 -#, fuzzy 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 "" -"Vuoi eliminare questo utente? Questa azione eliminerà tutti i dati " -"dell'utente dal database, senza una copia di sicurezza." +"Vuoi eliminare questa applicazione? Questa azione eliminerà tutti i dati " +"riguardo all'applicazione dal database, comprese tutte le connessioni utente." #: actions/deleteapplication.php:156 -#, fuzzy msgid "Do not delete this application" -msgstr "Non eliminare il messaggio" +msgstr "Non eliminare l'applicazione" #: actions/deleteapplication.php:160 -#, fuzzy msgid "Delete this application" -msgstr "Elimina questo messaggio" +msgstr "Elimina l'applicazione" #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 @@ -1153,86 +1144,74 @@ msgid "Add to favorites" msgstr "Aggiungi ai preferiti" #: actions/doc.php:158 -#, fuzzy, php-format +#, php-format msgid "No such document \"%s\"" -msgstr "Nessun documento." +msgstr "Nessun documento \"%s\"" #: actions/editapplication.php:54 -#, fuzzy msgid "Edit Application" -msgstr "Altre opzioni" +msgstr "Modifica applicazione" #: actions/editapplication.php:66 -#, fuzzy msgid "You must be logged in to edit an application." -msgstr "Devi eseguire l'accesso per modificare un gruppo." +msgstr "Devi eseguire l'accesso per modificare un'applicazione." #: actions/editapplication.php:81 actions/oauthconnectionssettings.php:166 #: actions/showapplication.php:87 -#, fuzzy msgid "No such application." -msgstr "Nessun messaggio." +msgstr "Nessuna applicazione." #: actions/editapplication.php:161 -#, fuzzy msgid "Use this form to edit your application." -msgstr "Usa questo modulo per modificare il gruppo." +msgstr "Usa questo modulo per modificare la tua applicazione." #: actions/editapplication.php:177 actions/newapplication.php:159 -#, fuzzy msgid "Name is required." -msgstr "Stessa password di sopra; richiesta" +msgstr "Il nome è richiesto." #: actions/editapplication.php:180 actions/newapplication.php:165 -#, fuzzy msgid "Name is too long (max 255 chars)." -msgstr "Nome troppo lungo (max 255 caratteri)." +msgstr "Il nome è troppo lungo (max 255 caratteri)." #: actions/editapplication.php:183 actions/newapplication.php:162 -#, fuzzy msgid "Name already in use. Try another one." -msgstr "Soprannome già in uso. Prova con un altro." +msgstr "Nome già in uso. Prova con un altro." #: actions/editapplication.php:186 actions/newapplication.php:168 -#, fuzzy msgid "Description is required." -msgstr "Descrizione" +msgstr "La descrizione è richiesta." #: actions/editapplication.php:194 msgid "Source URL is too long." -msgstr "" +msgstr "L'URL sorgente è troppo lungo." #: actions/editapplication.php:200 actions/newapplication.php:185 -#, fuzzy msgid "Source URL is not valid." -msgstr "L'URL \"%s\" dell'immagine non è valido." +msgstr "L'URL sorgente non è valido." #: actions/editapplication.php:203 actions/newapplication.php:188 msgid "Organization is required." -msgstr "" +msgstr "L'organizzazione è richiesta." #: actions/editapplication.php:206 actions/newapplication.php:191 -#, fuzzy msgid "Organization is too long (max 255 chars)." -msgstr "Ubicazione troppo lunga (max 255 caratteri)." +msgstr "L'organizzazione è troppo lunga (max 255 caratteri)." #: actions/editapplication.php:209 actions/newapplication.php:194 msgid "Organization homepage is required." -msgstr "" +msgstr "Il sito web dell'organizzazione è richiesto." #: actions/editapplication.php:218 actions/newapplication.php:206 msgid "Callback is too long." -msgstr "" +msgstr "Il callback è troppo lungo." #: actions/editapplication.php:225 actions/newapplication.php:215 -#, fuzzy msgid "Callback URL is not valid." -msgstr "L'URL \"%s\" dell'immagine non è valido." +msgstr "L'URL di callback non è valido." #: actions/editapplication.php:258 -#, fuzzy msgid "Could not update application." -msgstr "Impossibile aggiornare il gruppo." +msgstr "Impossibile aggiornare l'applicazione." #: actions/editgroup.php:56 #, php-format @@ -1609,7 +1588,7 @@ msgstr "L'utente è già bloccato dal gruppo." msgid "User is not a member of group." msgstr "L'utente non fa parte del gruppo." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Blocca l'utente dal gruppo" @@ -1711,19 +1690,19 @@ msgstr "Un elenco degli utenti in questo gruppo." msgid "Admin" msgstr "Amministra" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Blocca" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Rende l'utente amministratore del gruppo" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Rendi amm." -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Rende questo utente un amministratore" @@ -1905,9 +1884,9 @@ msgid "That is not your Jabber ID." msgstr "Quello non è il tuo ID di Jabber." #: actions/inbox.php:59 -#, fuzzy, php-format +#, php-format msgid "Inbox for %1$s - page %2$d" -msgstr "Casella posta in arrivo di %s" +msgstr "Casella posta in arrivo di %s - pagina %2$d" #: actions/inbox.php:62 #, php-format @@ -2129,22 +2108,22 @@ msgstr "" "Accedi col tuo nome utente e password. Non hai ancora un nome utente? [Crea]" "(%%action.register%%) un nuovo account." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" "Solo gli amministratori possono rendere un altro utente amministratori." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s è già amministratore del gruppo \"%2$s\"." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Impossibile recuperare la membership per %1$s nel gruppo %2$s" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Impossibile rendere %1$s un amministratore del gruppo %2$s" @@ -2154,28 +2133,24 @@ msgid "No current status" msgstr "Nessun messaggio corrente" #: actions/newapplication.php:52 -#, fuzzy msgid "New Application" -msgstr "Nessun messaggio." +msgstr "Nuova applicazione" #: actions/newapplication.php:64 -#, fuzzy msgid "You must be logged in to register an application." -msgstr "Devi eseguire l'accesso per creare un gruppo." +msgstr "Devi eseguire l'accesso per registrare un'applicazione." #: actions/newapplication.php:143 -#, fuzzy msgid "Use this form to register a new application." -msgstr "Usa questo modulo per creare un nuovo gruppo." +msgstr "Usa questo modulo per registrare un'applicazione." #: actions/newapplication.php:176 msgid "Source URL is required." -msgstr "" +msgstr "L'URL sorgente è richiesto." #: actions/newapplication.php:258 actions/newapplication.php:267 -#, fuzzy msgid "Could not create application." -msgstr "Impossibile creare gli alias." +msgstr "Impossibile creare l'applicazione." #: actions/newgroup.php:53 msgid "New group" @@ -2242,7 +2217,7 @@ msgid "Text search" msgstr "Cerca testo" #: actions/noticesearch.php:91 -#, fuzzy, php-format +#, php-format msgid "Search results for \"%1$s\" on %2$s" msgstr "Risultati della ricerca per \"%1$s\" su %2$s" @@ -2290,49 +2265,48 @@ msgid "Nudge sent!" msgstr "Richiamo inviato!" #: actions/oauthappssettings.php:59 -#, fuzzy msgid "You must be logged in to list your applications." -msgstr "Devi eseguire l'accesso per modificare un gruppo." +msgstr "Devi eseguire l'accesso per poter elencare le tue applicazioni." #: actions/oauthappssettings.php:74 -#, fuzzy msgid "OAuth applications" -msgstr "Altre opzioni" +msgstr "Applicazioni OAuth" #: actions/oauthappssettings.php:85 msgid "Applications you have registered" -msgstr "" +msgstr "Applicazioni che hai registrato" #: actions/oauthappssettings.php:135 #, php-format msgid "You have not registered any applications yet." -msgstr "" +msgstr "Non hai ancora registrato alcuna applicazione." #: actions/oauthconnectionssettings.php:72 msgid "Connected applications" -msgstr "" +msgstr "Applicazioni collegate" #: actions/oauthconnectionssettings.php:83 msgid "You have allowed the following applications to access you account." -msgstr "" +msgstr "Hai consentito alle seguenti applicazioni di accedere al tuo account." #: actions/oauthconnectionssettings.php:175 -#, fuzzy msgid "You are not a user of that application." -msgstr "Non fai parte di quel gruppo." +msgstr "Non sei un utente di quella applicazione." #: actions/oauthconnectionssettings.php:186 msgid "Unable to revoke access for app: " -msgstr "" +msgstr "Impossibile revocare l'accesso per l'applicazione: " #: actions/oauthconnectionssettings.php:198 #, php-format msgid "You have not authorized any applications to use your account." -msgstr "" +msgstr "Non hai autorizzato alcuna applicazione all'uso del tuo account." #: actions/oauthconnectionssettings.php:211 msgid "Developers can edit the registration settings for their applications " msgstr "" +"Gli sviluppatori possono modificare le impostazioni di registrazione per le " +"loro applicazioni " #: actions/oembed.php:79 actions/shownotice.php:100 msgid "Notice has no profile" @@ -2351,8 +2325,8 @@ msgstr "tipo di contenuto " msgid "Only " msgstr "Solo " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Non è un formato di dati supportato." @@ -2365,7 +2339,6 @@ msgid "Notice Search" msgstr "Cerca messaggi" #: actions/othersettings.php:60 -#, fuzzy msgid "Other settings" msgstr "Altre impostazioni" @@ -2398,34 +2371,29 @@ msgid "URL shortening service is too long (max 50 chars)." msgstr "Il servizio di riduzione degli URL è troppo lungo (max 50 caratteri)." #: actions/otp.php:69 -#, fuzzy msgid "No user ID specified." msgstr "Nessun ID utente specificato." #: actions/otp.php:83 -#, fuzzy msgid "No login token specified." msgstr "Nessun token di accesso specificato." #: actions/otp.php:90 -#, fuzzy msgid "No login token requested." msgstr "Nessun token di accesso richiesto." #: actions/otp.php:95 -#, fuzzy msgid "Invalid login token specified." msgstr "Token di accesso specificato non valido." #: actions/otp.php:104 -#, fuzzy msgid "Login token expired." msgstr "Token di accesso scaduto." #: actions/outbox.php:58 -#, fuzzy, php-format +#, php-format msgid "Outbox for %1$s - page %2$d" -msgstr "Casella posta inviata di %s" +msgstr "Casella posta inviata di %s - pagina %2$d" #: actions/outbox.php:61 #, php-format @@ -3266,9 +3234,9 @@ msgid "Replies to %s" msgstr "Risposte a %s" #: actions/replies.php:127 -#, fuzzy, php-format +#, php-format msgid "Replies to %1$s, page %2$d" -msgstr "Risposte a %1$s su %2$s!" +msgstr "Risposte a %1$s, pagina %2$d" #: actions/replies.php:144 #, php-format @@ -3310,7 +3278,7 @@ msgid "" "attention](%%%%action.newnotice%%%%?status_textarea=%3$s)." msgstr "" "Puoi provare a [richiamare %1$s](../%2$s) o [scrivere qualche cosa alla sua " -"attenzione](%%%%action.newnotice%%%%?status_textarea=%3$s)." +"attenzione](%%%%action.newnotice%%%%?status_textarea=%s)." #: actions/repliesrss.php:72 #, php-format @@ -3335,9 +3303,8 @@ msgid "Sessions" msgstr "Sessioni" #: actions/sessionsadminpanel.php:65 -#, fuzzy msgid "Session settings for this StatusNet site." -msgstr "Impostazioni dell'aspetto per questo sito di StatusNet." +msgstr "Impostazioni di sessione per questo sito di StatusNet." #: actions/sessionsadminpanel.php:175 msgid "Handle sessions" @@ -3361,18 +3328,16 @@ msgid "Save site settings" msgstr "Salva impostazioni" #: actions/showapplication.php:82 -#, fuzzy msgid "You must be logged in to view an application." -msgstr "Devi eseguire l'accesso per lasciare un gruppo." +msgstr "Devi eseguire l'accesso per visualizzare un'applicazione." #: actions/showapplication.php:157 -#, fuzzy msgid "Application profile" -msgstr "Il messaggio non ha un profilo" +msgstr "Profilo applicazione" #: actions/showapplication.php:159 lib/applicationeditform.php:180 msgid "Icon" -msgstr "" +msgstr "Icona" #: actions/showapplication.php:169 actions/version.php:195 #: lib/applicationeditform.php:195 @@ -3380,9 +3345,8 @@ msgid "Name" msgstr "Nome" #: actions/showapplication.php:178 lib/applicationeditform.php:222 -#, fuzzy msgid "Organization" -msgstr "Paginazione" +msgstr "Organizzazione" #: actions/showapplication.php:187 actions/version.php:198 #: lib/applicationeditform.php:209 lib/groupeditform.php:172 @@ -3397,56 +3361,56 @@ msgstr "Statistiche" #: actions/showapplication.php:203 #, php-format msgid "Created by %1$s - %2$s access by default - %3$d users" -msgstr "" +msgstr "creata da %1$s - %2$s accessi predefiniti - %3$d utenti" #: actions/showapplication.php:213 msgid "Application actions" -msgstr "" +msgstr "Azioni applicazione" #: actions/showapplication.php:236 msgid "Reset key & secret" -msgstr "" +msgstr "Reimposta chiave e segreto" #: actions/showapplication.php:261 msgid "Application info" -msgstr "" +msgstr "Informazioni applicazione" #: actions/showapplication.php:263 msgid "Consumer key" -msgstr "" +msgstr "Chiave consumatore" #: actions/showapplication.php:268 msgid "Consumer secret" -msgstr "" +msgstr "Segreto consumatore" #: actions/showapplication.php:273 msgid "Request token URL" -msgstr "" +msgstr "URL token di richiesta" #: actions/showapplication.php:278 msgid "Access token URL" -msgstr "" +msgstr "URL token di accesso" #: actions/showapplication.php:283 -#, fuzzy msgid "Authorize URL" -msgstr "Autore" +msgstr "URL di autorizzazione" #: actions/showapplication.php:288 msgid "" "Note: We support HMAC-SHA1 signatures. We do not support the plaintext " "signature method." msgstr "" +"Nota: sono supportate firme HMAC-SHA1, ma non è supportato il metodo di " +"firma di testo in chiaro." #: actions/showapplication.php:309 -#, fuzzy msgid "Are you sure you want to reset your consumer key and secret?" -msgstr "Vuoi eliminare questo messaggio?" +msgstr "Ripristinare la chiave e il segreto?" #: actions/showfavorites.php:79 -#, fuzzy, php-format +#, php-format msgid "%1$s's favorite notices, page %2$d" -msgstr "Messaggi preferiti di %s" +msgstr "Messaggi preferiti di %1$s, pagina %2$d" #: actions/showfavorites.php:132 msgid "Could not retrieve favorite notices." @@ -3505,9 +3469,9 @@ msgid "%s group" msgstr "Gruppo %s" #: actions/showgroup.php:84 -#, fuzzy, php-format +#, php-format msgid "%1$s group, page %2$d" -msgstr "Membri del gruppo %1$s, pagina %2$d" +msgstr "Gruppi di %1$s, pagina %2$d" #: actions/showgroup.php:218 msgid "Group profile" @@ -3629,9 +3593,9 @@ msgid " tagged %s" msgstr " etichettati con %s" #: actions/showstream.php:79 -#, fuzzy, php-format +#, php-format msgid "%1$s, page %2$d" -msgstr "Profili bloccati di %1$s, pagina %2$d" +msgstr "%1$s, pagina %2$d" #: actions/showstream.php:122 #, php-format @@ -3731,7 +3695,7 @@ msgid "You must have a valid contact email address." msgstr "Devi avere un'email di contatto valida." #: actions/siteadminpanel.php:158 -#, fuzzy, php-format +#, php-format msgid "Unknown language \"%s\"." msgstr "Lingua \"%s\" sconosciuta." @@ -4065,9 +4029,9 @@ msgid "SMS" msgstr "SMS" #: actions/tag.php:68 -#, fuzzy, php-format +#, php-format msgid "Notices tagged with %1$s, page %2$d" -msgstr "Utenti auto-etichettati con %1$s - pagina %2$d" +msgstr "Messaggi etichettati con %1$s, pagina %2$d" #: actions/tag.php:86 #, php-format @@ -4353,9 +4317,9 @@ msgid "Enjoy your hotdog!" msgstr "Gustati il tuo hotdog!" #: actions/usergroups.php:64 -#, fuzzy, php-format +#, php-format msgid "%1$s groups, page %2$d" -msgstr "Membri del gruppo %1$s, pagina %2$d" +msgstr "Gruppi di %1$s, pagina %2$d" #: actions/usergroups.php:130 msgid "Search for more groups" @@ -4419,7 +4383,7 @@ msgid "" "You should have received a copy of the GNU Affero General Public License " "along with this program. If not, see %s." msgstr "" -"Una copia della GNU Affero General Public License dovrebbe essere " +"Una copia della GNU Affero General Plublic License dovrebbe essere " "disponibile assieme a questo programma. Se così non fosse, consultare %s." #: actions/version.php:189 @@ -4456,19 +4420,16 @@ msgstr "" "Un file di questa dimensione supererebbe la tua quota mensile di %d byte." #: classes/Group_member.php:41 -#, fuzzy msgid "Group join failed." -msgstr "Profilo del gruppo" +msgstr "Ingresso nel gruppo non riuscito." #: classes/Group_member.php:53 -#, fuzzy msgid "Not part of group." -msgstr "Impossibile aggiornare il gruppo." +msgstr "Non si fa parte del gruppo." #: classes/Group_member.php:60 -#, fuzzy msgid "Group leave failed." -msgstr "Profilo del gruppo" +msgstr "Uscita dal gruppo non riuscita." #: classes/Login_token.php:76 #, php-format @@ -4524,16 +4485,15 @@ msgid "Problem saving notice." msgstr "Problema nel salvare il messaggio." #: classes/Notice.php:788 -#, fuzzy msgid "Problem saving group inbox." -msgstr "Problema nel salvare il messaggio." +msgstr "Problema nel salvare la casella della posta del gruppo." #: classes/Notice.php:848 #, php-format msgid "DB error inserting reply: %s" msgstr "Errore del DB nell'inserire la risposta: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4580,7 +4540,7 @@ msgid "Other options" msgstr "Altre opzioni" #: lib/action.php:144 -#, fuzzy, php-format +#, php-format msgid "%1$s - %2$s" msgstr "%1$s - %2$s" @@ -4737,16 +4697,19 @@ msgstr "Licenza del contenuto del sito" #: lib/action.php:806 #, php-format msgid "Content and data of %1$s are private and confidential." -msgstr "" +msgstr "I contenuti e i dati di %1$s sono privati e confidenziali." #: lib/action.php:811 #, php-format msgid "Content and data copyright by %1$s. All rights reserved." msgstr "" +"I contenuti e i dati sono copyright di %1$s. Tutti i diritti riservati." #: lib/action.php:814 msgid "Content and data copyright by contributors. All rights reserved." msgstr "" +"I contenuti e i dati sono forniti dai collaboratori. Tutti i diritti " +"riservati." #: lib/action.php:826 msgid "All " @@ -4797,102 +4760,99 @@ msgid "Design configuration" msgstr "Configurazione aspetto" #: lib/adminpanelaction.php:322 -#, fuzzy msgid "User configuration" -msgstr "Configurazione percorsi" +msgstr "Configurazione utente" #: lib/adminpanelaction.php:327 -#, fuzzy msgid "Access configuration" -msgstr "Configurazione aspetto" +msgstr "Configurazione di accesso" #: lib/adminpanelaction.php:332 msgid "Paths configuration" msgstr "Configurazione percorsi" #: lib/adminpanelaction.php:337 -#, fuzzy msgid "Sessions configuration" -msgstr "Configurazione aspetto" +msgstr "Configurazione sessioni" #: lib/apiauth.php:95 msgid "API resource requires read-write access, but you only have read access." msgstr "" +"Le risorse API richiedono accesso lettura-scrittura, ma si dispone del solo " +"accesso in lettura." #: lib/apiauth.php:273 #, php-format msgid "Failed API auth attempt, nickname = %1$s, proxy = %2$s, ip = %3$s" msgstr "" +"Tentativo di autorizzazione API non riuscito, soprannome = %1$s, proxy = %2" +"$s, IP = %3$s" #: lib/applicationeditform.php:136 msgid "Edit application" -msgstr "" +msgstr "Modifica applicazione" #: lib/applicationeditform.php:184 msgid "Icon for this application" -msgstr "" +msgstr "Icona per questa applicazione" #: lib/applicationeditform.php:204 -#, fuzzy, php-format +#, php-format msgid "Describe your application in %d characters" -msgstr "Descrivi il gruppo o l'argomento in %d caratteri" +msgstr "Descrivi l'applicazione in %d caratteri" #: lib/applicationeditform.php:207 -#, fuzzy msgid "Describe your application" -msgstr "Descrivi il gruppo o l'argomento" +msgstr "Descrivi l'applicazione" #: lib/applicationeditform.php:216 -#, fuzzy msgid "Source URL" -msgstr "Sorgenti" +msgstr "URL sorgente" #: lib/applicationeditform.php:218 -#, fuzzy msgid "URL of the homepage of this application" -msgstr "URL della pagina web, blog del gruppo o l'argomento" +msgstr "URL della pagina web di questa applicazione" #: lib/applicationeditform.php:224 msgid "Organization responsible for this application" -msgstr "" +msgstr "Organizzazione responsabile per questa applicazione" #: lib/applicationeditform.php:230 -#, fuzzy msgid "URL for the homepage of the organization" -msgstr "URL della pagina web, blog del gruppo o l'argomento" +msgstr "URL della pagina web dell'organizzazione" #: lib/applicationeditform.php:236 msgid "URL to redirect to after authentication" -msgstr "" +msgstr "URL verso cui redirigere dopo l'autenticazione" #: lib/applicationeditform.php:258 msgid "Browser" -msgstr "" +msgstr "Browser" #: lib/applicationeditform.php:274 msgid "Desktop" -msgstr "" +msgstr "Desktop" #: lib/applicationeditform.php:275 msgid "Type of application, browser or desktop" -msgstr "" +msgstr "Tipo di applicazione, browser o desktop" #: lib/applicationeditform.php:297 msgid "Read-only" -msgstr "" +msgstr "Sola lettura" #: lib/applicationeditform.php:315 msgid "Read-write" -msgstr "" +msgstr "Lettura-scrittura" #: lib/applicationeditform.php:316 msgid "Default access for this application: read-only, or read-write" msgstr "" +"Accesso predefinito per questa applicazione, sola lettura o lettura-scrittura" #: lib/applicationlist.php:154 -#, fuzzy msgid "Revoke" -msgstr "Rimuovi" +msgstr "Revoca" #: lib/attachmentlist.php:87 msgid "Attachments" @@ -5115,7 +5075,6 @@ msgstr "" "minuti: %s" #: lib/command.php:668 -#, fuzzy msgid "You are not subscribed to anyone." msgstr "Il tuo abbonamento è stato annullato." @@ -5142,8 +5101,8 @@ msgstr "Non fai parte di alcun gruppo." #: lib/command.php:714 msgid "You are a member of this group:" msgid_plural "You are a member of these groups:" -msgstr[0] "Sei membro di questo gruppo:" -msgstr[1] "Sei membro di questi gruppi:" +msgstr[0] "Non fai parte di questo gruppo:" +msgstr[1] "Non fai parte di questi gruppi:" #: lib/command.php:728 msgid "" @@ -5256,13 +5215,12 @@ msgid "Updates by SMS" msgstr "Messaggi via SMS" #: lib/connectsettingsaction.php:120 -#, fuzzy msgid "Connections" -msgstr "Connetti" +msgstr "Connessioni" #: lib/connectsettingsaction.php:121 msgid "Authorized connected applications" -msgstr "" +msgstr "Applicazioni collegate autorizzate" #: lib/dberroraction.php:60 msgid "Database error" @@ -5455,9 +5413,9 @@ msgid "[%s]" msgstr "[%s]" #: lib/jabber.php:400 -#, fuzzy, php-format +#, php-format msgid "Unknown inbox source %d." -msgstr "Lingua \"%s\" sconosciuta." +msgstr "Sorgente casella in arrivo %d sconosciuta." #: lib/joinform.php:114 msgid "Join" @@ -5845,12 +5803,10 @@ msgid "Attach a file" msgstr "Allega un file" #: lib/noticeform.php:212 -#, fuzzy msgid "Share my location" msgstr "Condividi la mia posizione" #: lib/noticeform.php:215 -#, fuzzy msgid "Do not share my location" msgstr "Non condividere la mia posizione" @@ -5859,6 +5815,8 @@ msgid "" "Sorry, retrieving your geo location is taking longer than expected, please " "try again later" msgstr "" +"Il recupero della tua posizione geografica sta impiegando più tempo del " +"previsto. Riprova più tardi." #: lib/noticelist.php:428 #, php-format @@ -6044,7 +6002,7 @@ msgstr "Ripeti questo messaggio" #: lib/router.php:665 msgid "No single user defined for single-user mode." -msgstr "" +msgstr "Nessun utente singolo definito per la modalità single-user." #: lib/sandboxform.php:67 msgid "Sandbox" @@ -6211,47 +6169,47 @@ msgstr "Messaggio" msgid "Moderate" msgstr "Modera" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "pochi secondi fa" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "circa un minuto fa" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "circa %d minuti fa" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "circa un'ora fa" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "circa %d ore fa" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "circa un giorno fa" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "circa %d giorni fa" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "circa un mese fa" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "circa %d mesi fa" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "circa un anno fa" diff --git a/locale/ja/LC_MESSAGES/statusnet.po b/locale/ja/LC_MESSAGES/statusnet.po index 82e67f8046..3063f95389 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:30+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:17+0000\n" "Language-Team: Japanese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ja\n" "X-Message-Group: out-statusnet\n" @@ -196,7 +196,7 @@ msgstr "%2$s に %1$s と友人からの更新があります!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "API メソッドが見つかりません。" @@ -818,7 +818,7 @@ msgstr "このユーザをアンブロックする" msgid "Yes" msgstr "Yes" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "このユーザをブロックする" @@ -1582,7 +1582,7 @@ msgstr "ユーザはすでにグループからブロックされています。 msgid "User is not a member of group." msgstr "ユーザはグループのメンバーではありません。" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "グループからユーザをブロック" @@ -1683,19 +1683,19 @@ msgstr "このグループのユーザのリスト。" msgid "Admin" msgstr "管理者" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "ブロック" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "ユーザをグループの管理者にする" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "管理者にする" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "このユーザを管理者にする" @@ -2100,21 +2100,21 @@ msgstr "" "ユーザ名とパスワードで、ログインしてください。 まだユーザ名を持っていません" "か? 新しいアカウントを [登録](%%action.register%%)。" -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "管理者だけが別のユーザを管理者にすることができます。" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s はすでにグループ \"%2$s\" の管理者です。" -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "%1$s の会員資格記録をグループ %2$s 中から取得できません。" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "%1$s をグループ %2$s の管理者にすることはできません" @@ -2316,8 +2316,8 @@ msgstr "内容種別 " msgid "Only " msgstr "だけ " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "サポートされていないデータ形式。" @@ -4474,7 +4474,7 @@ msgstr "グループ受信箱を保存する際に問題が発生しました。 msgid "DB error inserting reply: %s" msgstr "返信を追加する際にデータベースエラー : %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -6108,47 +6108,47 @@ msgstr "メッセージ" msgid "Moderate" msgstr "管理" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "数秒前" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "約 1 分前" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "約 %d 分前" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "約 1 時間前" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "約 %d 時間前" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "約 1 日前" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "約 %d 日前" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "約 1 ヵ月前" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "約 %d ヵ月前" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "約 1 年前" diff --git a/locale/ko/LC_MESSAGES/statusnet.po b/locale/ko/LC_MESSAGES/statusnet.po index d3bd136626..7be2acfca1 100644 --- a/locale/ko/LC_MESSAGES/statusnet.po +++ b/locale/ko/LC_MESSAGES/statusnet.po @@ -7,12 +7,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:33+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:20+0000\n" "Language-Team: Korean\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ko\n" "X-Message-Group: out-statusnet\n" @@ -195,7 +195,7 @@ msgstr "%1$s 및 %2$s에 있는 친구들의 업데이트!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "API 메서드를 찾을 수 없습니다." @@ -834,7 +834,7 @@ msgstr "이 사용자를 차단해제합니다." msgid "Yes" msgstr "네, 맞습니다." -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "이 사용자 차단하기" @@ -1635,7 +1635,7 @@ msgstr "회원이 당신을 차단해왔습니다." msgid "User is not a member of group." msgstr "당신은 해당 그룹의 멤버가 아닙니다." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "사용자를 차단합니다." @@ -1740,21 +1740,21 @@ msgstr "이 그룹의 회원리스트" msgid "Admin" msgstr "관리자" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "차단하기" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 #, fuzzy msgid "Make user an admin of the group" msgstr "관리자만 그룹을 편집할 수 있습니다." -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 #, fuzzy msgid "Make Admin" msgstr "관리자" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2146,21 +2146,21 @@ msgstr "" "action.register%%) 새 계정을 생성 또는 [OpenID](%%action.openidlogin%%)를 사" "용해 보세요." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "회원이 당신을 차단해왔습니다." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "그룹 %s에서 %s 사용자를 제거할 수 없습니다." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "관리자만 그룹을 편집할 수 있습니다." @@ -2365,8 +2365,8 @@ msgstr "연결" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "지원하는 형식의 데이터가 아닙니다." @@ -4517,7 +4517,7 @@ msgstr "통지를 저장하는데 문제가 발생했습니다." msgid "DB error inserting reply: %s" msgstr "답신을 추가 할 때에 데이타베이스 에러 : %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -6117,47 +6117,47 @@ msgstr "메시지" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "몇 초 전" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "1분 전" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "%d분 전" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "1시간 전" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "%d시간 전" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "하루 전" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "%d일 전" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "1달 전" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "%d달 전" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "1년 전" diff --git a/locale/mk/LC_MESSAGES/statusnet.po b/locale/mk/LC_MESSAGES/statusnet.po index 9aa7d12a1b..92209e72ea 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:36+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:23+0000\n" "Language-Team: Macedonian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: out-statusnet\n" @@ -199,7 +199,7 @@ msgstr "Подновувања од %1$s и пријатели на %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "API методот не е пронајден." @@ -828,7 +828,7 @@ msgstr "Не го блокирај корисников" msgid "Yes" msgstr "Да" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Блокирај го корисников" @@ -1591,7 +1591,7 @@ msgstr "Корисникот е веќе блокиран од оваа груп msgid "User is not a member of group." msgstr "Корисникот не членува во групата." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Блокирај корисник од група" @@ -1695,19 +1695,19 @@ msgstr "Листа на корисниците на овааг група." msgid "Admin" msgstr "Администратор" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Блокирај" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Направи го корисникот администратор на групата" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Направи го/ја администратор" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Направи го корисникот администратор" @@ -2093,7 +2093,8 @@ msgstr "Запамети ме" #: actions/login.php:237 actions/register.php:480 msgid "Automatically login in the future; not for shared computers!" msgstr "" -"Следниот пат најавете се автоматски; не за компјутери кои ги делите со други!" +"Следниот пат најавете се автоматски; не е за компјутери кои ги делите со " +"други!" #: actions/login.php:247 msgid "Lost or forgotten password?" @@ -2116,21 +2117,21 @@ msgstr "" "Најавете се со Вашето корисничко име и лозинка. Сè уште немате корисничко " "име? [Регистрирајте](%%action.register%%) нова сметка." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "Само администратор може да направи друг корисник администратор." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s веќе е администратор на групата „%2$s“." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Не можам да добијам евиденција за членство на %1$s во групата %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Не можам да го направам корисникот %1$s администратор на групата %2$s." @@ -2334,8 +2335,8 @@ msgstr "тип на содржини " msgid "Only " msgstr "Само " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Ова не е поддржан формат на податотека." @@ -4514,7 +4515,7 @@ msgstr "Проблем при зачувувањето на групното п msgid "DB error inserting reply: %s" msgstr "Одговор од внесот во базата: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -5251,8 +5252,8 @@ msgstr "Подигни податотека" msgid "" "You can upload your personal background image. The maximum file size is 2MB." msgstr "" -"Не можете да подигнете личната позадинска слика. Максималната дозволена " -"големина изнесува 2МБ." +"Можете да подигнете лична позадинска слика. Максималната дозволена големина " +"изнесува 2МБ." #: lib/designsettings.php:418 msgid "Design defaults restored." @@ -6193,47 +6194,47 @@ msgstr "Порака" msgid "Moderate" msgstr "Модерирај" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "пред неколку секунди" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "пред една минута" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "пред %d минути" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "пред еден час" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "пред %d часа" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "пред еден ден" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "пред %d денови" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "пред еден месец" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "пред %d месеца" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "пред една година" diff --git a/locale/nb/LC_MESSAGES/statusnet.po b/locale/nb/LC_MESSAGES/statusnet.po index 287b95b35a..ab74ad1dce 100644 --- a/locale/nb/LC_MESSAGES/statusnet.po +++ b/locale/nb/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:39+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:26+0000\n" "Language-Team: Norwegian (bokmål)‬\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: no\n" "X-Message-Group: out-statusnet\n" @@ -194,7 +194,7 @@ msgstr "Oppdateringer fra %1$s og venner på %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "API-metode ikke funnet!" @@ -812,7 +812,7 @@ msgstr "Ikke blokker denne brukeren" msgid "Yes" msgstr "Ja" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Blokker denne brukeren" @@ -1576,7 +1576,7 @@ msgstr "Du er allerede logget inn!" msgid "User is not a member of group." msgstr "" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "" @@ -1673,19 +1673,19 @@ msgstr "En liste over brukerne i denne gruppen." msgid "Admin" msgstr "Administrator" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Blokkér" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Gjør brukeren til en administrator for gruppen" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Gjør til administrator" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Gjør denne brukeren til administrator" @@ -2062,21 +2062,21 @@ msgid "" "(%%action.register%%) a new account." msgstr "" -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "Du er allerede logget inn!" -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Klarte ikke å oppdatere bruker." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Gjør brukeren til en administrator for gruppen" @@ -2271,8 +2271,8 @@ msgstr "innholdstype " msgid "Only " msgstr "Bare " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "" @@ -4365,7 +4365,7 @@ msgstr "" msgid "DB error inserting reply: %s" msgstr "" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -5952,47 +5952,47 @@ msgstr "" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "noen få sekunder siden" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "omtrent ett minutt siden" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "omtrent %d minutter siden" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "omtrent én time siden" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "omtrent %d timer siden" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "omtrent én dag siden" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "omtrent %d dager siden" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "omtrent én måned siden" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "omtrent %d måneder siden" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "omtrent ett år siden" diff --git a/locale/nl/LC_MESSAGES/statusnet.po b/locale/nl/LC_MESSAGES/statusnet.po index cbf50e60c1..b1a54d06a2 100644 --- a/locale/nl/LC_MESSAGES/statusnet.po +++ b/locale/nl/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-07 20:32:58+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:32+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: out-statusnet\n" @@ -198,7 +198,7 @@ msgstr "Updates van %1$s en vrienden op %2$s." #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "De API-functie is niet aangetroffen." @@ -837,7 +837,7 @@ msgstr "Gebruiker niet blokkeren" msgid "Yes" msgstr "Ja" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Deze gebruiker blokkeren" @@ -1605,7 +1605,7 @@ msgstr "Deze gebruiker is al de toegang tot de groep ontzegd." msgid "User is not a member of group." msgstr "De gebruiker is geen lid van de groep." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Gebruiker toegang tot de groep blokkeren" @@ -1709,19 +1709,19 @@ msgstr "Ledenlijst van deze groep" msgid "Admin" msgstr "Beheerder" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Blokkeren" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Deze gebruiker groepsbeheerder maken" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Beheerder maken" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Deze gebruiker beheerder maken" @@ -2133,21 +2133,21 @@ msgstr "" "Meld u aan met uw gebruikersnaam en wachtwoord. Hebt u nog geen " "gebruikersnaam? [Registreer een nieuwe gebruiker](%%action.register%%)." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "Alleen beheerders kunnen andere gebruikers beheerder maken." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s is al beheerder van de groep \"%2$s\"" -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Het was niet mogelijk te bevestigen dat %1$s lid is van de groep %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Het is niet mogelijk %1$s beheerder te maken van de groep %2$s." @@ -2354,8 +2354,8 @@ msgstr "inhoudstype " msgid "Only " msgstr "Alleen " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Geen ondersteund gegevensformaat." @@ -4551,7 +4551,7 @@ msgid "DB error inserting reply: %s" msgstr "" "Er is een databasefout opgetreden bij het invoegen van het antwoord: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6237,47 +6237,47 @@ msgstr "Bericht" msgid "Moderate" msgstr "Modereren" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "een paar seconden geleden" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "ongeveer een minuut geleden" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "ongeveer %d minuten geleden" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "ongeveer een uur geleden" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "ongeveer %d uur geleden" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "ongeveer een dag geleden" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "ongeveer %d dagen geleden" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "ongeveer een maand geleden" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "ongeveer %d maanden geleden" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "ongeveer een jaar geleden" diff --git a/locale/nn/LC_MESSAGES/statusnet.po b/locale/nn/LC_MESSAGES/statusnet.po index 5a6d256b96..e3e2cf80ed 100644 --- a/locale/nn/LC_MESSAGES/statusnet.po +++ b/locale/nn/LC_MESSAGES/statusnet.po @@ -7,12 +7,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:42+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:29+0000\n" "Language-Team: Norwegian Nynorsk\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nn\n" "X-Message-Group: out-statusnet\n" @@ -195,7 +195,7 @@ msgstr "Oppdateringar frå %1$s og vener på %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Fann ikkje API-metode." @@ -832,7 +832,7 @@ msgstr "Lås opp brukaren" msgid "Yes" msgstr "Jau" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Blokkér denne brukaren" @@ -1635,7 +1635,7 @@ msgstr "Brukar har blokkert deg." msgid "User is not a member of group." msgstr "Du er ikkje medlem av den gruppa." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "Blokker brukaren" @@ -1740,21 +1740,21 @@ msgstr "Ei liste over brukarane i denne gruppa." msgid "Admin" msgstr "Administrator" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Blokkér" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 #, fuzzy msgid "Make user an admin of the group" msgstr "Du må være administrator for å redigere gruppa" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 #, fuzzy msgid "Make Admin" msgstr "Administrator" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2149,21 +2149,21 @@ msgstr "" "%action.register%%) ein ny konto, eller prøv [OpenID](%%action.openidlogin%" "%)." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "Brukar har blokkert deg." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Kunne ikkje fjerne %s fra %s gruppa " -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Du må være administrator for å redigere gruppa" @@ -2370,8 +2370,8 @@ msgstr "Kopla til" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Ikkje eit støtta dataformat." @@ -4534,7 +4534,7 @@ msgstr "Eit problem oppstod ved lagring av notis." msgid "DB error inserting reply: %s" msgstr "Databasefeil, kan ikkje lagra svar: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -6144,47 +6144,47 @@ msgstr "Melding" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "eit par sekund sidan" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "omtrent eitt minutt sidan" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "~%d minutt sidan" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "omtrent ein time sidan" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "~%d timar sidan" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "omtrent ein dag sidan" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "~%d dagar sidan" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "omtrent ein månad sidan" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "~%d månadar sidan" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "omtrent eitt år sidan" diff --git a/locale/pl/LC_MESSAGES/statusnet.po b/locale/pl/LC_MESSAGES/statusnet.po index 0931925530..a13f6362b4 100644 --- a/locale/pl/LC_MESSAGES/statusnet.po +++ b/locale/pl/LC_MESSAGES/statusnet.po @@ -10,8 +10,8 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:48+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:35+0000\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" @@ -19,7 +19,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pl\n" "X-Message-Group: out-statusnet\n" @@ -201,7 +201,7 @@ msgstr "Aktualizacje z %1$s i przyjaciół na %2$s." #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "Nie odnaleziono metody API." @@ -823,7 +823,7 @@ msgstr "Nie blokuj tego użytkownika" msgid "Yes" msgstr "Tak" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Zablokuj tego użytkownika" @@ -1581,7 +1581,7 @@ msgstr "Użytkownik został już zablokował w grupie." msgid "User is not a member of group." msgstr "Użytkownik nie jest członkiem grupy." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Zablokuj użytkownika w grupie" @@ -1679,19 +1679,19 @@ msgstr "Lista użytkowników znajdujących się w tej grupie." msgid "Admin" msgstr "Administrator" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Zablokuj" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Uczyń użytkownika administratorem grupy" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Uczyń administratorem" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Uczyń tego użytkownika administratorem" @@ -2099,21 +2099,21 @@ msgstr "" "Zaloguj się za pomocą nazwy użytkownika i hasła. Nie masz ich jeszcze? " "[Zarejestruj](%%action.register%%) nowe konto." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "Tylko administrator może uczynić innego użytkownika administratorem." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "Użytkownika %1$s jest już administratorem grupy \"%2$s\"." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Nie można uzyskać wpisu członkostwa użytkownika %1$s w grupie %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Nie można uczynić %1$s administratorem grupy %2$s." @@ -2314,8 +2314,8 @@ msgstr "typ zawartości " msgid "Only " msgstr "Tylko " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "To nie jest obsługiwany format danych." @@ -4484,7 +4484,7 @@ msgstr "Problem podczas zapisywania skrzynki odbiorczej grupy." msgid "DB error inserting reply: %s" msgstr "Błąd bazy danych podczas wprowadzania odpowiedzi: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6163,47 +6163,47 @@ msgstr "Wiadomość" msgid "Moderate" msgstr "Moderuj" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "kilka sekund temu" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "około minutę temu" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "około %d minut temu" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "około godzinę temu" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "około %d godzin temu" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "blisko dzień temu" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "około %d dni temu" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "około miesiąc temu" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "około %d miesięcy temu" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "około rok temu" diff --git a/locale/pt/LC_MESSAGES/statusnet.po b/locale/pt/LC_MESSAGES/statusnet.po index 3258ec53cd..a2c8fd60cc 100644 --- a/locale/pt/LC_MESSAGES/statusnet.po +++ b/locale/pt/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:51+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:39+0000\n" "Language-Team: Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt\n" "X-Message-Group: out-statusnet\n" @@ -198,7 +198,7 @@ msgstr "Actualizações de %1$s e amigos no %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "Método da API não encontrado." @@ -821,7 +821,7 @@ msgstr "Não bloquear este utilizador" msgid "Yes" msgstr "Sim" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Bloquear este utilizador" @@ -1604,7 +1604,7 @@ msgstr "Acesso do utilizador ao grupo já foi bloqueado." msgid "User is not a member of group." msgstr "Utilizador não é membro do grupo." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Bloquear acesso do utilizador ao grupo" @@ -1706,19 +1706,19 @@ msgstr "Uma lista dos utilizadores neste grupo." msgid "Admin" msgstr "Gestor" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Bloquear" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Tornar utilizador o gestor do grupo" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Tornar Gestor" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Tornar este utilizador um gestor" @@ -2126,21 +2126,21 @@ msgstr "" "Entrar com o seu nome de utilizador e senha. Ainda não está registado? " "[Registe](%%action.register%%) uma conta." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "Só um gestor pode tornar outro utilizador num gestor." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s já é um administrador do grupo \"%2$s\"." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Não existe registo de %1$s ter entrado no grupo %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Não é possível tornar %1$s administrador do grupo %2$s." @@ -2347,8 +2347,8 @@ msgstr "tipo de conteúdo " msgid "Only " msgstr "Apenas " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Formato de dados não suportado." @@ -4530,7 +4530,7 @@ msgstr "Problema na gravação da nota." msgid "DB error inserting reply: %s" msgstr "Ocorreu um erro na base de dados ao inserir a resposta: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6203,47 +6203,47 @@ msgstr "Mensagem" msgid "Moderate" msgstr "Moderar" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "há alguns segundos" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "há cerca de um minuto" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "há cerca de %d minutos" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "há cerca de uma hora" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "há cerca de %d horas" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "há cerca de um dia" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "há cerca de %d dias" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "há cerca de um mês" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "há cerca de %d meses" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "há cerca de um ano" diff --git a/locale/pt_BR/LC_MESSAGES/statusnet.po b/locale/pt_BR/LC_MESSAGES/statusnet.po index 726ca3ca5e..6b94988bb0 100644 --- a/locale/pt_BR/LC_MESSAGES/statusnet.po +++ b/locale/pt_BR/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-07 20:33:07+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:43+0000\n" "Language-Team: Brazilian Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt-br\n" "X-Message-Group: out-statusnet\n" @@ -202,7 +202,7 @@ msgstr "Atualizações de %1$s e amigos no %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "O método da API não foi encontrado!" @@ -832,7 +832,7 @@ msgstr "Não bloquear este usuário" msgid "Yes" msgstr "Sim" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Bloquear este usuário" @@ -1604,7 +1604,7 @@ msgstr "O usuário já está bloqueado no grupo." msgid "User is not a member of group." msgstr "O usuário não é um membro do grupo" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Bloquear o usuário no grupo" @@ -1707,19 +1707,19 @@ msgstr "Uma lista dos usuários deste grupo." msgid "Admin" msgstr "Admin" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Bloquear" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Tornar o usuário um administrador do grupo" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Tornar administrador" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Torna este usuário um administrador" @@ -2130,23 +2130,23 @@ msgstr "" "Digite seu nome de usuário e senha. Ainda não possui um usuário? [Registre](%" "%action.register%%) uma nova conta." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" "Somente um administrador pode dar privilégios de administração para outro " "usuário." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s já é um administrador do grupo \"%2$s\"." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Não foi possível obter o registro de membro de %1$s no grupo %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Não foi possível tornar %1$s um administrador do grupo %2$s." @@ -2352,8 +2352,8 @@ msgstr "tipo de conteúdo " msgid "Only " msgstr "Apenas " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Não é um formato de dados suportado." @@ -4530,7 +4530,7 @@ msgstr "Problema no salvamento da mensagem." msgid "DB error inserting reply: %s" msgstr "Erro no banco de dados na inserção da reposta: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6206,47 +6206,47 @@ msgstr "Mensagem" msgid "Moderate" msgstr "Moderar" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "alguns segundos atrás" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "cerca de 1 minuto atrás" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "cerca de %d minutos atrás" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "cerca de 1 hora atrás" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "cerca de %d horas atrás" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "cerca de 1 dia atrás" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "cerca de %d dias atrás" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "cerca de 1 mês atrás" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "cerca de %d meses atrás" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "cerca de 1 ano atrás" diff --git a/locale/ru/LC_MESSAGES/statusnet.po b/locale/ru/LC_MESSAGES/statusnet.po index caa48b9609..c488351806 100644 --- a/locale/ru/LC_MESSAGES/statusnet.po +++ b/locale/ru/LC_MESSAGES/statusnet.po @@ -12,12 +12,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:54:57+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:46+0000\n" "Language-Team: Russian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ru\n" "X-Message-Group: out-statusnet\n" @@ -200,7 +200,7 @@ msgstr "Обновлено от %1$s и его друзей на %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "Метод API не найден." @@ -827,7 +827,7 @@ msgstr "Не блокировать этого пользователя" msgid "Yes" msgstr "Да" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Заблокировать пользователя." @@ -1597,7 +1597,7 @@ msgstr "Пользователь уже заблокирован из групп msgid "User is not a member of group." msgstr "Пользователь не является членом этой группы." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Заблокировать пользователя из группы." @@ -1699,19 +1699,19 @@ msgstr "Список пользователей, являющихся члена msgid "Admin" msgstr "Настройки" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Блокировать" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Сделать пользователя администратором группы" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Сделать администратором" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Сделать этого пользователя администратором" @@ -2119,22 +2119,22 @@ msgstr "" "Вход с вашим логином и паролем. Нет аккаунта? [Зарегистрируйте](%%action." "register%%) новый аккаунт." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" "Только администратор может сделать другого пользователя администратором." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s уже является администратором группы «%2$s»." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Не удаётся получить запись принадлежности для %1$s к группе %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Невозможно сделать %1$s администратором группы %2$s." @@ -2334,8 +2334,8 @@ msgstr "тип содержимого " msgid "Only " msgstr "Только " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Неподдерживаемый формат данных." @@ -4504,7 +4504,7 @@ msgstr "Проблемы с сохранением входящих сообще msgid "DB error inserting reply: %s" msgstr "Ошибка баз данных при вставке ответа для %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6179,47 +6179,47 @@ msgstr "Сообщение" msgid "Moderate" msgstr "Модерировать" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "пару секунд назад" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "около минуты назад" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "около %d минут(ы) назад" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "около часа назад" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "около %d часа(ов) назад" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "около дня назад" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "около %d дня(ей) назад" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "около месяца назад" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "около %d месяца(ев) назад" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "около года назад" diff --git a/locale/statusnet.po b/locale/statusnet.po index fbbd0e5c37..1676a76492 100644 --- a/locale/statusnet.po +++ b/locale/statusnet.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-07 20:31+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -185,7 +185,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "" @@ -794,7 +794,7 @@ msgstr "" msgid "Yes" msgstr "" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "" @@ -1534,7 +1534,7 @@ msgstr "" msgid "User is not a member of group." msgstr "" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "" @@ -1629,19 +1629,19 @@ msgstr "" msgid "Admin" msgstr "" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -1989,21 +1989,21 @@ msgid "" "(%%action.register%%) a new account." msgstr "" -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "" -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "" @@ -2195,8 +2195,8 @@ msgstr "" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "" @@ -4214,7 +4214,7 @@ msgstr "" msgid "DB error inserting reply: %s" msgstr "" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -5737,47 +5737,47 @@ msgstr "" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "" diff --git a/locale/sv/LC_MESSAGES/statusnet.po b/locale/sv/LC_MESSAGES/statusnet.po index 213be22da5..a0d407c5c8 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-07 20:33:13+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:15:57+0000\n" "Language-Team: Swedish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62096); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: sv\n" "X-Message-Group: out-statusnet\n" @@ -196,7 +196,7 @@ msgstr "Uppdateringar från %1$s och vänner på %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "API-metod hittades inte." @@ -815,7 +815,7 @@ msgstr "Blockera inte denna användare" msgid "Yes" msgstr "Ja" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Blockera denna användare" @@ -1577,7 +1577,7 @@ msgstr "Användaren är redan blockerad från grupp." msgid "User is not a member of group." msgstr "Användare är inte en gruppmedlem." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Blockera användare från grupp" @@ -1678,19 +1678,19 @@ msgstr "En lista av användarna i denna grupp." msgid "Admin" msgstr "Administratör" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Blockera" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Gör användare till en administratör för gruppen" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Gör till administratör" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Gör denna användare till administratör" @@ -2097,21 +2097,21 @@ msgstr "" "Logga in med ditt användarnamn och lösenord. Har du inget användarnamn ännu? " "[Registrera](%%action.register%%) ett nytt konto." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "Bara en administratör kan göra en annan användare till administratör." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s är redan en administratör för grupp \"%2$s\"." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Kan inte hämta uppgift om medlemskap för %1$s i grupp %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Kan inte göra %1$s till en administratör för grupp %2$s." @@ -2314,8 +2314,8 @@ msgstr "innehållstyp " msgid "Only " msgstr "Bara " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Ett dataformat som inte stödjs" @@ -3548,8 +3548,8 @@ msgid "" "[StatusNet](http://status.net/) tool. Its members share short messages about " "their life and interests. " msgstr "" -"**%s** är en användargrupp på %%%%site.name%%%%, en [mikroblogg](http://en." -"wikipedia.org/wiki/Micro-blogging)tjänst baserad den fria programvaran " +"**%s** är en användargrupp på %%%%site.name%%%%, en [mikroblogg](http://sv." +"wikipedia.org/wiki/Mikroblogg)tjänst baserad den fria programvaran " "[StatusNet](http://status.net/). Dess medlemmar delar korta meddelande om " "sina liv och intressen. " @@ -3644,8 +3644,8 @@ msgid "" "[StatusNet](http://status.net/) tool. [Join now](%%%%action.register%%%%) to " "follow **%s**'s notices and many more! ([Read more](%%%%doc.help%%%%))" msgstr "" -"**%s** har ett konto på %%%%site.name%%%%, en [mikroblogg](http://en." -"wikipedia.org/wiki/Micro-blogging)tjänst baserad på den fria programvaran " +"**%s** har ett konto på %%%%site.name%%%%, en [mikroblogg](http://sv." +"wikipedia.org/wiki/Mikroblogg)tjänst baserad på den fria programvaran " "[StatusNet](http://status.net/). [Gå med nu](%%%%action.register%%%%) för " "att följa **%s**s notiser och många fler! ([Läs mer](%%%%doc.help%%%%))" @@ -3656,8 +3656,8 @@ msgid "" "wikipedia.org/wiki/Micro-blogging) service based on the Free Software " "[StatusNet](http://status.net/) tool. " msgstr "" -"**%s** har ett konto på %%%%site.name%%%%, en [mikroblogg](http://en." -"wikipedia.org/wiki/Micro-blogging)tjänst baserad på den fria programvaran " +"**%s** har ett konto på %%%%site.name%%%%, en [mikroblogg](http://sv." +"wikipedia.org/wiki/Mikroblogg)tjänst baserad på den fria programvaran " "[StatusNet](http://status.net/). " #: actions/showstream.php:305 @@ -4483,7 +4483,7 @@ msgstr "Problem med att spara gruppinkorg." msgid "DB error inserting reply: %s" msgstr "Databasfel vid infogning av svar: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6150,47 +6150,47 @@ msgstr "Meddelande" msgid "Moderate" msgstr "Moderera" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "ett par sekunder sedan" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "för nån minut sedan" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "för %d minuter sedan" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "för en timma sedan" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "för %d timmar sedan" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "för en dag sedan" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "för %d dagar sedan" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "för en månad sedan" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "för %d månader sedan" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "för ett år sedan" diff --git a/locale/te/LC_MESSAGES/statusnet.po b/locale/te/LC_MESSAGES/statusnet.po index eee6e39e48..85719532b8 100644 --- a/locale/te/LC_MESSAGES/statusnet.po +++ b/locale/te/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:55:04+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:16:03+0000\n" "Language-Team: Telugu\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: te\n" "X-Message-Group: out-statusnet\n" @@ -190,7 +190,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "నిర్ధారణ సంకేతం కనబడలేదు." @@ -810,7 +810,7 @@ msgstr "ఈ వాడుకరిని నిరోధించకు" msgid "Yes" msgstr "అవును" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "ఈ వాడుకరిని నిరోధించు" @@ -1561,7 +1561,7 @@ msgstr "వాడుకరిని ఇప్పటికే గుంపున msgid "User is not a member of group." msgstr "వాడుకరి ఈ గుంపులో సభ్యులు కాదు." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "వాడుకరిని గుంపు నుండి నిరోధించు" @@ -1661,19 +1661,19 @@ msgstr "ఈ గుంపులో వాడుకరులు జాబితా msgid "Admin" msgstr "" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "నిరోధించు" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "వాడుకరిని గుంపుకి ఒక నిర్వాహకునిగా చేయి" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "నిర్వాహకున్ని చేయి" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "ఈ వాడుకరిని నిర్వాహకున్ని చేయి" @@ -2033,21 +2033,21 @@ msgstr "" "మీ వాడుకరిపేరు మరియు సంకేతపదాలతో ప్రవేశించండి. మీకు ఇంకా వాడుకరిపేరు లేదా? కొత్త ఖాతాని [నమోదుచేసుకోండి]" "(%%action.register%%)." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "నిర్వాహకులు మాత్రమే మరొక వాడుకరిని నిర్వాహకునిగా చేయగలరు." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s ఇప్పటికే \"%2$s\" గుంపు యొక్క ఒక నిర్వాకులు." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "వాడుకరి %sని %s గుంపు నుండి తొలగించలేకపోయాం" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "%s ఇప్పటికే \"%s\" గుంపు యొక్క ఒక నిర్వాకులు." @@ -2246,8 +2246,8 @@ msgstr "విషయ రకం " msgid "Only " msgstr "మాత్రమే " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "" @@ -4330,7 +4330,7 @@ msgstr "సందేశాన్ని భద్రపరచడంలో పొ msgid "DB error inserting reply: %s" msgstr "" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -5924,47 +5924,47 @@ msgstr "సందేశం" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "కొన్ని క్షణాల క్రితం" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "ఓ నిమిషం క్రితం" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "%d నిమిషాల క్రితం" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "ఒక గంట క్రితం" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "%d గంటల క్రితం" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "ఓ రోజు క్రితం" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "%d రోజుల క్రితం" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "ఓ నెల క్రితం" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "%d నెలల క్రితం" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "ఒక సంవత్సరం క్రితం" diff --git a/locale/tr/LC_MESSAGES/statusnet.po b/locale/tr/LC_MESSAGES/statusnet.po index c41e87f1ba..5368680c6b 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:55:08+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:16:08+0000\n" "Language-Team: Turkish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: tr\n" "X-Message-Group: out-statusnet\n" @@ -196,7 +196,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Onay kodu bulunamadı." @@ -838,7 +838,7 @@ msgstr "Böyle bir kullanıcı yok." msgid "Yes" msgstr "" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "Böyle bir kullanıcı yok." @@ -1628,7 +1628,7 @@ msgstr "Kullanıcının profili yok." msgid "User is not a member of group." msgstr "Bize o profili yollamadınız" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "Böyle bir kullanıcı yok." @@ -1732,19 +1732,19 @@ msgstr "" msgid "Admin" msgstr "" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2120,21 +2120,21 @@ msgstr "" "duruyorsunuz, hemen bir [yeni hesap oluşturun](%%action.register%%) ya da " "[OpenID](%%action.openidlogin%%) ile giriş yapın." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "Kullanıcının profili yok." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "OpenID formu yaratılamadı: %s" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Kullanıcının profili yok." @@ -2333,8 +2333,8 @@ msgstr "Bağlan" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "" @@ -4452,7 +4452,7 @@ msgstr "Durum mesajını kaydederken hata oluştu." msgid "DB error inserting reply: %s" msgstr "Cevap eklenirken veritabanı hatası: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -6067,47 +6067,47 @@ msgstr "" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "birkaç saniye önce" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "yaklaşık bir dakika önce" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "yaklaşık %d dakika önce" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "yaklaşık bir saat önce" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "yaklaşık %d saat önce" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "yaklaşık bir gün önce" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "yaklaşık %d gün önce" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "yaklaşık bir ay önce" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "yaklaşık %d ay önce" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "yaklaşık bir yıl önce" diff --git a/locale/uk/LC_MESSAGES/statusnet.po b/locale/uk/LC_MESSAGES/statusnet.po index 9f8e8b9419..5f5fa846e6 100644 --- a/locale/uk/LC_MESSAGES/statusnet.po +++ b/locale/uk/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:55:11+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:16:16+0000\n" "Language-Team: Ukrainian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: out-statusnet\n" @@ -198,7 +198,7 @@ msgstr "Оновлення від %1$s та друзів на %2$s!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 msgid "API method not found." msgstr "API метод не знайдено." @@ -825,7 +825,7 @@ msgstr "Не блокувати цього користувача" msgid "Yes" msgstr "Так" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 msgid "Block this user" msgstr "Блокувати користувача" @@ -1581,7 +1581,7 @@ msgstr "Користувача заблоковано в цій групі." msgid "User is not a member of group." msgstr "Користувач не є учасником групи." -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 msgid "Block user from group" msgstr "Блокувати користувача в групі" @@ -1683,19 +1683,19 @@ msgstr "Список учасників цієї групи." msgid "Admin" msgstr "Адмін" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "Блок" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "Надати користувачеві права адміністратора" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "Зробити адміном" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "Надати цьому користувачеві права адміністратора" @@ -2106,22 +2106,22 @@ msgstr "" "Увійти викристовуючи ім’я та пароль. Ще не маєте імені користувача? " "[Зареєструвати](%%action.register%%) новий акаунт." -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" "Лише користувач з правами адміністратора може призначити інших адмінів групи." -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "%1$s вже є адміном у групі «%2$s»." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Не можна отримати запис для %1$s щодо членства у групі %2$s." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Не можна надати %1$s права адміна в групі %2$s." @@ -2323,8 +2323,8 @@ msgstr "тип змісту " msgid "Only " msgstr "Лише " -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Такий формат даних не підтримується." @@ -4490,7 +4490,7 @@ msgstr "Проблема при збереженні вхідних дописі msgid "DB error inserting reply: %s" msgstr "Помилка бази даних при додаванні відповіді: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -6159,47 +6159,47 @@ msgstr "Повідомлення" msgid "Moderate" msgstr "Модерувати" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "мить тому" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "хвилину тому" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "близько %d хвилин тому" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "годину тому" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "близько %d годин тому" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "день тому" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "близько %d днів тому" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "місяць тому" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "близько %d місяців тому" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "рік тому" diff --git a/locale/vi/LC_MESSAGES/statusnet.po b/locale/vi/LC_MESSAGES/statusnet.po index 696587e5fd..cf152eff5f 100644 --- a/locale/vi/LC_MESSAGES/statusnet.po +++ b/locale/vi/LC_MESSAGES/statusnet.po @@ -7,12 +7,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:55:14+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:16:19+0000\n" "Language-Team: Vietnamese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: vi\n" "X-Message-Group: out-statusnet\n" @@ -195,7 +195,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "Phương thức API không tìm thấy!" @@ -843,7 +843,7 @@ msgstr "Bỏ chặn người dùng này" msgid "Yes" msgstr "Có" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "Ban user" @@ -1668,7 +1668,7 @@ msgstr "Người dùng không có thông tin." msgid "User is not a member of group." msgstr "Bạn chưa cập nhật thông tin riêng" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "Ban user" @@ -1775,20 +1775,20 @@ msgstr "" msgid "Admin" msgstr "" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 #, fuzzy msgid "Make user an admin of the group" msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những " -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 #, fuzzy msgid "Make this user an admin" msgstr "Kênh mà bạn tham gia" @@ -2200,21 +2200,21 @@ msgstr "" "khoản, [hãy đăng ký](%%action.register%%) tài khoản mới, hoặc thử đăng nhập " "bằng [OpenID](%%action.openidlogin%%). " -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "Người dùng không có thông tin." -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "Không thể theo bạn này: %s đã có trong danh sách bạn bè của bạn rồi." -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "Bạn phải đăng nhập vào mới có thể gửi thư mời những " @@ -2422,8 +2422,8 @@ msgstr "Kết nối" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "Không hỗ trợ định dạng dữ liệu này." @@ -4604,7 +4604,7 @@ msgstr "Có lỗi xảy ra khi lưu tin nhắn." msgid "DB error inserting reply: %s" msgstr "Lỗi cơ sở dữ liệu khi chèn trả lời: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%s (%s)" @@ -6309,47 +6309,47 @@ msgstr "Tin mới nhất" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "vài giây trước" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "1 phút trước" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "%d phút trước" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "1 giờ trước" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "%d giờ trước" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "1 ngày trước" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "%d ngày trước" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "1 tháng trước" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "%d tháng trước" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "1 năm trước" diff --git a/locale/zh_CN/LC_MESSAGES/statusnet.po b/locale/zh_CN/LC_MESSAGES/statusnet.po index f643a788d9..a7aeec7ca5 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:55:17+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:16:22+0000\n" "Language-Team: Simplified Chinese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hans\n" "X-Message-Group: out-statusnet\n" @@ -197,7 +197,7 @@ msgstr "来自%2$s 上 %1$s 和好友的更新!" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "API 方法未实现!" @@ -837,7 +837,7 @@ msgstr "取消阻止次用户" msgid "Yes" msgstr "是" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "阻止该用户" @@ -1646,7 +1646,7 @@ msgstr "用户没有个人信息。" msgid "User is not a member of group." msgstr "您未告知此个人信息" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "阻止用户" @@ -1752,21 +1752,21 @@ msgstr "该组成员列表。" msgid "Admin" msgstr "admin管理员" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "阻止" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 #, fuzzy msgid "Make user an admin of the group" msgstr "只有admin才能编辑这个组" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 #, fuzzy msgid "Make Admin" msgstr "admin管理员" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2155,21 +2155,21 @@ msgstr "" "请使用你的帐号和密码登入。没有帐号?[注册](%%action.register%%) 一个新帐号, " "或使用 [OpenID](%%action.openidlogin%%). " -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, fuzzy, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "用户没有个人信息。" -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "无法订阅用户:未找到。" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "只有admin才能编辑这个组" @@ -2372,8 +2372,8 @@ msgstr "连接" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "不支持的数据格式。" @@ -4530,7 +4530,7 @@ msgstr "保存通告时出错。" msgid "DB error inserting reply: %s" msgstr "添加回复时数据库出错:%s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -6174,47 +6174,47 @@ msgstr "新消息" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "几秒前" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "一分钟前" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "%d 分钟前" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "一小时前" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "%d 小时前" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "一天前" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "%d 天前" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "一个月前" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "%d 个月前" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "一年前" diff --git a/locale/zh_TW/LC_MESSAGES/statusnet.po b/locale/zh_TW/LC_MESSAGES/statusnet.po index 6a384eac16..815f95eacd 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-02-05 23:53+0000\n" -"PO-Revision-Date: 2010-02-05 23:55:19+0000\n" +"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"PO-Revision-Date: 2010-02-11 08:16:25+0000\n" "Language-Team: Traditional Chinese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62048); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hant\n" "X-Message-Group: out-statusnet\n" @@ -193,7 +193,7 @@ msgstr "" #: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 #: actions/apitimelineretweetedtome.php:121 #: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 #, fuzzy msgid "API method not found." msgstr "確認碼遺失" @@ -828,7 +828,7 @@ msgstr "無此使用者" msgid "Yes" msgstr "" -#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +#: actions/block.php:144 actions/groupmembers.php:348 lib/blockform.php:80 #, fuzzy msgid "Block this user" msgstr "無此使用者" @@ -1612,7 +1612,7 @@ msgstr "" msgid "User is not a member of group." msgstr "" -#: actions/groupblock.php:136 actions/groupmembers.php:314 +#: actions/groupblock.php:136 actions/groupmembers.php:316 #, fuzzy msgid "Block user from group" msgstr "無此使用者" @@ -1714,19 +1714,19 @@ msgstr "" msgid "Admin" msgstr "" -#: actions/groupmembers.php:346 lib/blockform.php:69 +#: actions/groupmembers.php:348 lib/blockform.php:69 msgid "Block" msgstr "" -#: actions/groupmembers.php:441 +#: actions/groupmembers.php:443 msgid "Make user an admin of the group" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make Admin" msgstr "" -#: actions/groupmembers.php:473 +#: actions/groupmembers.php:475 msgid "Make this user an admin" msgstr "" @@ -2082,21 +2082,21 @@ msgid "" "(%%action.register%%) a new account." msgstr "" -#: actions/makeadmin.php:91 +#: actions/makeadmin.php:92 msgid "Only an admin can make another user an admin." msgstr "" -#: actions/makeadmin.php:95 +#: actions/makeadmin.php:96 #, php-format msgid "%1$s is already an admin for group \"%2$s\"." msgstr "" -#: actions/makeadmin.php:132 +#: actions/makeadmin.php:133 #, fuzzy, php-format msgid "Can't get membership record for %1$s in group %2$s." msgstr "無法從 %s 建立OpenID" -#: actions/makeadmin.php:145 +#: actions/makeadmin.php:146 #, fuzzy, php-format msgid "Can't make %1$s an admin for group %2$s." msgstr "無法從 %s 建立OpenID" @@ -2292,8 +2292,8 @@ msgstr "連結" msgid "Only " msgstr "" -#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1039 -#: lib/api.php:1067 lib/api.php:1177 +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1040 +#: lib/api.php:1068 lib/api.php:1178 msgid "Not a supported data format." msgstr "" @@ -4374,7 +4374,7 @@ msgstr "儲存使用者發生錯誤" msgid "DB error inserting reply: %s" msgstr "增加回覆時,資料庫發生錯誤: %s" -#: classes/Notice.php:1231 +#: classes/Notice.php:1235 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -5962,47 +5962,47 @@ msgstr "" msgid "Moderate" msgstr "" -#: lib/util.php:867 +#: lib/util.php:870 msgid "a few seconds ago" msgstr "" -#: lib/util.php:869 +#: lib/util.php:872 msgid "about a minute ago" msgstr "" -#: lib/util.php:871 +#: lib/util.php:874 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:873 +#: lib/util.php:876 msgid "about an hour ago" msgstr "" -#: lib/util.php:875 +#: lib/util.php:878 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:877 +#: lib/util.php:880 msgid "about a day ago" msgstr "" -#: lib/util.php:879 +#: lib/util.php:882 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:881 +#: lib/util.php:884 msgid "about a month ago" msgstr "" -#: lib/util.php:883 +#: lib/util.php:886 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:885 +#: lib/util.php:888 msgid "about a year ago" msgstr "" From 20714d1f35305cc29c2b657310c2e0db290fbb48 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 11 Feb 2010 19:44:03 +0000 Subject: [PATCH 53/78] OStatus fix: include feed profile at notice text processing time, fixes replies --- plugins/OStatus/classes/Feedinfo.php | 3 +-- plugins/OStatus/lib/feedmunger.php | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/plugins/OStatus/classes/Feedinfo.php b/plugins/OStatus/classes/Feedinfo.php index d3cccd42f0..e71b0cfa00 100644 --- a/plugins/OStatus/classes/Feedinfo.php +++ b/plugins/OStatus/classes/Feedinfo.php @@ -356,7 +356,6 @@ class Feedinfo extends Memcached_DataObject // @fixme this might sort in wrong order if we get multiple updates $notice = $munger->notice($index); - $notice->profile_id = $this->profile_id; // Double-check for oldies // @fixme this could explode horribly for multiple feeds on a blog. sigh @@ -368,7 +367,7 @@ class Feedinfo extends Memcached_DataObject } // @fixme need to ensure that groups get handled correctly - $saved = Notice::saveNew($this->profile_id, + $saved = Notice::saveNew($notice->profile_id, $notice->content, 'ostatus', array('is_local' => Notice::REMOTE_OMB, diff --git a/plugins/OStatus/lib/feedmunger.php b/plugins/OStatus/lib/feedmunger.php index 5dce95342e..7f223cb20d 100644 --- a/plugins/OStatus/lib/feedmunger.php +++ b/plugins/OStatus/lib/feedmunger.php @@ -154,6 +154,11 @@ class FeedMunger { return $this->getAtomLink($this->feed, array('rel' => 'hub')); } + + function getSelfLink() + { + return $this->getAtomLink($this->feed, array('rel' => 'self')); + } /** * Get an appropriate avatar image source URL, if available. @@ -209,6 +214,7 @@ class FeedMunger $notice->id = -1; } else { $notice = new Notice(); + $notice->profile_id = $this->profileIdForEntry($index); } $link = $this->getAltLink($entry); @@ -239,6 +245,20 @@ class FeedMunger return $notice; } + function profileIdForEntry($index=1) + { + // hack hack hack + // should get profile for this entry's author... + $feed = new Feedinfo(); + $feed->feeduri = $self; + $feed = Feedinfo::staticGet('feeduri', $this->getSelfLink()); + if ($feed) { + return $feed->profile_id; + } else { + throw new Exception("Can't find feed profile"); + } + } + /** * @param feed item $entry * @return mixed Location or false From 21bfbc43ad026afdab4040713805913000fef626 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 11 Feb 2010 20:02:17 +0000 Subject: [PATCH 54/78] OStatus: fix salmon link on Atom feeds; add a url spec for group feeds as well (endpoint needs impl) --- plugins/OStatus/OStatusPlugin.php | 57 +++++++++++++++++++------------ 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index ce02393e43..c0f9dadc4a 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -80,6 +80,9 @@ class OStatusPlugin extends Plugin $m->connect('main/salmon/user/:id', array('action' => 'salmon'), array('id' => '[0-9]+')); + $m->connect('main/salmon/group/:id', + array('action' => 'salmongroup'), + array('id' => '[0-9]+')); return true; } @@ -111,25 +114,31 @@ class OStatusPlugin extends Plugin */ function onStartApiAtom(Action $action) { - if ($action instanceof ApiTimelineUserAction || $action instanceof ApiTimelineGroupAction) { - $id = $action->arg('id'); - if (strval(intval($id)) === strval($id)) { - // Canonical form of id in URL? These are used for OStatus syndication. - - $hub = common_config('ostatus', 'hub'); - if (empty($hub)) { - // Updates will be handled through our internal PuSH hub. - $hub = common_local_url('pushhub'); - } - $action->element('link', array('rel' => 'hub', - 'href' => $hub)); - - // Also, we'll add in the salmon link - $action->element('link', array('rel' => 'salmon', - 'href' => common_local_url('salmon'))); - } + if ($action instanceof ApiTimelineUserAction) { + $salmonAction = 'salmon'; + } else if ($action instanceof ApiTimelineGroupAction) { + $salmonAction = 'salmongroup'; + } else { + return; + } + + $id = $action->arg('id'); + if (strval(intval($id)) === strval($id)) { + // Canonical form of id in URL? These are used for OStatus syndication. + + $hub = common_config('ostatus', 'hub'); + if (empty($hub)) { + // Updates will be handled through our internal PuSH hub. + $hub = common_local_url('pushhub'); + } + $action->element('link', array('rel' => 'hub', + 'href' => $hub)); + + // Also, we'll add in the salmon link + $salmon = common_local_url($salmonAction, array('id' => $id)); + $action->element('link', array('rel' => 'salmon', + 'href' => $salmon)); } - return true; } /** @@ -191,14 +200,17 @@ class OStatusPlugin extends Plugin array('nickname' => $profile->nickname)); $output->element('a', array('href' => $url, 'class' => 'entity_remote_subscribe'), - _('OStatus')); + _m('OStatus')); $output->elementEnd('li'); } } /** - * Check if we've got some Salmon stuff to send + * Check if we've got remote replies to send via Salmon. + * + * @fixme push webfinger lookup & sending to a background queue + * @fixme also detect short-form name for remote subscribees where not ambiguous */ function onEndNoticeSave($notice) { @@ -233,7 +245,6 @@ class OStatusPlugin extends Plugin } } } - /** * Garbage collect unused feeds on unsubscribe @@ -253,7 +264,9 @@ class OStatusPlugin extends Plugin return true; } - + /** + * Make sure necessary tables are filled out. + */ function onCheckSchema() { $schema = Schema::get(); $schema->ensureTable('feedinfo', Feedinfo::schemaDef()); From 1773d12a24d2720cdb6c1b517999cac1f708b355 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 11 Feb 2010 20:12:48 +0000 Subject: [PATCH 55/78] OStatus: save Salmon postback URI in feed subscription info, if provided. Will need it for sub/unsub postbacks and other notifications. --- plugins/OStatus/classes/Feedinfo.php | 9 ++++++--- plugins/OStatus/lib/feedmunger.php | 11 ++++++++++- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/plugins/OStatus/classes/Feedinfo.php b/plugins/OStatus/classes/Feedinfo.php index e71b0cfa00..5b8a9039a6 100644 --- a/plugins/OStatus/classes/Feedinfo.php +++ b/plugins/OStatus/classes/Feedinfo.php @@ -93,11 +93,12 @@ class Feedinfo extends Memcached_DataObject 'group_id' => DB_DATAOBJECT_INT, 'feeduri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, 'homeuri' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, - 'huburi' => DB_DATAOBJECT_STR + DB_DATAOBJECT_NOTNULL, + 'huburi' => DB_DATAOBJECT_STR, 'secret' => DB_DATAOBJECT_STR, 'verify_token' => DB_DATAOBJECT_STR, 'sub_start' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME, 'sub_end' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME, + 'salmonuri' => DB_DATAOBJECT_STR, 'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL, 'lastupdate' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL); } @@ -119,8 +120,8 @@ class Feedinfo extends Memcached_DataObject 255, false, 'UNI'), new ColumnDef('homeuri', 'varchar', 255, false), - new ColumnDef('huburi', 'varchar', - 255, false), + new ColumnDef('huburi', 'text', + null, true), new ColumnDef('verify_token', 'varchar', 32, true), new ColumnDef('secret', 'varchar', @@ -129,6 +130,8 @@ class Feedinfo extends Memcached_DataObject null, true), new ColumnDef('sub_end', 'datetime', null, true), + new ColumnDef('salmonuri', 'text', + null, true), new ColumnDef('created', 'datetime', null, false), new ColumnDef('lastupdate', 'datetime', diff --git a/plugins/OStatus/lib/feedmunger.php b/plugins/OStatus/lib/feedmunger.php index 7f223cb20d..25b0a09317 100644 --- a/plugins/OStatus/lib/feedmunger.php +++ b/plugins/OStatus/lib/feedmunger.php @@ -89,6 +89,10 @@ class FeedMunger $feedinfo->feeduri = $this->url; $feedinfo->homeuri = $this->feed->link; $feedinfo->huburi = $this->getHubLink(); + $salmon = $this->getSalmonLink(); + if ($salmon) { + $feedinfo->salmonuri = $salmon; + } return $feedinfo; } @@ -154,7 +158,12 @@ class FeedMunger { return $this->getAtomLink($this->feed, array('rel' => 'hub')); } - + + function getSalmonLink() + { + return $this->getAtomLink($this->feed, array('rel' => 'salmon')); + } + function getSelfLink() { return $this->getAtomLink($this->feed, array('rel' => 'self')); From ce3c3be1bf971329f82bedbf3aae636e3c8ecbf9 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 10 Feb 2010 14:24:16 -0800 Subject: [PATCH 56/78] Utility classes for atom feeds --- actions/apitimelineuser.php | 39 +++++++- lib/atom10entry.php | 58 ++++++++++++ lib/atom10feed.php | 177 ++++++++++++++++++++++++++++++++++++ lib/atomnoticefeed.php | 34 +++++++ 4 files changed, 305 insertions(+), 3 deletions(-) create mode 100644 lib/atom10entry.php create mode 100644 lib/atom10feed.php create mode 100644 lib/atomnoticefeed.php diff --git a/actions/apitimelineuser.php b/actions/apitimelineuser.php index ed9104905d..bcc48f59c1 100644 --- a/actions/apitimelineuser.php +++ b/actions/apitimelineuser.php @@ -145,7 +145,26 @@ class ApiTimelineUserAction extends ApiBareAuthAction ); break; case 'atom': + + header('Content-Type: application/atom+xml; charset=utf-8'); + + $atom = new AtomNoticeFeed(); + + $atom->addLink( + common_local_url( + 'showstream', + array('nickname' => $this->user->nickname) + ) + ); + + $atom->setId($id); + $atom->setTitle($title); + $atom->setSubtitle($subtitle); + $atom->setLogo($logo); + $atom->setUpdated('now'); + $id = $this->arg('id'); + if ($id) { $selfuri = common_root_url() . 'api/statuses/user_timeline/' . @@ -154,10 +173,24 @@ class ApiTimelineUserAction extends ApiBareAuthAction $selfuri = common_root_url() . 'api/statuses/user_timeline.atom'; } - $this->showAtomTimeline( - $this->notices, $title, $id, $link, - $subtitle, $suplink, $selfuri, $logo + + $atom->addLink( + $selfuri, + array('rel' => 'self', 'type' => 'application/atom+xml') ); + + $atom->addLink( + $suplink, + array( + 'rel' => 'http://api.friendfeed.com/2008/03#sup', + 'type' => 'application/json' + ) + ); + + $atom->addEntryFromNotices($this->notices); + + print $atom->getString(); + break; case 'json': $this->showJsonTimeline($this->notices); diff --git a/lib/atom10entry.php b/lib/atom10entry.php new file mode 100644 index 0000000000..1b79ce7ad5 --- /dev/null +++ b/lib/atom10entry.php @@ -0,0 +1,58 @@ +namespaces = array(); + } + + function addNamespace($namespace, $uri) + { + $ns = array($namespace => $uri); + $this->namespaces = array_merge($this->namespaces, $ns); + } + + function initEntry() + { + + } + + function endEntry() + { + + } + + function validate + { + + } + + function getString() + { + $this->validate(); + + $this->initEntry(); + $this->renderEntries(); + $this->endEntry(); + + return $this->xw->outputMemory(); + } + +} \ No newline at end of file diff --git a/lib/atom10feed.php b/lib/atom10feed.php new file mode 100644 index 0000000000..9dd8ebc9bc --- /dev/null +++ b/lib/atom10feed.php @@ -0,0 +1,177 @@ +namespaces = array(); + $this->links = array(); + $this->entries = array(); + $this->addNamespace('xmlns', 'http://www.w3.org/2005/Atom'); + } + + function addNamespace($namespace, $uri) + { + $ns = array($namespace => $uri); + $this->namespaces = array_merge($this->namespaces, $ns); + } + + function getNamespaces() + { + return $this->namespaces; + } + + function initFeed() + { + $this->xw->startDocument('1.0', 'UTF-8'); + $commonAttrs = array('xml:lang' => 'en-US'); + $commonAttrs = array_merge($commonAttrs, $this->namespaces); + $this->elementStart('feed', $commonAttrs); + + $this->element('id', null, $this->id); + $this->element('title', null, $this->title); + $this->element('subtitle', null, $this->subtitle); + $this->element('logo', null, $this->logo); + $this->element('updated', null, $this->updated); + + $this->renderLinks(); + } + + /** + * Check that all required elements have been set, etc. + * Throws an Atom10FeedException if something's missing. + * + * @return void + */ + function validate() + { + } + + function renderLinks() + { + foreach ($this->links as $attrs) + { + $this->element('link', $attrs, null); + } + } + + function addEntryRaw($entry) + { + array_push($this->entries, $entry); + } + + function addEntry($entry) + { + array_push($this->entries, $entry->getString()); + } + + function renderEntries() + { + foreach ($this->entries as $entry) { + $this->raw($entry); + } + } + + function endFeed() + { + $this->elementEnd('feed'); + $this->xw->endDocument(); + } + + function getString() + { + $this->validate(); + + $this->initFeed(); + $this->renderEntries(); + $this->endFeed(); + + return $this->xw->outputMemory(); + } + + function setId($id) + { + $this->id = $id; + } + + function setTitle($title) + { + $this->title = $title; + } + + function setSubtitle($subtitle) + { + $this->subtitle = $subtitle; + } + + function setLogo($logo) + { + $this->logo = $logo; + } + + function setUpdated($dt) + { + $this->updated = common_date_iso8601($dt); + } + + function setPublished($dt) + { + $this->published = common_date_iso8601($dt); + } + + /** + * Adds a link element into the Atom document + * + * Assumes you want rel="alternate" and type="text/html" unless + * you send in $otherAttrs. + * + * @param string $uri the uri the href need to point to + * @param array $otherAttrs other attributes to stick in + * + * @return void + */ + function addLink($uri, $otherAttrs = null) { + $attrs = array('href' => $uri); + + if (is_null($otherAttrs)) { + $attrs['rel'] = 'alternate'; + $attrs['type'] = 'text/html'; + } else { + $attrs = array_merge($attrs, $otherAttrs); + } + + array_push($this->links, $attrs); + } + +} + + + diff --git a/lib/atomnoticefeed.php b/lib/atomnoticefeed.php new file mode 100644 index 0000000000..a28c9cda7b --- /dev/null +++ b/lib/atomnoticefeed.php @@ -0,0 +1,34 @@ +addNamespace( + 'xmlns:thr', + 'http://purl.org/syndication/thread/1.0' + ); + } + + function addEntryFromNotices($notices) + { + if (is_array($notices)) { + foreach ($notices as $notice) { + $this->addEntryFromNotice($notice); + } + } else { + while ($notices->fetch()) { + $this->addEntryFromNotice($notice); + } + } + } + + function addEntryFromNotice($notice) + { + $this->addEntryRaw($notice->asAtomEntry()); + } + +} \ No newline at end of file From e2c0f59414dd7e9a33ffbae7307b81a85c2c168b Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 10 Feb 2010 18:55:14 -0800 Subject: [PATCH 57/78] Some upgrades to Atom output for OStatus --- actions/apitimelineuser.php | 2 +- classes/Notice.php | 38 ++++++++++++++++++++++------ classes/Profile.php | 49 +++++++++++++++++++++++++++++++++++++ lib/atom10feed.php | 2 +- lib/atomnoticefeed.php | 18 +++++++++++++- 5 files changed, 98 insertions(+), 11 deletions(-) diff --git a/actions/apitimelineuser.php b/actions/apitimelineuser.php index bcc48f59c1..cb82136195 100644 --- a/actions/apitimelineuser.php +++ b/actions/apitimelineuser.php @@ -189,7 +189,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction $atom->addEntryFromNotices($this->notices); - print $atom->getString(); + $this->raw($atom->getString()); break; case 'json': diff --git a/classes/Notice.php b/classes/Notice.php index 247440f29c..091f2dc7b4 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -957,7 +957,10 @@ class Notice extends Memcached_DataObject if ($namespace) { $attrs = array('xmlns' => 'http://www.w3.org/2005/Atom', - 'xmlns:thr' => 'http://purl.org/syndication/thread/1.0'); + 'xmlns:thr' => 'http://purl.org/syndication/thread/1.0', + 'xmlns:georss' => 'http://www.georss.org/georss', + 'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/', + 'xmlns:ostatus' => 'http://ostatus.org/schema/1.0'); } else { $attrs = array(); } @@ -983,11 +986,6 @@ class Notice extends Memcached_DataObject $xs->element('icon', null, $profile->avatarUrl(AVATAR_PROFILE_SIZE)); } - $xs->elementStart('author'); - $xs->element('name', null, $profile->nickname); - $xs->element('uri', null, $profile->profileurl); - $xs->elementEnd('author'); - if ($source) { $xs->elementEnd('source'); } @@ -995,6 +993,9 @@ class Notice extends Memcached_DataObject $xs->element('title', null, $this->content); $xs->element('summary', null, $this->content); + $xs->raw($profile->asAtomAuthor()); + $xs->raw($profile->asActivityActor($namespace)); + $xs->element('link', array('rel' => 'alternate', 'href' => $this->bestUrl())); @@ -1014,6 +1015,29 @@ class Notice extends Memcached_DataObject } } + if (!empty($this->conversation) + && $this->conversation != $this->notice->id) { + $xs->element( + 'link', array( + 'rel' => 'osatus:conversation', + 'href' => common_local_url( + 'conversation', + array('id' => $this->conversation) + ) + ) + ); + } + + if (!empty($this->repeat_of)) { + $repeat = Notice::staticGet('id', $this->repeat_of); + if (!empty($repeat)) { + $xs->element( + 'ostatus:forward', + array('ref' => $repeat->uri, 'href' => $repeat->bestUrl()) + ); + } + } + $xs->element('content', array('type' => 'html'), $this->rendered); $tag = new Notice_tag(); @@ -1041,9 +1065,7 @@ class Notice extends Memcached_DataObject } if (!empty($this->lat) && !empty($this->lon)) { - $xs->elementStart('geo', array('xmlns:georss' => 'http://www.georss.org/georss')); $xs->element('georss:point', null, $this->lat . ' ' . $this->lon); - $xs->elementEnd('geo'); } $xs->elementEnd('entry'); diff --git a/classes/Profile.php b/classes/Profile.php index feabc25087..664c45f640 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -754,4 +754,53 @@ class Profile extends Memcached_DataObject return !empty($notice); } + + function asAtomAuthor() + { + $xs = new XMLStringer(true); + + $xs->elementStart('author'); + $xs->element('name', null, $this->nickname); + $xs->element('uri', null, $this->profileurl); + $xs->elementEnd('author'); + + return $xs->getString(); + } + + function asActivityActor() + { + $xs = new XMLStringer(true); + + $xs->elementStart('activity:actor'); + $xs->element( + 'activity:object-type', + null, + 'http://activitystrea.ms/schema/1.0/person' + ); + $xs->element( + 'id', + null, + common_local_url( + 'userbyid', + array('id' => $this->id) + ) + ); + $xs->element('title', null, $this->getBestName()); + + $avatar = $this->getAvatar(AVATAR_PROFILE_SIZE); + + $xs->element( + 'link', array( + 'type' => empty($avatar) ? 'image/png' : $avatar->mediatype, + 'href' => empty($avatar) + ? Avatar::defaultImage(AVATAR_PROFILE_SIZE) + : $avatar->displayUrl() + ), + '' + ); + + $xs->elementEnd('activity:actor'); + + return $xs->getString(); + } } diff --git a/lib/atom10feed.php b/lib/atom10feed.php index 9dd8ebc9bc..01fc69072c 100644 --- a/lib/atom10feed.php +++ b/lib/atom10feed.php @@ -153,7 +153,7 @@ class Atom10Feed extends XMLStringer * Assumes you want rel="alternate" and type="text/html" unless * you send in $otherAttrs. * - * @param string $uri the uri the href need to point to + * @param string $uri the uri the href needs to point to * @param array $otherAttrs other attributes to stick in * * @return void diff --git a/lib/atomnoticefeed.php b/lib/atomnoticefeed.php index a28c9cda7b..ce87ec9e64 100644 --- a/lib/atomnoticefeed.php +++ b/lib/atomnoticefeed.php @@ -5,12 +5,28 @@ class AtomNoticeFeed extends Atom10Feed function __construct($indent = true) { parent::__construct($indent); - // Feeds containing notice info use the Atom Threading Extensions + // Feeds containing notice info use these namespaces $this->addNamespace( 'xmlns:thr', 'http://purl.org/syndication/thread/1.0' ); + + $this->addNamespace( + 'xmlns:georss', + 'http://www.georss.org/georss' + ); + + $this->addNamespace( + 'xmlns:activity', + 'http://activitystrea.ms/spec/1.0/' + ); + + // XXX: What should the uri be? + $this->addNamespace( + 'xmlns:ostatus', + 'http://ostatus.org/schema/1.0' + ); } function addEntryFromNotices($notices) From c8d5c8442fe6ce54f7f65d1d0eb4203b06c09583 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 10 Feb 2010 21:21:42 -0800 Subject: [PATCH 58/78] Added some boilerplate class comments, etc. --- lib/atom10entry.php | 48 ++++++++++++++++++++++++++++++++++ lib/atom10feed.php | 58 +++++++++++++++++++++++++++++++++++++----- lib/atomnoticefeed.php | 55 ++++++++++++++++++++++++++++++++++++++- 3 files changed, 154 insertions(+), 7 deletions(-) diff --git a/lib/atom10entry.php b/lib/atom10entry.php index 1b79ce7ad5..5710c80fc5 100644 --- a/lib/atom10entry.php +++ b/lib/atom10entry.php @@ -1,9 +1,51 @@ . + * + * @category Feed + * @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); +} class Atom10EntryException extends Exception { } +/** + * Class for manipulating an Atom entry in memory. Get the entry as an XML + * string with Atom10Entry::getString(). + * + * @category Feed + * @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 Atom10Entry extends XMLStringer { private $namespaces; @@ -39,6 +81,12 @@ class Atom10Entry extends XMLStringer } + /** + * Check that all required elements have been set, etc. + * Throws an Atom10EntryException if something's missing. + * + * @return void + */ function validate { diff --git a/lib/atom10feed.php b/lib/atom10feed.php index 01fc69072c..a37f6521ad 100644 --- a/lib/atom10feed.php +++ b/lib/atom10feed.php @@ -1,9 +1,51 @@ . + * + * @category Feed + * @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); +} class Atom10FeedException extends Exception { } +/** + * Class for building an Atom feed in memory. Get the finished doc + * as a string with Atom10Feed::getString(). + * + * @category Feed + * @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 Atom10Feed extends XMLStringer { public $xw; @@ -23,12 +65,11 @@ class Atom10Feed extends XMLStringer private $entries; /** - * undocumented function + * Constructor * - * @param array $entries an array of FeedItems + * @param boolean $indent flag to turn indenting on or off * * @return void - * */ function __construct($indent = true) { parent::__construct($indent); @@ -38,6 +79,14 @@ class Atom10Feed extends XMLStringer $this->addNamespace('xmlns', 'http://www.w3.org/2005/Atom'); } + /** + * Add another namespace to the feed + * + * @param string $namespace the namespace + * @param string $uri namspace uri + * + * @return void + */ function addNamespace($namespace, $uri) { $ns = array($namespace => $uri); @@ -172,6 +221,3 @@ class Atom10Feed extends XMLStringer } } - - - diff --git a/lib/atomnoticefeed.php b/lib/atomnoticefeed.php index ce87ec9e64..a626ab549b 100644 --- a/lib/atomnoticefeed.php +++ b/lib/atomnoticefeed.php @@ -1,5 +1,47 @@ . + * + * @category Feed + * @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); +} + +/** + * Class for creating a feed that represents a collection of notices. Builds the + * feed in memory. Get the feed as a string with AtomNoticeFeed::getString(). + * + * @category Feed + * @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 AtomNoticeFeed extends Atom10Feed { function __construct($indent = true) { @@ -29,6 +71,12 @@ class AtomNoticeFeed extends Atom10Feed ); } + /** + * Add more than one Notice to the feed + * + * @param mixed $notices an array of Notice objects or handle + * + */ function addEntryFromNotices($notices) { if (is_array($notices)) { @@ -42,9 +90,14 @@ class AtomNoticeFeed extends Atom10Feed } } + /** + * Add a single Notice to the feed + * + * @param Notice $notice a Notice to add + */ function addEntryFromNotice($notice) { $this->addEntryRaw($notice->asAtomEntry()); } -} \ No newline at end of file +} From c465f675d9dbcf9f808bc31a1d01e753df4ddf58 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 11 Feb 2010 13:54:40 -0800 Subject: [PATCH 59/78] Make Atom timelines in the API use Atom10feed --- actions/apitimelinefavorites.php | 69 ++++++++++++++++++++------- actions/apitimelinefriends.php | 74 +++++++++++++++++++++-------- actions/apitimelinehome.php | 60 ++++++++++++++++------- actions/apitimelinementions.php | 34 +++++++++++-- actions/apitimelinepublic.php | 27 +++++++++-- actions/apitimelineretweetsofme.php | 36 ++++++++++++-- actions/apitimelinetag.php | 51 +++++++++++++++----- actions/apitimelineuser.php | 25 ++++------ lib/api.php | 18 +++++++ lib/atom10feed.php | 8 +++- lib/atomnoticefeed.php | 4 +- 11 files changed, 308 insertions(+), 98 deletions(-) diff --git a/actions/apitimelinefavorites.php b/actions/apitimelinefavorites.php index 1027d97d44..f7f900ddfb 100644 --- a/actions/apitimelinefavorites.php +++ b/actions/apitimelinefavorites.php @@ -100,11 +100,11 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction function showTimeline() { - $profile = $this->user->getProfile(); - $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + $profile = $this->user->getProfile(); + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); - $sitename = common_config('site', 'name'); - $title = sprintf( + $sitename = common_config('site', 'name'); + $title = sprintf( _('%1$s / Favorites from %2$s'), $sitename, $this->user->nickname @@ -112,32 +112,69 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction $taguribase = common_config('integration', 'taguri'); $id = "tag:$taguribase:Favorites:" . $this->user->id; - $link = common_local_url( - 'favorites', - array('nickname' => $this->user->nickname) - ); - $subtitle = sprintf( + + $subtitle = sprintf( _('%1$s updates favorited by %2$s / %2$s.'), $sitename, $profile->getBestName(), $this->user->nickname ); - $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); + $logo = !empty($avatar) + ? $avatar->displayUrl() + : Avatar::defaultImage(AVATAR_PROFILE_SIZE); switch($this->format) { case 'xml': $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo); + $link = common_local_url( + 'showfavorites', + array('nickname' => $this->user->nickname) + ); + $this->showRssTimeline( + $this->notices, + $title, + $link, + $subtitle, + null, + $logo + ); break; case 'atom': - $selfuri = common_root_url() . - ltrim($_SERVER['QUERY_STRING'], 'p='); - $this->showAtomTimeline( - $this->notices, $title, $id, $link, $subtitle, - null, $selfuri, $logo + + header('Content-Type: application/atom+xml; charset=utf-8'); + + $atom = new AtomNoticeFeed(); + + $atom->setId($id); + $atom->setTitle($title); + $atom->setSubtitle($subtitle); + $atom->setLogo($logo); + $atom->setUpdated('now'); + + $atom->addLink( + common_local_url( + 'showfavorites', + array('nickname' => $this->user->nickname) + ) ); + + $id = $this->arg('id'); + $aargs = array('format' => 'atom'); + if (!empty($id)) { + $aargs['id'] = $id; + } + + $atom->addLink( + $this->getSelfUri('ApiTimelineFavorites', $aargs), + array('rel' => 'self', 'type' => 'application/atom+xml') + ); + + $atom->addEntryFromNotices($this->notices); + + $this->raw($atom->getString()); + break; case 'json': $this->showJsonTimeline($this->notices); diff --git a/actions/apitimelinefriends.php b/actions/apitimelinefriends.php index 4e3827baea..0af04fe4fb 100644 --- a/actions/apitimelinefriends.php +++ b/actions/apitimelinefriends.php @@ -114,39 +114,71 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction $title = sprintf(_("%s and friends"), $this->user->nickname); $taguribase = common_config('integration', 'taguri'); $id = "tag:$taguribase:FriendsTimeline:" . $this->user->id; - $link = common_local_url( - 'all', array('nickname' => $this->user->nickname) - ); - $subtitle = sprintf( - _('Updates from %1$s and friends on %2$s!'), - $this->user->nickname, $sitename - ); - $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); + + $subtitle = sprintf( + _('Updates from %1$s and friends on %2$s!'), + $this->user->nickname, $sitename + ); + + $logo = (!empty($avatar)) + ? $avatar->displayUrl() + : Avatar::defaultImage(AVATAR_PROFILE_SIZE); switch($this->format) { case 'xml': $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo); + + $link = common_local_url( + 'all', array( + 'nickname' => $this->user->nickname + ) + ); + + $this->showRssTimeline( + $this->notices, + $title, + $link, + $subtitle, + null, + $logo + ); break; case 'atom': - $target_id = $this->arg('id'); + header('Content-Type: application/atom+xml; charset=utf-8'); - if (isset($target_id)) { - $selfuri = common_root_url() . - 'api/statuses/friends_timeline/' . - $target_id . '.atom'; - } else { - $selfuri = common_root_url() . - 'api/statuses/friends_timeline.atom'; + $atom = new AtomNoticeFeed(); + + $atom->setId($id); + $atom->setTitle($title); + $atom->setSubtitle($subtitle); + $atom->setLogo($logo); + $atom->setUpdated('now'); + + $atom->addLink( + common_local_url( + 'all', + array('nickname' => $this->user->nickname) + ) + ); + + $id = $this->arg('id'); + $aargs = array('format' => 'atom'); + if (!empty($id)) { + $aargs['id'] = $id; } - $this->showAtomTimeline( - $this->notices, $title, $id, $link, - $subtitle, null, $selfuri, $logo - ); + $atom->addLink( + $this->getSelfUri('ApiTimelineFriends', $aargs), + array('rel' => 'self', 'type' => 'application/atom+xml') + ); + + $atom->addEntryFromNotices($this->notices); + + $this->raw($atom->getString()); + break; case 'json': $this->showJsonTimeline($this->notices); diff --git a/actions/apitimelinehome.php b/actions/apitimelinehome.php index 828eae6cf6..ae41680702 100644 --- a/actions/apitimelinehome.php +++ b/actions/apitimelinehome.php @@ -115,39 +115,67 @@ class ApiTimelineHomeAction extends ApiBareAuthAction $title = sprintf(_("%s and friends"), $this->user->nickname); $taguribase = common_config('integration', 'taguri'); $id = "tag:$taguribase:HomeTimeline:" . $this->user->id; - $link = common_local_url( - 'all', array('nickname' => $this->user->nickname) - ); + $subtitle = sprintf( _('Updates from %1$s and friends on %2$s!'), $this->user->nickname, $sitename ); - $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); + + $logo = (!empty($avatar)) + ? $avatar->displayUrl() + : Avatar::defaultImage(AVATAR_PROFILE_SIZE); switch($this->format) { case 'xml': $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo); + $link = common_local_url( + 'all', + array('nickname' => $this->user->nickname) + ); + $this->showRssTimeline( + $this->notices, + $title, + $link, + $subtitle, + null, + $logo + ); break; case 'atom': - $target_id = $this->arg('id'); + header('Content-Type: application/atom+xml; charset=utf-8'); - if (isset($target_id)) { - $selfuri = common_root_url() . - 'api/statuses/home_timeline/' . - $target_id . '.atom'; - } else { - $selfuri = common_root_url() . - 'api/statuses/home_timeline.atom'; + $atom = new AtomNoticeFeed(); + + $atom->setId($id); + $atom->setTitle($title); + $atom->setSubtitle($subtitle); + $atom->setLogo($logo); + $atom->setUpdated('now'); + + $atom->addLink( + common_local_url( + 'all', + array('nickname' => $this->user->nickname) + ) + ); + + $id = $this->arg('id'); + $aargs = array('format' => 'atom'); + if (!empty($id)) { + $aargs['id'] = $id; } - $this->showAtomTimeline( - $this->notices, $title, $id, $link, - $subtitle, null, $selfuri, $logo + $atom->addLink( + $this->getSelfUri('ApiTimelineHome', $aargs), + array('rel' => 'self', 'type' => 'application/atom+xml') ); + + $atom->addEntryFromNotices($this->notices); + $this->raw($atom->getString()); + break; case 'json': $this->showJsonTimeline($this->notices); diff --git a/actions/apitimelinementions.php b/actions/apitimelinementions.php index 9dc2162cc4..d2e31d0bdd 100644 --- a/actions/apitimelinementions.php +++ b/actions/apitimelinementions.php @@ -137,12 +137,36 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo); break; case 'atom': - $selfuri = common_root_url() . - ltrim($_SERVER['QUERY_STRING'], 'p='); - $this->showAtomTimeline( - $this->notices, $title, $id, $link, $subtitle, - null, $selfuri, $logo + + $atom = new AtomNoticeFeed(); + + $atom->setId($id); + $atom->setTitle($title); + $atom->setSubtitle($subtitle); + $atom->setLogo($logo); + $atom->setUpdated('now'); + + $atom->addLink( + common_local_url( + 'replies', + array('nickname' => $this->user->nickname) + ) ); + + $id = $this->arg('id'); + $aargs = array('format' => 'atom'); + if (!empty($id)) { + $aargs['id'] = $id; + } + + $atom->addLink( + $this->getSelfUri('ApiTimelineMentions', $aargs), + array('rel' => 'self', 'type' => 'application/atom+xml') + ); + + $atom->addEntryFromNotices($this->notices); + $this->raw($atom->getString()); + break; case 'json': $this->showJsonTimeline($this->notices); diff --git a/actions/apitimelinepublic.php b/actions/apitimelinepublic.php index 0fb0788e98..c1fa72a3ee 100644 --- a/actions/apitimelinepublic.php +++ b/actions/apitimelinepublic.php @@ -74,7 +74,7 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction parent::prepare($args); $this->notices = $this->getNotices(); - + if ($this->since) { throw new ServerException("since parameter is disabled for performance; use since_id", 403); } @@ -122,11 +122,28 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $sitelogo); break; case 'atom': - $selfuri = common_root_url() . 'api/statuses/public_timeline.atom'; - $this->showAtomTimeline( - $this->notices, $title, $id, $link, - $subtitle, null, $selfuri, $sitelogo + + $atom = new AtomNoticeFeed(); + + $atom->setId($id); + $atom->setTitle($title); + $atom->setSubtitle($subtitle); + $atom->setLogo($sitelogo); + $atom->setUpdated('now'); + + $atom->addLink(common_local_url('public')); + + $atom->addLink( + $this->getSelfUri( + 'ApiTimelinePublic', array('format' => 'atom') + ), + array('rel' => 'self', 'type' => 'application/atom+xml') ); + + $atom->addEntryFromNotices($this->notices); + + $this->raw($atom->getString()); + break; case 'json': $this->showJsonTimeline($this->notices); diff --git a/actions/apitimelineretweetsofme.php b/actions/apitimelineretweetsofme.php index e4b09e9bda..26706a75e7 100644 --- a/actions/apitimelineretweetsofme.php +++ b/actions/apitimelineretweetsofme.php @@ -99,6 +99,8 @@ class ApiTimelineRetweetsOfMeAction extends ApiAuthAction $strm = $this->auth_user->repeatsOfMe($offset, $limit, $this->since_id, $this->max_id); + common_debug(var_export($strm, true)); + switch ($this->format) { case 'xml': $this->showXmlTimeline($strm); @@ -112,10 +114,38 @@ class ApiTimelineRetweetsOfMeAction extends ApiAuthAction $title = sprintf(_("Repeats of %s"), $this->auth_user->nickname); $taguribase = common_config('integration', 'taguri'); $id = "tag:$taguribase:RepeatsOfMe:" . $this->auth_user->id; - $link = common_local_url('showstream', - array('nickname' => $this->auth_user->nickname)); - $this->showAtomTimeline($strm, $title, $id, $link); + header('Content-Type: application/atom+xml; charset=utf-8'); + + $atom = new AtomNoticeFeed(); + + $atom->setId($id); + $atom->setTitle($title); + $atom->setSubtitle($subtitle); + $atom->setUpdated('now'); + + $atom->addLink( + common_local_url( + 'showstream', + array('nickname' => $this->auth_user->nickname) + ) + ); + + $id = $this->arg('id'); + $aargs = array('format' => 'atom'); + if (!empty($id)) { + $aargs['id'] = $id; + } + + $atom->addLink( + $this->getSelfUri('ApiTimelineRetweetsOfMe', $aargs), + array('rel' => 'self', 'type' => 'application/atom+xml') + ); + + $atom->addEntryFromNotices($strm); + + $this->raw($atom->getString()); + break; default: diff --git a/actions/apitimelinetag.php b/actions/apitimelinetag.php index 1427d23b6a..5b6ded4c04 100644 --- a/actions/apitimelinetag.php +++ b/actions/apitimelinetag.php @@ -100,10 +100,6 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction $sitename = common_config('site', 'name'); $sitelogo = (common_config('site', 'logo')) ? common_config('site', 'logo') : Theme::path('logo.png'); $title = sprintf(_("Notices tagged with %s"), $this->tag); - $link = common_local_url( - 'tag', - array('tag' => $this->tag) - ); $subtitle = sprintf( _('Updates tagged with %1$s on %2$s!'), $this->tag, @@ -117,22 +113,51 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $sitelogo); - break; - case 'atom': - $selfuri = common_root_url() . - 'api/statusnet/tags/timeline/' . - $this->tag . '.atom'; - $this->showAtomTimeline( + $link = common_local_url( + 'tag', + array('tag' => $this->tag) + ); + $this->showRssTimeline( $this->notices, $title, - $id, $link, $subtitle, null, - $selfuri, $sitelogo ); + break; + case 'atom': + + header('Content-Type: application/atom+xml; charset=utf-8'); + + $atom = new AtomNoticeFeed(); + + $atom->setId($id); + $atom->setTitle($title); + $atom->setSubtitle($subtitle); + $atom->setLogo($logo); + $atom->setUpdated('now'); + + $atom->addLink( + common_local_url( + 'tag', + array('tag' => $this->tag) + ) + ); + + $aargs = array('format' => 'atom'); + if (!empty($this->tag)) { + $aargs['tag'] = $this->tag; + } + + $atom->addLink( + $this->getSelfUri('ApiTimelineTag', $aargs), + array('rel' => 'self', 'type' => 'application/atom+xml') + ); + + $atom->addEntryFromNotices($this->notices); + $this->raw($atom->getString()); + break; case 'json': $this->showJsonTimeline($this->notices); diff --git a/actions/apitimelineuser.php b/actions/apitimelineuser.php index cb82136195..d20bb0d202 100644 --- a/actions/apitimelineuser.php +++ b/actions/apitimelineuser.php @@ -150,6 +150,12 @@ class ApiTimelineUserAction extends ApiBareAuthAction $atom = new AtomNoticeFeed(); + $atom->setId($id); + $atom->setTitle($title); + $atom->setSubtitle($subtitle); + $atom->setLogo($logo); + $atom->setUpdated('now'); + $atom->addLink( common_local_url( 'showstream', @@ -157,25 +163,14 @@ class ApiTimelineUserAction extends ApiBareAuthAction ) ); - $atom->setId($id); - $atom->setTitle($title); - $atom->setSubtitle($subtitle); - $atom->setLogo($logo); - $atom->setUpdated('now'); - $id = $this->arg('id'); - - if ($id) { - $selfuri = common_root_url() . - 'api/statuses/user_timeline/' . - rawurlencode($id) . '.atom'; - } else { - $selfuri = common_root_url() . - 'api/statuses/user_timeline.atom'; + $aargs = array('format' => 'atom'); + if (!empty($id)) { + $aargs['id'] = $id; } $atom->addLink( - $selfuri, + $this->getSelfUri('ApiTimelineUser', $aargs), array('rel' => 'self', 'type' => 'application/atom+xml') ); diff --git a/lib/api.php b/lib/api.php index fd07bbbbe0..8f1fe1ef71 100644 --- a/lib/api.php +++ b/lib/api.php @@ -1321,4 +1321,22 @@ class ApiAction extends Action } } + function getSelfUri($action, $aargs) + { + parse_str($_SERVER['QUERY_STRING'], $params); + $pstring = ''; + if (!empty($params)) { + unset($params['p']); + $pstring = http_build_query($params); + } + + $uri = common_local_url($action, $aargs); + + if (!empty($pstring)) { + $uri .= '?' . $pstring; + } + + return $uri; + } + } diff --git a/lib/atom10feed.php b/lib/atom10feed.php index a37f6521ad..ccca76a09e 100644 --- a/lib/atom10feed.php +++ b/lib/atom10feed.php @@ -27,7 +27,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET') +if (!defined('STATUSNET')) { exit(1); } @@ -108,7 +108,11 @@ class Atom10Feed extends XMLStringer $this->element('id', null, $this->id); $this->element('title', null, $this->title); $this->element('subtitle', null, $this->subtitle); - $this->element('logo', null, $this->logo); + + if (!empty($this->logo)) { + $this->element('logo', null, $this->logo); + } + $this->element('updated', null, $this->updated); $this->renderLinks(); diff --git a/lib/atomnoticefeed.php b/lib/atomnoticefeed.php index a626ab549b..34ed44b2ed 100644 --- a/lib/atomnoticefeed.php +++ b/lib/atomnoticefeed.php @@ -27,7 +27,7 @@ * @link http://status.net/ */ -if (!defined('STATUSNET') +if (!defined('STATUSNET')) { exit(1); } @@ -85,7 +85,7 @@ class AtomNoticeFeed extends Atom10Feed } } else { while ($notices->fetch()) { - $this->addEntryFromNotice($notice); + $this->addEntryFromNotice($notices); } } } From e08657d56cc10d2cf45e9e5701856d8a0dc7351e Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 11 Feb 2010 22:42:36 +0000 Subject: [PATCH 60/78] OStatus: correct parsing of georss:point for max interop (commas allowed, whitespace not strictly defined) --- plugins/OStatus/lib/feedmunger.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/plugins/OStatus/lib/feedmunger.php b/plugins/OStatus/lib/feedmunger.php index 25b0a09317..927a2fe7a7 100644 --- a/plugins/OStatus/lib/feedmunger.php +++ b/plugins/OStatus/lib/feedmunger.php @@ -269,6 +269,9 @@ class FeedMunger } /** + * Parse location given as a GeoRSS-simple point, if provided. + * http://www.georss.org/simple + * * @param feed item $entry * @return mixed Location or false */ @@ -278,7 +281,10 @@ class FeedMunger $points = $dom->getElementsByTagNameNS('http://www.georss.org/georss', 'point'); for ($i = 0; $i < $points->length; $i++) { - $point = trim($points->item(0)->textContent); + $point = $points->item(0)->textContent; + $point = str_replace(',', ' ', $point); // per spec "treat commas as whitespace" + $point = preg_replace('/\s+/', ' ', $point); + $point = trim($point); $coords = explode(' ', $point); if (count($coords) == 2) { list($lat, $lon) = $coords; From 8e6b52e8994ce9a3180554f999bdc89b414fc892 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 12 Feb 2010 00:22:16 +0000 Subject: [PATCH 61/78] OStatus: renamed feedinfo table to ostatus_profile -- will cover remote ostatus people and groups whether a subscription's active or not (maintains identity over unsub/resub, and between subscribers and subscribees) --- plugins/OStatus/OStatusPlugin.php | 6 +-- plugins/OStatus/actions/feedsubsettings.php | 20 ++++---- plugins/OStatus/actions/ostatussub.php | 16 +++--- plugins/OStatus/actions/pushcallback.php | 22 ++++----- .../{Feedinfo.php => Ostatus_profile.php} | 49 +++++++++++-------- plugins/OStatus/lib/feedmunger.php | 18 +++---- 6 files changed, 68 insertions(+), 63 deletions(-) rename plugins/OStatus/classes/{Feedinfo.php => Ostatus_profile.php} (92%) diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index c0f9dadc4a..8444c3d73d 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -251,14 +251,14 @@ class OStatusPlugin extends Plugin */ function onEndUnsubscribe($user, $other) { - $feed = Feedinfo::staticGet('profile_id', $other->id); + $profile = Ostatus_profile::staticGet('profile_id', $other->id); if ($feed) { $sub = new Subscription(); $sub->subscribed = $other->id; $sub->limit(1); if (!$sub->find(true)) { common_log(LOG_INFO, "Unsubscribing from now-unused feed $feed->feeduri on hub $feed->huburi"); - $feed->unsubscribe(); + $profile->unsubscribe(); } } return true; @@ -269,7 +269,7 @@ class OStatusPlugin extends Plugin */ function onCheckSchema() { $schema = Schema::get(); - $schema->ensureTable('feedinfo', Feedinfo::schemaDef()); + $schema->ensureTable('ostatus_profile', Ostatus_profile::schemaDef()); $schema->ensureTable('hubsub', HubSub::schemaDef()); return true; } diff --git a/plugins/OStatus/actions/feedsubsettings.php b/plugins/OStatus/actions/feedsubsettings.php index 6f592bf5b0..af8bf4d25e 100644 --- a/plugins/OStatus/actions/feedsubsettings.php +++ b/plugins/OStatus/actions/feedsubsettings.php @@ -182,9 +182,9 @@ class FeedSubSettingsAction extends ConnectSettingsAction } $this->munger = $discover->feedMunger(); - $this->feedinfo = $this->munger->feedInfo(); + $this->profile = $this->munger->ostatusProfile(); - if ($this->feedinfo->huburi == '' && !common_config('feedsub', 'nohub')) { + if ($this->profile->huburi == '' && !common_config('feedsub', 'nohub')) { $this->showForm(_m('Feed is not PuSH-enabled; cannot subscribe.')); return false; } @@ -196,13 +196,13 @@ class FeedSubSettingsAction extends ConnectSettingsAction { if ($this->validateFeed()) { $this->preview = true; - $this->feedinfo = Feedinfo::ensureProfile($this->munger); + $this->profile = Ostatus_profile::ensureProfile($this->munger); // If not already in use, subscribe to updates via the hub - if ($this->feedinfo->sub_start) { - common_log(LOG_INFO, __METHOD__ . ": double the fun! new sub for {$this->feedinfo->feeduri} last subbed {$this->feedinfo->sub_start}"); + if ($this->profile->sub_start) { + common_log(LOG_INFO, __METHOD__ . ": double the fun! new sub for {$this->profile->feeduri} last subbed {$this->profile->sub_start}"); } else { - $ok = $this->feedinfo->subscribe(); + $ok = $this->profile->subscribe(); common_log(LOG_INFO, __METHOD__ . ": sub was $ok"); if (!$ok) { $this->showForm(_m('Feed subscription failed! Bad response from hub.')); @@ -212,15 +212,15 @@ class FeedSubSettingsAction extends ConnectSettingsAction // And subscribe the current user to the local profile $user = common_current_user(); - $profile = $this->feedinfo->getProfile(); + $profile = $this->profile->getLocalProfile(); if (!$profile) { throw new ServerException("Feed profile was not saved properly."); } - if ($this->feedinfo->isGroup()) { + if ($this->profile->isGroup()) { if ($user->isMember($profile)) { $this->showForm(_m('Already a member!')); - } elseif (Group_member::join($this->feedinfo->group_id, $user->id)) { + } elseif (Group_member::join($this->profile->group_id, $user->id)) { $this->showForm(_m('Joined remote group!')); } else { $this->showForm(_m('Remote group join failed!')); @@ -247,7 +247,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction function previewFeed() { - $feedinfo = $this->munger->feedinfo(); + $profile = $this->munger->ostatusProfile(); $notice = $this->munger->notice(0, true); // preview if ($notice) { diff --git a/plugins/OStatus/actions/ostatussub.php b/plugins/OStatus/actions/ostatussub.php index ffc4ae8dfe..9774286fdd 100644 --- a/plugins/OStatus/actions/ostatussub.php +++ b/plugins/OStatus/actions/ostatussub.php @@ -164,9 +164,9 @@ class OStatusSubAction extends Action } $this->munger = $discover->feedMunger(); - $this->feedinfo = $this->munger->feedInfo(); + $this->profile = $this->munger->ostatusProfile(); - if ($this->feedinfo->huburi == '') { + if ($this->profile->huburi == '') { $this->showForm(_m('Feed is not PuSH-enabled; cannot subscribe.')); return false; } @@ -178,13 +178,13 @@ class OStatusSubAction extends Action { if ($this->validateFeed()) { $this->preview = true; - $this->feedinfo = Feedinfo::ensureProfile($this->munger); + $this->profile = Ostatus_profile::ensureProfile($this->munger); // If not already in use, subscribe to updates via the hub - if ($this->feedinfo->sub_start) { - common_log(LOG_INFO, __METHOD__ . ": double the fun! new sub for {$this->feedinfo->feeduri} last subbed {$this->feedinfo->sub_start}"); + if ($this->profile->sub_start) { + common_log(LOG_INFO, __METHOD__ . ": double the fun! new sub for {$this->profile->feeduri} last subbed {$this->profile->sub_start}"); } else { - $ok = $this->feedinfo->subscribe(); + $ok = $this->profile->subscribe(); common_log(LOG_INFO, __METHOD__ . ": sub was $ok"); if (!$ok) { $this->showForm(_m('Feed subscription failed! Bad response from hub.')); @@ -194,7 +194,7 @@ class OStatusSubAction extends Action // And subscribe the current user to the local profile $user = common_current_user(); - $profile = $this->feedinfo->getProfile(); + $profile = $this->profile->getProfile(); if ($user->isSubscribed($profile)) { $this->showForm(_m('Already subscribed!')); @@ -209,7 +209,7 @@ class OStatusSubAction extends Action function previewFeed() { - $feedinfo = $this->munger->feedinfo(); + $profile = $this->munger->ostatusProfile(); $notice = $this->munger->notice(0, true); // preview if ($notice) { diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index 471d079ab9..a446593ff9 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -48,9 +48,9 @@ class PushCallbackAction extends Action throw new ServerException('Empty or invalid feed id', 400); } - $feedinfo = Feedinfo::staticGet('id', $feedid); - if (!$feedinfo) { - throw new ServerException('Unknown feed id ' . $feedid, 400); + $profile = Ostatus_profile::staticGet('id', $feedid); + if (!$profile) { + throw new ServerException('Unknown OStatus/PuSH feed id ' . $feedid, 400); } $hmac = ''; @@ -59,7 +59,7 @@ class PushCallbackAction extends Action } $post = file_get_contents('php://input'); - $feedinfo->postUpdates($post, $hmac); + $profile->postUpdates($post, $hmac); } /** @@ -78,8 +78,8 @@ class PushCallbackAction extends Action throw new ServerException("Bogus hub callback: bad mode", 404); } - $feedinfo = Feedinfo::staticGet('feeduri', $topic); - if (!$feedinfo) { + $profile = Ostatus_profile::staticGet('feeduri', $topic); + if (!$profile) { common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback for unknown feed $topic"); throw new ServerException("Bogus hub callback: unknown feed", 404); } @@ -93,16 +93,16 @@ class PushCallbackAction extends Action // OK! if ($mode == 'subscribe') { common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); - $feedinfo->sub_start = common_sql_date(time()); + $profile->sub_start = common_sql_date(time()); if ($lease_seconds > 0) { - $feedinfo->sub_end = common_sql_date(time() + $lease_seconds); + $profile->sub_end = common_sql_date(time() + $lease_seconds); } else { - $feedinfo->sub_end = null; + $profile->sub_end = null; } - $feedinfo->update(); + $profile->update(); } else { common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic"); - $feedinfo->delete(); + $profile->delete(); } print $challenge; diff --git a/plugins/OStatus/classes/Feedinfo.php b/plugins/OStatus/classes/Ostatus_profile.php similarity index 92% rename from plugins/OStatus/classes/Feedinfo.php rename to plugins/OStatus/classes/Ostatus_profile.php index 5b8a9039a6..748ecce18f 100644 --- a/plugins/OStatus/classes/Feedinfo.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -25,17 +25,17 @@ /* PuSH subscription flow: - $feedinfo->subscribe() + $profile->subscribe() generate random verification token save to verify_token sends a sub request to the hub... - feedsub/callback + main/push/callback hub sends confirmation back to us via GET We verify the request, then echo back the challenge. On our end, we save the time we subscribed and the lease expiration - feedsub/callback + main/push/callback hub sends us updates via POST */ @@ -51,23 +51,27 @@ class FeedDBException extends FeedSubException } } -class Feedinfo extends Memcached_DataObject +class Ostatus_profile extends Memcached_DataObject { - public $__table = 'feedinfo'; + public $__table = 'ostatus_profile'; public $id; public $profile_id; + public $group_id; public $feeduri; public $homeuri; - public $huburi; // PuSH subscription data + public $huburi; public $secret; public $verify_token; + public $sub_state; // subscribe, active, unsubscribe public $sub_start; public $sub_end; + public $salmonuri; + public $created; public $lastupdate; @@ -96,6 +100,7 @@ class Feedinfo extends Memcached_DataObject 'huburi' => DB_DATAOBJECT_STR, 'secret' => DB_DATAOBJECT_STR, 'verify_token' => DB_DATAOBJECT_STR, + 'sub_state' => DB_DATAOBJECT_STR, 'sub_start' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME, 'sub_end' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME, 'salmonuri' => DB_DATAOBJECT_STR, @@ -126,6 +131,8 @@ class Feedinfo extends Memcached_DataObject 32, true), new ColumnDef('secret', 'varchar', 64, true), + new ColumnDef('sub_state', "enum('subscribe','active','unsubscribe')", + null, true), new ColumnDef('sub_start', 'datetime', null, true), new ColumnDef('sub_end', 'datetime', @@ -175,7 +182,7 @@ class Feedinfo extends Memcached_DataObject * Fetch the StatusNet-side profile for this feed * @return Profile */ - public function getProfile() + public function getLocalProfile() { return Profile::staticGet('id', $this->profile_id); } @@ -183,23 +190,23 @@ class Feedinfo extends Memcached_DataObject /** * @param FeedMunger $munger * @param boolean $isGroup is this a group record? - * @return Feedinfo + * @return Ostatus_profile */ public static function ensureProfile($munger) { - $feedinfo = $munger->feedinfo(); + $entity = $munger->ostatusProfile(); - $current = self::staticGet('feeduri', $feedinfo->feeduri); + $current = self::staticGet('feeduri', $entity->feeduri); if ($current) { // @fixme we should probably update info as necessary return $current; } - $feedinfo->query('BEGIN'); + $entity->query('BEGIN'); // Awful hack! Awful hack! - $feedinfo->verify = common_good_rand(16); - $feedinfo->secret = common_good_rand(32); + $entity->verify = common_good_rand(16); + $entity->secret = common_good_rand(32); try { $profile = $munger->profile(); @@ -223,8 +230,8 @@ class Feedinfo extends Memcached_DataObject $profile->setOriginal($filename); } - $feedinfo->profile_id = $profile->id; - if ($feedinfo->isGroup()) { + $entity->profile_id = $profile->id; + if ($entity->isGroup()) { $group = new User_group(); $group->nickname = $profile->nickname . '@remote'; // @fixme $group->fullname = $profile->fullname; @@ -237,21 +244,21 @@ class Feedinfo extends Memcached_DataObject $group->setOriginal($filename); } - $feedinfo->group_id = $group->id; + $entity->group_id = $group->id; } - $result = $feedinfo->insert(); + $result = $entity->insert(); if (empty($result)) { - throw new FeedDBException($feedinfo); + throw new FeedDBException($entity); } - $feedinfo->query('COMMIT'); + $entity->query('COMMIT'); } catch (FeedDBException $e) { common_log_db_error($e->obj, 'INSERT', __FILE__); - $feedinfo->query('ROLLBACK'); + $entity->query('ROLLBACK'); return false; } - return $feedinfo; + return $entity; } /** diff --git a/plugins/OStatus/lib/feedmunger.php b/plugins/OStatus/lib/feedmunger.php index 927a2fe7a7..c895b6ce24 100644 --- a/plugins/OStatus/lib/feedmunger.php +++ b/plugins/OStatus/lib/feedmunger.php @@ -83,17 +83,17 @@ class FeedMunger $this->url = $url; } - function feedinfo() + function ostatusProfile() { - $feedinfo = new Feedinfo(); - $feedinfo->feeduri = $this->url; - $feedinfo->homeuri = $this->feed->link; - $feedinfo->huburi = $this->getHubLink(); + $profile = new Ostatus_profile(); + $profile->feeduri = $this->url; + $profile->homeuri = $this->feed->link; + $profile->huburi = $this->getHubLink(); $salmon = $this->getSalmonLink(); if ($salmon) { - $feedinfo->salmonuri = $salmon; + $profile->salmonuri = $salmon; } - return $feedinfo; + return $profile; } function getAtomLink($item, $attribs=array()) @@ -258,9 +258,7 @@ class FeedMunger { // hack hack hack // should get profile for this entry's author... - $feed = new Feedinfo(); - $feed->feeduri = $self; - $feed = Feedinfo::staticGet('feeduri', $this->getSelfLink()); + $remote = Ostatus_profile::staticGet('feeduri', $this->getSelfLink()); if ($feed) { return $feed->profile_id; } else { From 3beddffc39e9a0bc5d32f50f4c8f93771060a032 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 11 Feb 2010 15:24:18 -0800 Subject: [PATCH 62/78] ostatus:attention links in Notice Atom output --- classes/Notice.php | 16 +++++++++++++++- classes/Profile.php | 6 ++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/classes/Notice.php b/classes/Notice.php index 091f2dc7b4..a39388cdb3 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -994,7 +994,7 @@ class Notice extends Memcached_DataObject $xs->element('summary', null, $this->content); $xs->raw($profile->asAtomAuthor()); - $xs->raw($profile->asActivityActor($namespace)); + $xs->raw($profile->asActivityActor()); $xs->element('link', array('rel' => 'alternate', 'href' => $this->bestUrl())); @@ -1028,6 +1028,20 @@ class Notice extends Memcached_DataObject ); } + $reply_ids = $this->getReplies(); + + foreach ($reply_ids as $id) { + $profile = Profile::staticGet('id', $id); + if (!empty($profile)) { + $xs->element( + 'link', array( + 'rel' => 'osatus:attention', + 'href' => $profile->getAcctUri() + ) + ); + } + } + if (!empty($this->repeat_of)) { $repeat = Notice::staticGet('id', $this->repeat_of); if (!empty($repeat)) { diff --git a/classes/Profile.php b/classes/Profile.php index 664c45f640..3e5150c182 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -803,4 +803,10 @@ class Profile extends Memcached_DataObject return $xs->getString(); } + + function getAcctUri() + { + return $this->nickname . '@' . common_config('site', 'server'); + } + } From 525358fa101784fa5bbbac8b214091de89ec0634 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 11 Feb 2010 17:08:50 -0800 Subject: [PATCH 63/78] Fix retarded spelling mistake --- classes/Notice.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/classes/Notice.php b/classes/Notice.php index a39388cdb3..924931e42b 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1019,7 +1019,7 @@ class Notice extends Memcached_DataObject && $this->conversation != $this->notice->id) { $xs->element( 'link', array( - 'rel' => 'osatus:conversation', + 'rel' => 'ostatus:conversation', 'href' => common_local_url( 'conversation', array('id' => $this->conversation) @@ -1035,7 +1035,7 @@ class Notice extends Memcached_DataObject if (!empty($profile)) { $xs->element( 'link', array( - 'rel' => 'osatus:attention', + 'rel' => 'ostatus:attention', 'href' => $profile->getAcctUri() ) ); From bc46621af2bea8d2f9f132f275c70c5964f880b4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 12 Feb 2010 01:11:46 +0000 Subject: [PATCH 64/78] OStatus sub setup code cleanup and partial group fixes (needs more work after the Atom updates are done) --- plugins/OStatus/actions/feedsubsettings.php | 15 +- plugins/OStatus/actions/pushcallback.php | 27 ++-- plugins/OStatus/classes/Ostatus_profile.php | 168 ++++++++++++++------ 3 files changed, 143 insertions(+), 67 deletions(-) diff --git a/plugins/OStatus/actions/feedsubsettings.php b/plugins/OStatus/actions/feedsubsettings.php index af8bf4d25e..6933c9bf21 100644 --- a/plugins/OStatus/actions/feedsubsettings.php +++ b/plugins/OStatus/actions/feedsubsettings.php @@ -197,6 +197,9 @@ class FeedSubSettingsAction extends ConnectSettingsAction if ($this->validateFeed()) { $this->preview = true; $this->profile = Ostatus_profile::ensureProfile($this->munger); + if (!$this->profile) { + throw new ServerException("Feed profile was not saved properly."); + } // If not already in use, subscribe to updates via the hub if ($this->profile->sub_start) { @@ -212,13 +215,10 @@ class FeedSubSettingsAction extends ConnectSettingsAction // And subscribe the current user to the local profile $user = common_current_user(); - $profile = $this->profile->getLocalProfile(); - if (!$profile) { - throw new ServerException("Feed profile was not saved properly."); - } if ($this->profile->isGroup()) { - if ($user->isMember($profile)) { + $group = $this->profile->localGroup(); + if ($user->isMember($group)) { $this->showForm(_m('Already a member!')); } elseif (Group_member::join($this->profile->group_id, $user->id)) { $this->showForm(_m('Joined remote group!')); @@ -226,9 +226,10 @@ class FeedSubSettingsAction extends ConnectSettingsAction $this->showForm(_m('Remote group join failed!')); } } else { - if ($user->isSubscribed($profile)) { + $local = $this->profile->localProfile(); + if ($user->isSubscribed($local)) { $this->showForm(_m('Already subscribed!')); - } elseif ($user->subscribeTo($profile)) { + } elseif ($user->subscribeTo($local)) { $this->showForm(_m('Feed subscribed!')); } else { $this->showForm(_m('Feed subscription failed!')); diff --git a/plugins/OStatus/actions/pushcallback.php b/plugins/OStatus/actions/pushcallback.php index a446593ff9..2601a377a0 100644 --- a/plugins/OStatus/actions/pushcallback.php +++ b/plugins/OStatus/actions/pushcallback.php @@ -84,27 +84,24 @@ class PushCallbackAction extends Action throw new ServerException("Bogus hub callback: unknown feed", 404); } - # Can't currently set the token in our sub api - #if ($feedinfo->verify_token !== $verify_token) { - # common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad token \"$verify_token\" for feed $topic"); - # throw new ServerError("Bogus hub callback: bad token", 404); - #} - + if ($profile->verify_token !== $verify_token) { + common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad token \"$verify_token\" for feed $topic"); + throw new ServerError("Bogus hub callback: bad token", 404); + } + + if ($mode != $profile->sub_state) { + common_log(LOG_WARNING, __METHOD__ . ": bogus hub callback with bad mode \"$mode\" for feed $topic in state \"{$profile->sub_state}\""); + throw new ServerException("Bogus hub callback: mode doesn't match subscription state.", 404); + } + // OK! if ($mode == 'subscribe') { common_log(LOG_INFO, __METHOD__ . ': sub confirmed'); - $profile->sub_start = common_sql_date(time()); - if ($lease_seconds > 0) { - $profile->sub_end = common_sql_date(time() + $lease_seconds); - } else { - $profile->sub_end = null; - } - $profile->update(); + $profile->confirmSubscribe($lease_seconds); } else { common_log(LOG_INFO, __METHOD__ . ": unsub confirmed; deleting sub record for $topic"); - $profile->delete(); + $profile->confirmUnsubscribe(); } - print $challenge; } } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 748ecce18f..f7bbcd0286 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -182,9 +182,24 @@ class Ostatus_profile extends Memcached_DataObject * Fetch the StatusNet-side profile for this feed * @return Profile */ - public function getLocalProfile() + public function localProfile() { - return Profile::staticGet('id', $this->profile_id); + if ($this->profile_id) { + return Profile::staticGet('id', $this->profile_id); + } + return null; + } + + /** + * Fetch the StatusNet-side profile for this feed + * @return Profile + */ + public function localGroup() + { + if ($this->group_id) { + return User_group::staticGet('id', $this->group_id); + } + return null; } /** @@ -194,73 +209,96 @@ class Ostatus_profile extends Memcached_DataObject */ public static function ensureProfile($munger) { - $entity = $munger->ostatusProfile(); + $profile = $munger->ostatusProfile(); - $current = self::staticGet('feeduri', $entity->feeduri); + $current = self::staticGet('feeduri', $profile->feeduri); if ($current) { // @fixme we should probably update info as necessary return $current; } - $entity->query('BEGIN'); + $profile->query('BEGIN'); // Awful hack! Awful hack! - $entity->verify = common_good_rand(16); - $entity->secret = common_good_rand(32); + $profile->verify = common_good_rand(16); + $profile->secret = common_good_rand(32); try { - $profile = $munger->profile(); + $local = $munger->profile(); + + if ($entity->isGroup()) { + $group = new User_group(); + $group->nickname = $local->nickname . '@remote'; // @fixme + $group->fullname = $local->fullname; + $group->homepage = $local->homepage; + $group->location = $local->location; + $group->created = $local->created; + $group->insert(); + if (empty($result)) { + throw new FeedDBException($group); + } + $profile->group_id = $group->id; + } else { + $result = $local->insert(); + if (empty($result)) { + throw new FeedDBException($local); + } + $profile->profile_id = $local->id; + } + + $profile->created = sql_common_date(); + $profile->lastupdate = sql_common_date(); $result = $profile->insert(); if (empty($result)) { throw new FeedDBException($profile); } - $avatar = $munger->getAvatar(); - if ($avatar) { - // @fixme this should be better encapsulated - // ripped from oauthstore.php (for old OMB client) - $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar'); - copy($avatar, $temp_filename); - $imagefile = new ImageFile($profile->id, $temp_filename); - $filename = Avatar::filename($profile->id, - image_type_to_extension($imagefile->type), - null, - common_timestamp()); - rename($temp_filename, Avatar::path($filename)); - $profile->setOriginal($filename); - } - - $entity->profile_id = $profile->id; - if ($entity->isGroup()) { - $group = new User_group(); - $group->nickname = $profile->nickname . '@remote'; // @fixme - $group->fullname = $profile->fullname; - $group->homepage = $profile->homepage; - $group->location = $profile->location; - $group->created = $profile->created; - $group->insert(); - - if ($avatar) { - $group->setOriginal($filename); - } - - $entity->group_id = $group->id; - } - - $result = $entity->insert(); - if (empty($result)) { - throw new FeedDBException($entity); - } - $entity->query('COMMIT'); } catch (FeedDBException $e) { common_log_db_error($e->obj, 'INSERT', __FILE__); $entity->query('ROLLBACK'); return false; } + + $avatar = $munger->getAvatar(); + if ($avatar) { + try { + $this->updateAvatar($avatar); + } catch (Exception $e) { + common_log(LOG_ERR, "Exception setting OStatus avatar: " . + $e->getMessage()); + } + } + return $entity; } + /** + * Download and update given avatar image + * @param string $url + * @throws Exception in various failure cases + */ + public function updateAvatar($url) + { + // @fixme this should be better encapsulated + // ripped from oauthstore.php (for old OMB client) + $temp_filename = tempnam(sys_get_temp_dir(), 'listener_avatar'); + copy($url, $temp_filename); + $imagefile = new ImageFile($profile->id, $temp_filename); + $filename = Avatar::filename($profile->id, + image_type_to_extension($imagefile->type), + null, + common_timestamp()); + rename($temp_filename, Avatar::path($filename)); + if ($this->isGroup()) { + $group = $this->localGroup(); + $group->setOriginal($filename); + } else { + $profile = $this->localProfile(); + $profile->setOriginal($filename); + } + } + /** * Damn dirty hack! */ @@ -318,6 +356,46 @@ class Ostatus_profile extends Memcached_DataObject } } + /** + * Save PuSH subscription confirmation. + * Sets approximate lease start and end times and finalizes state. + * + * @param int $lease_seconds provided hub.lease_seconds parameter, if given + */ + public function confirmSubscribe($lease_seconds=0) + { + $original = clone($this); + + $this->sub_state = 'active'; + $this->sub_start = common_sql_date(time()); + if ($lease_seconds > 0) { + $this->sub_end = common_sql_date(time() + $lease_seconds); + } else { + $this->sub_end = null; + } + $this->lastupdate = common_sql_date(); + + return $this->update($original); + } + + /** + * Save PuSH unsubscription confirmation. + * Wipes active PuSH sub info and resets state. + */ + public function confirmUnsubscribe() + { + $original = clone($this); + + $this->verify_token = null; + $this->secret = null; + $this->sub_state = null; + $this->sub_start = null; + $this->sub_end = null; + $this->lastupdate = common_sql_date(); + + return $this->update($original); + } + /** * Send an unsubscription request to the hub for this feed. * The hub will later send us a confirmation POST to /main/push/callback. From 5f94efc45463378f246f9db82e9f2e0e8a109f7d Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 12 Feb 2010 00:42:42 -0500 Subject: [PATCH 65/78] stub for activities --- plugins/OStatus/lib/activity.php | 85 ++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 plugins/OStatus/lib/activity.php diff --git a/plugins/OStatus/lib/activity.php b/plugins/OStatus/lib/activity.php new file mode 100644 index 0000000000..36e2279134 --- /dev/null +++ b/plugins/OStatus/lib/activity.php @@ -0,0 +1,85 @@ +. + * + * @category OStatus + * @package StatusNet + * @author Evan Prodromou + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +class ActivityNoun +{ + const ARTICLE = 'http://activitystrea.ms/schema/1.0/article'; + const BLOGENTRY = 'http://activitystrea.ms/schema/1.0/blog-entry'; + const NOTE = 'http://activitystrea.ms/schema/1.0/note'; + const STATUS = 'http://activitystrea.ms/schema/1.0/status'; + const FILE = 'http://activitystrea.ms/schema/1.0/file'; + const PHOTO = 'http://activitystrea.ms/schema/1.0/photo'; + const ALBUM = 'http://activitystrea.ms/schema/1.0/photo-album'; + const PLAYLIST = 'http://activitystrea.ms/schema/1.0/playlist'; + const VIDEO = 'http://activitystrea.ms/schema/1.0/video'; + const AUDIO = 'http://activitystrea.ms/schema/1.0/audio'; + const BOOKMARK = 'http://activitystrea.ms/schema/1.0/bookmark'; + const PERSON = 'http://activitystrea.ms/schema/1.0/person'; + const GROUP = 'http://activitystrea.ms/schema/1.0/group'; + const PLACE = 'http://activitystrea.ms/schema/1.0/place'; + const COMMENT = 'http://activitystrea.ms/schema/1.0/comment'; // tea + + public $type; + public $id; + public $title; + public $summary; + public $content; +} + +class Activity +{ + const NAMESPACE = 'http://activitystrea.ms/schema/1.0/'; + + const POST = 'http://activitystrea.ms/schema/1.0/post'; + const SHARE = 'http://activitystrea.ms/schema/1.0/share'; + const SAVE = 'http://activitystrea.ms/schema/1.0/save'; + const FAVORITE = 'http://activitystrea.ms/schema/1.0/favorite'; + const PLAY = 'http://activitystrea.ms/schema/1.0/play'; + const FOLLOW = 'http://activitystrea.ms/schema/1.0/follow'; + const FRIEND = 'http://activitystrea.ms/schema/1.0/make-friend'; + const JOIN = 'http://activitystrea.ms/schema/1.0/join'; + const TAG = 'http://activitystrea.ms/schema/1.0/tag'; + + public $actor; // an ActivityNoun + public $verb; // a string (the URL) + public $object; // an ActivityNoun + public $target; // an ActivityNoun + + static function fromAtomEntry($domEntry) + { + } + + function toAtomEntry() + { + } +} From 320532560fe6fa4661d58317923c54b708c897c2 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 12 Feb 2010 00:43:16 -0500 Subject: [PATCH 66/78] flesh out salmon endpoint --- plugins/OStatus/actions/salmon.php | 52 ++++++++++++++++++++++++------ 1 file changed, 42 insertions(+), 10 deletions(-) diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php index 012869cf73..b616027a93 100644 --- a/plugins/OStatus/actions/salmon.php +++ b/plugins/OStatus/actions/salmon.php @@ -22,28 +22,60 @@ * @author James Walker */ -if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } +if (!defined('STATUSNET')) { + exit(1); +} class SalmonAction extends Action { + var $user = null; + var $xml = null; + var $activity = null; - function handle() + function prepare($args) { - parent::handle(); - if ($_SERVER['REQUEST_METHOD'] == 'POST') { - $this->handlePost(); + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->clientError(_('This method requires a POST.')); } - } + if ($_SERVER['CONTENT_TYPE'] != 'application/atom+xml') { + $this->clientError(_('Salmon requires application/atom+xml')); + } - function handlePost() - { - $user_id = $this->arg('id'); - common_log(LOG_DEBUG, 'Salmon: incoming post for user: '. $user_id); + $id = $this->trimmed('id'); + + if (!$id) { + $this->clientError(_('No ID.')); + } + + $this->user = User::staticGet($id); + + if (empty($this->user)) { + $this->clientError(_('No such user.')); + } $xml = file_get_contents('php://input'); + $dom = DOMDocument::loadXML($xml); + + // XXX: check that document element is Atom entry + // XXX: check the signature + + $this->act = Activity::fromAtomEntry($dom->documentElement); + } + + function handle($args) + { + common_log(LOG_DEBUG, 'Salmon: incoming post for user: '. $user_id); + // TODO : Insert new $xml -> notice code + switch ($this->act->verb) + { + case Activity::POST: + case Activity::SHARE: + case Activity::FAVORITE: + case Activity::FOLLOW: + } } } From fd527b8de120587670eb6fdd0ecce7ca7833ea72 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Fri, 12 Feb 2010 11:34:23 +0100 Subject: [PATCH 67/78] Moved colour properties out of base stylesheet --- theme/base/css/display.css | 3 --- theme/default/css/display.css | 9 ++++++--- theme/identica/css/display.css | 10 +++++++--- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 8490fb5803..70ddc411f8 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -1109,15 +1109,12 @@ right:29px; z-index:9; min-width:199px; float:none; -background-color:#FFF; padding:11px; border-radius:7px; -moz-border-radius:7px; -webkit-border-radius:7px; border-style:solid; border-width:1px; -border-color:#DDDDDD; --moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); } .dialogbox legend { diff --git a/theme/default/css/display.css b/theme/default/css/display.css index 82eb135316..02e1645f47 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -46,7 +46,8 @@ box-shadow:3px 3px 7px rgba(194, 194, 194, 0.3); .pagination .nav_prev a, .pagination .nav_next a, .form_settings fieldset fieldset, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { border-color:#DDDDDD; } @@ -221,7 +222,8 @@ border-color:transparent; #content, #site_nav_local_views .current a, .entity_send-a-message .form_notice, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { background-color:#FFFFFF; } @@ -308,7 +310,8 @@ background-position: 5px -718px; background-position: 5px -852px; } .entity_send-a-message .form_notice, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); -moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); -webkit-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index 44ae4953b7..6dc7d21df0 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -46,7 +46,8 @@ box-shadow:3px 3px 7px rgba(194, 194, 194, 0.3); .pagination .nav_prev a, .pagination .nav_next a, .form_settings fieldset fieldset, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { border-color:#DDDDDD; } @@ -88,6 +89,7 @@ color:#FFFFFF; border-color:transparent; text-shadow:none; } + .dialogbox .submit_dialogbox, input.submit, .form_notice input.submit { @@ -221,7 +223,8 @@ border-color:transparent; #content, #site_nav_local_views .current a, .entity_send-a-message .form_notice, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { background-color:#FFFFFF; } @@ -307,7 +310,8 @@ background-position: 5px -718px; background-position: 5px -852px; } .entity_send-a-message .form_notice, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); -moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); -webkit-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); From 3c79448cd817d01b4421262fefc29eb558cede20 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Fri, 12 Feb 2010 11:34:23 +0100 Subject: [PATCH 68/78] Moved colour properties out of base stylesheet --- theme/base/css/display.css | 3 --- theme/default/css/display.css | 9 ++++++--- theme/identica/css/display.css | 10 +++++++--- 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 8490fb5803..70ddc411f8 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -1109,15 +1109,12 @@ right:29px; z-index:9; min-width:199px; float:none; -background-color:#FFF; padding:11px; border-radius:7px; -moz-border-radius:7px; -webkit-border-radius:7px; border-style:solid; border-width:1px; -border-color:#DDDDDD; --moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); } .dialogbox legend { diff --git a/theme/default/css/display.css b/theme/default/css/display.css index 82eb135316..02e1645f47 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -46,7 +46,8 @@ box-shadow:3px 3px 7px rgba(194, 194, 194, 0.3); .pagination .nav_prev a, .pagination .nav_next a, .form_settings fieldset fieldset, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { border-color:#DDDDDD; } @@ -221,7 +222,8 @@ border-color:transparent; #content, #site_nav_local_views .current a, .entity_send-a-message .form_notice, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { background-color:#FFFFFF; } @@ -308,7 +310,8 @@ background-position: 5px -718px; background-position: 5px -852px; } .entity_send-a-message .form_notice, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); -moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); -webkit-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index 44ae4953b7..6dc7d21df0 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -46,7 +46,8 @@ box-shadow:3px 3px 7px rgba(194, 194, 194, 0.3); .pagination .nav_prev a, .pagination .nav_next a, .form_settings fieldset fieldset, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { border-color:#DDDDDD; } @@ -88,6 +89,7 @@ color:#FFFFFF; border-color:transparent; text-shadow:none; } + .dialogbox .submit_dialogbox, input.submit, .form_notice input.submit { @@ -221,7 +223,8 @@ border-color:transparent; #content, #site_nav_local_views .current a, .entity_send-a-message .form_notice, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { background-color:#FFFFFF; } @@ -307,7 +310,8 @@ background-position: 5px -718px; background-position: 5px -852px; } .entity_send-a-message .form_notice, -.entity_moderation:hover ul { +.entity_moderation:hover ul, +.dialogbox { box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); -moz-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); -webkit-box-shadow:3px 7px 5px rgba(194, 194, 194, 0.7); From 42679a22dc712467db567a9bac41c58e4788dd58 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Fri, 12 Feb 2010 12:04:14 +0100 Subject: [PATCH 69/78] Extracted default values for dialogbox layout and uniqe for form_repeat --- theme/base/css/display.css | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 70ddc411f8..990280d847 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -1104,10 +1104,9 @@ left:0; .dialogbox { position:absolute; -top:-4px; -right:29px; +top:0; +right:0; z-index:9; -min-width:199px; float:none; padding:11px; border-radius:7px; @@ -1142,6 +1141,12 @@ outline:none; text-indent:-9999px; } +.form_repeat.dialogbox { +top:-4px; +right:29px; +min-width:199px; +} + .notice-options { position:relative; font-size:0.95em; From b57e3dfae2f48ef6097fef04df218201783abed1 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Fri, 12 Feb 2010 14:16:38 +0100 Subject: [PATCH 70/78] More style generalisation for dialogbox --- theme/base/css/display.css | 16 ++++++++++++++-- theme/default/css/display.css | 14 ++++++++------ theme/identica/css/display.css | 11 ++++++----- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 990280d847..3218276a68 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -1104,8 +1104,8 @@ left:0; .dialogbox { position:absolute; -top:0; -right:0; +top:-1px; +right:-1px; z-index:9; float:none; padding:11px; @@ -1119,6 +1119,7 @@ border-width:1px; .dialogbox legend { display:block !important; margin-right:18px; +margin-bottom:18px; } .dialogbox button.close { @@ -1127,11 +1128,22 @@ right:3px; top:3px; } +.dialogbox .form_guide { +font-weight:normal; +padding:0; +} + .dialogbox .submit_dialogbox { font-weight:bold; text-indent:0; min-width:46px; } +.dialogbox input { +padding-left:4px; +} +.dialogbox fieldset { +margin-bottom:0; +} #wrap form.processing input.submit, .entity_actions a.processing, diff --git a/theme/default/css/display.css b/theme/default/css/display.css index 02e1645f47..a2f1013428 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -30,7 +30,9 @@ border-radius:4px; input, textarea, select, option { font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; } -input, textarea, select { +input, textarea, select, +.entity_actions .dialogbox input, +.mark-top { border-color:#AAAAAA; } @@ -79,7 +81,8 @@ background-color:transparent; input:focus, textarea:focus, select:focus, .form_notice.warning #notice_data-text, .form_notice.warning #notice_text-count, -.form_settings .form_note { +.form_settings .form_note, +.entity_actions .dialogbox .form_data input:focus { border-color:#9BB43E; } input.submit { @@ -134,9 +137,6 @@ color:#002FA7; #content tbody tr { border-top-color:#C8D1D5; } -.mark-top { -border-color:#AAAAAA; -} #aside_primary { background-color:#C8D1D5; @@ -145,7 +145,9 @@ background-color:#C8D1D5; #notice_text-count { color:#333333; } -.form_notice.warning #notice_text-count { +.form_notice.warning #notice_text-count, +.dialogbox, +.entity_actions .dialogbox input { color:#000000; } .form_notice label[for=notice_data-attach] { diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index 6dc7d21df0..e214047451 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -30,7 +30,9 @@ border-radius:4px; input, textarea, select, option { font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; } -input, textarea, select { +input, textarea, select, +.entity_actions .dialogbox input, +.mark-top { border-color:#AAAAAA; } @@ -135,9 +137,6 @@ color:#002FA7; #content tbody tr { border-top-color:#CEE1E9; } -.mark-top { -border-color:#AAAAAA; -} #aside_primary { background-color:#CEE1E9; @@ -146,7 +145,9 @@ background-color:#CEE1E9; #notice_text-count { color:#333333; } -.form_notice.warning #notice_text-count { +.form_notice.warning #notice_text-count, +.dialogbox, +.entity_actions .dialogbox input { color:#000000; } .form_notice label[for=notice_data-attach] { From 094565b4aa1893e6a4422f3d05a0a43844e47a67 Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Fri, 12 Feb 2010 18:20:13 +0100 Subject: [PATCH 71/78] Added 'pre' to pick up Palm Pre's UA string: Mozilla/5.0 (webOS/1.3.5.1; U; en-US) AppleWebKit/525.27.1 (KHTML, like Gecko) Version/1.0 Safari/525.27.1 Pre/1.0 --- plugins/MobileProfile/MobileProfilePlugin.php | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/MobileProfile/MobileProfilePlugin.php b/plugins/MobileProfile/MobileProfilePlugin.php index cd2531fa72..e9b4a05f7d 100644 --- a/plugins/MobileProfile/MobileProfilePlugin.php +++ b/plugins/MobileProfile/MobileProfilePlugin.php @@ -121,6 +121,7 @@ class MobileProfilePlugin extends WAP20Plugin 'philips', 'pocketpc', 'portalmmm', + 'pre', 'rover', 'samsung', 'sanyo', From 47f6b0afc9a94b5e649102dd209950b94c6ac33a Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Fri, 12 Feb 2010 18:30:27 +0100 Subject: [PATCH 72/78] Revert "Added 'pre' to pick up Palm Pre's UA string:" This reverts commit 094565b4aa1893e6a4422f3d05a0a43844e47a67. On second thought, "pre" is probably the stupidest way of differentiating one agent from another. Need a different solution. --- plugins/MobileProfile/MobileProfilePlugin.php | 1 - 1 file changed, 1 deletion(-) diff --git a/plugins/MobileProfile/MobileProfilePlugin.php b/plugins/MobileProfile/MobileProfilePlugin.php index e9b4a05f7d..cd2531fa72 100644 --- a/plugins/MobileProfile/MobileProfilePlugin.php +++ b/plugins/MobileProfile/MobileProfilePlugin.php @@ -121,7 +121,6 @@ class MobileProfilePlugin extends WAP20Plugin 'philips', 'pocketpc', 'portalmmm', - 'pre', 'rover', 'samsung', 'sanyo', From b39047d95b447251de75d15b986017286aca05e0 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 12 Feb 2010 18:54:48 +0000 Subject: [PATCH 73/78] OStatus: prep work for sending notifications on sub/unsub/join/leave/favorite/unfavorite via Salmon; needs to be completed and hooked up once feed gen is fixed. --- classes/Profile.php | 34 ++++- plugins/OStatus/classes/Ostatus_profile.php | 153 +++++++++++++++++++- 2 files changed, 184 insertions(+), 3 deletions(-) diff --git a/classes/Profile.php b/classes/Profile.php index 3e5150c182..ab05bb8546 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -755,6 +755,14 @@ class Profile extends Memcached_DataObject return !empty($notice); } + /** + * Returns an XML string fragment with limited profile information + * as an Atom element. + * + * Assumes that Atom has been previously set up as the base namespace. + * + * @return string + */ function asAtomAuthor() { $xs = new XMLStringer(true); @@ -767,11 +775,33 @@ class Profile extends Memcached_DataObject return $xs->getString(); } + /** + * Returns an XML string fragment with profile information as an + * Activity Streams element. + * + * Assumes that 'activity' namespace has been previously defined. + * + * @return string + */ function asActivityActor() + { + return $this->asActivityNoun('actor'); + } + + /** + * Returns an XML string fragment with profile information as an + * Activity Streams noun object with the given element type. + * + * Assumes that 'activity' namespace has been previously defined. + * + * @param string $element one of 'actor', 'subject', 'object', 'target' + * @return string + */ + function asActivityNoun($element) { $xs = new XMLStringer(true); - $xs->elementStart('activity:actor'); + $xs->elementStart('activity:' . $element); $xs->element( 'activity:object-type', null, @@ -799,7 +829,7 @@ class Profile extends Memcached_DataObject '' ); - $xs->elementEnd('activity:actor'); + $xs->elementEnd('activity:' . $element); return $xs->getString(); } diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index f7bbcd0286..733d8843b8 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -299,6 +299,71 @@ class Ostatus_profile extends Memcached_DataObject } } + /** + * Returns an XML string fragment with profile information as an + * Activity Streams noun object with the given element type. + * + * Assumes that 'activity' namespace has been previously defined. + * + * @param string $element one of 'actor', 'subject', 'object', 'target' + * @return string + */ + function asActivityNoun($element) + { + $xs = new XMLStringer(true); + + $avatarHref = Avatar::defaultImage(AVATAR_PROFILE_SIZE); + $avatarType = 'image/png'; + if ($this->isGroup()) { + $type = 'http://activitystrea.ms/schema/1.0/group'; + $self = $this->localGroup(); + + // @fixme put a standard getAvatar() interface on groups too + if ($self->homepage_logo) { + $avatarHref = $self->homepage_logo; + $map = array('png' => 'image/png', + 'jpg' => 'image/jpeg', + 'jpeg' => 'image/jpeg', + 'gif' => 'image/gif'); + $extension = pathinfo(parse_url($avatarHref, PHP_URL_PATH), PATHINFO_EXTENSION); + if (isset($map[$extension])) { + $avatarType = $map[$extension]; + } + } + } else { + $type = 'http://activitystrea.ms/schema/1.0/person'; + $self = $this->localProfile(); + $avatar = $self->getAvatar(AVATAR_PROFILE_SIZE); + if ($avatar) { + $avatarHref = $avatar-> + $avatarType = $avatar->mediatype; + } + } + $xs->elementStart('activity:' . $element); + $xs->element( + 'activity:object-type', + null, + $type + ); + $xs->element( + 'id', + null, + $this->homeuri); // ? + $xs->element('title', null, $self->getBestName()); + + $xs->element( + 'link', array( + 'type' => $avatarType, + 'href' => $avatarHref + ), + '' + ); + + $xs->elementEnd('activity:' . $element); + + return $xs->getString(); + } + /** * Damn dirty hack! */ @@ -397,7 +462,7 @@ class Ostatus_profile extends Memcached_DataObject } /** - * Send an unsubscription request to the hub for this feed. + * Send a PuSH unsubscription request to the hub for this feed. * The hub will later send us a confirmation POST to /main/push/callback. * * @return bool true on success, false on failure @@ -406,6 +471,92 @@ class Ostatus_profile extends Memcached_DataObject return $this->subscribe('unsubscribe'); } + /** + * Send an Activity Streams notification to the remote Salmon endpoint, + * if so configured. + * + * @param Profile $actor + * @param $verb eg Activity::SUBSCRIBE or Activity::JOIN + * @param $object object of the action; if null, the remote entity itself is assumed + */ + public function notify(Profile $actor, $verb, $object=null) + { + if ($object == null) { + $object = $this; + } + if ($this->salmonuri) { + $text = 'update'; // @fixme + $id = 'tag:' . common_config('site', 'server') . + ':' . $verb . + ':' . $actor->id . + ':' . time(); // @fixme + + $entry = new Atom10Entry(); + $entry->elementStart('entry'); + $entry->element('id', null, $id); + $entry->element('title', null, $text); + $entry->element('summary', null, $text); + $entry->element('published', null, common_date_w3dtf()); + + $entry->element('activity:verb', null, $verb); + $entry->raw($profile->asAtomAuthor()); + $entry->raw($profile->asActivityActor()); + $entry->raw($object->asActivityNoun('object')); + $entry->elmentEnd('entry'); + + $feed = $this->atomFeed($actor); + $feed->initFeed(); + $feed->addEntry($entry); + $feed->renderEntries(); + $feed->endFeed(); + + $xml = $feed->getString(); + common_log(LOG_INFO, "Posting to Salmon endpoint $salmon: $xml"); + + $salmon = new Salmon(); // ? + $salmon->post($this->salmonuri, $xml); + } + } + + function getBestName() + { + if ($this->isGroup()) { + return $this->localGroup()->getBestName(); + } else { + return $this->localProfile()->getBestName(); + } + } + + function atomFeed($actor) + { + $feed = new Atom10Feed(); + // @fixme should these be set up somewhere else? + $feed->addNamespace('activity', 'http://activitystrea.ms/spec/1.0/'); + $feed->addNamesapce('thr', 'http://purl.org/syndication/thread/1.0'); + $feed->addNamespace('georss', 'http://www.georss.org/georss'); + $feed->addNamespace('ostatus', 'http://ostatus.org/schema/1.0'); + + $taguribase = common_config('integration', 'taguri'); + $feed->setId("tag:{$taguribase}:UserTimeline:{$actor->id}"); // ??? + + $feed->setTitle($actor->getBestName() . ' timeline'); // @fixme + $feed->setUpdated(time()); + $feed->setPublished(time()); + + $feed->addLink(common_url('ApiTimelineUser', + array('id' => $actor->id, + 'type' => 'atom')), + array('rel' => 'self', + 'type' => 'application/atom+xml')); + + $feed->addLink(common_url('userbyid', + array('id' => $actor->id)), + array('rel' => 'alternate', + 'type' => 'text/html')); + + return $feed; + } + /** * Read and post notices for updates from the feed. * Currently assumes that all items in the feed are new, From fd3c9334bfcfe627446feb86ac3054b24ed05449 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 12 Feb 2010 11:15:12 -0800 Subject: [PATCH 74/78] PHP 5.3 compatibility hack for DB_DataObject statusnet.links.ini file could not be read anymore due to the entry for nonce containing a comma in its key value. PHP's parse_ini_file() function no longer allows commas in keys, and rejects the *ENTIRE FILE* if it's present, breaking various automatic joins. --- classes/Nonce.php | 15 +++++++++++++++ classes/statusnet.links.ini | 7 +++++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/classes/Nonce.php b/classes/Nonce.php index 486a65a3c7..2f8ab00b5d 100644 --- a/classes/Nonce.php +++ b/classes/Nonce.php @@ -22,4 +22,19 @@ class Nonce extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + /** + * Compatibility hack for PHP 5.3 + * + * The statusnet.links.ini entry cannot be read because "," is no longer + * allowed in key names when read by parse_ini_file(). + * + * @return array + * @access public + */ + function links() + { + return array('consumer_key,token' => 'token:consumer_key,token'); + } + } diff --git a/classes/statusnet.links.ini b/classes/statusnet.links.ini index 7f233e6760..b9dd5af0c9 100644 --- a/classes/statusnet.links.ini +++ b/classes/statusnet.links.ini @@ -19,8 +19,11 @@ profile_id = profile:id [token] consumer_key = consumer:consumer_key -[nonce] -consumer_key,token = token:consumer_key,token +; Compatibility hack for PHP 5.3 +; This entry has been moved to the class definition, as commas are no longer +; considered valid in keys, causing parse_ini_file() to reject the whole file. +;[nonce] +;consumer_key,token = token:consumer_key,token [confirm_address] user_id = user:id From 506c2d7491f7f229a1469ef176fee6c21d61a6c6 Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 12 Feb 2010 12:22:12 -0800 Subject: [PATCH 75/78] Initial upgraded Atom output for group timelines --- actions/apitimelinegroup.php | 62 ++++++++++++++++++++++++-------- classes/User_group.php | 33 +++++++++++++++++ lib/api.php | 2 +- lib/atom10feed.php | 70 ++++++++++++++++++++++++++++++++++-- 4 files changed, 149 insertions(+), 18 deletions(-) diff --git a/actions/apitimelinegroup.php b/actions/apitimelinegroup.php index fd2ed9ff93..45962fa76f 100644 --- a/actions/apitimelinegroup.php +++ b/actions/apitimelinegroup.php @@ -109,38 +109,70 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction $title = sprintf(_("%s timeline"), $this->group->nickname); $taguribase = common_config('integration', 'taguri'); $id = "tag:$taguribase:GroupTimeline:" . $this->group->id; - $link = common_local_url( - 'showgroup', - array('nickname' => $this->group->nickname) - ); + $subtitle = sprintf( _('Updates from %1$s on %2$s!'), $this->group->nickname, $sitename ); - $logo = ($avatar) ? $avatar : User_group::defaultLogo(AVATAR_PROFILE_SIZE); + + $logo = ($avatar) ? $avatar : User_group::defaultLogo(AVATAR_PROFILE_SIZE); switch($this->format) { case 'xml': $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo); - break; - case 'atom': - $selfuri = common_root_url() . - 'api/statusnet/groups/timeline/' . - $this->group->id . '.atom'; - $this->showAtomTimeline( + $this->showRssTimeline( $this->notices, $title, - $id, - $link, + $this->group->homeUrl(), $subtitle, null, - $selfuri, $logo ); + break; + case 'atom': + + header('Content-Type: application/atom+xml; charset=utf-8'); + + try { + + $atom = new AtomNoticeFeed(); + + $atom->setId($id); + $atom->setTitle($title); + $atom->setSubtitle($subtitle); + $atom->setLogo($logo); + $atom->setUpdated('now'); + + $atom->addAuthorRaw($this->group->asAtomAuthor()); + $atom->setActivitySubject($this->group->asActivitySubject()); + + $atom->addLink($this->group->homeUrl()); + + $id = $this->arg('id'); + $aargs = array('format' => 'atom'); + if (!empty($id)) { + $aargs['id'] = $id; + } + + $atom->addLink( + $this->getSelfUri('ApiTimelineGroup', $aargs), + array('rel' => 'self', 'type' => 'application/atom+xml') + ); + + $atom->addEntryFromNotices($this->notices); + + $this->raw($atom->getString()); + + } catch (Atom10FeedException $e) { + $this->serverError( + 'Could not generate feed for group - ' . $e->getMessage() + ); + return; + } + break; case 'json': $this->showJsonTimeline($this->notices); diff --git a/classes/User_group.php b/classes/User_group.php index 1fbb50a6eb..379e6b7219 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -355,6 +355,39 @@ class User_group extends Memcached_DataObject return $xs->getString(); } + function asAtomAuthor() + { + $xs = new XMLStringer(true); + + $xs->elementStart('author'); + $xs->element('name', null, $this->nickname); + $xs->element('uri', null, $this->permalink()); + $xs->elementEnd('author'); + + return $xs->getString(); + } + + function asActivitySubject() + { + $xs = new XMLStringer(true); + + $xs->elementStart('activity:subject'); + $xs->element('activity:object', null, 'http://activitystrea.ms/schema/1.0/group'); + $xs->element('id', null, $this->permalink()); + $xs->element('title', null, $this->getBestName()); + $xs->element( + 'link', array( + 'rel' => 'avatar', + 'href' => empty($this->homepage_logo) + ? User_group::defaultLogo(AVATAR_PROFILE_SIZE) + : $this->homepage_logo + ) + ); + $xs->elementEnd('activity:subject'); + + return $xs->getString(); + } + static function register($fields) { // MAGICALLY put fields into current scope diff --git a/lib/api.php b/lib/api.php index 8f1fe1ef71..494b595d17 100644 --- a/lib/api.php +++ b/lib/api.php @@ -1103,7 +1103,7 @@ class ApiAction extends Action } } - function serverError($msg, $code = 500, $content_type = 'json') + function serverError($msg, $code = 500, $content_type = 'xml') { $action = $this->trimmed('action'); diff --git a/lib/atom10feed.php b/lib/atom10feed.php index ccca76a09e..806a9684b7 100644 --- a/lib/atom10feed.php +++ b/lib/atom10feed.php @@ -51,6 +51,7 @@ class Atom10Feed extends XMLStringer public $xw; private $namespaces; private $authors; + private $subject; private $categories; private $contributors; private $generator; @@ -74,6 +75,7 @@ class Atom10Feed extends XMLStringer function __construct($indent = true) { parent::__construct($indent); $this->namespaces = array(); + $this->authors = array(); $this->links = array(); $this->entries = array(); $this->addNamespace('xmlns', 'http://www.w3.org/2005/Atom'); @@ -93,6 +95,64 @@ class Atom10Feed extends XMLStringer $this->namespaces = array_merge($this->namespaces, $ns); } + function addAuthor($name, $uri = null, $email = null) + { + $xs = new XMLStringer(true); + + $xs->elementStart('author'); + + if (!empty($name)) { + $xs->element('name', null, $name); + } else { + throw new Atom10FeedException( + 'author element must contain a name element.' + ); + } + + if (!is_null($uri)) { + $xs->element('uri', null, $uri); + } + + if (!is_null(email)) { + $xs->element('email', null, $email); + } + + $xs->elementEnd('author'); + + array_push($this->authors, $xs->getString()); + } + + /** + * Add an Author to the feed via raw XML string + * + * @param string $xmlAuthor An XML string representation author + * + * @return void + */ + function addAuthorRaw($xmlAuthor) + { + array_push($this->authors, $xmlAuthor); + } + + function renderAuthors() + { + foreach ($this->authors as $author) { + $this->raw($author); + } + } + + /** + * Add a activity feed subject via raw XML string + * + * @param string $xmlSubject An XML string representation of the subject + * + * @return void + */ + function setActivitySubject($xmlSubject) + { + $this->subject = $xmlSubject; + } + function getNamespaces() { return $this->namespaces; @@ -136,9 +196,9 @@ class Atom10Feed extends XMLStringer } } - function addEntryRaw($entry) + function addEntryRaw($xmlEntry) { - array_push($this->entries, $entry); + array_push($this->entries, $xmlEntry); } function addEntry($entry) @@ -164,6 +224,12 @@ class Atom10Feed extends XMLStringer $this->validate(); $this->initFeed(); + $this->renderAuthors(); + + if (!empty($this->subject)) { + $this->raw($this->subject); + } + $this->renderEntries(); $this->endFeed(); From 38f42d56bc5f2871d69d1df066a1f1d76e7cbc68 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 12 Feb 2010 15:24:15 -0800 Subject: [PATCH 76/78] Session fix for PHP 5.3 configurations where cookies are excluded from $_REQUEST via request_order in php.ini (Fedora 12, MacPorts known to be affected) --- lib/util.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/util.php b/lib/util.php index a07fe49e33..209dc2254e 100644 --- a/lib/util.php +++ b/lib/util.php @@ -367,7 +367,8 @@ function common_current_user() if ($_cur === false) { - if (isset($_REQUEST[session_name()]) || (isset($_SESSION['userid']) && $_SESSION['userid'])) { + if (isset($_COOKIE[session_name()]) || isset($_GET[session_name()]) + || (isset($_SESSION['userid']) && $_SESSION['userid'])) { common_ensure_session(); $id = isset($_SESSION['userid']) ? $_SESSION['userid'] : false; if ($id) { From d6f1df8b76259acfc0d0566e8bf3610172b27884 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 12 Feb 2010 15:30:23 -0800 Subject: [PATCH 77/78] fix for Atom notice output: correct check against conversation & current id --- classes/Notice.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/classes/Notice.php b/classes/Notice.php index 924931e42b..73b22d58a0 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -1016,7 +1016,7 @@ class Notice extends Memcached_DataObject } if (!empty($this->conversation) - && $this->conversation != $this->notice->id) { + && $this->conversation != $this->id) { $xs->element( 'link', array( 'rel' => 'ostatus:conversation', From 14a7353fd5583066b154836cccf035e87310ee97 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sun, 14 Feb 2010 21:12:59 +0100 Subject: [PATCH 78/78] Localisation updates for !StatusNet from !translatewiki.net !sntrans --- locale/ar/LC_MESSAGES/statusnet.po | 90 +++++---- locale/arz/LC_MESSAGES/statusnet.po | 225 +++++++++++------------ locale/en_GB/LC_MESSAGES/statusnet.po | 60 +++--- locale/es/LC_MESSAGES/statusnet.po | 252 +++++++++++--------------- locale/pt_BR/LC_MESSAGES/statusnet.po | 130 ++++++------- locale/ru/LC_MESSAGES/statusnet.po | 62 +++---- locale/statusnet.po | 56 +++--- 7 files changed, 415 insertions(+), 460 deletions(-) diff --git a/locale/ar/LC_MESSAGES/statusnet.po b/locale/ar/LC_MESSAGES/statusnet.po index 82eb96e5f2..c7276b56f7 100644 --- a/locale/ar/LC_MESSAGES/statusnet.po +++ b/locale/ar/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-11 08:14+0000\n" -"PO-Revision-Date: 2010-02-11 08:14:11+0000\n" +"POT-Creation-Date: 2010-02-14 20:05+0000\n" +"PO-Revision-Date: 2010-02-14 20:05:58+0000\n" "Language-Team: Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ar\n" "X-Message-Group: out-statusnet\n" @@ -26,14 +26,12 @@ msgid "Access" msgstr "نفاذ" #: actions/accessadminpanel.php:65 -#, fuzzy msgid "Site access settings" -msgstr "اذف إعدادت الموقع" +msgstr "إعدادات الوصول إلى الموقع" #: actions/accessadminpanel.php:158 -#, fuzzy msgid "Registration" -msgstr "سجّل" +msgstr "تسجيل" #: actions/accessadminpanel.php:161 msgid "Private" @@ -72,9 +70,8 @@ msgid "Save" msgstr "أرسل" #: actions/accessadminpanel.php:189 -#, fuzzy msgid "Save access settings" -msgstr "اذف إعدادت الموقع" +msgstr "حفظ إعدادت الوصول" #: actions/all.php:63 actions/public.php:97 actions/replies.php:92 #: actions/showfavorites.php:137 actions/tag.php:51 @@ -165,8 +162,8 @@ msgstr "" msgid "You and friends" msgstr "أنت والأصدقاء" -#: actions/allrss.php:119 actions/apitimelinefriends.php:121 -#: actions/apitimelinehome.php:122 +#: actions/allrss.php:119 actions/apitimelinefriends.php:119 +#: actions/apitimelinehome.php:120 #, php-format msgid "Updates from %1$s and friends on %2$s!" msgstr "" @@ -187,12 +184,12 @@ msgstr "" #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 -#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155 -#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156 -#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 +#: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 +#: actions/apitimelinegroup.php:182 actions/apitimelinehome.php:184 +#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 -#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 +#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 +#: actions/apitimelineuser.php:194 actions/apiusershow.php:101 msgid "API method not found." msgstr "لم يتم العثور على وسيلة API." @@ -280,7 +277,7 @@ msgstr "رسائل مباشرة من %s" #: actions/apidirectmessage.php:93 #, php-format msgid "All the direct messages sent from %s" -msgstr "" +msgstr "جميع الرسائل المرسلة من %s" #: actions/apidirectmessage.php:101 #, php-format @@ -353,7 +350,7 @@ msgstr "" #: actions/apifriendshipsshow.php:134 msgid "Could not determine source user." -msgstr "" +msgstr "تعذّر تحديد المستخدم المصدر." #: actions/apifriendshipsshow.php:142 msgid "Could not find target user." @@ -369,7 +366,7 @@ msgstr "" #: actions/newgroup.php:130 actions/profilesettings.php:238 #: actions/register.php:208 msgid "Nickname already in use. Try another one." -msgstr "" +msgstr "الاسم المستعار مستخدم بالفعل. جرّب اسمًا آخرًا." #: actions/apigroupcreate.php:180 actions/editgroup.php:189 #: actions/newgroup.php:133 actions/profilesettings.php:218 @@ -406,7 +403,7 @@ msgstr "" #: actions/newgroup.php:159 #, php-format msgid "Too many aliases! Maximum %d." -msgstr "" +msgstr "كنيات كيرة! العدد الأقصى هو %d." #: actions/apigroupcreate.php:264 actions/editgroup.php:224 #: actions/newgroup.php:168 @@ -446,7 +443,7 @@ msgstr "لم يمكن ضم المستخدم %1$s إلى المجموعة %2$s." #: actions/apigroupleave.php:114 msgid "You are not a member of this group." -msgstr "" +msgstr "لست عضوًا في هذه المجموعة" #: actions/apigroupleave.php:124 actions/leavegroup.php:119 #, php-format @@ -628,7 +625,7 @@ msgstr "نسق غير مدعوم." msgid "%1$s / Favorites from %2$s" msgstr "" -#: actions/apitimelinefavorites.php:120 +#: actions/apitimelinefavorites.php:117 #, php-format msgid "%1$s updates favorited by %2$s / %2$s." msgstr "" @@ -639,7 +636,7 @@ msgstr "" msgid "%s timeline" msgstr "مسار %s الزمني" -#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -655,12 +652,12 @@ msgstr "" msgid "%1$s updates that reply to updates from %2$s / %3$s." msgstr "" -#: actions/apitimelinepublic.php:107 actions/publicrss.php:103 +#: actions/apitimelinepublic.php:111 actions/publicrss.php:103 #, php-format msgid "%s public timeline" msgstr "مسار %s الزمني العام" -#: actions/apitimelinepublic.php:111 actions/publicrss.php:105 +#: actions/apitimelinepublic.php:115 actions/publicrss.php:105 #, php-format msgid "%s updates from everyone!" msgstr "" @@ -670,7 +667,7 @@ msgstr "" msgid "Repeated to %s" msgstr "كرر إلى %s" -#: actions/apitimelineretweetsofme.php:112 +#: actions/apitimelineretweetsofme.php:114 #, php-format msgid "Repeats of %s" msgstr "تكرارات %s" @@ -680,7 +677,7 @@ msgstr "تكرارات %s" msgid "Notices tagged with %s" msgstr "الإشعارات الموسومة ب%s" -#: actions/apitimelinetag.php:108 actions/tagrss.php:64 +#: actions/apitimelinetag.php:104 actions/tagrss.php:64 #, php-format msgid "Updates tagged with %1$s on %2$s!" msgstr "" @@ -1217,7 +1214,7 @@ msgstr "" msgid "Could not update group." msgstr "تعذر تحديث المجموعة." -#: actions/editgroup.php:259 classes/User_group.php:390 +#: actions/editgroup.php:259 classes/User_group.php:423 msgid "Could not create aliases." msgstr "تعذّر إنشاء الكنى." @@ -2544,7 +2541,7 @@ msgstr "إعدادات الملف الشخصي" #: actions/profilesettings.php:71 msgid "" "You can update your personal profile info here so people know more about you." -msgstr "" +msgstr "بإمكانك تحديث بيانات ملفك الشخصي ليعرف عنك الناس أكثر." #: actions/profilesettings.php:99 msgid "Profile information" @@ -2567,12 +2564,12 @@ msgstr "الصفحة الرئيسية" #: actions/profilesettings.php:117 actions/register.php:455 msgid "URL of your homepage, blog, or profile on another site" -msgstr "" +msgstr "مسار صفحتك الرئيسية أو مدونتك أو ملفك الشخصي على موقع آخر" #: actions/profilesettings.php:122 actions/register.php:461 #, php-format msgid "Describe yourself and your interests in %d chars" -msgstr "" +msgstr "تكلم عن نفسك واهتمامتك في %d حرف" #: actions/profilesettings.php:125 actions/register.php:464 msgid "Describe yourself and your interests" @@ -2591,7 +2588,7 @@ msgstr "الموقع" #: actions/profilesettings.php:134 actions/register.php:473 msgid "Where you are, like \"City, State (or Region), Country\"" -msgstr "" +msgstr "مكان تواجدك، على سبيل المثال \"المدينة، الولاية (أو المنطقة)، الدولة\"" #: actions/profilesettings.php:138 msgid "Share my current location when posting notices" @@ -2607,6 +2604,7 @@ msgstr "الوسوم" msgid "" "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated" msgstr "" +"سِم نفسك (حروف وأرقام و \"-\" و \".\" و \"_\")، افصلها بفاصلة (',') أو مسافة." #: actions/profilesettings.php:151 actions/siteadminpanel.php:280 msgid "Language" @@ -2627,7 +2625,7 @@ msgstr "ما المنطقة الزمنية التي تتواجد فيها عاد #: actions/profilesettings.php:167 msgid "" "Automatically subscribe to whoever subscribes to me (best for non-humans)" -msgstr "" +msgstr "اشترك تلقائيًا بأي شخص يشترك بي (يفضل أن يستخدم لغير البشر)" #: actions/profilesettings.php:228 actions/register.php:223 #, php-format @@ -4246,7 +4244,7 @@ msgstr "مشكلة أثناء حفظ الإشعار." msgid "DB error inserting reply: %s" msgstr "" -#: classes/Notice.php:1235 +#: classes/Notice.php:1271 #, php-format msgid "RT @%1$s %2$s" msgstr "آر تي @%1$s %2$s" @@ -4256,11 +4254,11 @@ msgstr "آر تي @%1$s %2$s" msgid "Welcome to %1$s, @%2$s!" msgstr "أهلا بكم في %1$s يا @%2$s!" -#: classes/User_group.php:380 +#: classes/User_group.php:413 msgid "Could not create group." msgstr "تعذّر إنشاء المجموعة." -#: classes/User_group.php:409 +#: classes/User_group.php:442 msgid "Could not set group membership." msgstr "تعذّر ضبط عضوية المجموعة." @@ -5802,47 +5800,47 @@ msgstr "رسالة" msgid "Moderate" msgstr "" -#: lib/util.php:870 +#: lib/util.php:871 msgid "a few seconds ago" msgstr "قبل لحظات قليلة" -#: lib/util.php:872 +#: lib/util.php:873 msgid "about a minute ago" msgstr "قبل دقيقة تقريبًا" -#: lib/util.php:874 +#: lib/util.php:875 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:876 +#: lib/util.php:877 msgid "about an hour ago" msgstr "قبل ساعة تقريبًا" -#: lib/util.php:878 +#: lib/util.php:879 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:880 +#: lib/util.php:881 msgid "about a day ago" msgstr "قبل يوم تقريبا" -#: lib/util.php:882 +#: lib/util.php:883 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:884 +#: lib/util.php:885 msgid "about a month ago" msgstr "قبل شهر تقريبًا" -#: lib/util.php:886 +#: lib/util.php:887 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:888 +#: lib/util.php:889 msgid "about a year ago" msgstr "قبل سنة تقريبًا" diff --git a/locale/arz/LC_MESSAGES/statusnet.po b/locale/arz/LC_MESSAGES/statusnet.po index a508465430..2940486d81 100644 --- a/locale/arz/LC_MESSAGES/statusnet.po +++ b/locale/arz/LC_MESSAGES/statusnet.po @@ -1,5 +1,6 @@ # Translation of StatusNet to Egyptian Spoken Arabic # +# Author@translatewiki.net: Dudi # Author@translatewiki.net: Ghaly # Author@translatewiki.net: Meno25 # -- @@ -9,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-11 08:14+0000\n" -"PO-Revision-Date: 2010-02-11 08:14:14+0000\n" +"POT-Creation-Date: 2010-02-14 20:05+0000\n" +"PO-Revision-Date: 2010-02-14 20:06:01+0000\n" "Language-Team: Egyptian Spoken Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: arz\n" "X-Message-Group: out-statusnet\n" @@ -110,7 +111,7 @@ msgstr "لا مستخدم كهذا." #: actions/all.php:84 #, php-format msgid "%1$s and friends, page %2$d" -msgstr "%1$s والأصدقاء, الصفحه %2$d" +msgstr "%1$s و الصحاب, صفحه %2$d" #: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 #: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115 @@ -165,8 +166,8 @@ msgstr "" msgid "You and friends" msgstr "أنت والأصدقاء" -#: actions/allrss.php:119 actions/apitimelinefriends.php:121 -#: actions/apitimelinehome.php:122 +#: actions/allrss.php:119 actions/apitimelinefriends.php:119 +#: actions/apitimelinehome.php:120 #, php-format msgid "Updates from %1$s and friends on %2$s!" msgstr "" @@ -187,12 +188,12 @@ msgstr "" #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 -#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155 -#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156 -#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 +#: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 +#: actions/apitimelinegroup.php:182 actions/apitimelinehome.php:184 +#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 -#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 +#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 +#: actions/apitimelineuser.php:194 actions/apiusershow.php:101 msgid "API method not found." msgstr "لم يتم العثور على وسيله API." @@ -316,7 +317,7 @@ msgstr "" #: actions/apifavoritecreate.php:119 msgid "This status is already a favorite." -msgstr "هذه الحاله مفضله بالفعل." +msgstr "الحاله دى موجوده فعلا فى التفضيلات." #: actions/apifavoritecreate.php:130 actions/favor.php:84 lib/command.php:176 msgid "Could not create favorite." @@ -324,7 +325,7 @@ msgstr "تعذّر إنشاء مفضله." #: actions/apifavoritedestroy.php:122 msgid "That status is not a favorite." -msgstr "تلك الحاله ليست مفضله." +msgstr "الحاله دى مش محطوطه فى التفضيلات." #: actions/apifavoritedestroy.php:134 actions/disfavor.php:87 msgid "Could not delete favorite." @@ -345,7 +346,7 @@ msgstr "" #: actions/apifriendshipsdestroy.php:120 msgid "You cannot unfollow yourself." -msgstr "لا يمكنك عدم متابعه نفسك." +msgstr "ما ينفعش عدم متابعة نفسك." #: actions/apifriendshipsexists.php:94 msgid "Two user ids or screen_names must be supplied." @@ -442,7 +443,7 @@ msgstr "" #: actions/apigroupjoin.php:138 actions/joingroup.php:124 #, php-format msgid "Could not join user %1$s to group %2$s." -msgstr "لم يمكن ضم المستخدم %1$s إلى المجموعه %2$s." +msgstr "ما نفعش يضم %1$s للجروپ %2$s." #: actions/apigroupleave.php:114 msgid "You are not a member of this group." @@ -451,7 +452,7 @@ msgstr "" #: actions/apigroupleave.php:124 actions/leavegroup.php:119 #, php-format msgid "Could not remove user %1$s from group %2$s." -msgstr "لم يمكن إزاله المستخدم %1$s من المجموعه %2$s." +msgstr "ما نفعش يتشال اليوزر %1$s من الجروپ %2$s." #: actions/apigrouplist.php:95 #, php-format @@ -497,7 +498,7 @@ msgstr "" #: actions/apioauthauthorize.php:135 msgid "Invalid nickname / password!" -msgstr "اسم/كلمه سر غير صحيحة!" +msgstr "نيكنيم / پاسوورد مش مظبوطه!" #: actions/apioauthauthorize.php:159 #, fuzzy @@ -628,7 +629,7 @@ msgstr "نسق غير مدعوم." msgid "%1$s / Favorites from %2$s" msgstr "" -#: actions/apitimelinefavorites.php:120 +#: actions/apitimelinefavorites.php:117 #, php-format msgid "%1$s updates favorited by %2$s / %2$s." msgstr "" @@ -639,7 +640,7 @@ msgstr "" msgid "%s timeline" msgstr "مسار %s الزمني" -#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -655,12 +656,12 @@ msgstr "" msgid "%1$s updates that reply to updates from %2$s / %3$s." msgstr "" -#: actions/apitimelinepublic.php:107 actions/publicrss.php:103 +#: actions/apitimelinepublic.php:111 actions/publicrss.php:103 #, php-format msgid "%s public timeline" msgstr "مسار %s الزمنى العام" -#: actions/apitimelinepublic.php:111 actions/publicrss.php:105 +#: actions/apitimelinepublic.php:115 actions/publicrss.php:105 #, php-format msgid "%s updates from everyone!" msgstr "" @@ -670,7 +671,7 @@ msgstr "" msgid "Repeated to %s" msgstr "كرر إلى %s" -#: actions/apitimelineretweetsofme.php:112 +#: actions/apitimelineretweetsofme.php:114 #, php-format msgid "Repeats of %s" msgstr "تكرارات %s" @@ -680,7 +681,7 @@ msgstr "تكرارات %s" msgid "Notices tagged with %s" msgstr "الإشعارات الموسومه ب%s" -#: actions/apitimelinetag.php:108 actions/tagrss.php:64 +#: actions/apitimelinetag.php:104 actions/tagrss.php:64 #, php-format msgid "Updates tagged with %1$s on %2$s!" msgstr "" @@ -830,7 +831,7 @@ msgstr "" #: actions/blockedfromgroup.php:93 #, php-format msgid "%1$s blocked profiles, page %2$d" -msgstr "%1$s ملفات ممنوعة, الصفحه %2$d" +msgstr "%1$s فايلات معمول ليها بلوك, الصفحه %2$d" #: actions/blockedfromgroup.php:108 msgid "A list of the users blocked from joining this group." @@ -888,7 +889,7 @@ msgstr "تعذّر حذف تأكيد البريد الإلكترونى." #: actions/confirmaddress.php:144 msgid "Confirm address" -msgstr "أكد العنوان" +msgstr "اكد العنوان" #: actions/confirmaddress.php:159 #, php-format @@ -917,7 +918,7 @@ msgstr "لم يوجد رمز التأكيد." #: actions/deleteapplication.php:78 actions/editapplication.php:77 #: actions/showapplication.php:94 msgid "You are not the owner of this application." -msgstr "أنت لست مالك هذا التطبيق." +msgstr "انت مش بتملك الapplication دى." #: actions/deleteapplication.php:102 actions/editapplication.php:127 #: actions/newapplication.php:110 actions/showapplication.php:118 @@ -1131,16 +1132,16 @@ msgstr "تطبيقات OAuth" #: actions/editapplication.php:66 msgid "You must be logged in to edit an application." -msgstr "يجب أن تكون مسجل الدخول لتعدل تطبيقا." +msgstr "لازم يكون متسجل دخولك علشان تعدّل application." #: actions/editapplication.php:81 actions/oauthconnectionssettings.php:166 #: actions/showapplication.php:87 msgid "No such application." -msgstr "لا تطبيق كهذا." +msgstr "ما فيش application زى كده." #: actions/editapplication.php:161 msgid "Use this form to edit your application." -msgstr "استخدم النموذج ده علشان تعدل تطبيقك." +msgstr "استعمل الفورمه دى علشان تعدّل الapplication بتاعتك." #: actions/editapplication.php:177 actions/newapplication.php:159 msgid "Name is required." @@ -1148,7 +1149,7 @@ msgstr "الاسم مطلوب." #: actions/editapplication.php:180 actions/newapplication.php:165 msgid "Name is too long (max 255 chars)." -msgstr "الاسم طويل جدا (الأقصى 255 حرفا)." +msgstr "الاسم طويل جدا (اكتر حاجه 255 رمز)." #: actions/editapplication.php:183 actions/newapplication.php:162 msgid "Name already in use. Try another one." @@ -1164,7 +1165,7 @@ msgstr "" #: actions/editapplication.php:200 actions/newapplication.php:185 msgid "Source URL is not valid." -msgstr "مسار المصدر ليس صحيحا." +msgstr "الSource URL مش مظبوط." #: actions/editapplication.php:203 actions/newapplication.php:188 msgid "Organization is required." @@ -1172,7 +1173,7 @@ msgstr "" #: actions/editapplication.php:206 actions/newapplication.php:191 msgid "Organization is too long (max 255 chars)." -msgstr "المنظمه طويله جدا (الأقصى 255 حرفا)." +msgstr "المنظمه طويله جدا (اكتر حاجه 255 رمز)." #: actions/editapplication.php:209 actions/newapplication.php:194 msgid "Organization homepage is required." @@ -1188,7 +1189,7 @@ msgstr "" #: actions/editapplication.php:258 msgid "Could not update application." -msgstr "لم يمكن تحديث التطبيق." +msgstr "ما نفعش تحديث الapplication." #: actions/editgroup.php:56 #, php-format @@ -1202,7 +1203,7 @@ msgstr "يجب أن تكون والجًا لتنشئ مجموعه." #: actions/editgroup.php:103 actions/editgroup.php:168 #: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 msgid "You must be an admin to edit the group." -msgstr "يجب أن تكون إداريا لتعدل المجموعه." +msgstr "لازم تكون ادارى علشان تعدّل الجروپ." #: actions/editgroup.php:154 msgid "Use this form to edit the group." @@ -1217,7 +1218,7 @@ msgstr "" msgid "Could not update group." msgstr "تعذر تحديث المجموعه." -#: actions/editgroup.php:259 classes/User_group.php:390 +#: actions/editgroup.php:259 classes/User_group.php:423 msgid "Could not create aliases." msgstr "تعذّر إنشاء الكنى." @@ -1227,7 +1228,7 @@ msgstr "حُفظت الخيارات." #: actions/emailsettings.php:60 msgid "Email settings" -msgstr "إعدادات البريد الإلكتروني" +msgstr "تظبيطات الايميل" #: actions/emailsettings.php:71 #, php-format @@ -1263,7 +1264,7 @@ msgstr "ألغِ" #: actions/emailsettings.php:121 msgid "Email address" -msgstr "عنوان البريد الإلكتروني" +msgstr "عنوان الايميل" #: actions/emailsettings.php:123 msgid "Email address, like \"UserName@example.org\"" @@ -1613,7 +1614,7 @@ msgstr "" #: actions/grouplogo.php:178 msgid "User without matching profile." -msgstr "المستخدم بدون ملف مطابق." +msgstr "يوزر من-غير پروفايل زيّه." #: actions/grouplogo.php:362 msgid "Pick a square area of the image to be the logo." @@ -1635,7 +1636,7 @@ msgstr "أعضاء مجموعه %s" #: actions/groupmembers.php:96 #, php-format msgid "%1$s group members, page %2$d" -msgstr "%1$s أعضاء المجموعة, الصفحه %2$d" +msgstr "%1$s اعضاء الجروپ, صفحه %2$d" #: actions/groupmembers.php:111 msgid "A list of the users in this group." @@ -1734,7 +1735,7 @@ msgstr "خطأ أثناء منع الحجب." #: actions/imsettings.php:59 msgid "IM settings" -msgstr "إعدادات المراسله الفورية" +msgstr "تظبيطات بعت الرسايل الفوريه" #: actions/imsettings.php:70 #, php-format @@ -1760,7 +1761,7 @@ msgstr "" #: actions/imsettings.php:124 msgid "IM address" -msgstr "عنوان المراسله الفورية" +msgstr "عنوان الرساله الفوريه" #: actions/imsettings.php:126 #, php-format @@ -1944,7 +1945,7 @@ msgstr "" #: actions/joingroup.php:131 #, php-format msgid "%1$s joined group %2$s" -msgstr "%1$s انضم للمجموعه %2$s" +msgstr "%1$s دخل جروپ %2$s" #: actions/leavegroup.php:60 msgid "You must be logged in to leave a group." @@ -1957,7 +1958,7 @@ msgstr "لست عضوا فى تلك المجموعه." #: actions/leavegroup.php:127 #, php-format msgid "%1$s left group %2$s" -msgstr "%1$s ترك المجموعه %2$s" +msgstr "%1$s ساب جروپ %2$s" #: actions/login.php:80 actions/otp.php:62 actions/register.php:137 msgid "Already logged in." @@ -2017,12 +2018,12 @@ msgstr "" #: actions/makeadmin.php:133 #, php-format msgid "Can't get membership record for %1$s in group %2$s." -msgstr "لم يمكن الحصول على تسجيل العضويه ل%1$s فى المجموعه %2$s." +msgstr "مش نافع يتجاب سجل العضويه لـ%1$s فى جروپ %2$s." #: actions/makeadmin.php:146 #, php-format msgid "Can't make %1$s an admin for group %2$s." -msgstr "لم يمكن جعل %1$s إداريا للمجموعه %2$s." +msgstr "%1$s مش نافع يبقى ادارى لجروپ %2$s." #: actions/microsummary.php:69 msgid "No current status" @@ -2035,11 +2036,11 @@ msgstr "لا تطبيق كهذا." #: actions/newapplication.php:64 msgid "You must be logged in to register an application." -msgstr "يجب أن تكون مسجل الدخول لتسجل تطبيقا." +msgstr "لازم تكون مسجل دخوللك علشان تسجل application." #: actions/newapplication.php:143 msgid "Use this form to register a new application." -msgstr "استخدم هذا النموذج لتسجل تطبيقا جديدا." +msgstr "استعمل الفورمه دى علشان تسجل application جديد." #: actions/newapplication.php:176 msgid "Source URL is required." @@ -2047,7 +2048,7 @@ msgstr "" #: actions/newapplication.php:258 actions/newapplication.php:267 msgid "Could not create application." -msgstr "مش ممكن إنشاء التطبيق." +msgstr "مش ممكن إنشاء الapplication." #: actions/newgroup.php:53 msgid "New group" @@ -2086,7 +2087,7 @@ msgstr "أُرسلت الرسالة" #: actions/newmessage.php:185 #, php-format msgid "Direct message to %s sent." -msgstr "رساله مباشره ل%s تم إرسالها." +msgstr "رساله مباشره اتبعتت لـ%s." #: actions/newmessage.php:210 actions/newnotice.php:245 lib/channel.php:170 msgid "Ajax Error" @@ -2114,7 +2115,7 @@ msgstr "بحث فى النصوص" #: actions/noticesearch.php:91 #, php-format msgid "Search results for \"%1$s\" on %2$s" -msgstr "نتائج البحث ل\"%1$s\" على %2$s" +msgstr "نتايج التدوير لـ\"%1$s\" على %2$s" #: actions/noticesearch.php:121 #, php-format @@ -2155,11 +2156,11 @@ msgstr "أُرسل التنبيه!" #: actions/oauthappssettings.php:59 msgid "You must be logged in to list your applications." -msgstr "يجب أن تكون مسجل الدخول لعرض تطبيقاتك." +msgstr "لازم تكون مسجل دخولك علشان تشوف ليستة الapplications بتاعتك." #: actions/oauthappssettings.php:74 msgid "OAuth applications" -msgstr "تطبيقات OAuth" +msgstr "OAuth applications" #: actions/oauthappssettings.php:85 msgid "Applications you have registered" @@ -2180,7 +2181,7 @@ msgstr "" #: actions/oauthconnectionssettings.php:175 msgid "You are not a user of that application." -msgstr "أنت لست مستخدما لهذا التطبيق." +msgstr "انت مش يوزر للapplication دى." #: actions/oauthconnectionssettings.php:186 msgid "Unable to revoke access for app: " @@ -2227,7 +2228,7 @@ msgstr "بحث الإشعارات" #: actions/othersettings.php:60 msgid "Other settings" -msgstr "إعدادات تانيه" +msgstr "تظبيطات تانيه" #: actions/othersettings.php:71 msgid "Manage various other options." @@ -2259,23 +2260,23 @@ msgstr "" #: actions/otp.php:69 msgid "No user ID specified." -msgstr "لا هويه مستخدم محدده." +msgstr "ما فيش ID متحدد لليوزر." #: actions/otp.php:83 msgid "No login token specified." -msgstr "لا محتوى دخول محدد." +msgstr "ما فيش امارة دخول متحدده." #: actions/otp.php:90 msgid "No login token requested." -msgstr "لا طلب استيثاق." +msgstr "ما فيش طلب تسجيل دخول مطلوب." #: actions/otp.php:95 msgid "Invalid login token specified." -msgstr "توكن دخول غير صحيح محدد." +msgstr "امارة تسجيل الدخول اللى اتحطت مش موجوده." #: actions/otp.php:104 msgid "Login token expired." -msgstr "توكن الدخول انتهى." +msgstr "تاريخ صلاحية الاماره خلص." #: actions/outbox.php:58 #, php-format @@ -2495,7 +2496,7 @@ msgstr "" #: actions/pathsadminpanel.php:335 msgid "SSL server" -msgstr "خادم SSL" +msgstr "SSL server" #: actions/pathsadminpanel.php:336 msgid "Server to direct SSL requests to" @@ -3118,7 +3119,7 @@ msgstr "" #: actions/rsd.php:146 actions/version.php:157 msgid "StatusNet" -msgstr "ستاتس نت" +msgstr "StatusNet" #: actions/sandbox.php:65 actions/unsandbox.php:65 msgid "You cannot sandbox users on this site." @@ -3161,7 +3162,7 @@ msgstr "اذف إعدادت الموقع" #: actions/showapplication.php:82 msgid "You must be logged in to view an application." -msgstr "يجب أن تكون مسجل الدخول لرؤيه تطبيق." +msgstr "لازم تكون مسجل دخولك علشان تشوف اى application." #: actions/showapplication.php:157 msgid "Application profile" @@ -3178,7 +3179,7 @@ msgstr "الاسم" #: actions/showapplication.php:178 lib/applicationeditform.php:222 msgid "Organization" -msgstr "المنظمة" +msgstr "المنظمه" #: actions/showapplication.php:187 actions/version.php:198 #: lib/applicationeditform.php:209 lib/groupeditform.php:172 @@ -3225,7 +3226,7 @@ msgstr "" #: actions/showapplication.php:283 msgid "Authorize URL" -msgstr "اسمح بالمسار" +msgstr "اسمح للURL" #: actions/showapplication.php:288 msgid "" @@ -3499,12 +3500,12 @@ msgstr "يجب ألا يكون طول اسم الموقع صفرًا." #: actions/siteadminpanel.php:140 msgid "You must have a valid contact email address." -msgstr "يجب أن تملك عنوان بريد إلكترونى صحيح." +msgstr "لازم يكون عندك عنوان ايميل صالح." #: actions/siteadminpanel.php:158 #, php-format msgid "Unknown language \"%s\"." -msgstr "لغه غير معروفه \"%s\"." +msgstr "لغه مش معروفه \"%s\"." #: actions/siteadminpanel.php:165 msgid "Invalid snapshot report URL." @@ -3632,7 +3633,7 @@ msgstr "" #: actions/smssettings.php:58 msgid "SMS settings" -msgstr "إعدادات الرسائل القصيرة" +msgstr "تظبيطات الـSMS" #: actions/smssettings.php:69 #, php-format @@ -3661,7 +3662,7 @@ msgstr "" #: actions/smssettings.php:138 msgid "SMS phone number" -msgstr "رقم هاتف SMS" +msgstr "نمرة تليفون الـSMS" #: actions/smssettings.php:140 msgid "Phone number, no punctuation or spaces, with area code" @@ -3746,7 +3747,7 @@ msgstr "مشتركو %s" #: actions/subscribers.php:52 #, php-format msgid "%1$s subscribers, page %2$d" -msgstr "مشتركو %1$s, الصفحه %2$d" +msgstr "%1$s مشتركين, صفحه %2$d" #: actions/subscribers.php:63 msgid "These are the people who listen to your notices." @@ -3783,7 +3784,7 @@ msgstr "اشتراكات %s" #: actions/subscriptions.php:54 #, php-format msgid "%1$s subscriptions, page %2$d" -msgstr "اشتراكات%1$s, الصفحه %2$d" +msgstr "%1$s اشتراكات, صفحه %2$d" #: actions/subscriptions.php:65 msgid "These are the people whose notices you listen to." @@ -4108,7 +4109,7 @@ msgstr "" #: actions/version.php:73 #, php-format msgid "StatusNet %s" -msgstr "ستاتس نت %s" +msgstr "StatusNet %s" #: actions/version.php:153 #, php-format @@ -4150,11 +4151,11 @@ msgstr "" #: actions/version.php:196 lib/action.php:747 msgid "Version" -msgstr "النسخة" +msgstr "النسخه" #: actions/version.php:197 msgid "Author(s)" -msgstr "المؤلف(ون)" +msgstr "المؤلف/ين" #: classes/File.php:144 #, php-format @@ -4175,15 +4176,15 @@ msgstr "" #: classes/Group_member.php:41 msgid "Group join failed." -msgstr "الانضمام للمجموعه فشل." +msgstr "دخول الجروپ فشل." #: classes/Group_member.php:53 msgid "Not part of group." -msgstr "ليس جزءا من المجموعه." +msgstr "مش جزء من الجروپ." #: classes/Group_member.php:60 msgid "Group leave failed." -msgstr "ترك المجموعه فشل." +msgstr "الخروج من الجروپ فشل." #: classes/Login_token.php:76 #, php-format @@ -4244,7 +4245,7 @@ msgstr "مشكله أثناء حفظ الإشعار." msgid "DB error inserting reply: %s" msgstr "" -#: classes/Notice.php:1235 +#: classes/Notice.php:1271 #, php-format msgid "RT @%1$s %2$s" msgstr "آر تى @%1$s %2$s" @@ -4254,11 +4255,11 @@ msgstr "آر تى @%1$s %2$s" msgid "Welcome to %1$s, @%2$s!" msgstr "أهلا بكم فى %1$s يا @%2$s!" -#: classes/User_group.php:380 +#: classes/User_group.php:413 msgid "Could not create group." msgstr "تعذّر إنشاء المجموعه." -#: classes/User_group.php:409 +#: classes/User_group.php:442 msgid "Could not set group membership." msgstr "تعذّر ضبط عضويه المجموعه." @@ -4485,7 +4486,7 @@ msgstr "" #: lib/adminpanelaction.php:107 msgid "Changes to that panel are not allowed." -msgstr "التغييرات لهذه اللوحه غير مسموح بها." +msgstr "التغييرات مش مسموحه للـ لوحه دى." #: lib/adminpanelaction.php:206 msgid "showForm() not implemented." @@ -4550,11 +4551,11 @@ msgstr "" #: lib/applicationeditform.php:207 msgid "Describe your application" -msgstr "اوصف تطبيقك" +msgstr "اوصف الapplication بتاعتك" #: lib/applicationeditform.php:216 msgid "Source URL" -msgstr "مسار المصدر" +msgstr "Source URL" #: lib/applicationeditform.php:218 msgid "URL of the homepage of this application" @@ -4598,7 +4599,7 @@ msgstr "" #: lib/applicationlist.php:154 msgid "Revoke" -msgstr "اسحب" +msgstr "بطّل" #: lib/attachmentlist.php:87 msgid "Attachments" @@ -4622,11 +4623,11 @@ msgstr "وسوم هذا المرفق" #: lib/authenticationplugin.php:218 lib/authenticationplugin.php:223 msgid "Password changing failed" -msgstr "تغيير كلمه السر فشل" +msgstr "تغيير الپاسوورد فشل" #: lib/authenticationplugin.php:233 msgid "Password changing is not allowed" -msgstr "تغيير كلمه السر غير مسموح به" +msgstr "تغيير الپاسوورد مش مسموح" #: lib/channel.php:138 lib/channel.php:158 msgid "Command results" @@ -4647,7 +4648,7 @@ msgstr "" #: lib/command.php:88 #, php-format msgid "Could not find a user with nickname %s" -msgstr "لم يمكن إيجاد مستخدم بالاسم %s" +msgstr "ما نفعش يلاقى يوزر بإسم %s" #: lib/command.php:92 msgid "It does not make a lot of sense to nudge yourself!" @@ -4656,7 +4657,7 @@ msgstr "" #: lib/command.php:99 #, php-format msgid "Nudge sent to %s" -msgstr "التنبيه تم إرساله إلى %s" +msgstr "Nudge اتبعتت لـ %s" #: lib/command.php:126 #, php-format @@ -4671,7 +4672,7 @@ msgstr "" #: lib/command.php:152 lib/command.php:390 lib/command.php:451 msgid "Notice with that id does not exist" -msgstr "الملاحظه بهذا الرقم غير موجودة" +msgstr "الملاحظه بالـID ده مالهاش وجود" #: lib/command.php:168 lib/command.php:406 lib/command.php:467 #: lib/command.php:523 @@ -4684,12 +4685,12 @@ msgstr "" #: lib/command.php:217 msgid "You are already a member of that group" -msgstr "أنت بالفعل عضو فى هذه المجموعة" +msgstr "انت اصلا عضو فى الجروپ ده" #: lib/command.php:231 #, php-format msgid "Could not join user %s to group %s" -msgstr "لم يمكن ضم المستخدم %s إلى المجموعه %s" +msgstr "ما نفعش يدخل اليوزر %s لجروپ %s" #: lib/command.php:236 #, php-format @@ -4699,12 +4700,12 @@ msgstr "%s انضم إلى مجموعه %s" #: lib/command.php:275 #, php-format msgid "Could not remove user %s to group %s" -msgstr "لم يمكن إزاله المستخدم %s من المجموعه %s" +msgstr "ما نفعش يشيل اليوزر %s لجروپ %s" #: lib/command.php:280 #, php-format msgid "%s left group %s" -msgstr "%s ترك المجموعه %s" +msgstr "%s ساب الجروپ %s" #: lib/command.php:309 #, php-format @@ -4734,7 +4735,7 @@ msgstr "" #: lib/command.php:367 #, php-format msgid "Direct message to %s sent" -msgstr "رساله مباشره إلى %s تم إرسالها" +msgstr "رساله مباشره اتبعتت لـ %s" #: lib/command.php:369 msgid "Error sending direct message." @@ -4742,7 +4743,7 @@ msgstr "" #: lib/command.php:413 msgid "Cannot repeat your own notice" -msgstr "لا يمكنك تكرار ملاحظتك الخاصة" +msgstr "الملاحظه بتاعتك مش نافعه تتكرر" #: lib/command.php:418 msgid "Already repeated that notice" @@ -4931,7 +4932,7 @@ msgstr "" #: lib/connectsettingsaction.php:120 msgid "Connections" -msgstr "اتصالات" +msgstr "كونيكشونات (Connections)" #: lib/connectsettingsaction.php:121 msgid "Authorized connected applications" @@ -5127,7 +5128,7 @@ msgstr "[%s]" #: lib/jabber.php:400 #, php-format msgid "Unknown inbox source %d." -msgstr "مصدر صندوق وارد غير معروف %d." +msgstr "مصدر الـinbox مش معروف %d." #: lib/joinform.php:114 msgid "Join" @@ -5189,7 +5190,7 @@ msgstr "" #: lib/mail.php:258 #, php-format msgid "Bio: %s" -msgstr "السيرة: %s" +msgstr "عن نفسك: %s" #: lib/mail.php:286 #, php-format @@ -5342,7 +5343,7 @@ msgstr "" #: lib/mailhandler.php:228 #, php-format msgid "Unsupported message type: %s" -msgstr "نوع رساله غير مدعوم: %s" +msgstr "نوع رساله مش مدعوم: %s" #: lib/mediafile.php:98 lib/mediafile.php:123 msgid "There was a database error while saving your file. Please try again." @@ -5384,7 +5385,7 @@ msgstr "" #: lib/mediafile.php:201 lib/mediafile.php:237 msgid "Could not determine file's MIME type." -msgstr "لم يمكن تحديد نوع MIME للملف." +msgstr "مش نافع يتحدد نوع الـMIME بتاع الفايل." #: lib/mediafile.php:270 #, php-format @@ -5427,11 +5428,11 @@ msgstr "أرفق ملفًا" #: lib/noticeform.php:212 msgid "Share my location" -msgstr "شارك موقعى" +msgstr "اعمل مشاركه لمكانى" #: lib/noticeform.php:215 msgid "Do not share my location" -msgstr "لا تشارك موقعي" +msgstr "ما تعملش مشاركه لمكانى" #: lib/noticeform.php:216 msgid "" @@ -5555,7 +5556,7 @@ msgstr "" #: lib/plugin.php:114 msgid "Unknown" -msgstr "غير معروف" +msgstr "مش معروف" #: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82 msgid "Subscriptions" @@ -5790,47 +5791,47 @@ msgstr "رسالة" msgid "Moderate" msgstr "" -#: lib/util.php:870 +#: lib/util.php:871 msgid "a few seconds ago" msgstr "قبل لحظات قليلة" -#: lib/util.php:872 +#: lib/util.php:873 msgid "about a minute ago" msgstr "قبل دقيقه تقريبًا" -#: lib/util.php:874 +#: lib/util.php:875 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:876 +#: lib/util.php:877 msgid "about an hour ago" msgstr "قبل ساعه تقريبًا" -#: lib/util.php:878 +#: lib/util.php:879 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:880 +#: lib/util.php:881 msgid "about a day ago" msgstr "قبل يوم تقريبا" -#: lib/util.php:882 +#: lib/util.php:883 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:884 +#: lib/util.php:885 msgid "about a month ago" msgstr "قبل شهر تقريبًا" -#: lib/util.php:886 +#: lib/util.php:887 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:888 +#: lib/util.php:889 msgid "about a year ago" msgstr "قبل سنه تقريبًا" diff --git a/locale/en_GB/LC_MESSAGES/statusnet.po b/locale/en_GB/LC_MESSAGES/statusnet.po index 6a77520060..0e7acedc07 100644 --- a/locale/en_GB/LC_MESSAGES/statusnet.po +++ b/locale/en_GB/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-11 08:14+0000\n" -"PO-Revision-Date: 2010-02-11 08:14:33+0000\n" +"POT-Creation-Date: 2010-02-14 20:05+0000\n" +"PO-Revision-Date: 2010-02-14 20:06:20+0000\n" "Language-Team: British English\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: en-gb\n" "X-Message-Group: out-statusnet\n" @@ -169,8 +169,8 @@ msgstr "" msgid "You and friends" msgstr "You and friends" -#: actions/allrss.php:119 actions/apitimelinefriends.php:121 -#: actions/apitimelinehome.php:122 +#: actions/allrss.php:119 actions/apitimelinefriends.php:119 +#: actions/apitimelinehome.php:120 #, php-format msgid "Updates from %1$s and friends on %2$s!" msgstr "Updates from %1$s and friends on %2$s!" @@ -191,12 +191,12 @@ msgstr "Updates from %1$s and friends on %2$s!" #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 -#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155 -#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156 -#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 +#: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 +#: actions/apitimelinegroup.php:182 actions/apitimelinehome.php:184 +#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 -#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 +#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 +#: actions/apitimelineuser.php:194 actions/apiusershow.php:101 msgid "API method not found." msgstr "API method not found." @@ -640,7 +640,7 @@ msgstr "Unsupported format." msgid "%1$s / Favorites from %2$s" msgstr "%1$s / Favourites from %2$s" -#: actions/apitimelinefavorites.php:120 +#: actions/apitimelinefavorites.php:117 #, php-format msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s updates favourited by %2$s / %2$s." @@ -651,7 +651,7 @@ msgstr "%1$s updates favourited by %2$s / %2$s." msgid "%s timeline" msgstr "%s timeline" -#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -667,12 +667,12 @@ msgstr "%1$s / Updates mentioning %2$s" msgid "%1$s updates that reply to updates from %2$s / %3$s." msgstr "%1$s updates that reply to updates from %2$s / %3$s." -#: actions/apitimelinepublic.php:107 actions/publicrss.php:103 +#: actions/apitimelinepublic.php:111 actions/publicrss.php:103 #, php-format msgid "%s public timeline" msgstr "%s public timeline" -#: actions/apitimelinepublic.php:111 actions/publicrss.php:105 +#: actions/apitimelinepublic.php:115 actions/publicrss.php:105 #, php-format msgid "%s updates from everyone!" msgstr "%s updates from everyone!" @@ -682,7 +682,7 @@ msgstr "%s updates from everyone!" msgid "Repeated to %s" msgstr "Repeated to %s" -#: actions/apitimelineretweetsofme.php:112 +#: actions/apitimelineretweetsofme.php:114 #, php-format msgid "Repeats of %s" msgstr "Repeats of %s" @@ -692,7 +692,7 @@ msgstr "Repeats of %s" msgid "Notices tagged with %s" msgstr "Notices tagged with %s" -#: actions/apitimelinetag.php:108 actions/tagrss.php:64 +#: actions/apitimelinetag.php:104 actions/tagrss.php:64 #, php-format msgid "Updates tagged with %1$s on %2$s!" msgstr "Updates tagged with %1$s on %2$s!" @@ -1235,7 +1235,7 @@ msgstr "description is too long (max %d chars)." msgid "Could not update group." msgstr "Could not update group." -#: actions/editgroup.php:259 classes/User_group.php:390 +#: actions/editgroup.php:259 classes/User_group.php:423 msgid "Could not create aliases." msgstr "Could not create aliases" @@ -4501,7 +4501,7 @@ msgstr "Problem saving notice." msgid "DB error inserting reply: %s" msgstr "DB error inserting reply: %s" -#: classes/Notice.php:1235 +#: classes/Notice.php:1271 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" @@ -4511,11 +4511,11 @@ msgstr "%1$s (%2$s)" msgid "Welcome to %1$s, @%2$s!" msgstr "Welcome to %1$s, @%2$s!" -#: classes/User_group.php:380 +#: classes/User_group.php:413 msgid "Could not create group." msgstr "Could not create group." -#: classes/User_group.php:409 +#: classes/User_group.php:442 msgid "Could not set group membership." msgstr "Could not set group membership." @@ -6091,47 +6091,47 @@ msgstr "Message" msgid "Moderate" msgstr "" -#: lib/util.php:870 +#: lib/util.php:871 msgid "a few seconds ago" msgstr "a few seconds ago" -#: lib/util.php:872 +#: lib/util.php:873 msgid "about a minute ago" msgstr "about a minute ago" -#: lib/util.php:874 +#: lib/util.php:875 #, php-format msgid "about %d minutes ago" msgstr "about %d minutes ago" -#: lib/util.php:876 +#: lib/util.php:877 msgid "about an hour ago" msgstr "about an hour ago" -#: lib/util.php:878 +#: lib/util.php:879 #, php-format msgid "about %d hours ago" msgstr "about %d hours ago" -#: lib/util.php:880 +#: lib/util.php:881 msgid "about a day ago" msgstr "about a day ago" -#: lib/util.php:882 +#: lib/util.php:883 #, php-format msgid "about %d days ago" msgstr "about %d days ago" -#: lib/util.php:884 +#: lib/util.php:885 msgid "about a month ago" msgstr "about a month ago" -#: lib/util.php:886 +#: lib/util.php:887 #, php-format msgid "about %d months ago" msgstr "about %d months ago" -#: lib/util.php:888 +#: lib/util.php:889 msgid "about a year ago" msgstr "about a year ago" diff --git a/locale/es/LC_MESSAGES/statusnet.po b/locale/es/LC_MESSAGES/statusnet.po index a351c293b2..0d7c9384a1 100644 --- a/locale/es/LC_MESSAGES/statusnet.po +++ b/locale/es/LC_MESSAGES/statusnet.po @@ -12,12 +12,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-11 08:14+0000\n" -"PO-Revision-Date: 2010-02-11 08:14:36+0000\n" +"POT-Creation-Date: 2010-02-14 20:05+0000\n" +"PO-Revision-Date: 2010-02-14 20:06:23+0000\n" "Language-Team: Spanish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: es\n" "X-Message-Group: out-statusnet\n" @@ -172,8 +172,8 @@ msgstr "" msgid "You and friends" msgstr "Tú y amigos" -#: actions/allrss.php:119 actions/apitimelinefriends.php:121 -#: actions/apitimelinehome.php:122 +#: actions/allrss.php:119 actions/apitimelinefriends.php:119 +#: actions/apitimelinehome.php:120 #, php-format msgid "Updates from %1$s and friends on %2$s!" msgstr "¡Actualizaciones de %1$s y amigos en %2$s!" @@ -194,12 +194,12 @@ msgstr "¡Actualizaciones de %1$s y amigos en %2$s!" #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 -#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155 -#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156 -#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 +#: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 +#: actions/apitimelinegroup.php:182 actions/apitimelinehome.php:184 +#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 -#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 +#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 +#: actions/apitimelineuser.php:194 actions/apiusershow.php:101 msgid "API method not found." msgstr "Método de API no encontrado." @@ -648,7 +648,7 @@ msgstr "Formato no soportado." msgid "%1$s / Favorites from %2$s" msgstr "%1$s / Favoritos de %2$s" -#: actions/apitimelinefavorites.php:120 +#: actions/apitimelinefavorites.php:117 #, php-format msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s actualizaciones favoritas de %2$s / %2$s." @@ -659,7 +659,7 @@ msgstr "%1$s actualizaciones favoritas de %2$s / %2$s." msgid "%s timeline" msgstr "línea temporal de %s" -#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -675,12 +675,12 @@ msgstr "%1$s / Actualizaciones que mencionan %2$s" msgid "%1$s updates that reply to updates from %2$s / %3$s." msgstr "actualizaciones de %1$s en respuesta a las de %2$s / %3$s" -#: actions/apitimelinepublic.php:107 actions/publicrss.php:103 +#: actions/apitimelinepublic.php:111 actions/publicrss.php:103 #, php-format msgid "%s public timeline" msgstr "línea temporal pública de %s" -#: actions/apitimelinepublic.php:111 actions/publicrss.php:105 +#: actions/apitimelinepublic.php:115 actions/publicrss.php:105 #, php-format msgid "%s updates from everyone!" msgstr "¡Actualizaciones de todos en %s!" @@ -690,7 +690,7 @@ msgstr "¡Actualizaciones de todos en %s!" msgid "Repeated to %s" msgstr "Repetido a %s" -#: actions/apitimelineretweetsofme.php:112 +#: actions/apitimelineretweetsofme.php:114 #, php-format msgid "Repeats of %s" msgstr "Repeticiones de %s" @@ -700,7 +700,7 @@ msgstr "Repeticiones de %s" msgid "Notices tagged with %s" msgstr "Avisos marcados con %s" -#: actions/apitimelinetag.php:108 actions/tagrss.php:64 +#: actions/apitimelinetag.php:104 actions/tagrss.php:64 #, php-format msgid "Updates tagged with %1$s on %2$s!" msgstr "Actualizaciones etiquetadas con %1$s en %2$s!" @@ -1244,7 +1244,7 @@ msgstr "La descripción es muy larga (máx. %d caracteres)." msgid "Could not update group." msgstr "No se pudo actualizar el grupo." -#: actions/editgroup.php:259 classes/User_group.php:390 +#: actions/editgroup.php:259 classes/User_group.php:423 msgid "Could not create aliases." msgstr "No fue posible crear alias." @@ -2380,9 +2380,8 @@ msgid "URL shortening service is too long (max 50 chars)." msgstr "El servicio de acortamiento de URL es muy largo (máx. 50 caracteres)." #: actions/otp.php:69 -#, fuzzy msgid "No user ID specified." -msgstr "Grupo no especificado." +msgstr "No se ha especificado ID de usuario." #: actions/otp.php:83 msgid "No login token specified." @@ -2393,18 +2392,17 @@ msgid "No login token requested." msgstr "Token de acceso solicitado." #: actions/otp.php:95 -#, fuzzy msgid "Invalid login token specified." -msgstr "El contenido del aviso es inválido" +msgstr "Token de acceso inválido especificado." #: actions/otp.php:104 msgid "Login token expired." msgstr "Token de acceso caducado." #: actions/outbox.php:58 -#, fuzzy, php-format +#, php-format msgid "Outbox for %1$s - page %2$d" -msgstr "Bandeja de salida para %s" +msgstr "Bandeja de salida de %1$s - página %2$d" #: actions/outbox.php:61 #, php-format @@ -2421,9 +2419,8 @@ msgid "Change password" msgstr "Cambiar contraseña" #: actions/passwordsettings.php:69 -#, fuzzy msgid "Change your password." -msgstr "Cambia tu contraseña." +msgstr "Cambia tu contraseña" #: actions/passwordsettings.php:96 actions/recoverpassword.php:231 msgid "Password change" @@ -2487,9 +2484,9 @@ msgid "Path and server settings for this StatusNet site." msgstr "" #: actions/pathsadminpanel.php:157 -#, fuzzy, php-format +#, php-format msgid "Theme directory not readable: %s" -msgstr "Esta página no está disponible en un " +msgstr "Directorio de temas ilegible: %s" #: actions/pathsadminpanel.php:163 #, php-format @@ -2499,7 +2496,7 @@ msgstr "" #: actions/pathsadminpanel.php:169 #, php-format msgid "Background directory not writable: %s" -msgstr "" +msgstr "Directorio de fondo ilegible: %s" #: actions/pathsadminpanel.php:177 #, php-format @@ -2508,7 +2505,7 @@ msgstr "" #: actions/pathsadminpanel.php:183 msgid "Invalid SSL server. The maximum length is 255 characters." -msgstr "" +msgstr "Servidor SSL no válido. La longitud máxima es de 255 caracteres." #: actions/pathsadminpanel.php:234 actions/siteadminpanel.php:58 #: lib/adminpanelaction.php:311 @@ -2516,9 +2513,8 @@ msgid "Site" msgstr "Sitio" #: actions/pathsadminpanel.php:238 -#, fuzzy msgid "Server" -msgstr "Recuperar" +msgstr "Servidor" #: actions/pathsadminpanel.php:238 msgid "Site's server hostname." @@ -2570,9 +2566,8 @@ msgid "Avatars" msgstr "Avatares" #: actions/pathsadminpanel.php:284 -#, fuzzy msgid "Avatar server" -msgstr "Configuración de Avatar" +msgstr "Servidor del avatar" #: actions/pathsadminpanel.php:288 #, fuzzy @@ -2580,13 +2575,12 @@ msgid "Avatar path" msgstr "Avatar actualizado" #: actions/pathsadminpanel.php:292 -#, fuzzy msgid "Avatar directory" -msgstr "Avatar actualizado" +msgstr "Directorio del avatar" #: actions/pathsadminpanel.php:301 msgid "Backgrounds" -msgstr "" +msgstr "Fondos" #: actions/pathsadminpanel.php:305 msgid "Background server" @@ -2598,7 +2592,7 @@ msgstr "" #: actions/pathsadminpanel.php:313 msgid "Background directory" -msgstr "" +msgstr "Directorio del fondo" #: actions/pathsadminpanel.php:320 msgid "SSL" @@ -2618,7 +2612,7 @@ msgstr "Siempre" #: actions/pathsadminpanel.php:329 msgid "Use SSL" -msgstr "" +msgstr "Usar SSL" #: actions/pathsadminpanel.php:330 msgid "When to use SSL" @@ -2651,9 +2645,9 @@ msgid "People search" msgstr "Buscador de gente" #: actions/peopletag.php:70 -#, fuzzy, php-format +#, php-format msgid "Not a valid people tag: %s" -msgstr "No es un tag de personas válido: %s" +msgstr "No es una etiqueta válida para personas: %s" #: actions/peopletag.php:144 #, fuzzy, php-format @@ -2780,9 +2774,9 @@ msgid "Language is too long (max 50 chars)." msgstr "Idioma es muy largo ( max 50 car.)" #: actions/profilesettings.php:253 actions/tagother.php:178 -#, fuzzy, php-format +#, php-format msgid "Invalid tag: \"%s\"" -msgstr "Tag no válido: '%s' " +msgstr "Etiqueta inválida: \"% s\"" #: actions/profilesettings.php:302 msgid "Couldn't update user for autosubscribe." @@ -2807,7 +2801,7 @@ msgstr "Se guardó configuración." #: actions/public.php:83 #, php-format msgid "Beyond the page limit (%s)" -msgstr "" +msgstr "Más allá del límite de páginas (%s)" #: actions/public.php:92 msgid "Could not retrieve public stream." @@ -2891,7 +2885,7 @@ msgstr "" #: actions/publictagcloud.php:72 msgid "Be the first to post one!" -msgstr "" +msgstr "¡Sé la primera persona en publicar!" #: actions/publictagcloud.php:75 #, php-format @@ -2943,14 +2937,16 @@ msgstr "" #: actions/recoverpassword.php:158 msgid "You have been identified. Enter a new password below. " msgstr "" +"Se te ha identificado. Por favor, escribe una nueva contraseña a " +"continuación. " #: actions/recoverpassword.php:188 msgid "Password recovery" -msgstr "" +msgstr "Recuperación de contraseña" #: actions/recoverpassword.php:191 msgid "Nickname or email address" -msgstr "" +msgstr "Nombre de usuario o dirección de correo electrónico" #: actions/recoverpassword.php:193 msgid "Your nickname on this server, or your registered email address." @@ -3107,13 +3103,12 @@ msgid "Creative Commons Attribution 3.0" msgstr "" #: actions/register.php:497 -#, fuzzy msgid "" " except this private data: password, email address, IM address, and phone " "number." msgstr "" -"excepto los siguientes datos privados: contraseña, dirección de correo " -"electrónico, dirección de mensajería instantánea, número de teléfono." +"con excepción de esta información privada: contraseña, dirección de correo " +"electrónico, dirección de mensajería instantánea y número de teléfono." #: actions/register.php:538 #, fuzzy, php-format @@ -3212,29 +3207,24 @@ msgid "That’s a local profile! Login to subscribe." msgstr "¡Este es un perfil local! Ingresa para suscribirte" #: actions/remotesubscribe.php:183 -#, fuzzy msgid "Couldn’t get a request token." -msgstr "No se pudo obtener la señal de petición." +msgstr "No se pudo obtener un token de solicitud" #: actions/repeat.php:57 -#, fuzzy msgid "Only logged-in users can repeat notices." -msgstr "Sólo el usuario puede leer sus bandejas de correo." +msgstr "Sólo los usuarios que hayan accedido pueden repetir mensajes." #: actions/repeat.php:64 actions/repeat.php:71 -#, fuzzy msgid "No notice specified." -msgstr "No se especificó perfil." +msgstr "No se ha especificado un mensaje." #: actions/repeat.php:76 -#, fuzzy msgid "You can't repeat your own notice." -msgstr "No puedes registrarte si no estás de acuerdo con la licencia." +msgstr "No puedes repetir tus propios mensajes." #: actions/repeat.php:90 -#, fuzzy msgid "You already repeated that notice." -msgstr "Ya has bloqueado este usuario." +msgstr "Ya has repetido este mensaje." #: actions/repeat.php:114 lib/noticelist.php:642 msgid "Repeated" @@ -3251,9 +3241,9 @@ msgid "Replies to %s" msgstr "Respuestas a %s" #: actions/replies.php:127 -#, fuzzy, php-format +#, php-format msgid "Replies to %1$s, page %2$d" -msgstr "Respuestas a %1$s en %2$s!" +msgstr "Respuestas a %1$s, página %2$d" #: actions/replies.php:144 #, fuzzy, php-format @@ -3297,9 +3287,8 @@ msgid "Replies to %1$s on %2$s!" msgstr "Respuestas a %1$s en %2$s!" #: actions/rsd.php:146 actions/version.php:157 -#, fuzzy msgid "StatusNet" -msgstr "Status borrado." +msgstr "StatusNet" #: actions/sandbox.php:65 actions/unsandbox.php:65 #, fuzzy @@ -3318,11 +3307,11 @@ msgstr "Sesiones" #: actions/sessionsadminpanel.php:65 msgid "Session settings for this StatusNet site." -msgstr "" +msgstr "Configuración de sesión para este sitio StatusNet." #: actions/sessionsadminpanel.php:175 msgid "Handle sessions" -msgstr "" +msgstr "Gestionar sesiones" #: actions/sessionsadminpanel.php:177 msgid "Whether to handle sessions ourselves." @@ -3348,13 +3337,12 @@ msgid "You must be logged in to view an application." msgstr "Debes estar conectado para dejar un grupo." #: actions/showapplication.php:157 -#, fuzzy msgid "Application profile" -msgstr "Aviso sin perfil" +msgstr "Perfil de la aplicación" #: actions/showapplication.php:159 lib/applicationeditform.php:180 msgid "Icon" -msgstr "" +msgstr "Icono" #: actions/showapplication.php:169 actions/version.php:195 #: lib/applicationeditform.php:195 @@ -3362,9 +3350,8 @@ msgid "Name" msgstr "Nombre" #: actions/showapplication.php:178 lib/applicationeditform.php:222 -#, fuzzy msgid "Organization" -msgstr "Paginación" +msgstr "Organización" #: actions/showapplication.php:187 actions/version.php:198 #: lib/applicationeditform.php:209 lib/groupeditform.php:172 @@ -3383,7 +3370,7 @@ msgstr "" #: actions/showapplication.php:213 msgid "Application actions" -msgstr "" +msgstr "Acciones de la aplicación" #: actions/showapplication.php:236 msgid "Reset key & secret" @@ -3391,7 +3378,7 @@ msgstr "" #: actions/showapplication.php:261 msgid "Application info" -msgstr "" +msgstr "Información de la aplicación" #: actions/showapplication.php:263 msgid "Consumer key" @@ -3411,7 +3398,7 @@ msgstr "" #: actions/showapplication.php:283 msgid "Authorize URL" -msgstr "" +msgstr "Autorizar URL" #: actions/showapplication.php:288 msgid "" @@ -3484,9 +3471,8 @@ msgid "%1$s group, page %2$d" msgstr "Miembros del grupo %s, página %d" #: actions/showgroup.php:218 -#, fuzzy msgid "Group profile" -msgstr "Perfil de grupo" +msgstr "Perfil del grupo" #: actions/showgroup.php:263 actions/tagother.php:118 #: actions/userauthorization.php:175 lib/userprofile.php:177 @@ -3495,13 +3481,12 @@ msgstr "URL" #: actions/showgroup.php:274 actions/tagother.php:128 #: actions/userauthorization.php:187 lib/userprofile.php:194 -#, fuzzy msgid "Note" msgstr "Nota" #: actions/showgroup.php:284 lib/groupeditform.php:184 msgid "Aliases" -msgstr "" +msgstr "Alias" #: actions/showgroup.php:293 msgid "Group actions" @@ -3543,9 +3528,8 @@ msgid "All members" msgstr "Todos los miembros" #: actions/showgroup.php:432 -#, fuzzy msgid "Created" -msgstr "Crear" +msgstr "Creado" #: actions/showgroup.php:448 #, php-format @@ -3569,9 +3553,8 @@ msgstr "" "blogging](http://en.wikipedia.org/wiki/Micro-blogging) " #: actions/showgroup.php:482 -#, fuzzy msgid "Admins" -msgstr "Admin" +msgstr "Administradores" #: actions/showmessage.php:81 msgid "No such message." @@ -3596,14 +3579,14 @@ msgid "Notice deleted." msgstr "Aviso borrado" #: actions/showstream.php:73 -#, fuzzy, php-format +#, php-format msgid " tagged %s" -msgstr "Avisos marcados con %s" +msgstr "%s etiquetados" #: actions/showstream.php:79 -#, fuzzy, php-format +#, php-format msgid "%1$s, page %2$d" -msgstr "%s y amigos, página %d" +msgstr "%1$s, página %2$d" #: actions/showstream.php:122 #, fuzzy, php-format @@ -3684,7 +3667,7 @@ msgstr "El usuario te ha bloqueado." #: actions/siteadminpanel.php:69 msgid "Basic settings for this StatusNet site." -msgstr "" +msgstr "Configuración básica de este sitio StatusNet." #: actions/siteadminpanel.php:132 msgid "Site name must have non-zero length." @@ -3698,7 +3681,7 @@ msgstr "No es una dirección de correo electrónico válida" #: actions/siteadminpanel.php:158 #, php-format msgid "Unknown language \"%s\"." -msgstr "" +msgstr "Idioma desconocido \"%s\"." #: actions/siteadminpanel.php:165 msgid "Invalid snapshot report URL." @@ -3722,12 +3705,11 @@ msgstr "" #: actions/siteadminpanel.php:239 msgid "General" -msgstr "" +msgstr "General" #: actions/siteadminpanel.php:242 -#, fuzzy msgid "Site name" -msgstr "Aviso de sitio" +msgstr "Nombre del sitio" #: actions/siteadminpanel.php:243 msgid "The name of your site, like \"Yourcompany Microblog\"" @@ -3761,11 +3743,11 @@ msgstr "Vistas locales" #: actions/siteadminpanel.php:274 msgid "Default timezone" -msgstr "" +msgstr "Zona horaria predeterminada" #: actions/siteadminpanel.php:275 msgid "Default timezone for the site; usually UTC." -msgstr "" +msgstr "Zona horaria predeterminada del sitio; generalmente UTC." #: actions/siteadminpanel.php:281 #, fuzzy @@ -3806,19 +3788,19 @@ msgstr "" #: actions/siteadminpanel.php:308 msgid "Snapshots will be sent to this URL" -msgstr "" +msgstr "Las capturas se enviarán a este URL" #: actions/siteadminpanel.php:315 msgid "Limits" -msgstr "" +msgstr "Límites" #: actions/siteadminpanel.php:318 msgid "Text limit" -msgstr "" +msgstr "Límite de texto" #: actions/siteadminpanel.php:318 msgid "Maximum number of characters for notices." -msgstr "" +msgstr "Cantidad máxima de caracteres para los mensajes." #: actions/siteadminpanel.php:322 msgid "Dupe limit" @@ -3829,9 +3811,8 @@ msgid "How long users must wait (in seconds) to post the same thing again." msgstr "" #: actions/smssettings.php:58 -#, fuzzy msgid "SMS settings" -msgstr "Preferencias SMS" +msgstr "Configuración de SMS" #: actions/smssettings.php:69 #, php-format @@ -3860,9 +3841,8 @@ msgid "Enter the code you received on your phone." msgstr "Ingrese el código recibido en su teléfono" #: actions/smssettings.php:138 -#, fuzzy msgid "SMS phone number" -msgstr "Número telefónico para sms" +msgstr "Número de teléfono de SMS" #: actions/smssettings.php:140 msgid "Phone number, no punctuation or spaces, with area code" @@ -3911,9 +3891,8 @@ msgid "That is not your phone number." msgstr "Ese no es tu número telefónico" #: actions/smssettings.php:465 -#, fuzzy msgid "Mobile carrier" -msgstr "Operador móvil" +msgstr "Operador de telefonía móvil" #: actions/smssettings.php:469 msgid "Select a carrier" @@ -3949,7 +3928,6 @@ msgid "Not a local user." msgstr "No es usuario local." #: actions/subscribe.php:69 -#, fuzzy msgid "Subscribed" msgstr "Suscrito" @@ -4064,7 +4042,6 @@ msgid "Tag %s" msgstr "%s tag" #: actions/tagother.php:77 lib/userprofile.php:75 -#, fuzzy msgid "User profile" msgstr "Perfil de usuario" @@ -4092,9 +4069,8 @@ msgstr "" "suscritas a ti." #: actions/tagother.php:200 -#, fuzzy msgid "Could not save tags." -msgstr "No se pudo guardar tags." +msgstr "No se han podido guardar las etiquetas." #: actions/tagother.php:236 msgid "Use this form to add tags to your subscribers or subscriptions." @@ -4179,16 +4155,15 @@ msgstr "Nuevos usuarios" #: actions/useradminpanel.php:234 msgid "New user welcome" -msgstr "" +msgstr "Bienvenida a nuevos usuarios" #: actions/useradminpanel.php:235 msgid "Welcome text for new users (Max 255 chars)." msgstr "" #: actions/useradminpanel.php:240 -#, fuzzy msgid "Default subscription" -msgstr "Todas las suscripciones" +msgstr "Suscripción predeterminada" #: actions/useradminpanel.php:241 #, fuzzy @@ -4316,9 +4291,8 @@ msgid "Wrong image type for avatar URL ‘%s’." msgstr "Tipo de imagen incorrecto para '%s'" #: actions/userdesignsettings.php:76 lib/designsettings.php:65 -#, fuzzy msgid "Profile design" -msgstr "Configuración del perfil" +msgstr "Diseño del perfil" #: actions/userdesignsettings.php:87 lib/designsettings.php:76 msgid "" @@ -4336,9 +4310,8 @@ msgid "%1$s groups, page %2$d" msgstr "Miembros del grupo %s, página %d" #: actions/usergroups.php:130 -#, fuzzy msgid "Search for more groups" -msgstr "Buscar personas o texto" +msgstr "Buscar más grupos" #: actions/usergroups.php:153 #, fuzzy, php-format @@ -4402,7 +4375,7 @@ msgstr "Sesiones" #: actions/version.php:197 msgid "Author(s)" -msgstr "" +msgstr "Autor(es)" #: classes/File.php:144 #, php-format @@ -4427,9 +4400,8 @@ msgid "Group join failed." msgstr "Perfil de grupo" #: classes/Group_member.php:53 -#, fuzzy msgid "Not part of group." -msgstr "No se pudo actualizar el grupo." +msgstr "No es parte del grupo." #: classes/Group_member.php:60 #, fuzzy @@ -4460,14 +4432,12 @@ msgid "DB error inserting hashtag: %s" msgstr "Error de la BD al insertar la etiqueta clave: %s" #: classes/Notice.php:214 -#, fuzzy msgid "Problem saving notice. Too long." -msgstr "Hubo un problema al guardar el aviso." +msgstr "Ha habido un problema al guardar el mensaje. Es muy largo." #: classes/Notice.php:218 -#, fuzzy msgid "Problem saving notice. Unknown user." -msgstr "Hubo problemas al guardar el aviso. Usuario desconocido." +msgstr "Ha habido un problema al guardar el mensaje. Usuario desconocido." #: classes/Notice.php:223 msgid "" @@ -4503,7 +4473,7 @@ msgstr "Hubo un problema al guardar el aviso." msgid "DB error inserting reply: %s" msgstr "Error de BD al insertar respuesta: %s" -#: classes/Notice.php:1235 +#: classes/Notice.php:1271 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4513,11 +4483,11 @@ msgstr "RT @%1$s %2$s" msgid "Welcome to %1$s, @%2$s!" msgstr "Bienvenido a %1$s, @%2$s!" -#: classes/User_group.php:380 +#: classes/User_group.php:413 msgid "Could not create group." msgstr "No se pudo crear grupo." -#: classes/User_group.php:409 +#: classes/User_group.php:442 #, fuzzy msgid "Could not set group membership." msgstr "No se pudo configurar miembros de grupo." @@ -4551,9 +4521,9 @@ msgid "Other options" msgstr "Otras opciones" #: lib/action.php:144 -#, fuzzy, php-format +#, php-format msgid "%1$s - %2$s" -msgstr "%1$s (%2$s)" +msgstr "%1$s - %2$s" #: lib/action.php:159 msgid "Untitled page" @@ -4584,9 +4554,8 @@ msgid "Connect to services" msgstr "Conectar a los servicios" #: lib/action.php:448 -#, fuzzy msgid "Change site configuration" -msgstr "Navegación de sitio primario" +msgstr "Cambiar la configuración del sitio" #: lib/action.php:452 lib/subgroupnav.php:105 msgid "Invite" @@ -4743,9 +4712,8 @@ msgid "Before" msgstr "Antes" #: lib/adminpanelaction.php:96 -#, fuzzy msgid "You cannot make changes to this site." -msgstr "No puedes enviar mensaje a este usuario." +msgstr "No puedes hacer cambios a este sitio." #: lib/adminpanelaction.php:107 #, fuzzy @@ -4783,9 +4751,8 @@ msgid "User configuration" msgstr "SMS confirmación" #: lib/adminpanelaction.php:327 -#, fuzzy msgid "Access configuration" -msgstr "SMS confirmación" +msgstr "Configuración de acceso" #: lib/adminpanelaction.php:332 #, fuzzy @@ -4793,9 +4760,8 @@ msgid "Paths configuration" msgstr "SMS confirmación" #: lib/adminpanelaction.php:337 -#, fuzzy msgid "Sessions configuration" -msgstr "SMS confirmación" +msgstr "Configuración de sesiones" #: lib/apiauth.php:95 msgid "API resource requires read-write access, but you only have read access." @@ -6103,47 +6069,47 @@ msgstr "Mensaje" msgid "Moderate" msgstr "Moderar" -#: lib/util.php:870 +#: lib/util.php:871 msgid "a few seconds ago" msgstr "hace unos segundos" -#: lib/util.php:872 +#: lib/util.php:873 msgid "about a minute ago" msgstr "hace un minuto" -#: lib/util.php:874 +#: lib/util.php:875 #, php-format msgid "about %d minutes ago" msgstr "hace %d minutos" -#: lib/util.php:876 +#: lib/util.php:877 msgid "about an hour ago" msgstr "hace una hora" -#: lib/util.php:878 +#: lib/util.php:879 #, php-format msgid "about %d hours ago" msgstr "hace %d horas" -#: lib/util.php:880 +#: lib/util.php:881 msgid "about a day ago" msgstr "hace un día" -#: lib/util.php:882 +#: lib/util.php:883 #, php-format msgid "about %d days ago" msgstr "hace %d días" -#: lib/util.php:884 +#: lib/util.php:885 msgid "about a month ago" msgstr "hace un mes" -#: lib/util.php:886 +#: lib/util.php:887 #, php-format msgid "about %d months ago" msgstr "hace %d meses" -#: lib/util.php:888 +#: lib/util.php:889 msgid "about a year ago" msgstr "hace un año" diff --git a/locale/pt_BR/LC_MESSAGES/statusnet.po b/locale/pt_BR/LC_MESSAGES/statusnet.po index 6b94988bb0..b9ffc361b4 100644 --- a/locale/pt_BR/LC_MESSAGES/statusnet.po +++ b/locale/pt_BR/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-11 08:14+0000\n" -"PO-Revision-Date: 2010-02-11 08:15:43+0000\n" +"POT-Creation-Date: 2010-02-14 20:05+0000\n" +"PO-Revision-Date: 2010-02-14 20:07:20+0000\n" "Language-Team: Brazilian Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt-br\n" "X-Message-Group: out-statusnet\n" @@ -27,14 +27,12 @@ msgid "Access" msgstr "Acesso" #: actions/accessadminpanel.php:65 -#, fuzzy msgid "Site access settings" -msgstr "Salvar as configurações do site" +msgstr "Configurações de acesso ao site" #: actions/accessadminpanel.php:158 -#, fuzzy msgid "Registration" -msgstr "Registrar-se" +msgstr "Registro" #: actions/accessadminpanel.php:161 msgid "Private" @@ -73,9 +71,8 @@ msgid "Save" msgstr "Salvar" #: actions/accessadminpanel.php:189 -#, fuzzy msgid "Save access settings" -msgstr "Salvar as configurações do site" +msgstr "Salvar as configurações de acesso" #: actions/all.php:63 actions/public.php:97 actions/replies.php:92 #: actions/showfavorites.php:137 actions/tag.php:51 @@ -175,8 +172,8 @@ msgstr "" msgid "You and friends" msgstr "Você e amigos" -#: actions/allrss.php:119 actions/apitimelinefriends.php:121 -#: actions/apitimelinehome.php:122 +#: actions/allrss.php:119 actions/apitimelinefriends.php:119 +#: actions/apitimelinehome.php:120 #, php-format msgid "Updates from %1$s and friends on %2$s!" msgstr "Atualizações de %1$s e amigos no %2$s!" @@ -197,12 +194,12 @@ msgstr "Atualizações de %1$s e amigos no %2$s!" #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 -#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155 -#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156 -#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 +#: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 +#: actions/apitimelinegroup.php:182 actions/apitimelinehome.php:184 +#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 -#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 +#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 +#: actions/apitimelineuser.php:194 actions/apiusershow.php:101 msgid "API method not found." msgstr "O método da API não foi encontrado!" @@ -488,12 +485,11 @@ msgstr "grupos no %s" #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." -msgstr "" +msgstr "Não foi fornecido nenhum parâmetro oauth_token" #: actions/apioauthauthorize.php:106 -#, fuzzy msgid "Invalid token." -msgstr "Tamanho inválido." +msgstr "Token inválido." #: actions/apioauthauthorize.php:123 actions/avatarsettings.php:268 #: actions/deletenotice.php:157 actions/disfavor.php:74 @@ -519,16 +515,14 @@ msgid "Invalid nickname / password!" msgstr "Nome de usuário e/ou senha inválido(s)!" #: actions/apioauthauthorize.php:159 -#, fuzzy msgid "Database error deleting OAuth application user." msgstr "" -"Erro no banco de dados durante a exclusão do aplicativo OAuth do usuário." +"Erro no banco de dados durante a exclusão do usuário da aplicação OAuth." #: actions/apioauthauthorize.php:185 -#, fuzzy msgid "Database error inserting OAuth application user." msgstr "" -"Erro no banco de dados durante a inserção do aplicativo OAuth do usuário." +"Erro no banco de dados durante a inserção do usuário da aplicativo OAuth." #: actions/apioauthauthorize.php:214 #, php-format @@ -540,9 +534,9 @@ msgstr "" "acesso." #: actions/apioauthauthorize.php:227 -#, fuzzy, php-format +#, php-format msgid "The request token %s has been denied and revoked." -msgstr "O token de requisição %s foi negado." +msgstr "O token %s solicitado foi negado e revogado." #: actions/apioauthauthorize.php:232 actions/avatarsettings.php:281 #: actions/designadminpanel.php:103 actions/editapplication.php:139 @@ -568,6 +562,10 @@ msgid "" "the ability to %3$s your %4$s account data. You should only " "give access to your %4$s account to third parties you trust." msgstr "" +"A aplicação %1$s por %2$s solicita a " +"permissão para %3$s os dados da sua conta %4$s. Você deve " +"fornecer acesso à sua conta %4$s somente para terceiros nos quais você " +"confia." #: actions/apioauthauthorize.php:310 lib/action.php:441 msgid "Account" @@ -651,7 +649,7 @@ msgstr "Formato não suportado." msgid "%1$s / Favorites from %2$s" msgstr "%1$s / Favoritas de %2$s" -#: actions/apitimelinefavorites.php:120 +#: actions/apitimelinefavorites.php:117 #, php-format msgid "%1$s updates favorited by %2$s / %2$s." msgstr "%1$s marcadas como favoritas por %2$s / %2$s." @@ -662,7 +660,7 @@ msgstr "%1$s marcadas como favoritas por %2$s / %2$s." msgid "%s timeline" msgstr "Mensagens de %s" -#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -678,12 +676,12 @@ msgstr "%1$s / Mensagens mencionando %2$s" msgid "%1$s updates that reply to updates from %2$s / %3$s." msgstr "%1$s mensagens em resposta a mensagens de %2$s / %3$s." -#: actions/apitimelinepublic.php:107 actions/publicrss.php:103 +#: actions/apitimelinepublic.php:111 actions/publicrss.php:103 #, php-format msgid "%s public timeline" msgstr "Mensagens públicas de %s" -#: actions/apitimelinepublic.php:111 actions/publicrss.php:105 +#: actions/apitimelinepublic.php:115 actions/publicrss.php:105 #, php-format msgid "%s updates from everyone!" msgstr "%s mensagens de todo mundo!" @@ -693,7 +691,7 @@ msgstr "%s mensagens de todo mundo!" msgid "Repeated to %s" msgstr "Repetida para %s" -#: actions/apitimelineretweetsofme.php:112 +#: actions/apitimelineretweetsofme.php:114 #, php-format msgid "Repeats of %s" msgstr "Repetições de %s" @@ -703,7 +701,7 @@ msgstr "Repetições de %s" msgid "Notices tagged with %s" msgstr "Mensagens etiquetadas como %s" -#: actions/apitimelinetag.php:108 actions/tagrss.php:64 +#: actions/apitimelinetag.php:104 actions/tagrss.php:64 #, php-format msgid "Updates tagged with %1$s on %2$s!" msgstr "Mensagens etiquetadas como %1$s no %2$s!" @@ -933,14 +931,12 @@ msgid "Notices" msgstr "Mensagens" #: actions/deleteapplication.php:63 -#, fuzzy msgid "You must be logged in to delete an application." -msgstr "Você precisa estar autenticado para editar uma aplicação." +msgstr "Você precisa estar autenticado para excluir uma aplicação." #: actions/deleteapplication.php:71 -#, fuzzy msgid "Application not found." -msgstr "Informação da aplicação" +msgstr "A aplicação não foi encontrada." #: actions/deleteapplication.php:78 actions/editapplication.php:77 #: actions/showapplication.php:94 @@ -954,29 +950,26 @@ msgid "There was a problem with your session token." msgstr "Ocorreu um problema com o seu token de sessão." #: actions/deleteapplication.php:123 actions/deleteapplication.php:147 -#, fuzzy msgid "Delete application" -msgstr "Editar a aplicação" +msgstr "Excluir a aplicação" #: actions/deleteapplication.php:149 -#, fuzzy 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 "" -"Tem certeza que deseja excluir este usuário? Isso irá eliminar todos os " -"dados deste usuário do banco de dados, sem cópia de segurança." +"Tem certeza que deseja excluir esta aplicação? Isso eliminará todos os dados " +"desta aplicação do banco de dados, incluindo todas as conexões existentes " +"com os usuários." #: actions/deleteapplication.php:156 -#, fuzzy msgid "Do not delete this application" -msgstr "Não excluir esta mensagem." +msgstr "Não excluir esta aplicação" #: actions/deleteapplication.php:160 -#, fuzzy msgid "Delete this application" -msgstr "Ícone para esta aplicação" +msgstr "Excluir esta aplicação" #: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 #: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 @@ -1033,8 +1026,8 @@ msgid "" "Are you sure you want to delete this user? This will clear all data about " "the user from the database, without a backup." msgstr "" -"Tem certeza que deseja excluir este usuário? Isso irá eliminar todos os " -"dados deste usuário do banco de dados, sem cópia de segurança." +"Tem certeza que deseja excluir este usuário? Isso eliminará todos os dados " +"deste usuário do banco de dados, sem cópia de segurança." #: actions/deleteuser.php:148 lib/deleteuserform.php:77 msgid "Delete this user" @@ -1157,12 +1150,11 @@ msgid "Add to favorites" msgstr "Adicionar às favoritas" #: actions/doc.php:158 -#, fuzzy, php-format +#, php-format msgid "No such document \"%s\"" -msgstr "Esse documento não existe." +msgstr "O documento \"%s\" não existe" #: actions/editapplication.php:54 -#, fuzzy msgid "Edit Application" msgstr "Editar a aplicação" @@ -1188,9 +1180,8 @@ msgid "Name is too long (max 255 chars)." msgstr "O nome é muito extenso (máx. 255 caracteres)." #: actions/editapplication.php:183 actions/newapplication.php:162 -#, fuzzy msgid "Name already in use. Try another one." -msgstr "Esta identificação já está em uso. Tente outro." +msgstr "Este nome já está em uso. Tente outro." #: actions/editapplication.php:186 actions/newapplication.php:168 msgid "Description is required." @@ -1255,7 +1246,7 @@ msgstr "descrição muito extensa (máximo %d caracteres)." msgid "Could not update group." msgstr "Não foi possível atualizar o grupo." -#: actions/editgroup.php:259 classes/User_group.php:390 +#: actions/editgroup.php:259 classes/User_group.php:423 msgid "Could not create aliases." msgstr "Não foi possível criar os apelidos." @@ -1902,9 +1893,9 @@ msgid "That is not your Jabber ID." msgstr "Essa não é sua ID do Jabber." #: actions/inbox.php:59 -#, fuzzy, php-format +#, php-format msgid "Inbox for %1$s - page %2$d" -msgstr "Recebidas por %s" +msgstr "Recebidas por %s - pág. %2$d" #: actions/inbox.php:62 #, php-format @@ -2156,7 +2147,6 @@ msgid "No current status" msgstr "Nenhuma mensagem atual" #: actions/newapplication.php:52 -#, fuzzy msgid "New Application" msgstr "Nova aplicação" @@ -2418,9 +2408,9 @@ msgid "Login token expired." msgstr "O token de autenticação expirou." #: actions/outbox.php:58 -#, fuzzy, php-format +#, php-format msgid "Outbox for %1$s - page %2$d" -msgstr "Enviadas de %s" +msgstr "Enviadas por %s - pág. %2$d" #: actions/outbox.php:61 #, php-format @@ -4530,7 +4520,7 @@ msgstr "Problema no salvamento da mensagem." msgid "DB error inserting reply: %s" msgstr "Erro no banco de dados na inserção da reposta: %s" -#: classes/Notice.php:1235 +#: classes/Notice.php:1271 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4540,11 +4530,11 @@ msgstr "RT @%1$s %2$s" msgid "Welcome to %1$s, @%2$s!" msgstr "Bem vindo(a) a %1$s, @%2$s!" -#: classes/User_group.php:380 +#: classes/User_group.php:413 msgid "Could not create group." msgstr "Não foi possível criar o grupo." -#: classes/User_group.php:409 +#: classes/User_group.php:442 msgid "Could not set group membership." msgstr "Não foi possível configurar a associação ao grupo." @@ -6206,47 +6196,47 @@ msgstr "Mensagem" msgid "Moderate" msgstr "Moderar" -#: lib/util.php:870 +#: lib/util.php:871 msgid "a few seconds ago" msgstr "alguns segundos atrás" -#: lib/util.php:872 +#: lib/util.php:873 msgid "about a minute ago" msgstr "cerca de 1 minuto atrás" -#: lib/util.php:874 +#: lib/util.php:875 #, php-format msgid "about %d minutes ago" msgstr "cerca de %d minutos atrás" -#: lib/util.php:876 +#: lib/util.php:877 msgid "about an hour ago" msgstr "cerca de 1 hora atrás" -#: lib/util.php:878 +#: lib/util.php:879 #, php-format msgid "about %d hours ago" msgstr "cerca de %d horas atrás" -#: lib/util.php:880 +#: lib/util.php:881 msgid "about a day ago" msgstr "cerca de 1 dia atrás" -#: lib/util.php:882 +#: lib/util.php:883 #, php-format msgid "about %d days ago" msgstr "cerca de %d dias atrás" -#: lib/util.php:884 +#: lib/util.php:885 msgid "about a month ago" msgstr "cerca de 1 mês atrás" -#: lib/util.php:886 +#: lib/util.php:887 #, php-format msgid "about %d months ago" msgstr "cerca de %d meses atrás" -#: lib/util.php:888 +#: lib/util.php:889 msgid "about a year ago" msgstr "cerca de 1 ano atrás" diff --git a/locale/ru/LC_MESSAGES/statusnet.po b/locale/ru/LC_MESSAGES/statusnet.po index c488351806..da1345a0d6 100644 --- a/locale/ru/LC_MESSAGES/statusnet.po +++ b/locale/ru/LC_MESSAGES/statusnet.po @@ -12,12 +12,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-11 08:14+0000\n" -"PO-Revision-Date: 2010-02-11 08:15:46+0000\n" +"POT-Creation-Date: 2010-02-14 20:05+0000\n" +"PO-Revision-Date: 2010-02-14 20:07:23+0000\n" "Language-Team: Russian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.16alpha (r62295); Translate extension (2010-01-16)\n" +"X-Generator: MediaWiki 1.16alpha (r62476); Translate extension (2010-01-16)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ru\n" "X-Message-Group: out-statusnet\n" @@ -173,8 +173,8 @@ msgstr "" msgid "You and friends" msgstr "Вы и друзья" -#: actions/allrss.php:119 actions/apitimelinefriends.php:121 -#: actions/apitimelinehome.php:122 +#: actions/allrss.php:119 actions/apitimelinefriends.php:119 +#: actions/apitimelinehome.php:120 #, php-format msgid "Updates from %1$s and friends on %2$s!" msgstr "Обновлено от %1$s и его друзей на %2$s!" @@ -195,12 +195,12 @@ msgstr "Обновлено от %1$s и его друзей на %2$s!" #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 -#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155 -#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156 -#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 +#: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 +#: actions/apitimelinegroup.php:182 actions/apitimelinehome.php:184 +#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 -#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 +#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 +#: actions/apitimelineuser.php:194 actions/apiusershow.php:101 msgid "API method not found." msgstr "Метод API не найден." @@ -647,7 +647,7 @@ msgstr "Неподдерживаемый формат." msgid "%1$s / Favorites from %2$s" msgstr "%1$s / Любимое от %2$s" -#: actions/apitimelinefavorites.php:120 +#: actions/apitimelinefavorites.php:117 #, php-format msgid "%1$s updates favorited by %2$s / %2$s." msgstr "Обновления %1$s, отмеченные как любимые %2$s / %2$s." @@ -658,7 +658,7 @@ msgstr "Обновления %1$s, отмеченные как любимые %2 msgid "%s timeline" msgstr "Лента %s" -#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -674,12 +674,12 @@ msgstr "%1$s / Обновления, упоминающие %2$s" msgid "%1$s updates that reply to updates from %2$s / %3$s." msgstr "%1$s обновил этот ответ на сообщение: %2$s / %3$s." -#: actions/apitimelinepublic.php:107 actions/publicrss.php:103 +#: actions/apitimelinepublic.php:111 actions/publicrss.php:103 #, php-format msgid "%s public timeline" msgstr "Общая лента %s" -#: actions/apitimelinepublic.php:111 actions/publicrss.php:105 +#: actions/apitimelinepublic.php:115 actions/publicrss.php:105 #, php-format msgid "%s updates from everyone!" msgstr "Обновления %s от всех!" @@ -689,7 +689,7 @@ msgstr "Обновления %s от всех!" msgid "Repeated to %s" msgstr "Повторено для %s" -#: actions/apitimelineretweetsofme.php:112 +#: actions/apitimelineretweetsofme.php:114 #, php-format msgid "Repeats of %s" msgstr "Повторы за %s" @@ -699,7 +699,7 @@ msgstr "Повторы за %s" msgid "Notices tagged with %s" msgstr "Записи с тегом %s" -#: actions/apitimelinetag.php:108 actions/tagrss.php:64 +#: actions/apitimelinetag.php:104 actions/tagrss.php:64 #, php-format msgid "Updates tagged with %1$s on %2$s!" msgstr "Обновления с тегом %1$s на %2$s!" @@ -1243,7 +1243,7 @@ msgstr "Слишком длинное описание (максимум %d си msgid "Could not update group." msgstr "Не удаётся обновить информацию о группе." -#: actions/editgroup.php:259 classes/User_group.php:390 +#: actions/editgroup.php:259 classes/User_group.php:423 msgid "Could not create aliases." msgstr "Не удаётся создать алиасы." @@ -1743,7 +1743,7 @@ msgstr "" "общими интересами. После присоединения к группе и вы сможете отправлять " "сообщения до всех её участников, используя команду «!имягруппы». Не видите " "группу, которая вас интересует? Попробуйте [найти её](%%%%action.groupsearch%" -"%%%) или [создайте собственную!](%%%%action.newgroup%%%%)" +"%%%) или [создайте собственную](%%%%action.newgroup%%%%)!" #: actions/groups.php:107 actions/usergroups.php:124 lib/groupeditform.php:122 msgid "Create a new group" @@ -4504,7 +4504,7 @@ msgstr "Проблемы с сохранением входящих сообще msgid "DB error inserting reply: %s" msgstr "Ошибка баз данных при вставке ответа для %s" -#: classes/Notice.php:1235 +#: classes/Notice.php:1271 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" @@ -4514,11 +4514,11 @@ msgstr "RT @%1$s %2$s" msgid "Welcome to %1$s, @%2$s!" msgstr "Добро пожаловать на %1$s, @%2$s!" -#: classes/User_group.php:380 +#: classes/User_group.php:413 msgid "Could not create group." msgstr "Не удаётся создать группу." -#: classes/User_group.php:409 +#: classes/User_group.php:442 msgid "Could not set group membership." msgstr "Не удаётся назначить членство в группе." @@ -6179,47 +6179,47 @@ msgstr "Сообщение" msgid "Moderate" msgstr "Модерировать" -#: lib/util.php:870 +#: lib/util.php:871 msgid "a few seconds ago" msgstr "пару секунд назад" -#: lib/util.php:872 +#: lib/util.php:873 msgid "about a minute ago" msgstr "около минуты назад" -#: lib/util.php:874 +#: lib/util.php:875 #, php-format msgid "about %d minutes ago" msgstr "около %d минут(ы) назад" -#: lib/util.php:876 +#: lib/util.php:877 msgid "about an hour ago" msgstr "около часа назад" -#: lib/util.php:878 +#: lib/util.php:879 #, php-format msgid "about %d hours ago" msgstr "около %d часа(ов) назад" -#: lib/util.php:880 +#: lib/util.php:881 msgid "about a day ago" msgstr "около дня назад" -#: lib/util.php:882 +#: lib/util.php:883 #, php-format msgid "about %d days ago" msgstr "около %d дня(ей) назад" -#: lib/util.php:884 +#: lib/util.php:885 msgid "about a month ago" msgstr "около месяца назад" -#: lib/util.php:886 +#: lib/util.php:887 #, php-format msgid "about %d months ago" msgstr "около %d месяца(ев) назад" -#: lib/util.php:888 +#: lib/util.php:889 msgid "about a year ago" msgstr "около года назад" diff --git a/locale/statusnet.po b/locale/statusnet.po index 1676a76492..d1ee56f2ca 100644 --- a/locale/statusnet.po +++ b/locale/statusnet.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-02-11 08:14+0000\n" +"POT-Creation-Date: 2010-02-14 20:05+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -158,8 +158,8 @@ msgstr "" msgid "You and friends" msgstr "" -#: actions/allrss.php:119 actions/apitimelinefriends.php:121 -#: actions/apitimelinehome.php:122 +#: actions/allrss.php:119 actions/apitimelinefriends.php:119 +#: actions/apitimelinehome.php:120 #, php-format msgid "Updates from %1$s and friends on %2$s!" msgstr "" @@ -180,12 +180,12 @@ msgstr "" #: actions/apistatusesdestroy.php:102 actions/apistatusesretweets.php:112 #: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:137 #: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 -#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:155 -#: actions/apitimelinegroup.php:150 actions/apitimelinehome.php:156 -#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 +#: actions/apitimelinefavorites.php:183 actions/apitimelinefriends.php:187 +#: actions/apitimelinegroup.php:182 actions/apitimelinehome.php:184 +#: actions/apitimelinementions.php:175 actions/apitimelinepublic.php:152 #: actions/apitimelineretweetedtome.php:121 -#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 -#: actions/apitimelineuser.php:166 actions/apiusershow.php:101 +#: actions/apitimelineretweetsofme.php:152 actions/apitimelinetag.php:166 +#: actions/apitimelineuser.php:194 actions/apiusershow.php:101 msgid "API method not found." msgstr "" @@ -618,7 +618,7 @@ msgstr "" msgid "%1$s / Favorites from %2$s" msgstr "" -#: actions/apitimelinefavorites.php:120 +#: actions/apitimelinefavorites.php:117 #, php-format msgid "%1$s updates favorited by %2$s / %2$s." msgstr "" @@ -629,7 +629,7 @@ msgstr "" msgid "%s timeline" msgstr "" -#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126 +#: actions/apitimelinegroup.php:114 actions/apitimelineuser.php:126 #: actions/userrss.php:92 #, php-format msgid "Updates from %1$s on %2$s!" @@ -645,12 +645,12 @@ msgstr "" msgid "%1$s updates that reply to updates from %2$s / %3$s." msgstr "" -#: actions/apitimelinepublic.php:107 actions/publicrss.php:103 +#: actions/apitimelinepublic.php:111 actions/publicrss.php:103 #, php-format msgid "%s public timeline" msgstr "" -#: actions/apitimelinepublic.php:111 actions/publicrss.php:105 +#: actions/apitimelinepublic.php:115 actions/publicrss.php:105 #, php-format msgid "%s updates from everyone!" msgstr "" @@ -660,7 +660,7 @@ msgstr "" msgid "Repeated to %s" msgstr "" -#: actions/apitimelineretweetsofme.php:112 +#: actions/apitimelineretweetsofme.php:114 #, php-format msgid "Repeats of %s" msgstr "" @@ -670,7 +670,7 @@ msgstr "" msgid "Notices tagged with %s" msgstr "" -#: actions/apitimelinetag.php:108 actions/tagrss.php:64 +#: actions/apitimelinetag.php:104 actions/tagrss.php:64 #, php-format msgid "Updates tagged with %1$s on %2$s!" msgstr "" @@ -1201,7 +1201,7 @@ msgstr "" msgid "Could not update group." msgstr "" -#: actions/editgroup.php:259 classes/User_group.php:390 +#: actions/editgroup.php:259 classes/User_group.php:423 msgid "Could not create aliases." msgstr "" @@ -4214,7 +4214,7 @@ msgstr "" msgid "DB error inserting reply: %s" msgstr "" -#: classes/Notice.php:1235 +#: classes/Notice.php:1271 #, php-format msgid "RT @%1$s %2$s" msgstr "" @@ -4224,11 +4224,11 @@ msgstr "" msgid "Welcome to %1$s, @%2$s!" msgstr "" -#: classes/User_group.php:380 +#: classes/User_group.php:413 msgid "Could not create group." msgstr "" -#: classes/User_group.php:409 +#: classes/User_group.php:442 msgid "Could not set group membership." msgstr "" @@ -5737,47 +5737,47 @@ msgstr "" msgid "Moderate" msgstr "" -#: lib/util.php:870 +#: lib/util.php:871 msgid "a few seconds ago" msgstr "" -#: lib/util.php:872 +#: lib/util.php:873 msgid "about a minute ago" msgstr "" -#: lib/util.php:874 +#: lib/util.php:875 #, php-format msgid "about %d minutes ago" msgstr "" -#: lib/util.php:876 +#: lib/util.php:877 msgid "about an hour ago" msgstr "" -#: lib/util.php:878 +#: lib/util.php:879 #, php-format msgid "about %d hours ago" msgstr "" -#: lib/util.php:880 +#: lib/util.php:881 msgid "about a day ago" msgstr "" -#: lib/util.php:882 +#: lib/util.php:883 #, php-format msgid "about %d days ago" msgstr "" -#: lib/util.php:884 +#: lib/util.php:885 msgid "about a month ago" msgstr "" -#: lib/util.php:886 +#: lib/util.php:887 #, php-format msgid "about %d months ago" msgstr "" -#: lib/util.php:888 +#: lib/util.php:889 msgid "about a year ago" msgstr ""