From fd530a892fd969f8938d8f7300d348846e684d2f Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Wed, 4 Aug 2010 12:30:43 -0700 Subject: [PATCH 01/11] Fix for source attribution on notices; it was displaying the code instead of the source name sometimes. --- lib/noticelist.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/noticelist.php b/lib/noticelist.php index 17adf3a49c..252e1ca900 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -499,7 +499,7 @@ class NoticeListItem extends Widget $ns = $this->notice->getSource(); if ($ns) { - $source_name = _($ns->code); + $source_name = (empty($ns->name)) ? _($ns->code) : _($ns->name); $this->out->text(' '); $this->out->elementStart('span', 'source'); $this->out->text(_('from')); From 300ed65d301d21c33a5f0a196d6acfe762a34f29 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Thu, 5 Aug 2010 13:37:47 -0700 Subject: [PATCH 02/11] SubMirror plugin initial checkin: allows setting up automatic mirroring of posts from any of your subscriptions into your own stream, either via repeat or by copying the text. The UI for setup and editing is a bit nasty for now. Can be reached via 'Mirroring' tab in account settings, or from a link at top of subscriptions list. Currently relies on the OStatus plugin to handle actual setup, parsing, and importing of feeds; to support more general feed formatting we may need some further work there to accept weird feeds. Also requires an actual live subscription, but this could be changed in future. (Ensuring that PSHB feed subscriptions remain live even if nobody's directly subscribed might be tricky.) The repeat style is our preferred method since it retains full attribution, but right now we don't handle repeats very well across site boundaries; when pushed out to Twitter or to other StatusNet instances via OStatus, currently we end up losing some of the data and can end up with the 'RT @blah' version. WARNING: There's no loop detection yet; it's most likely possible to set up a fun loop of profiles repeating each others' stuff forever and ever and ever and ever... --- plugins/SubMirror/SubMirrorPlugin.php | 149 +++++++++++++ plugins/SubMirror/actions/addmirror.php | 155 ++++++++++++++ plugins/SubMirror/actions/editmirror.php | 105 +++++++++ plugins/SubMirror/actions/mirrorsettings.php | 105 +++++++++ plugins/SubMirror/classes/SubMirror.php | 213 +++++++++++++++++++ plugins/SubMirror/lib/addmirrorform.php | 171 +++++++++++++++ plugins/SubMirror/lib/editmirrorform.php | 189 ++++++++++++++++ plugins/SubMirror/lib/mirrorqueuehandler.php | 44 ++++ 8 files changed, 1131 insertions(+) create mode 100644 plugins/SubMirror/SubMirrorPlugin.php create mode 100644 plugins/SubMirror/actions/addmirror.php create mode 100644 plugins/SubMirror/actions/editmirror.php create mode 100644 plugins/SubMirror/actions/mirrorsettings.php create mode 100644 plugins/SubMirror/classes/SubMirror.php create mode 100644 plugins/SubMirror/lib/addmirrorform.php create mode 100644 plugins/SubMirror/lib/editmirrorform.php create mode 100644 plugins/SubMirror/lib/mirrorqueuehandler.php diff --git a/plugins/SubMirror/SubMirrorPlugin.php b/plugins/SubMirror/SubMirrorPlugin.php new file mode 100644 index 0000000000..8678cc3dd0 --- /dev/null +++ b/plugins/SubMirror/SubMirrorPlugin.php @@ -0,0 +1,149 @@ +. + */ + +/** + * @package SubMirrorPlugin + * @maintainer Brion Vibber + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + + +class SubMirrorPlugin extends Plugin +{ + /** + * Hook for RouterInitialized event. + * + * @param Net_URL_Mapper $m path-to-action mapper + * @return boolean hook return + */ + function onRouterInitialized($m) + { + $m->connect('settings/mirror', + array('action' => 'mirrorsettings')); + $m->connect('settings/mirror/add', + array('action' => 'addmirror')); + $m->connect('settings/mirror/edit', + array('action' => 'editmirror')); + return true; + } + + /** + * Automatically load the actions and libraries used by the plugin + * + * @param Class $cls the class + * + * @return boolean hook return + * + */ + function onAutoload($cls) + { + $base = dirname(__FILE__); + $lower = strtolower($cls); + $files = array("$base/lib/$lower.php", + "$base/classes/$cls.php"); + if (substr($lower, -6) == 'action') { + $files[] = "$base/actions/" . substr($lower, 0, -6) . ".php"; + } + foreach ($files as $file) { + if (file_exists($file)) { + include_once $file; + return false; + } + } + return true; + } + + function handle($notice) + { + // Is anybody mirroring? + $mirror = new SubMirror(); + $mirror->subscribed = $notice->profile_id; + if ($mirror->find()) { + while ($mirror->fetch()) { + $mirror->repeat($notice); + } + } + } + + function onPluginVersion(&$versions) + { + $versions[] = array('name' => 'SubMirror', + 'version' => STATUSNET_VERSION, + 'author' => 'Brion Vibber', + 'homepage' => 'http://status.net/wiki/Plugin:SubMirror', + 'rawdescription' => + _m('Pull feeds into your timeline!')); + + return true; + } + + /** + * Menu item for settings + * + * @param Action &$action Action being executed + * + * @return boolean hook return + */ + + function onEndAccountSettingsNav(&$action) + { + $action_name = $action->trimmed('action'); + + $action->menuItem(common_local_url('mirrorsettings'), + // TRANS: SubMirror plugin menu item on user settings page. + _m('MENU', 'Mirroring'), + // TRANS: SubMirror plugin tooltip for user settings menu item. + _m('Configure mirroring of posts from other feeds'), + $action_name === 'mirrorsettings'); + + return true; + } + + function onCheckSchema() + { + $schema = Schema::get(); + $schema->ensureTable('submirror', SubMirror::schemaDef()); + return true; + } + + /** + * Set up queue handlers for outgoing hub pushes + * @param QueueManager $qm + * @return boolean hook return + */ + function onEndInitializeQueueManager(QueueManager $qm) + { + // After each notice save, check if there's any repeat mirrors. + $qm->connect('mirror', 'MirrorQueueHandler'); + return true; + } + + function onStartEnqueueNotice($notice, &$transports) + { + $transports[] = 'mirror'; + } + + function onStartShowSubscriptionsContent($action) + { + $action->element('a', + array('href' => common_local_url('mirrorsettings')), + _m('Set up mirroring options...')); + } +} diff --git a/plugins/SubMirror/actions/addmirror.php b/plugins/SubMirror/actions/addmirror.php new file mode 100644 index 0000000000..df6939491f --- /dev/null +++ b/plugins/SubMirror/actions/addmirror.php @@ -0,0 +1,155 @@ +. + * + * PHP version 5 + * + * @category Action + * @package StatusNet + * @author Brion Vibber + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Takes parameters: + * + * - feed: a profile ID + * - token: session token to prevent CSRF attacks + * - ajax: boolean; whether to return Ajax or full-browser results + * + * Only works if the current user is logged in. + * + * @category Action + * @package StatusNet + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +class AddMirrorAction extends Action +{ + var $user; + var $feedurl; + + /** + * Check pre-requisites and instantiate attributes + * + * @param Array $args array of arguments (URL, GET, POST) + * + * @return boolean success flag + */ + + function prepare($args) + { + parent::prepare($args); + $ok = $this->sharedBoilerplate(); + if ($ok) { + // and now do something useful! + $this->profile = $this->validateProfile($this->trimmed('profile')); + return true; + } else { + return $ok; + } + } + + function validateProfile($id) + { + $id = intval($id); + $profile = Profile::staticGet('id', $id); + if ($profile && $profile->id != $this->user->id) { + return $profile; + } + // TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed. + $this->clientError(_m("Invalid profile for mirroring.")); + } + + /** + * @fixme none of this belongs in end classes + * this stuff belongs in shared code! + */ + function sharedBoilerplate() + { + // Only allow POST requests + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->clientError(_('This action only accepts POST requests.')); + return false; + } + + // CSRF protection + + $token = $this->trimmed('token'); + + if (!$token || $token != common_session_token()) { + $this->clientError(_('There was a problem with your session token.'. + ' Try again, please.')); + return false; + } + + // Only for logged-in users + + $this->user = common_current_user(); + + if (empty($this->user)) { + $this->clientError(_('Not logged in.')); + return false; + } + return true; + } + + /** + * Handle request + * + * Does the subscription and returns results. + * + * @param Array $args unused. + * + * @return void + */ + + function handle($args) + { + // Throws exception on error + $this->saveMirror(); + + if ($this->boolean('ajax')) { + $this->startHTML('text/xml;charset=utf-8'); + $this->elementStart('head'); + $this->element('title', null, _('Subscribed')); + $this->elementEnd('head'); + $this->elementStart('body'); + $unsubscribe = new EditMirrorForm($this, $this->profile); + $unsubscribe->show(); + $this->elementEnd('body'); + $this->elementEnd('html'); + } else { + $url = common_local_url('mirrorsettings'); + common_redirect($url, 303); + } + } + + function saveMirror() + { + SubMirror::saveMirror($this->user, $this->profile); + } +} diff --git a/plugins/SubMirror/actions/editmirror.php b/plugins/SubMirror/actions/editmirror.php new file mode 100644 index 0000000000..7ddd32ef35 --- /dev/null +++ b/plugins/SubMirror/actions/editmirror.php @@ -0,0 +1,105 @@ +. + * + * PHP version 5 + * + * @category Action + * @package StatusNet + * @author Brion Vibber + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Takes parameters: + * + * - feed: a profile ID + * - token: session token to prevent CSRF attacks + * - ajax: boolean; whether to return Ajax or full-browser results + * + * Only works if the current user is logged in. + * + * @category Action + * @package StatusNet + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +class EditMirrorAction extends AddMirrorAction +{ + + /** + * Check pre-requisites and instantiate attributes + * + * @param Array $args array of arguments (URL, GET, POST) + * + * @return boolean success flag + */ + + function prepare($args) + { + parent::prepare($args); + $this->mirror = SubMirror::pkeyGet(array('subscriber' => $this->user->id, + 'subscribed' => $this->profile->id)); + + if (!$this->mirror) { + $this->clientError(_m("Requested invalid profile to edit.")); + } + + $this->style = $this->validateStyle($this->trimmed('style')); + + // DO NOT change to $this->boolean(), it will be wrong. + // We're checking for the presence of the setting, not its value. + $this->delete = (bool)$this->arg('delete'); + + return true; + } + + protected function validateStyle($style) + { + $allowed = array('repeat', 'copy'); + if (in_array($style, $allowed)) { + return $style; + } else { + $this->clientError(_m("Bad form data.")); + } + } + + function saveMirror() + { + $mirror = SubMirror::getMirror($this->user, $this->profile); + if (!$mirror) { + $this->clientError(_m('Requested edit of missing mirror')); + } + + if ($this->delete) { + $mirror->delete(); + } else if ($this->style != $mirror->style) { + $orig = clone($mirror); + $mirror->style = $this->style; + $mirror->modified = common_sql_now(); + $mirror->update($orig); + } + } +} diff --git a/plugins/SubMirror/actions/mirrorsettings.php b/plugins/SubMirror/actions/mirrorsettings.php new file mode 100644 index 0000000000..edb024183d --- /dev/null +++ b/plugins/SubMirror/actions/mirrorsettings.php @@ -0,0 +1,105 @@ +. + * + * @category Plugins + * @package StatusNet + * @author Brion Vibber + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class MirrorSettingsAction extends AccountSettingsAction +{ + /** + * Title of the page + * + * @return string Page title + */ + + function title() + { + return _m('Feed mirror settings'); + } + + /** + * Instructions for use + * + * @return string Instructions for use + */ + + function getInstructions() + { + return _m('You can mirror updates from your RSS and Atom feeds ' . + 'into your StatusNet timeline!'); + } + + /** + * Show the form for OpenID management + * + * We have one form with a few different submit buttons to do different things. + * + * @return void + */ + + function showContent() + { + $user = common_current_user(); + + $mirror = new SubMirror(); + $mirror->subscriber = $user->id; + if ($mirror->find()) { + while ($mirror->fetch()) { + $this->showFeedForm($mirror); + } + } + $this->showAddFeedForm(); + } + + function showFeedForm($mirror) + { + $profile = Profile::staticGet('id', $mirror->subscribed); + if ($profile) { + $form = new EditMirrorForm($this, $profile); + $form->show(); + } + } + + function showAddFeedForm() + { + $form = new AddMirrorForm($this); + $form->show(); + } + + /** + * Handle a POST request + * + * Muxes to different sub-functions based on which button was pushed + * + * @return void + */ + + function handlePost() + { + } +} diff --git a/plugins/SubMirror/classes/SubMirror.php b/plugins/SubMirror/classes/SubMirror.php new file mode 100644 index 0000000000..4e7e005db2 --- /dev/null +++ b/plugins/SubMirror/classes/SubMirror.php @@ -0,0 +1,213 @@ +. + */ + +/** + * @package SubMirrorPlugin + * @maintainer Brion Vibber + */ + +class SubMirror extends Memcached_DataObject +{ + public $__table = 'submirror'; + + public $subscriber; + public $subscribed; + + public $style; + + public $created; + public $modified; + + public /*static*/ function staticGet($k, $v=null) + { + return parent::staticGet(__CLASS__, $k, $v); + } + + /** + * return table definition for DB_DataObject + * + * DB_DataObject needs to know something about the table to manipulate + * instances. This method provides all the DB_DataObject needs to know. + * + * @return array array of column definitions + */ + + function table() + { + return array('subscriber' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, + 'subscribed' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, + + 'style' => DB_DATAOBJECT_STR, + + 'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL, + 'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL); + } + + static function schemaDef() + { + // @fixme need a reverse key on (subscribed, subscriber) as well + return array(new ColumnDef('subscriber', 'integer', + null, false, 'PRI'), + new ColumnDef('subscribed', 'integer', + null, false, 'PRI'), + + new ColumnDef('style', 'varchar', + 16, true), + + new ColumnDef('created', 'datetime', + null, false), + new ColumnDef('modified', 'datetime', + null, false)); + } + + /** + * return key definitions for DB_DataObject + * + * DB_DataObject needs to know about keys that the table has; this function + * defines them. + * + * @return array key definitions + */ + + function keys() + { + return array_keys($this->keyTypes()); + } + + /** + * return key definitions for Memcached_DataObject + * + * Our caching system uses the same key definitions, but uses a different + * method to get them. + * + * @return array key definitions + */ + + function keyTypes() + { + // @fixme keys + // need a sane key for reverse lookup too + return array('subscriber' => 'K', 'subscribed' => 'K'); + } + + function sequenceKey() + { + return array(false, false, false); + } + + /** + * @param Profile $subscribed + * @param Profile $subscribed + * @return SubMirror + * @throws ServerException + */ + public static function saveMirror($subscriber, $subscribed, $style='repeat') + { + // @fixme make sure they're subscribed! + $mirror = new SubMirror(); + + $mirror->subscriber = $subscriber->id; + $mirror->subscribed = $subscribed->id; + $mirror->style = $style; + + $mirror->created = common_sql_now(); + $mirror->modified = common_sql_now(); + $mirror->insert(); + + return $mirror; + } + + /** + * @param Notice $notice + * @return mixed Notice on successful mirroring, boolean if not + */ + public function mirrorNotice($notice) + { + $profile = Profile::staticGet('id', $this->subscriber); + if (!$profile) { + common_log(LOG_ERROR, "SubMirror plugin skipping auto-repeat of notice $notice->id for missing user $profile->id"); + return false; + } + + if ($this->style == 'copy') { + return $this->copyNotice($profile, $notice); + } else { // default to repeat mode + return $this->repeatNotice($profile, $notice); + } + } + + /** + * Mirror a notice using StatusNet's repeat functionality. + * This retains attribution within the site, and other nice things, + * but currently ends up looking like 'RT @foobar bla bla' when + * bridged out over OStatus or TwitterBridge. + * + * @param Notice $notice + * @return mixed Notice on successful repeat, true if already repeated, false on failure + */ + protected function repeatNotice($profile, $notice) + { + if($profile->hasRepeated($notice->id)) { + common_log(LOG_INFO, "SubMirror plugin skipping auto-repeat of notice $notice->id for user $profile->id; already repeated."); + return true; + } else { + common_log(LOG_INFO, "SubMirror plugin auto-repeating notice $notice->id for $profile->id"); + return $notice->repeat($profile->id, 'mirror'); + } + } + + /** + * Mirror a notice by emitting a new notice with the same contents. + * Kind of dirty, but if pulling an external data feed into an account + * that may be what you want. + * + * @param Notice $notice + * @return mixed Notice on successful repeat, true if already repeated, false on failure + */ + protected function copyNotice($profile, $notice) + { + $options = array('is_local' => Notice::LOCAL_PUBLIC, + 'url' => $notice->bestUrl(), // pass through the foreign link... + 'rendered' => $notice->rendered); + + $saved = Notice::saveNew($profile->id, + $notice->content, + 'feed', + $options); + return $saved; + } + + public /*static*/ function pkeyGet($v) + { + return parent::pkeyGet(__CLASS__, $v); + } + + /** + * Get the mirroring setting for a pair of profiles, if existing. + * + * @param Profile $subscriber + * @param Profile $subscribed + * @return mixed Profile or empty + */ + public static function getMirror($subscriber, $subscribed) + { + return self::pkeyGet(array('subscriber' => $subscriber->id, + 'subscribed' => $subscribed->id)); + } +} diff --git a/plugins/SubMirror/lib/addmirrorform.php b/plugins/SubMirror/lib/addmirrorform.php new file mode 100644 index 0000000000..9ee59661a5 --- /dev/null +++ b/plugins/SubMirror/lib/addmirrorform.php @@ -0,0 +1,171 @@ +. + * + * @package StatusNet + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class AddMirrorForm extends Form +{ + + /** + * Name of the form + * + * Sub-classes should overload this with the name of their form. + * + * @return void + */ + + function formLegend() + { + } + + /** + * Visible or invisible data elements + * + * Display the form fields that make up the data of the form. + * Sub-classes should overload this to show their data. + * + * @return void + */ + + function formData() + { + $this->out->elementStart('fieldset'); + + $this->out->elementStart('ul'); + + $this->li(); + $this->out->element('label', array('for' => $this->id() . '-profile'), + _m("Mirror one of your existing subscriptions:")); + $this->out->elementStart('select', array('name' => 'profile')); + + $user = common_current_user(); + $profile = $user->getSubscriptions(); + while ($profile->fetch()) { + $mirror = SubMirror::pkeyGet(array('subscriber' => $user->id, + 'subscribed' => $profile->id)); + if (!$mirror) { + $this->out->element('option', + array('value' => $profile->id), + $profile->getBestName()); + } + } + $this->out->elementEnd('select'); + $this->out->submit($this->id() . '-save', _m('Save')); + $this->unli(); + + + $this->li(); + + $this->out->elementStart('fieldset', array('style' => 'width: 360px; margin-left: auto; margin-right: auto')); + $this->out->element('p', false, + _m("Not already subscribed to the feed you want? " . + "Add a new remote subscription and paste in the URL!")); + + $this->out->elementStart('div', 'entity_actions'); + $this->out->elementStart('p', array('id' => 'entity_remote_subscribe', + 'class' => 'entity_subscribe')); + $this->out->element('a', array('href' => common_local_url('ostatussub'), + 'class' => 'entity_remote_subscribe') + , _m('Remote')); + $this->out->elementEnd('p'); + $this->out->elementEnd('div'); + + $this->out->element('div', array('style' => 'clear: both')); + $this->out->elementEnd('fieldset'); + $this->unli(); + + $this->out->elementEnd('ul'); + $this->out->elementEnd('fieldset'); + } + + private function doInput($id, $name, $label, $value=null, $instructions=null) + { + $this->out->element('label', array('for' => $id), $label); + $attrs = array('name' => $name, + 'type' => 'text', + 'id' => $id); + if ($value) { + $attrs['value'] = $value; + } + $this->out->element('input', $attrs); + if ($instructions) { + $this->out->element('p', 'form_guide', $instructions); + } + } + + /** + * Buttons for form actions + * + * Submit and cancel buttons (or whatever) + * Sub-classes should overload this to show their own buttons. + * + * @return void + */ + + function formActions() + { + } + + /** + * ID of the form + * + * Should be unique on the page. Sub-classes should overload this + * to show their own IDs. + * + * @return string ID of the form + */ + + function id() + { + return 'add-mirror-form'; + } + + /** + * Action of the form. + * + * URL to post to. Should be overloaded by subclasses to give + * somewhere to post to. + * + * @return string URL to post to + */ + + function action() + { + return common_local_url('addmirror'); + } + + /** + * Class of the form. + * + * @return string the form's class + */ + + function formClass() + { + return 'form_settings'; + } + +} diff --git a/plugins/SubMirror/lib/editmirrorform.php b/plugins/SubMirror/lib/editmirrorform.php new file mode 100644 index 0000000000..8236da3896 --- /dev/null +++ b/plugins/SubMirror/lib/editmirrorform.php @@ -0,0 +1,189 @@ +. + * + * @package StatusNet + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +class EditMirrorForm extends Form +{ + function __construct($action, $profile) + { + parent::__construct($action); + + $this->profile = clone($profile); + $this->user = common_current_user(); + $this->mirror = SubMirror::pkeyGet(array('subscriber' => $this->user->id, + 'subscribed' => $this->profile->id)); + } + + /** + * Name of the form + * + * Sub-classes should overload this with the name of their form. + * + * @return void + */ + + function formLegend() + { + } + + /** + * Visible or invisible data elements + * + * Display the form fields that make up the data of the form. + * Sub-classes should overload this to show their data. + * + * @return void + */ + + function formData() + { + $this->out->elementStart('fieldset'); + + $this->out->hidden('profile', $this->profile->id); + + $this->out->elementStart('div', array('style' => 'float: left; width: 80px;')); + $img = $this->getAvatar($this->profile); + $feed = $this->getFeed($this->profile); + $this->out->elementStart('a', array('href' => $this->profile->profileurl)); + $this->out->element('img', array('src' => $img, 'style' => 'float: left')); + $this->out->elementEnd('a'); + $this->out->elementEnd('div'); + + + $this->out->elementStart('div', array('style' => 'margin-left: 80px; margin-right: 20px')); + $this->out->elementStart('p'); + $this->out->elementStart('div'); + $this->out->element('a', array('href' => $this->profile->profileurl), $this->profile->getBestName()); + $this->out->elementEnd('div'); + $this->out->elementStart('div'); + if ($feed) { + $this->out->text(_m('LABEL', 'Remote feed:') . ' '); + //$this->out->element('a', array('href' => $feed), $feed); + $this->out->element('input', array('value' => $feed, 'readonly' => 'readonly', 'style' => 'width: 100%')); + } else { + $this->out->text(_m('LABEL', 'Local user')); + } + $this->out->elementEnd('div'); + $this->out->elementEnd('p'); + + $this->out->elementStart('fieldset', array('style' => 'margin-top: 20px')); + $this->out->element('legend', false, _m("Mirroring style")); + + $styles = array('repeat' => _m("Repeat: reference the original user's post (sometimes shows as 'RT @blah')"), + 'copy' => _m("Repost the content under my account")); + foreach ($styles as $key => $label) { + $this->out->elementStart('div'); + $attribs = array('type' => 'radio', + 'value' => $key, + 'name' => 'style', + 'id' => $this->id() . '-style'); + if ($key == $this->mirror->style || ($key == 'repeat' && empty($this->mirror->style))) { + $attribs['checked'] = 'checked'; + } + $this->out->element('input', $attribs); + $this->out->element('span', false, $label); // @fixme should be label, but the styles muck it up for now + $this->out->elementEnd('div'); + + } + $this->out->elementEnd('fieldset'); + + + $this->out->elementStart('div'); + $this->out->submit($this->id() . '-save', _m('Save')); + $this->out->element('input', array('type' => 'submit', + 'value' => _m('Stop mirroring'), + 'name' => 'delete', + 'class' => 'submit')); + $this->out->elementEnd('div'); + + $this->out->elementEnd('div'); + $this->out->elementEnd('fieldset'); + } + + private function getAvatar($profile) + { + $avatar = $this->profile->getAvatar(48); + if ($avatar) { + return $avatar->displayUrl(); + } else { + return Avatar::defaultImage(48); + } + } + + private function getFeed($profile) + { + // Ok this is a bit of a hack. ;) + if (class_exists('Ostatus_profile')) { + $oprofile = Ostatus_profile::staticGet('profile_id', $profile->id); + if ($oprofile) { + return $oprofile->feeduri; + } + } + var_dump('wtf'); + return false; + } + + /** + * ID of the form + * + * Should be unique on the page. Sub-classes should overload this + * to show their own IDs. + * + * @return string ID of the form + */ + + function id() + { + return 'edit-mirror-form-' . $this->profile->id; + } + + /** + * Action of the form. + * + * URL to post to. Should be overloaded by subclasses to give + * somewhere to post to. + * + * @return string URL to post to + */ + + function action() + { + return common_local_url('editmirror'); + } + + /** + * Class of the form. + * + * @return string the form's class + */ + + function formClass() + { + return 'form_settings'; + } + +} diff --git a/plugins/SubMirror/lib/mirrorqueuehandler.php b/plugins/SubMirror/lib/mirrorqueuehandler.php new file mode 100644 index 0000000000..0306180eeb --- /dev/null +++ b/plugins/SubMirror/lib/mirrorqueuehandler.php @@ -0,0 +1,44 @@ +. + */ + +/** + * Check for subscription mirroring options on each newly seen post! + * + * @package SubMirror + * @author Brion Vibber + */ + +class MirrorQueueHandler extends QueueHandler +{ + function transport() + { + return 'mirror'; + } + + function handle($notice) + { + $mirror = new SubMirror(); + $mirror->subscribed = $notice->profile_id; + if ($mirror->find()) { + while ($mirror->fetch()) { + $mirror->mirrorNotice($notice); + } + } + } +} From ebd2fc2f7cb799cc190b2d4a77d8d0057a8854c0 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 6 Aug 2010 10:14:07 -0700 Subject: [PATCH 03/11] Partial fix for ticket #2489 -- problems with SNI SSL virtual host certificate validation. Two prongs here: * We attempt to enable SNI on the SSL stream context with the appropriate hostname... This requires PHP 5.3.2 and OpenSSL that supports the TLS extensions. Unfortunately this doesn't seem to be working in my testing. * If set $config['http']['curl'] = true, we'll use the CURL backend if available. In my testing on Ubuntu 10.04, this works. No guarantees on other systems. I'm not enabling CURL mode by default just yet; want to make sure there's no other surprises. --- lib/default.php | 3 ++- lib/httpclient.php | 13 +++++++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/lib/default.php b/lib/default.php index dcf225d1fa..45a4560ff3 100644 --- a/lib/default.php +++ b/lib/default.php @@ -315,6 +315,7 @@ $default = 'members' => true, 'peopletag' => true), 'http' => // HTTP client settings when contacting other sites - array('ssl_cafile' => false // To enable SSL cert validation, point to a CA bundle (eg '/usr/lib/ssl/certs/ca-certificates.crt') + array('ssl_cafile' => false, // To enable SSL cert validation, point to a CA bundle (eg '/usr/lib/ssl/certs/ca-certificates.crt') + 'curl' => false, // Use CURL backend for HTTP fetches if available. (If not, PHP's socket streams will be used.) ), ); diff --git a/lib/httpclient.php b/lib/httpclient.php index b69f718e5f..514a5afeb2 100644 --- a/lib/httpclient.php +++ b/lib/httpclient.php @@ -145,6 +145,10 @@ class HTTPClient extends HTTP_Request2 $this->config['ssl_verify_peer'] = false; } + if (common_config('http', 'curl') && extension_loaded('curl')) { + $this->config['adapter'] = 'HTTP_Request2_Adapter_Curl'; + } + parent::__construct($url, $method, $config); $this->setHeader('User-Agent', $this->userAgent()); } @@ -204,6 +208,15 @@ class HTTPClient extends HTTP_Request2 protected function doRequest($url, $method, $headers) { $this->setUrl($url); + + // Workaround for HTTP_Request2 not setting up SNI in socket contexts; + // This fixes cert validation for SSL virtual hosts using SNI. + // Requires PHP 5.3.2 or later and OpenSSL with SNI support. + if ($this->url->getScheme() == 'https' && defined('OPENSSL_TLSEXT_SERVER_NAME')) { + $this->config['ssl_SNI_enabled'] = true; + $this->config['ssl_SNI_server_name'] = $this->url->getHost(); + } + $this->setMethod($method); if ($headers) { foreach ($headers as $header) { From 7e55fc00447923b40b2ffc87329fd95347d776f5 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 6 Aug 2010 10:56:18 -0700 Subject: [PATCH 04/11] OStatus/FeedSub: tweaked PuSH feed garbage collection so other plugins can declare usage of a low-level feed or an OStatus profile besides profile subscriptions & group memberships. SubMirror: redid add-mirror frontend to accept a feed URL, then pass that on to OStatus, instead of pulling from your subscriptions. Profile: tweaked subscriberCount() so it doesn't subtract 1 for foreign profiles who aren't subscribed to themselves; instead excludes the self-subscription in the count query. Memcached_DataObject: tweak to avoid extra error spew in the DB error raising Work in progress: tweaking feedsub garbage collection so we can count other uses --- classes/Memcached_DataObject.php | 2 +- classes/Profile.php | 4 +- plugins/OStatus/OStatusPlugin.php | 18 ++++ plugins/OStatus/classes/FeedSub.php | 30 +++++++ plugins/OStatus/classes/Ostatus_profile.php | 45 ++++++---- plugins/SubMirror/SubMirrorPlugin.php | 23 +++++ plugins/SubMirror/actions/addmirror.php | 94 ++------------------ plugins/SubMirror/actions/editmirror.php | 9 +- plugins/SubMirror/actions/mirrorsettings.php | 5 +- plugins/SubMirror/lib/addmirrorform.php | 44 ++------- 10 files changed, 125 insertions(+), 149 deletions(-) diff --git a/classes/Memcached_DataObject.php b/classes/Memcached_DataObject.php index 7768fe7571..0f1ed04892 100644 --- a/classes/Memcached_DataObject.php +++ b/classes/Memcached_DataObject.php @@ -574,7 +574,7 @@ class Memcached_DataObject extends Safe_DataObject function raiseError($message, $type = null, $behaviour = null) { $id = get_class($this); - if ($this->id) { + if (!empty($this->id)) { $id .= ':' . $this->id; } if ($message instanceof PEAR_Error) { diff --git a/classes/Profile.php b/classes/Profile.php index 0d0463b730..d7617f0b74 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -464,11 +464,9 @@ class Profile extends Memcached_DataObject $sub = new Subscription(); $sub->subscribed = $this->id; - + $sub->whereAdd('subscriber != subscribed'); $cnt = (int) $sub->count('distinct subscriber'); - $cnt = ($cnt > 0) ? $cnt - 1 : $cnt; - if (!empty($c)) { $c->set(common_cache_key('profile:subscriber_count:'.$this->id), $cnt); } diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php index 70971c5b34..3b073a5d13 100644 --- a/plugins/OStatus/OStatusPlugin.php +++ b/plugins/OStatus/OStatusPlugin.php @@ -479,6 +479,24 @@ class OStatusPlugin extends Plugin } } + /** + * Tell the FeedSub infrastructure whether we have any active OStatus + * usage for the feed; if not it'll be able to garbage-collect the + * feed subscription. + * + * @param FeedSub $feedsub + * @param integer $count in/out + * @return mixed hook return code + */ + function onFeedSubSubscriberCount($feedsub, &$count) + { + $oprofile = Ostatus_profile::staticGet('feeduri', $feedsub->uri); + if ($oprofile) { + $count += $oprofile->subscriberCount(); + } + return true; + } + /** * When about to subscribe to a remote user, start a server-to-server * PuSH subscription if needed. If we can't establish that, abort. diff --git a/plugins/OStatus/classes/FeedSub.php b/plugins/OStatus/classes/FeedSub.php index b10509dae6..9cd35e29c9 100644 --- a/plugins/OStatus/classes/FeedSub.php +++ b/plugins/OStatus/classes/FeedSub.php @@ -255,6 +255,9 @@ class FeedSub extends Memcached_DataObject /** * Send a PuSH unsubscription request to the hub for this feed. * The hub will later send us a confirmation POST to /main/push/callback. + * Warning: this will cancel the subscription even if someone else in + * the system is using it. Most callers will want garbageCollect() instead, + * which confirms there's no uses left. * * @return bool true on success, false on failure * @throws ServerException if feed state is not valid @@ -275,6 +278,33 @@ class FeedSub extends Memcached_DataObject return $this->doSubscribe('unsubscribe'); } + /** + * Check if there are any active local uses of this feed, and if not then + * make sure it's inactive, unsubscribing if necessary. + * + * @return boolean true if the subscription is now inactive, false if still active. + */ + public function garbageCollect() + { + if ($this->sub_state == '' || $this->sub_state == 'inactive') { + // No active PuSH subscription, we can just leave it be. + return true; + } else { + // PuSH subscription is either active or in an indeterminate state. + // Check if we're out of subscribers, and if so send an unsubscribe. + $count = 0; + Event::handle('FeedSubSubscriberCount', array($this, &$count)); + + if ($count) { + common_log(LOG_INFO, __METHOD__ . ': ok, ' . $count . ' user(s) left for ' . $this->uri); + return false; + } else { + common_log(LOG_INFO, __METHOD__ . ': unsubscribing, no users left for ' . $this->uri); + return $this->unsubscribe(); + } + } + } + protected function doSubscribe($mode) { $orig = clone($this); diff --git a/plugins/OStatus/classes/Ostatus_profile.php b/plugins/OStatus/classes/Ostatus_profile.php index 5d3f37cd07..2d7c632e63 100644 --- a/plugins/OStatus/classes/Ostatus_profile.php +++ b/plugins/OStatus/classes/Ostatus_profile.php @@ -215,22 +215,13 @@ class Ostatus_profile extends Memcached_DataObject } /** - * Send a PuSH unsubscription request to the hub for this feed. - * The hub will later send us a confirmation POST to /main/push/callback. + * Check if this remote profile has any active local subscriptions, and + * if not drop the PuSH subscription feed. * * @return bool true on success, false on failure - * @throws ServerException if feed state is not valid */ public function unsubscribe() { - $feedsub = FeedSub::staticGet('uri', $this->feeduri); - if (!$feedsub || $feedsub->sub_state == '' || $feedsub->sub_state == 'inactive') { - // No active PuSH subscription, we can just leave it be. - return true; - } else { - // PuSH subscription is either active or in an indeterminate state. - // Send an unsubscribe. - return $feedsub->unsubscribe(); - } + $this->garbageCollect(); } /** @@ -240,6 +231,21 @@ class Ostatus_profile extends Memcached_DataObject * @return boolean */ public function garbageCollect() + { + $feedsub = FeedSub::staticGet('uri', $this->feeduri); + return $feedsub->garbageCollect(); + } + + /** + * Check if this remote profile has any active local subscriptions, so the + * PuSH subscription layer can decide if it can drop the feed. + * + * This gets called via the FeedSubSubscriberCount event when running + * FeedSub::garbageCollect(). + * + * @return int + */ + public function subscriberCount() { if ($this->isGroup()) { $members = $this->localGroup()->getMembers(0, 1); @@ -247,13 +253,14 @@ class Ostatus_profile extends Memcached_DataObject } else { $count = $this->localProfile()->subscriberCount(); } - if ($count == 0) { - common_log(LOG_INFO, "Unsubscribing from now-unused remote feed $this->feeduri"); - $this->unsubscribe(); - return true; - } else { - return false; - } + common_log(LOG_INFO, __METHOD__ . " SUB COUNT BEFORE: $count"); + + // Other plugins may be piggybacking on OStatus without having + // an active group or user-to-user subscription we know about. + Event::handle('Ostatus_profileSubscriberCount', array($this, &$count)); + common_log(LOG_INFO, __METHOD__ . " SUB COUNT AFTER: $count"); + + return $count; } /** diff --git a/plugins/SubMirror/SubMirrorPlugin.php b/plugins/SubMirror/SubMirrorPlugin.php index 8678cc3dd0..00c04ad0b6 100644 --- a/plugins/SubMirror/SubMirrorPlugin.php +++ b/plugins/SubMirror/SubMirrorPlugin.php @@ -146,4 +146,27 @@ class SubMirrorPlugin extends Plugin array('href' => common_local_url('mirrorsettings')), _m('Set up mirroring options...')); } + + /** + * Let the OStatus subscription garbage collection know if we're + * making use of a remote feed, so it doesn't get dropped out + * from under us. + * + * @param Ostatus_profile $oprofile + * @param int $count in/out + * @return mixed hook return value + */ + function onOstatus_profileSubscriberCount($oprofile, &$count) + { + if ($oprofile->profile_id) { + $mirror = new SubMirror(); + $mirror->subscribed = $oprofile->profile_id; + if ($mirror->find()) { + while ($mirror->fetch()) { + $count++; + } + } + } + return true; + } } diff --git a/plugins/SubMirror/actions/addmirror.php b/plugins/SubMirror/actions/addmirror.php index df6939491f..5acdf1dfe4 100644 --- a/plugins/SubMirror/actions/addmirror.php +++ b/plugins/SubMirror/actions/addmirror.php @@ -46,9 +46,8 @@ if (!defined('STATUSNET')) { * @link http://status.net/ */ -class AddMirrorAction extends Action +class AddMirrorAction extends BaseMirrorAction { - var $user; var $feedurl; /** @@ -62,94 +61,17 @@ class AddMirrorAction extends Action function prepare($args) { parent::prepare($args); - $ok = $this->sharedBoilerplate(); - if ($ok) { - // and now do something useful! - $this->profile = $this->validateProfile($this->trimmed('profile')); - return true; - } else { - return $ok; - } - } - - function validateProfile($id) - { - $id = intval($id); - $profile = Profile::staticGet('id', $id); - if ($profile && $profile->id != $this->user->id) { - return $profile; - } - // TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed. - $this->clientError(_m("Invalid profile for mirroring.")); - } - - /** - * @fixme none of this belongs in end classes - * this stuff belongs in shared code! - */ - function sharedBoilerplate() - { - // Only allow POST requests - - if ($_SERVER['REQUEST_METHOD'] != 'POST') { - $this->clientError(_('This action only accepts POST requests.')); - return false; - } - - // CSRF protection - - $token = $this->trimmed('token'); - - if (!$token || $token != common_session_token()) { - $this->clientError(_('There was a problem with your session token.'. - ' Try again, please.')); - return false; - } - - // Only for logged-in users - - $this->user = common_current_user(); - - if (empty($this->user)) { - $this->clientError(_('Not logged in.')); - return false; - } + $this->feedurl = $this->validateFeedUrl($this->trimmed('feedurl')); + $this->profile = $this->profileForFeed($this->feedurl); return true; } - /** - * Handle request - * - * Does the subscription and returns results. - * - * @param Array $args unused. - * - * @return void - */ - - function handle($args) - { - // Throws exception on error - $this->saveMirror(); - - if ($this->boolean('ajax')) { - $this->startHTML('text/xml;charset=utf-8'); - $this->elementStart('head'); - $this->element('title', null, _('Subscribed')); - $this->elementEnd('head'); - $this->elementStart('body'); - $unsubscribe = new EditMirrorForm($this, $this->profile); - $unsubscribe->show(); - $this->elementEnd('body'); - $this->elementEnd('html'); - } else { - $url = common_local_url('mirrorsettings'); - common_redirect($url, 303); - } - } - function saveMirror() { - SubMirror::saveMirror($this->user, $this->profile); + if ($this->oprofile->subscribe()) { + SubMirror::saveMirror($this->user, $this->profile); + } else { + $this->serverError(_m("Could not subscribe to feed.")); + } } } diff --git a/plugins/SubMirror/actions/editmirror.php b/plugins/SubMirror/actions/editmirror.php index 7ddd32ef35..c7fdab0d67 100644 --- a/plugins/SubMirror/actions/editmirror.php +++ b/plugins/SubMirror/actions/editmirror.php @@ -46,7 +46,7 @@ if (!defined('STATUSNET')) { * @link http://status.net/ */ -class EditMirrorAction extends AddMirrorAction +class EditMirrorAction extends BaseMirrorAction { /** @@ -60,6 +60,9 @@ class EditMirrorAction extends AddMirrorAction function prepare($args) { parent::prepare($args); + + $this->profile = $this->validateProfile($this->trimmed('profile')); + $this->mirror = SubMirror::pkeyGet(array('subscriber' => $this->user->id, 'subscribed' => $this->profile->id)); @@ -95,6 +98,10 @@ class EditMirrorAction extends AddMirrorAction if ($this->delete) { $mirror->delete(); + $oprofile = Ostatus_profile::staticGet('profile_id', $this->profile->id); + if ($oprofile) { + $oprofile->garbageCollect(); + } } else if ($this->style != $mirror->style) { $orig = clone($mirror); $mirror->style = $this->style; diff --git a/plugins/SubMirror/actions/mirrorsettings.php b/plugins/SubMirror/actions/mirrorsettings.php index edb024183d..5463a8dc0c 100644 --- a/plugins/SubMirror/actions/mirrorsettings.php +++ b/plugins/SubMirror/actions/mirrorsettings.php @@ -50,7 +50,7 @@ class MirrorSettingsAction extends AccountSettingsAction function getInstructions() { - return _m('You can mirror updates from your RSS and Atom feeds ' . + return _m('You can mirror updates from many RSS and Atom feeds ' . 'into your StatusNet timeline!'); } @@ -65,6 +65,8 @@ class MirrorSettingsAction extends AccountSettingsAction function showContent() { $user = common_current_user(); + + $this->showAddFeedForm(); $mirror = new SubMirror(); $mirror->subscriber = $user->id; @@ -73,7 +75,6 @@ class MirrorSettingsAction extends AccountSettingsAction $this->showFeedForm($mirror); } } - $this->showAddFeedForm(); } function showFeedForm($mirror) diff --git a/plugins/SubMirror/lib/addmirrorform.php b/plugins/SubMirror/lib/addmirrorform.php index 9ee59661a5..0a798c9eaf 100644 --- a/plugins/SubMirror/lib/addmirrorform.php +++ b/plugins/SubMirror/lib/addmirrorform.php @@ -57,46 +57,15 @@ class AddMirrorForm extends Form $this->out->elementStart('ul'); $this->li(); - $this->out->element('label', array('for' => $this->id() . '-profile'), - _m("Mirror one of your existing subscriptions:")); - $this->out->elementStart('select', array('name' => 'profile')); - - $user = common_current_user(); - $profile = $user->getSubscriptions(); - while ($profile->fetch()) { - $mirror = SubMirror::pkeyGet(array('subscriber' => $user->id, - 'subscribed' => $profile->id)); - if (!$mirror) { - $this->out->element('option', - array('value' => $profile->id), - $profile->getBestName()); - } - } - $this->out->elementEnd('select'); - $this->out->submit($this->id() . '-save', _m('Save')); + $this->doInput('addmirror-feedurl', + 'feedurl', + _m('Web page or feed URL:'), + $this->out->trimmed('feedurl')); $this->unli(); - $this->li(); - - $this->out->elementStart('fieldset', array('style' => 'width: 360px; margin-left: auto; margin-right: auto')); - $this->out->element('p', false, - _m("Not already subscribed to the feed you want? " . - "Add a new remote subscription and paste in the URL!")); - - $this->out->elementStart('div', 'entity_actions'); - $this->out->elementStart('p', array('id' => 'entity_remote_subscribe', - 'class' => 'entity_subscribe')); - $this->out->element('a', array('href' => common_local_url('ostatussub'), - 'class' => 'entity_remote_subscribe') - , _m('Remote')); - $this->out->elementEnd('p'); - $this->out->elementEnd('div'); - - $this->out->element('div', array('style' => 'clear: both')); - $this->out->elementEnd('fieldset'); + $this->out->submit('addmirror-save', _m('Add feed')); $this->unli(); - $this->out->elementEnd('ul'); $this->out->elementEnd('fieldset'); } @@ -106,7 +75,8 @@ class AddMirrorForm extends Form $this->out->element('label', array('for' => $id), $label); $attrs = array('name' => $name, 'type' => 'text', - 'id' => $id); + 'id' => $id, + 'style' => 'width: 80%'); if ($value) { $attrs['value'] = $value; } From 79485340ab31ef9444431a098a5909b0be874264 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 6 Aug 2010 11:55:56 -0700 Subject: [PATCH 05/11] SubMirror: Drop mirror link from subscriptions list; has decoupled from subscriptions. --- plugins/SubMirror/SubMirrorPlugin.php | 7 ------- 1 file changed, 7 deletions(-) diff --git a/plugins/SubMirror/SubMirrorPlugin.php b/plugins/SubMirror/SubMirrorPlugin.php index 00c04ad0b6..7289e77938 100644 --- a/plugins/SubMirror/SubMirrorPlugin.php +++ b/plugins/SubMirror/SubMirrorPlugin.php @@ -140,13 +140,6 @@ class SubMirrorPlugin extends Plugin $transports[] = 'mirror'; } - function onStartShowSubscriptionsContent($action) - { - $action->element('a', - array('href' => common_local_url('mirrorsettings')), - _m('Set up mirroring options...')); - } - /** * Let the OStatus subscription garbage collection know if we're * making use of a remote feed, so it doesn't get dropped out From 729912e36a826f63ae109ae82125a97d1b100ce5 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 6 Aug 2010 12:00:31 -0700 Subject: [PATCH 06/11] Missing file from SubMirror. :P --- plugins/SubMirror/actions/basemirror.php | 169 +++++++++++++++++++++++ 1 file changed, 169 insertions(+) create mode 100644 plugins/SubMirror/actions/basemirror.php diff --git a/plugins/SubMirror/actions/basemirror.php b/plugins/SubMirror/actions/basemirror.php new file mode 100644 index 0000000000..5be0699f09 --- /dev/null +++ b/plugins/SubMirror/actions/basemirror.php @@ -0,0 +1,169 @@ +. + * + * PHP version 5 + * + * @category Action + * @package StatusNet + * @author Brion Vibber + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Takes parameters: + * + * - feed: a profile ID + * - token: session token to prevent CSRF attacks + * - ajax: boolean; whether to return Ajax or full-browser results + * + * Only works if the current user is logged in. + * + * @category Action + * @package StatusNet + * @copyright 2010 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 + * @link http://status.net/ + */ + +abstract class BaseMirrorAction extends Action +{ + var $user; + var $profile; + + /** + * Check pre-requisites and instantiate attributes + * + * @param Array $args array of arguments (URL, GET, POST) + * + * @return boolean success flag + */ + + function prepare($args) + { + parent::prepare($args); + return $this->sharedBoilerplate(); + } + + protected function validateFeedUrl($url) + { + if (common_valid_http_url($url)) { + return $url; + } else { + $this->clientError(_m("Invalid feed URL.")); + } + } + + protected function validateProfile($id) + { + $id = intval($id); + $profile = Profile::staticGet('id', $id); + if ($profile && $profile->id != $this->user->id) { + return $profile; + } + // TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed. + $this->clientError(_m("Invalid profile for mirroring.")); + } + + /** + * + * @param string $url + * @return Profile + */ + protected function profileForFeed($url) + { + $oprofile = Ostatus_profile::ensureProfileURL($url); + if ($oprofile->isGroup()) { + $this->clientError(_m("Can't mirror a StatusNet group at this time.")); + } + $this->oprofile = $oprofile; // @fixme ugly side effect :D + return $oprofile->localProfile(); + } + + /** + * @fixme none of this belongs in end classes + * this stuff belongs in shared code! + */ + function sharedBoilerplate() + { + // Only allow POST requests + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->clientError(_('This action only accepts POST requests.')); + return false; + } + + // CSRF protection + + $token = $this->trimmed('token'); + + if (!$token || $token != common_session_token()) { + $this->clientError(_('There was a problem with your session token.'. + ' Try again, please.')); + return false; + } + + // Only for logged-in users + + $this->user = common_current_user(); + + if (empty($this->user)) { + $this->clientError(_('Not logged in.')); + return false; + } + return true; + } + + /** + * Handle request + * + * Does the subscription and returns results. + * + * @param Array $args unused. + * + * @return void + */ + + function handle($args) + { + // Throws exception on error + $this->saveMirror(); + + if ($this->boolean('ajax')) { + $this->startHTML('text/xml;charset=utf-8'); + $this->elementStart('head'); + $this->element('title', null, _('Subscribed')); + $this->elementEnd('head'); + $this->elementStart('body'); + $unsubscribe = new EditMirrorForm($this, $this->profile); + $unsubscribe->show(); + $this->elementEnd('body'); + $this->elementEnd('html'); + } else { + $url = common_local_url('mirrorsettings'); + common_redirect($url, 303); + } + } + + abstract function saveMirror(); +} From 39277ebf78dbe21e27bb93550689a983bd0237ae Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 6 Aug 2010 12:04:34 -0700 Subject: [PATCH 07/11] And.... one more fix for queueing in SubMirror. --- plugins/SubMirror/lib/mirrorqueuehandler.php | 1 + 1 file changed, 1 insertion(+) diff --git a/plugins/SubMirror/lib/mirrorqueuehandler.php b/plugins/SubMirror/lib/mirrorqueuehandler.php index 0306180eeb..92b36b5ebf 100644 --- a/plugins/SubMirror/lib/mirrorqueuehandler.php +++ b/plugins/SubMirror/lib/mirrorqueuehandler.php @@ -40,5 +40,6 @@ class MirrorQueueHandler extends QueueHandler $mirror->mirrorNotice($notice); } } + return true; } } From fd2919be18c6045f948b77d4eba1a81212548d4a Mon Sep 17 00:00:00 2001 From: Eric Helgeson Date: Fri, 6 Aug 2010 22:48:00 -0500 Subject: [PATCH 08/11] Fixed PHP 5.3 by & value Cleaned up {}'s --- plugins/Gravatar/GravatarPlugin.php | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/plugins/Gravatar/GravatarPlugin.php b/plugins/Gravatar/GravatarPlugin.php index 580852072d..8a9721ea90 100644 --- a/plugins/Gravatar/GravatarPlugin.php +++ b/plugins/Gravatar/GravatarPlugin.php @@ -30,11 +30,13 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { class GravatarPlugin extends Plugin { - function onInitializePlugin() { + function onInitializePlugin() + { return true; } - function onStartAvatarFormData($action) { + function onStartAvatarFormData($action) + { $user = common_current_user(); $hasGravatar = $this->hasGravatar($user->id); @@ -43,7 +45,8 @@ class GravatarPlugin extends Plugin } } - function onEndAvatarFormData(&$action) { + function onEndAvatarFormData($action) + { $user = common_current_user(); $hasGravatar = $this->hasGravatar($user->id); @@ -89,7 +92,8 @@ class GravatarPlugin extends Plugin } } - function onStartAvatarSaveForm($action) { + function onStartAvatarSaveForm($action) + { if ($action->arg('add')) { $result = $this->gravatar_save(); @@ -178,7 +182,8 @@ class GravatarPlugin extends Plugin 'success' => true); } - function gravatar_url($email, $size) { + function gravatar_url($email, $size) + { $url = "http://www.gravatar.com/avatar.php?gravatar_id=". md5(strtolower($email)). "&default=".urlencode(Avatar::defaultImage($size)). @@ -197,4 +202,4 @@ class GravatarPlugin extends Plugin return true; } -} +} \ No newline at end of file From c8a706081e45d67280dd6be2d68922236adc85f2 Mon Sep 17 00:00:00 2001 From: James Walker Date: Sat, 7 Aug 2010 09:48:21 -0400 Subject: [PATCH 09/11] strip whitespace from me:data and me:sig (per spec) --- plugins/OStatus/lib/magicenvelope.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/plugins/OStatus/lib/magicenvelope.php b/plugins/OStatus/lib/magicenvelope.php index 3bdf24b317..967e5f6d17 100644 --- a/plugins/OStatus/lib/magicenvelope.php +++ b/plugins/OStatus/lib/magicenvelope.php @@ -210,13 +210,13 @@ class MagicEnvelope } $data_element = $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'data')->item(0); - + $sig_element = $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'sig')->item(0); return array( - 'data' => trim($data_element->nodeValue), + 'data' => preg_replace('/\s/', '', $data_element->nodeValue), 'data_type' => $data_element->getAttribute('type'), 'encoding' => $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'encoding')->item(0)->nodeValue, 'alg' => $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'alg')->item(0)->nodeValue, - 'sig' => $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'sig')->item(0)->nodeValue, + 'sig' => preg_replace('/\s/', '', $sig_element->nodeValue), ); } From 5549600505fa1b8abc11563eb026d6c40f8e0c37 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sat, 7 Aug 2010 18:33:40 +0200 Subject: [PATCH 10/11] Localisation updates from http://translatewiki.net --- locale/af/LC_MESSAGES/statusnet.po | 12 ++--- locale/ar/LC_MESSAGES/statusnet.po | 12 ++--- locale/arz/LC_MESSAGES/statusnet.po | 12 ++--- locale/bg/LC_MESSAGES/statusnet.po | 12 ++--- locale/br/LC_MESSAGES/statusnet.po | 74 +++++++++++++-------------- locale/ca/LC_MESSAGES/statusnet.po | 12 ++--- locale/cs/LC_MESSAGES/statusnet.po | 12 ++--- locale/da/LC_MESSAGES/statusnet.po | 12 ++--- locale/de/LC_MESSAGES/statusnet.po | 12 ++--- locale/el/LC_MESSAGES/statusnet.po | 12 ++--- locale/en_GB/LC_MESSAGES/statusnet.po | 12 ++--- locale/es/LC_MESSAGES/statusnet.po | 12 ++--- locale/fa/LC_MESSAGES/statusnet.po | 12 ++--- locale/fi/LC_MESSAGES/statusnet.po | 12 ++--- locale/fr/LC_MESSAGES/statusnet.po | 14 ++--- locale/ga/LC_MESSAGES/statusnet.po | 12 ++--- locale/gl/LC_MESSAGES/statusnet.po | 50 +++++++++--------- locale/he/LC_MESSAGES/statusnet.po | 12 ++--- locale/hsb/LC_MESSAGES/statusnet.po | 12 ++--- locale/ia/LC_MESSAGES/statusnet.po | 64 +++++++++++------------ locale/is/LC_MESSAGES/statusnet.po | 12 ++--- locale/it/LC_MESSAGES/statusnet.po | 12 ++--- locale/ja/LC_MESSAGES/statusnet.po | 12 ++--- locale/ko/LC_MESSAGES/statusnet.po | 12 ++--- locale/mk/LC_MESSAGES/statusnet.po | 12 ++--- locale/nb/LC_MESSAGES/statusnet.po | 12 ++--- locale/nl/LC_MESSAGES/statusnet.po | 14 ++--- locale/nn/LC_MESSAGES/statusnet.po | 12 ++--- locale/pl/LC_MESSAGES/statusnet.po | 12 ++--- locale/pt/LC_MESSAGES/statusnet.po | 12 ++--- locale/pt_BR/LC_MESSAGES/statusnet.po | 12 ++--- locale/ru/LC_MESSAGES/statusnet.po | 12 ++--- locale/statusnet.pot | 8 +-- locale/sv/LC_MESSAGES/statusnet.po | 12 ++--- locale/te/LC_MESSAGES/statusnet.po | 12 ++--- locale/tr/LC_MESSAGES/statusnet.po | 12 ++--- locale/uk/LC_MESSAGES/statusnet.po | 22 ++++---- locale/vi/LC_MESSAGES/statusnet.po | 12 ++--- locale/zh_CN/LC_MESSAGES/statusnet.po | 12 ++--- locale/zh_TW/LC_MESSAGES/statusnet.po | 12 ++--- 40 files changed, 317 insertions(+), 325 deletions(-) diff --git a/locale/af/LC_MESSAGES/statusnet.po b/locale/af/LC_MESSAGES/statusnet.po index a1a8a6801c..2e4b6b0574 100644 --- a/locale/af/LC_MESSAGES/statusnet.po +++ b/locale/af/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:38+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:23:59+0000\n" "Language-Team: Afrikaans\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: af\n" "X-Message-Group: out-statusnet\n" @@ -4726,21 +4726,21 @@ msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/ar/LC_MESSAGES/statusnet.po b/locale/ar/LC_MESSAGES/statusnet.po index c5e7f56b8d..e0d4701a3a 100644 --- a/locale/ar/LC_MESSAGES/statusnet.po +++ b/locale/ar/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:39+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:01+0000\n" "Language-Team: Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ar\n" "X-Message-Group: out-statusnet\n" @@ -4740,21 +4740,21 @@ msgstr "مشكلة أثناء حفظ الإشعار." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "آر تي @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/arz/LC_MESSAGES/statusnet.po b/locale/arz/LC_MESSAGES/statusnet.po index dc05558481..0b06f2817f 100644 --- a/locale/arz/LC_MESSAGES/statusnet.po +++ b/locale/arz/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:41+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:02+0000\n" "Language-Team: Egyptian Spoken Arabic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: arz\n" "X-Message-Group: out-statusnet\n" @@ -4768,21 +4768,21 @@ msgstr "مشكله أثناء حفظ الإشعار." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "آر تى @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/bg/LC_MESSAGES/statusnet.po b/locale/bg/LC_MESSAGES/statusnet.po index 4661bc824a..3b78847b5b 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:42+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:08+0000\n" "Language-Team: Bulgarian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: bg\n" "X-Message-Group: out-statusnet\n" @@ -4920,21 +4920,21 @@ msgstr "Проблем при записване на бележката." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/br/LC_MESSAGES/statusnet.po b/locale/br/LC_MESSAGES/statusnet.po index 676ef5a27a..2b12d7f566 100644 --- a/locale/br/LC_MESSAGES/statusnet.po +++ b/locale/br/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:44+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:10+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: br\n" "X-Message-Group: out-statusnet\n" @@ -354,9 +354,8 @@ msgid "Could not delete favorite." msgstr "Diposupl eo dilemel ar pennroll-mañ." #: actions/apifriendshipscreate.php:109 -#, fuzzy msgid "Could not follow user: profile not found." -msgstr "Diposupl eo heuliañ an implijer : N'eo ket bet kavet an implijer." +msgstr "Dibosupl eo heuliañ an implijer : n'eo ket bet kavet ar profil." #: actions/apifriendshipscreate.php:118 #, php-format @@ -503,9 +502,8 @@ msgid "groups on %s" msgstr "strolladoù war %s" #: actions/apimediaupload.php:99 -#, fuzzy msgid "Upload failed." -msgstr "C'hwitet en deus an urzhiad" +msgstr "Enporzhiadenn c'hwitet." #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." @@ -720,7 +718,7 @@ msgstr "Hizivadennoù merket gant %1$s e %2$s !" #: actions/apitrends.php:87 msgid "API method under construction." -msgstr "" +msgstr "Hentenn API war sevel." #: actions/attachment.php:73 msgid "No such attachment." @@ -756,7 +754,7 @@ msgstr "" #: actions/grouplogo.php:181 actions/remotesubscribe.php:191 #: actions/userauthorization.php:72 actions/userrss.php:108 msgid "User without matching profile." -msgstr "" +msgstr "Implijer hep profil klotus." #: actions/avatarsettings.php:119 actions/avatarsettings.php:197 #: actions/grouplogo.php:254 @@ -2782,6 +2780,9 @@ msgid "" "Search for people on %%site.name%% by their name, location, or interests. " "Separate the terms by spaces; they must be 3 characters or more." msgstr "" +"Klask tud e %%site.name%% dre o anv, o lec'hiadur pe o diduadennoù. " +"Dispartiañ termenoù ar c'hlask gant esaouennoù. Ret eo e vefe da nebeutañ 3 " +"arouezenn." #: actions/peoplesearch.php:58 msgid "People search" @@ -3233,6 +3234,8 @@ msgstr "Postel" #: actions/register.php:446 actions/register.php:450 msgid "Used only for updates, announcements, and password recovery" msgstr "" +"Implijet hepken evit an hizivadennoù, ar c'hemennoù, pe adtapout gerioù-" +"tremen" #: actions/register.php:457 msgid "Longer name, preferably your \"real\" name" @@ -3242,22 +3245,22 @@ msgstr "Anv hiroc'h, ho anv \"gwir\" a zo gwelloc'h" #, php-format msgid "" "I understand that content and data of %1$s are private and confidential." -msgstr "" +msgstr "Kompren a ran ez eo prevez danvez ha roadennoù %1$s." #: actions/register.php:528 #, php-format msgid "My text and files are copyright by %1$s." -msgstr "" +msgstr "Ma zestenn ha ma restroù a zo gwarezet dre copyright gant %1$s." #. TRANS: Copyright checkbox label in registration dialog, for all rights reserved with ownership left to contributors. #: actions/register.php:532 msgid "My text and files remain under my own copyright." -msgstr "" +msgstr "Ma zestenn ha ma restroù a chom dindan ma gwirioù oberour." #. TRANS: Copyright checkbox label in registration dialog, for all rights reserved. #: actions/register.php:535 msgid "All rights reserved." -msgstr "" +msgstr "Holl gwrioù miret strizh." #. TRANS: Copyright checkbox label in registration dialog, for Creative Commons-style licenses. #: actions/register.php:540 @@ -4702,12 +4705,12 @@ msgstr "" #. TRANS: Client exception thrown if a notice contains too many characters. #: classes/Notice.php:260 msgid "Problem saving notice. Too long." -msgstr "" +msgstr "Ur gudenn a zo bet e-pad enrolladenn ar c'hemenn. Re hir." #. TRANS: Client exception thrown when trying to save a notice for an unknown user. #: classes/Notice.php:265 msgid "Problem saving notice. Unknown user." -msgstr "" +msgstr "Ur gudenn a zo bet e-pad enrolladenn ar c'hemenn. Implijer dianav." #. TRANS: Client exception thrown when a user tries to post too many notices in a given time frame. #: classes/Notice.php:271 @@ -4745,36 +4748,34 @@ msgstr "Ur gudenn 'zo bet pa veze enrollet boest degemer ar strollad." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." -msgstr "An implijer-mañ n'eus profil ebet dezhañ." +msgstr "Mankout a ra ar profil." #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 -#, fuzzy msgid "Unable to save tag." -msgstr "Diposubl eo enrollañ ali al lec'hienn." +msgstr "Dibosupl eo enrollañ an tikedenn." #. TRANS: Exception thrown when trying to subscribe while being banned from subscribing. #: classes/Subscription.php:75 lib/oauthstore.php:465 @@ -4810,9 +4811,8 @@ msgstr "Diposubl eo dilemel ar postel kadarnadur." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." -msgstr "Dibosupl eo paouez gant ar c'houmanant." +msgstr "Dibosupl eo dilemel ar c'houmanant." #. TRANS: Notice given on user registration. #. TRANS: %1$s is the sitename, $2$s is the registering user's nickname. @@ -5558,7 +5558,7 @@ msgstr "" #: lib/command.php:634 #, php-format msgid "Subscribed to %s" -msgstr "" +msgstr "Koumanantet da %s" #: lib/command.php:655 lib/command.php:754 msgid "Specify the name of the user to unsubscribe from" @@ -5567,7 +5567,7 @@ msgstr "" #: lib/command.php:664 #, php-format msgid "Unsubscribed from %s" -msgstr "" +msgstr "Digoumanantiñ da %s" #: lib/command.php:682 lib/command.php:705 msgid "Command not yet implemented." @@ -5579,7 +5579,7 @@ msgstr "Kemennoù diweredekaet." #: lib/command.php:687 msgid "Can't turn off notification." -msgstr "" +msgstr "Dibosupl eo diweredekaat ar c'hemennoù." #: lib/command.php:708 msgid "Notification on." @@ -5587,7 +5587,7 @@ msgstr "Kemennoù gweredekaet" #: lib/command.php:710 msgid "Can't turn on notification." -msgstr "" +msgstr "Dibosupl eo gweredekaat ar c'hemennoù." #: lib/command.php:723 msgid "Login command is disabled" @@ -5596,7 +5596,7 @@ msgstr "Diweredekaet eo an urzhiad evit digeriñ un dalc'h" #: lib/command.php:734 #, php-format msgid "This link is useable only once, and is good for only 2 minutes: %s" -msgstr "" +msgstr "Implijadus eo al liamm-se ur wech hepken, hag e-pad 2 vunutenn : %s" #: lib/command.php:761 #, php-format @@ -5605,7 +5605,7 @@ msgstr "Digoumanantet eus %s" #: lib/command.php:778 msgid "You are not subscribed to anyone." -msgstr "" +msgstr "N'hoc'h ket koumanantet da zen ebet." #: lib/command.php:780 #, fuzzy @@ -5616,7 +5616,7 @@ msgstr[1] "You are subscribed to these people:" #: lib/command.php:800 msgid "No one is subscribed to you." -msgstr "" +msgstr "Den n'eo koumanantet deoc'h." #: lib/command.php:802 #, fuzzy @@ -5680,7 +5680,7 @@ msgstr "" #: lib/common.php:135 msgid "No configuration file found. " -msgstr "" +msgstr "N'eo bet kavet restr kefluniadur ebet. " #: lib/common.php:136 msgid "I looked for configuration files in the following places: " @@ -5716,11 +5716,11 @@ msgstr "" #: lib/dberroraction.php:60 msgid "Database error" -msgstr "" +msgstr "Fazi bank roadennoù" #: lib/designsettings.php:105 msgid "Upload file" -msgstr "" +msgstr "Enporzhiañ ar restr" #: lib/designsettings.php:109 msgid "" @@ -5733,15 +5733,15 @@ msgstr "" #: lib/disfavorform.php:114 lib/disfavorform.php:140 msgid "Disfavor this notice" -msgstr "" +msgstr "Tennañ eus ar pennrolloù" #: lib/favorform.php:114 lib/favorform.php:140 msgid "Favor this notice" -msgstr "" +msgstr "Ouzhpennañ d'ar pennrolloù" #: lib/favorform.php:140 msgid "Favor" -msgstr "" +msgstr "Pennrolloù" #: lib/feed.php:85 msgid "RSS 1.0" diff --git a/locale/ca/LC_MESSAGES/statusnet.po b/locale/ca/LC_MESSAGES/statusnet.po index 94bca4e7f0..d7de3b4d6b 100644 --- a/locale/ca/LC_MESSAGES/statusnet.po +++ b/locale/ca/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:45+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:12+0000\n" "Language-Team: Catalan\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ca\n" "X-Message-Group: out-statusnet\n" @@ -4992,21 +4992,21 @@ msgstr "S'ha produït un problema en desar la safata d'entrada del grup." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/cs/LC_MESSAGES/statusnet.po b/locale/cs/LC_MESSAGES/statusnet.po index 0834169e90..8df43a7890 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:47+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:14+0000\n" "Language-Team: Czech\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: cs\n" "X-Message-Group: out-statusnet\n" @@ -4954,21 +4954,21 @@ msgstr "Problém při ukládání sdělení" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/da/LC_MESSAGES/statusnet.po b/locale/da/LC_MESSAGES/statusnet.po index 772ca0e56c..f68253d226 100644 --- a/locale/da/LC_MESSAGES/statusnet.po +++ b/locale/da/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:48+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:15+0000\n" "Language-Team: Danish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: da\n" "X-Message-Group: out-statusnet\n" @@ -4728,21 +4728,21 @@ msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/de/LC_MESSAGES/statusnet.po b/locale/de/LC_MESSAGES/statusnet.po index 8154220b72..5a52a7c0cb 100644 --- a/locale/de/LC_MESSAGES/statusnet.po +++ b/locale/de/LC_MESSAGES/statusnet.po @@ -16,12 +16,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:49+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:17+0000\n" "Language-Team: German\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: de\n" "X-Message-Group: out-statusnet\n" @@ -5003,14 +5003,14 @@ msgstr "Problem bei Speichern der Nachricht." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" @@ -5019,7 +5019,7 @@ msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/el/LC_MESSAGES/statusnet.po b/locale/el/LC_MESSAGES/statusnet.po index 704ae6c2a7..841e3172cb 100644 --- a/locale/el/LC_MESSAGES/statusnet.po +++ b/locale/el/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:51+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:18+0000\n" "Language-Team: Greek\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: el\n" "X-Message-Group: out-statusnet\n" @@ -4879,21 +4879,21 @@ msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/en_GB/LC_MESSAGES/statusnet.po b/locale/en_GB/LC_MESSAGES/statusnet.po index d4d793a362..6eee49858e 100644 --- a/locale/en_GB/LC_MESSAGES/statusnet.po +++ b/locale/en_GB/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:52+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24: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.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: en-gb\n" "X-Message-Group: out-statusnet\n" @@ -4894,21 +4894,21 @@ msgstr "Problem saving group inbox." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/es/LC_MESSAGES/statusnet.po b/locale/es/LC_MESSAGES/statusnet.po index ae6f2929a8..f7e57911c2 100644 --- a/locale/es/LC_MESSAGES/statusnet.po +++ b/locale/es/LC_MESSAGES/statusnet.po @@ -15,12 +15,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:54+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:22+0000\n" "Language-Team: Spanish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: es\n" "X-Message-Group: out-statusnet\n" @@ -4990,21 +4990,21 @@ msgstr "Hubo un problema al guarda la bandeja de entrada del grupo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "No se puede revocar rol \"%1$s\" para usuario #%2$d; no existe." #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/fa/LC_MESSAGES/statusnet.po b/locale/fa/LC_MESSAGES/statusnet.po index 685d96e4af..c5303e3415 100644 --- a/locale/fa/LC_MESSAGES/statusnet.po +++ b/locale/fa/LC_MESSAGES/statusnet.po @@ -12,8 +12,8 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:57+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:25+0000\n" "Last-Translator: Ahmad Sufi Mahmudi\n" "Language-Team: Persian\n" "MIME-Version: 1.0\n" @@ -22,7 +22,7 @@ msgstr "" "X-Language-Code: fa\n" "X-Message-Group: out-statusnet\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" #. TRANS: Page title @@ -4934,21 +4934,21 @@ msgstr "هنگام ذخیرهٔ صندوق ورودی گروه مشکلی رخ #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/fi/LC_MESSAGES/statusnet.po b/locale/fi/LC_MESSAGES/statusnet.po index a087c57775..5b1465bc5f 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:55+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:23+0000\n" "Language-Team: Finnish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fi\n" "X-Message-Group: out-statusnet\n" @@ -5057,21 +5057,21 @@ msgstr "Ongelma päivityksen tallentamisessa." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/fr/LC_MESSAGES/statusnet.po b/locale/fr/LC_MESSAGES/statusnet.po index 3246555e1a..e9890ef360 100644 --- a/locale/fr/LC_MESSAGES/statusnet.po +++ b/locale/fr/LC_MESSAGES/statusnet.po @@ -15,12 +15,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:21:58+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:27+0000\n" "Language-Team: French\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: fr\n" "X-Message-Group: out-statusnet\n" @@ -4940,7 +4940,7 @@ msgstr "Impossible de créer le jeton d’identification pour %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 msgid "No database name or DSN found anywhere." -msgstr "Aucune base de données de nom ou DSN trouvée nulle part." +msgstr "Aucun nom de base de données ou DSN trouvé nulle part." #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. #: classes/Message.php:46 @@ -5020,14 +5020,14 @@ msgstr "Problème lors de l’enregistrement de la boîte de réception du group #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" @@ -5036,7 +5036,7 @@ msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/ga/LC_MESSAGES/statusnet.po b/locale/ga/LC_MESSAGES/statusnet.po index dc3c53286d..8d30fb8296 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:00+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:29+0000\n" "Language-Team: Irish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ga\n" "X-Message-Group: out-statusnet\n" @@ -5114,21 +5114,21 @@ msgstr "Aconteceu un erro ó gardar o chío." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/gl/LC_MESSAGES/statusnet.po b/locale/gl/LC_MESSAGES/statusnet.po index 40e79f7822..68434b085f 100644 --- a/locale/gl/LC_MESSAGES/statusnet.po +++ b/locale/gl/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:01+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:30+0000\n" "Language-Team: Galician\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: gl\n" "X-Message-Group: out-statusnet\n" @@ -166,7 +166,7 @@ msgstr "" #. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@" #: actions/all.php:146 -#, fuzzy, php-format +#, php-format msgid "" "You can try to [nudge %1$s](../%2$s) from their profile or [post something " "to them](%%%%action.newnotice%%%%?status_textarea=%3$s)." @@ -176,7 +176,7 @@ msgstr "" "status_textarea=%3$s)." #: actions/all.php:149 actions/replies.php:210 actions/showstream.php:211 -#, fuzzy, php-format +#, php-format msgid "" "Why not [register an account](%%%%action.register%%%%) and then nudge %s or " "post a notice to them." @@ -512,9 +512,8 @@ msgid "groups on %s" msgstr "grupos en %s" #: actions/apimediaupload.php:99 -#, fuzzy msgid "Upload failed." -msgstr "Cargar un ficheiro" +msgstr "Houbo un erro durante a carga." #: actions/apioauthauthorize.php:101 msgid "No oauth_token parameter provided." @@ -663,7 +662,7 @@ msgstr "Non se atopou ningún estado con esa ID." #: actions/apistatusesupdate.php:221 msgid "Client must provide a 'status' parameter with a value." -msgstr "" +msgstr "O cliente debe proporcionar un parámetro de \"estado\" cun valor." #: actions/apistatusesupdate.php:242 actions/newnotice.php:155 #: lib/mailhandler.php:60 @@ -3555,7 +3554,7 @@ msgid "Replies feed for %s (Atom)" msgstr "Fonte de novas coas respostas a %s (Atom)" #: actions/replies.php:199 -#, fuzzy, php-format +#, php-format msgid "" "This is the timeline showing replies to %1$s but %2$s hasn't received a " "notice to them yet." @@ -3573,7 +3572,7 @@ msgstr "" "grupos](%%action.groups%%)." #: actions/replies.php:206 -#, fuzzy, php-format +#, php-format msgid "" "You can try to [nudge %1$s](../%2$s) or [post something to them](%%%%action." "newnotice%%%%?status_textarea=%3$s)." @@ -3953,7 +3952,7 @@ msgstr "" "bo momento para comezar :)" #: actions/showstream.php:207 -#, fuzzy, php-format +#, php-format msgid "" "You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%" "%?status_textarea=%2$s)." @@ -4843,12 +4842,12 @@ msgstr "Autores" #: classes/File.php:143 #, php-format msgid "Cannot process URL '%s'" -msgstr "" +msgstr "Non se pode procesar o URL \"%s\"" #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." -msgstr "" +msgstr "Robin pensa que algo é imposible." #. TRANS: Message given if an upload is larger than the configured maximum. #. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. @@ -4878,9 +4877,8 @@ msgstr "Un ficheiro deste tamaño excedería a súa cota mensual de %d bytes." #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Tamaño non válido." +msgstr "Nome de ficheiro incorrecto." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4912,7 +4910,7 @@ msgstr "Non se puido crear un pase de sesión para %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 msgid "No database name or DSN found anywhere." -msgstr "" +msgstr "Non se atopou por ningures o nome da base de datos ou DSN." #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. #: classes/Message.php:46 @@ -4932,9 +4930,9 @@ msgstr "Non se puido actualizar a mensaxe co novo URI." #. TRANS: Server exception thrown when a user profile for a notice cannot be found. #. TRANS: %1$d is a profile ID (number), %2$d is a notice ID (number). #: classes/Notice.php:98 -#, fuzzy, php-format +#, php-format msgid "No such profile (%1$d) for notice (%2$d)." -msgstr "Non existe tal perfil (%d) para a nota (%d)" +msgstr "Non existe tal perfil (%1$d) para a nota (%2$d)." #. TRANS: Server exception. %s are the error details. #: classes/Notice.php:190 @@ -4983,7 +4981,7 @@ msgstr "Houbo un problema ao gardar a nota." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). #: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" -msgstr "" +msgstr "O tipo dado para saveKnownGroups era incorrecto" #. TRANS: Server exception thrown when an update for a group inbox fails. #: classes/Notice.php:991 @@ -4992,30 +4990,31 @@ msgstr "Houbo un problema ao gardar a caixa de entrada do grupo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "♻ @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" +"Non se pode revogar o rol \"%1$s\" do usuario #%2$d: o usuario non existe." #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" +"Non se pode revogar o rol \"%1$s\" do usuario #%2$d: erro na base de datos." #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." -msgstr "O usuario non ten perfil." +msgstr "Falta o perfil de usuario." #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 @@ -5044,19 +5043,16 @@ msgstr "Non está subscrito!" #. TRANS: Exception thrown when trying to unsubscribe a user from themselves. #: classes/Subscription.php:178 -#, fuzzy msgid "Could not delete self-subscription." msgstr "Non se puido borrar a subscrición a si mesmo." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 -#, fuzzy msgid "Could not delete subscription OMB token." msgstr "Non se puido borrar o pase de subscrición OMB." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." msgstr "Non se puido borrar a subscrición." diff --git a/locale/he/LC_MESSAGES/statusnet.po b/locale/he/LC_MESSAGES/statusnet.po index d8d60e7296..64c36e84ee 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:03+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:32+0000\n" "Language-Team: Hebrew\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: he\n" "X-Message-Group: out-statusnet\n" @@ -4957,21 +4957,21 @@ msgstr "בעיה בשמירת ההודעה." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/hsb/LC_MESSAGES/statusnet.po b/locale/hsb/LC_MESSAGES/statusnet.po index e0cc3dc431..860efa66ec 100644 --- a/locale/hsb/LC_MESSAGES/statusnet.po +++ b/locale/hsb/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:04+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:33+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: hsb\n" "X-Message-Group: out-statusnet\n" @@ -4705,21 +4705,21 @@ msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/ia/LC_MESSAGES/statusnet.po b/locale/ia/LC_MESSAGES/statusnet.po index e0961e4475..82541026bc 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:07+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:35+0000\n" "Language-Team: Interlingua\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ia\n" "X-Message-Group: out-statusnet\n" @@ -3734,24 +3734,24 @@ msgstr "" "mitter los in evidentia." #: actions/showfavorites.php:208 -#, fuzzy, php-format +#, php-format msgid "" "%s hasn't added any favorite notices yet. Post something interesting they " "would add to their favorites :)" msgstr "" -"%s non ha ancora addite alcun nota a su favorites. Publica alique " -"interessante que ille favoritisarea :)" +"%s non ha ancora addite un nota favorite. Publica alique interessante que " +"ille adderea a su favorites :)" #: actions/showfavorites.php:212 -#, fuzzy, php-format +#, php-format msgid "" "%s hasn't added any favorite notices yet. Why not [register an account](%%%%" "action.register%%%%) and then post something interesting they would add to " "their favorites :)" msgstr "" -"%s non ha ancora addite alcun nota a su favorites. Proque non [registrar un " -"conto](%%%%action.register%%%%) e postea publicar alique interessante que " -"ille favoritisarea :)" +"%s non ha ancora addite un nota favorite. Proque non [crear un conto](%%%%" +"action.register%%%%) e postea publicar alique interessante que ille adderea " +"a su favorites :)" #: actions/showfavorites.php:243 msgid "This is a way to share what you like." @@ -3931,13 +3931,13 @@ msgstr "" "alcun nota, dunque iste es un bon momento pro comenciar :)" #: actions/showstream.php:207 -#, fuzzy, php-format +#, php-format msgid "" "You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%" "%?status_textarea=%2$s)." msgstr "" -"Tu pote tentar pulsar %1$s o [publicar un nota a su attention](%%%%action." -"newnotice%%%%?status_textarea=%2$s)." +"Tu pote tentar dar un pulsata a %1$s o [publicar un nota a su attention](%%%%" +"action.newnotice%%%%?status_textarea=%2$s)." #: actions/showstream.php:243 #, php-format @@ -4817,23 +4817,23 @@ msgstr "Autor(es)" #: classes/File.php:143 #, php-format msgid "Cannot process URL '%s'" -msgstr "" +msgstr "Impossibile processar le URL '%s'" #. TRANS: Server exception thrown when... Robin thinks something is impossible! #: classes/File.php:175 msgid "Robin thinks something is impossible." -msgstr "" +msgstr "Robin pensa que alique es impossibile." #. TRANS: Message given if an upload is larger than the configured maximum. #. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file. #: classes/File.php:190 -#, fuzzy, php-format +#, php-format msgid "" "No file may be larger than %1$d bytes and the file you sent was %2$d bytes. " "Try to upload a smaller version." msgstr "" -"Nulle file pote esser plus grande que %d bytes e le file que tu inviava ha %" -"d bytes. Tenta incargar un version minus grande." +"Nulle file pote esser plus grande que %1$d bytes e le file que tu inviava ha " +"%2$d bytes. Tenta incargar un version minus grande." #. TRANS: Message given if an upload would exceed user quota. #. TRANS: %d (number) is the user quota in bytes. @@ -4851,9 +4851,8 @@ msgstr "Un file de iste dimension excederea tu quota mensual de %d bytes." #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 -#, fuzzy msgid "Invalid filename." -msgstr "Dimension invalide." +msgstr "Nomine de file invalide." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -4885,7 +4884,7 @@ msgstr "Non poteva crear indicio de identification pro %s" #. TRANS: Exception thrown when database name or Data Source Name could not be found. #: classes/Memcached_DataObject.php:533 msgid "No database name or DSN found anywhere." -msgstr "" +msgstr "Nulle nomine de base de datos o DSN trovate." #. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them. #: classes/Message.php:46 @@ -4907,7 +4906,7 @@ msgstr "Non poteva actualisar message con nove URI." #: classes/Notice.php:98 #, php-format msgid "No such profile (%1$d) for notice (%2$d)." -msgstr "" +msgstr "Nulle profilo (%1$d) trovate pro le nota (%2$d)." #. TRANS: Server exception. %s are the error details. #: classes/Notice.php:190 @@ -4956,7 +4955,7 @@ msgstr "Problema salveguardar nota." #. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups(). #: classes/Notice.php:892 msgid "Bad type provided to saveKnownGroups" -msgstr "" +msgstr "Mal typo fornite a saveKnownGroups" #. TRANS: Server exception thrown when an update for a group inbox fails. #: classes/Notice.php:991 @@ -4965,36 +4964,36 @@ msgstr "Problema salveguardar le cassa de entrata del gruppo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." -msgstr "" +msgstr "Non pote revocar le rolo \"%1$s\" del usator #%2$d; non existe." #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" +"Non pote revocar le rolo \"%1$s\" del usator #%2$d; error in le base de " +"datos." #. TRANS: Exception thrown when a right for a non-existing user profile is checked. #: classes/Remote_profile.php:54 -#, fuzzy msgid "Missing profile." -msgstr "Le usator non ha un profilo." +msgstr "Profilo mancante." #. TRANS: Exception thrown when a tag cannot be saved. #: classes/Status_network.php:346 -#, fuzzy msgid "Unable to save tag." -msgstr "Impossibile salveguardar le aviso del sito." +msgstr "Impossibile salveguardar le etiquetta." #. TRANS: Exception thrown when trying to subscribe while being banned from subscribing. #: classes/Subscription.php:75 lib/oauthstore.php:465 @@ -5018,19 +5017,16 @@ msgstr "Non subscribite!" #. TRANS: Exception thrown when trying to unsubscribe a user from themselves. #: classes/Subscription.php:178 -#, fuzzy msgid "Could not delete self-subscription." msgstr "Non poteva deler auto-subscription." #. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server. #: classes/Subscription.php:206 -#, fuzzy msgid "Could not delete subscription OMB token." msgstr "Non poteva deler le indicio OMB del subscription." #. TRANS: Exception thrown when a subscription could not be deleted on the server. #: classes/Subscription.php:218 -#, fuzzy msgid "Could not delete subscription." msgstr "Non poteva deler subscription." diff --git a/locale/is/LC_MESSAGES/statusnet.po b/locale/is/LC_MESSAGES/statusnet.po index 963d214244..701d0f1d45 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:08+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:37+0000\n" "Language-Team: Icelandic\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: is\n" "X-Message-Group: out-statusnet\n" @@ -5009,21 +5009,21 @@ msgstr "Vandamál komu upp við að vista babl." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/it/LC_MESSAGES/statusnet.po b/locale/it/LC_MESSAGES/statusnet.po index 401889a5cf..5bb079af7e 100644 --- a/locale/it/LC_MESSAGES/statusnet.po +++ b/locale/it/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:10+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:38+0000\n" "Language-Team: Italian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: it\n" "X-Message-Group: out-statusnet\n" @@ -4968,21 +4968,21 @@ msgstr "Problema nel salvare la casella della posta del gruppo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/ja/LC_MESSAGES/statusnet.po b/locale/ja/LC_MESSAGES/statusnet.po index 1141b34279..fab6b3d780 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:11+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:41+0000\n" "Language-Team: Japanese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ja\n" "X-Message-Group: out-statusnet\n" @@ -5001,21 +5001,21 @@ msgstr "グループ受信箱を保存する際に問題が発生しました。 #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/ko/LC_MESSAGES/statusnet.po b/locale/ko/LC_MESSAGES/statusnet.po index c40002fc53..5b5bb04249 100644 --- a/locale/ko/LC_MESSAGES/statusnet.po +++ b/locale/ko/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:13+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:43+0000\n" "Language-Team: Korean\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ko\n" "X-Message-Group: out-statusnet\n" @@ -4982,21 +4982,21 @@ msgstr "통지를 저장하는데 문제가 발생했습니다." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/mk/LC_MESSAGES/statusnet.po b/locale/mk/LC_MESSAGES/statusnet.po index 383d7a91a9..551c61dce7 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:14+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:45+0000\n" "Language-Team: Macedonian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: mk\n" "X-Message-Group: out-statusnet\n" @@ -4983,14 +4983,14 @@ msgstr "Проблем при зачувувањето на групното п #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" @@ -4999,7 +4999,7 @@ msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/nb/LC_MESSAGES/statusnet.po b/locale/nb/LC_MESSAGES/statusnet.po index 6616a6a6b6..ab0506e347 100644 --- a/locale/nb/LC_MESSAGES/statusnet.po +++ b/locale/nb/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:16+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:47+0000\n" "Language-Team: Norwegian (bokmål)‬\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: no\n" "X-Message-Group: out-statusnet\n" @@ -4895,21 +4895,21 @@ msgstr "Problem ved lagring av gruppeinnboks." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/nl/LC_MESSAGES/statusnet.po b/locale/nl/LC_MESSAGES/statusnet.po index c98e1d84ac..8c432b7b17 100644 --- a/locale/nl/LC_MESSAGES/statusnet.po +++ b/locale/nl/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:19+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:50+0000\n" "Language-Team: Dutch\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nl\n" "X-Message-Group: out-statusnet\n" @@ -4907,7 +4907,7 @@ msgstr "" #. TRANS: Client exception thrown if a file upload does not have a valid name. #: classes/File.php:248 classes/File.php:263 msgid "Invalid filename." -msgstr "Ongeldig bestandsnaam." +msgstr "Ongeldige bestandsnaam." #. TRANS: Exception thrown when joining a group fails. #: classes/Group_member.php:42 @@ -5026,14 +5026,14 @@ msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" @@ -5042,7 +5042,7 @@ msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/nn/LC_MESSAGES/statusnet.po b/locale/nn/LC_MESSAGES/statusnet.po index 9d1c47205f..08b25c9e6b 100644 --- a/locale/nn/LC_MESSAGES/statusnet.po +++ b/locale/nn/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:17+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:48+0000\n" "Language-Team: Norwegian Nynorsk\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: nn\n" "X-Message-Group: out-statusnet\n" @@ -5047,21 +5047,21 @@ msgstr "Eit problem oppstod ved lagring av notis." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/pl/LC_MESSAGES/statusnet.po b/locale/pl/LC_MESSAGES/statusnet.po index fe0581a69b..89da186ca7 100644 --- a/locale/pl/LC_MESSAGES/statusnet.po +++ b/locale/pl/LC_MESSAGES/statusnet.po @@ -11,8 +11,8 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:20+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:52+0000\n" "Last-Translator: Piotr Drąg \n" "Language-Team: Polish \n" "MIME-Version: 1.0\n" @@ -20,7 +20,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2);\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pl\n" "X-Message-Group: out-statusnet\n" @@ -4955,21 +4955,21 @@ msgstr "Problem podczas zapisywania skrzynki odbiorczej grupy." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "Nie można unieważnić roli \"\"%1$s\" użytkownika #%2$d; nie istnieje." #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/pt/LC_MESSAGES/statusnet.po b/locale/pt/LC_MESSAGES/statusnet.po index f7e4791546..ab309b7b3a 100644 --- a/locale/pt/LC_MESSAGES/statusnet.po +++ b/locale/pt/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:22+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:54+0000\n" "Language-Team: Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt\n" "X-Message-Group: out-statusnet\n" @@ -4959,14 +4959,14 @@ msgstr "Problema na gravação da caixa de entrada do grupo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" @@ -4974,7 +4974,7 @@ msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/pt_BR/LC_MESSAGES/statusnet.po b/locale/pt_BR/LC_MESSAGES/statusnet.po index cb77836d45..53468a0649 100644 --- a/locale/pt_BR/LC_MESSAGES/statusnet.po +++ b/locale/pt_BR/LC_MESSAGES/statusnet.po @@ -13,12 +13,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:23+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:55+0000\n" "Language-Team: Brazilian Portuguese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: pt-br\n" "X-Message-Group: out-statusnet\n" @@ -4995,21 +4995,21 @@ msgstr "Problema no salvamento das mensagens recebidas do grupo." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/ru/LC_MESSAGES/statusnet.po b/locale/ru/LC_MESSAGES/statusnet.po index 8692129457..7027150bdf 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:25+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:57+0000\n" "Language-Team: Russian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: ru\n" "X-Message-Group: out-statusnet\n" @@ -4971,14 +4971,14 @@ msgstr "Проблемы с сохранением входящих сообще #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" @@ -4987,7 +4987,7 @@ msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/statusnet.pot b/locale/statusnet.pot index 9618100557..81c5a97c4d 100644 --- a/locale/statusnet.pot +++ b/locale/statusnet.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -4679,21 +4679,21 @@ msgstr "" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/sv/LC_MESSAGES/statusnet.po b/locale/sv/LC_MESSAGES/statusnet.po index 68ba9a6a9a..16a0858ea7 100644 --- a/locale/sv/LC_MESSAGES/statusnet.po +++ b/locale/sv/LC_MESSAGES/statusnet.po @@ -10,12 +10,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:26+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:24:59+0000\n" "Language-Team: Swedish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: sv\n" "X-Message-Group: out-statusnet\n" @@ -4957,21 +4957,21 @@ msgstr "Problem med att spara gruppinkorg." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/te/LC_MESSAGES/statusnet.po b/locale/te/LC_MESSAGES/statusnet.po index e83ab4a304..bd506b98a0 100644 --- a/locale/te/LC_MESSAGES/statusnet.po +++ b/locale/te/LC_MESSAGES/statusnet.po @@ -9,12 +9,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:28+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:25:01+0000\n" "Language-Team: Telugu\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: te\n" "X-Message-Group: out-statusnet\n" @@ -4842,21 +4842,21 @@ msgstr "సందేశాన్ని భద్రపరచడంలో పొ #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/tr/LC_MESSAGES/statusnet.po b/locale/tr/LC_MESSAGES/statusnet.po index 18140c3e02..029f36db16 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:29+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:25:03+0000\n" "Language-Team: Turkish\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: tr\n" "X-Message-Group: out-statusnet\n" @@ -4960,21 +4960,21 @@ msgstr "Durum mesajını kaydederken hata oluştu." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/uk/LC_MESSAGES/statusnet.po b/locale/uk/LC_MESSAGES/statusnet.po index 73ae721663..8e1e37ced9 100644 --- a/locale/uk/LC_MESSAGES/statusnet.po +++ b/locale/uk/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:31+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:25:05+0000\n" "Language-Team: Ukrainian\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: uk\n" "X-Message-Group: out-statusnet\n" @@ -4960,21 +4960,21 @@ msgstr "Проблема при збереженні вхідних дописі #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "RT @%1$s %2$s" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "Не вдалося скасувати роль «%s» для користувача #%2$s; не існує." #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" @@ -6210,17 +6210,17 @@ msgid "" "Thanks for your time, \n" "%s\n" msgstr "" -"Агов, %s.\n" +"Агов, %s!\n" "\n" "Хтось щойно ввів цю електронну адресу на %s.\n" "\n" -"Якщо то були Ви, мусите це підтвердити використовуючи посилання:\n" +"Якщо то були Ви, мусите це підтвердити, використовуючи посилання:\n" "\n" -"\t%s\n" +"%s\n" "\n" -"А якщо ні, то просто проігноруйте це повідомлення.\n" +"А якщо ні, просто ігноруйте це повідомлення.\n" "\n" -"Дякуємо за Ваш час \n" +"Вибачте за турботу, \n" "%s\n" #. TRANS: Subject of new-subscriber notification e-mail diff --git a/locale/vi/LC_MESSAGES/statusnet.po b/locale/vi/LC_MESSAGES/statusnet.po index 60164da4d2..c82d34e663 100644 --- a/locale/vi/LC_MESSAGES/statusnet.po +++ b/locale/vi/LC_MESSAGES/statusnet.po @@ -8,12 +8,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:32+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:25:06+0000\n" "Language-Team: Vietnamese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: vi\n" "X-Message-Group: out-statusnet\n" @@ -5103,21 +5103,21 @@ msgstr "Có lỗi xảy ra khi lưu tin nhắn." #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%s (%s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/zh_CN/LC_MESSAGES/statusnet.po b/locale/zh_CN/LC_MESSAGES/statusnet.po index bd331de651..9de9d8e750 100644 --- a/locale/zh_CN/LC_MESSAGES/statusnet.po +++ b/locale/zh_CN/LC_MESSAGES/statusnet.po @@ -11,12 +11,12 @@ msgid "" msgstr "" "Project-Id-Version: StatusNet\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2010-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:34+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:25:08+0000\n" "Language-Team: Simplified Chinese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hans\n" "X-Message-Group: out-statusnet\n" @@ -5045,21 +5045,21 @@ msgstr "保存通告时出错。" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, fuzzy, php-format msgid "RT @%1$s %2$s" msgstr "%1$s (%2$s)" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" diff --git a/locale/zh_TW/LC_MESSAGES/statusnet.po b/locale/zh_TW/LC_MESSAGES/statusnet.po index 1e5b44ae63..be09ed6d75 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-08-03 13:21+0000\n" -"PO-Revision-Date: 2010-08-03 13:22:35+0000\n" +"POT-Creation-Date: 2010-08-07 16:23+0000\n" +"PO-Revision-Date: 2010-08-07 16:25:10+0000\n" "Language-Team: Traditional Chinese\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n" +"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n" "X-Translation-Project: translatewiki.net at http://translatewiki.net\n" "X-Language-Code: zh-hant\n" "X-Message-Group: out-statusnet\n" @@ -4868,21 +4868,21 @@ msgstr "儲存使用者發生錯誤" #. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'. #. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice. -#: classes/Notice.php:1614 +#: classes/Notice.php:1745 #, php-format msgid "RT @%1$s %2$s" msgstr "" #. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:740 +#: classes/Profile.php:737 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist." msgstr "" #. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query. #. TRANS: %1$s is the role name, %2$s is the user ID (number). -#: classes/Profile.php:749 +#: classes/Profile.php:746 #, php-format msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error." msgstr "" From 09dee24cbeadfb1fef797d38265e2ece09266bb0 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sun, 8 Aug 2010 21:13:21 +0200 Subject: [PATCH 11/11] Add two i18n related FIXMEs. --- lib/mailbox.php | 1 + lib/noticelist.php | 1 + 2 files changed, 2 insertions(+) diff --git a/lib/mailbox.php b/lib/mailbox.php index 90a58b4c48..2b00f5ffde 100644 --- a/lib/mailbox.php +++ b/lib/mailbox.php @@ -224,6 +224,7 @@ class MailboxAction extends CurrentUserDesignAction if ($message->source) { $this->elementStart('span', 'source'); + // FIXME: bad i18n. Device should be a parameter (from %s). $this->text(_('from')); $this->element('span', 'device', $this->showSource($message->source)); $this->elementEnd('span'); diff --git a/lib/noticelist.php b/lib/noticelist.php index 252e1ca900..dbc5bfb519 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -502,6 +502,7 @@ class NoticeListItem extends Widget $source_name = (empty($ns->name)) ? _($ns->code) : _($ns->name); $this->out->text(' '); $this->out->elementStart('span', 'source'); + // FIXME: probably i18n issue. If "from" is followed by text, that should be a parameter to "from" (from %s). $this->out->text(_('from')); $this->out->text(' ');