From c89b10ffe4adb1df724b6a7c5c31b42c7dd3376b Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Wed, 2 Dec 2009 09:47:02 -0800 Subject: Code style cleanup: dropped some unnecessary =& reference assignments where they're used only out of habit for PHP 4-style object semantics --- lib/schema.php | 18 +++++++++--------- lib/util.php | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/schema.php b/lib/schema.php index df7cb65f5..a8ba91b87 100644 --- a/lib/schema.php +++ b/lib/schema.php @@ -94,7 +94,7 @@ class Schema public function getTableDef($name) { - $res =& $this->conn->query('DESCRIBE ' . $name); + $res = $this->conn->query('DESCRIBE ' . $name); if (PEAR::isError($res)) { throw new Exception($res->getMessage()); @@ -213,7 +213,7 @@ class Schema $sql .= "); "; - $res =& $this->conn->query($sql); + $res = $this->conn->query($sql); if (PEAR::isError($res)) { throw new Exception($res->getMessage()); @@ -234,7 +234,7 @@ class Schema public function dropTable($name) { - $res =& $this->conn->query("DROP TABLE $name"); + $res = $this->conn->query("DROP TABLE $name"); if (PEAR::isError($res)) { throw new Exception($res->getMessage()); @@ -269,7 +269,7 @@ class Schema $name = "$table_".implode("_", $columnNames)."_idx"; } - $res =& $this->conn->query("ALTER TABLE $table ". + $res = $this->conn->query("ALTER TABLE $table ". "ADD INDEX $name (". implode(",", $columnNames).")"); @@ -291,7 +291,7 @@ class Schema public function dropIndex($table, $name) { - $res =& $this->conn->query("ALTER TABLE $table DROP INDEX $name"); + $res = $this->conn->query("ALTER TABLE $table DROP INDEX $name"); if (PEAR::isError($res)) { throw new Exception($res->getMessage()); @@ -314,7 +314,7 @@ class Schema { $sql = "ALTER TABLE $table ADD COLUMN " . $this->_columnSql($columndef); - $res =& $this->conn->query($sql); + $res = $this->conn->query($sql); if (PEAR::isError($res)) { throw new Exception($res->getMessage()); @@ -339,7 +339,7 @@ class Schema $sql = "ALTER TABLE $table MODIFY COLUMN " . $this->_columnSql($columndef); - $res =& $this->conn->query($sql); + $res = $this->conn->query($sql); if (PEAR::isError($res)) { throw new Exception($res->getMessage()); @@ -363,7 +363,7 @@ class Schema { $sql = "ALTER TABLE $table DROP COLUMN $columnName"; - $res =& $this->conn->query($sql); + $res = $this->conn->query($sql); if (PEAR::isError($res)) { throw new Exception($res->getMessage()); @@ -446,7 +446,7 @@ class Schema $sql = 'ALTER TABLE ' . $tableName . ' ' . implode(', ', $phrase); - $res =& $this->conn->query($sql); + $res = $this->conn->query($sql); if (PEAR::isError($res)) { throw new Exception($res->getMessage()); diff --git a/lib/util.php b/lib/util.php index 99a0a1db3..ab046e871 100644 --- a/lib/util.php +++ b/lib/util.php @@ -127,7 +127,7 @@ function common_check_user($nickname, $password) if (0 == strcmp(common_munge_password($password, $user->id), $user->password)) { //internal checking passed - $authenticatedUser =& $user; + $authenticatedUser = $user; } } } -- cgit v1.2.3-54-g00ecf From aef4cc0a59276938f0f0aec4d67374f578f2117a Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Thu, 3 Dec 2009 17:06:58 -0800 Subject: Make it impossible to block (and thus unsubscribe from your self-subscription) via the API. Additionally, make it impossible to block yourself or unsubscribe from yourself, period. I also made User use the subs.php helper function for unsubscribing during a block. Hopefully, these changes will get rid of the problem of people accidentally deleting their self-subscriptions once and for all (knock on wood). --- actions/apiblockcreate.php | 11 +++++++++++ classes/User.php | 36 +++++++++++++++++++++++++++--------- lib/subs.php | 6 ++++++ 3 files changed, 44 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/actions/apiblockcreate.php b/actions/apiblockcreate.php index 4f941f6c3..e79dec32d 100644 --- a/actions/apiblockcreate.php +++ b/actions/apiblockcreate.php @@ -98,6 +98,17 @@ class ApiBlockCreateAction extends ApiAuthAction return; } + // Don't allow blocking yourself! + + if ($this->user->id == $this->other->id) { + $this->clientError( + _("You cannot block yourself!"), + 403, + $this->format + ); + return; + } + if ($this->user->hasBlocked($this->other) || $this->user->block($this->other) ) { diff --git a/classes/User.php b/classes/User.php index f905ea2b7..4838fe1c7 100644 --- a/classes/User.php +++ b/classes/User.php @@ -502,6 +502,19 @@ class User extends Memcached_DataObject { // Add a new block record + // no blocking (and thus unsubbing from) yourself + + if ($this->id == $other->id) { + common_log(LOG_WARNING, + sprintf( + "Profile ID %d (%s) tried to block his or herself.", + $profile->id, + $profile->nickname + ) + ); + return false; + } + $block = new Profile_block(); // Begin a transaction @@ -520,15 +533,20 @@ class User extends Memcached_DataObject // Cancel their subscription, if it exists - $sub = Subscription::pkeyGet(array('subscriber' => $other->id, - 'subscribed' => $this->id)); - - if ($sub) { - $result = $sub->delete(); - if (!$result) { - common_log_db_error($sub, 'DELETE', __FILE__); - return false; - } + $result = subs_unsubscribe_to($this, $other); + + if ($result !== true) { + common_log(LOG_WARNING, + sprintf( + "Error trying to unsubscribe profile ID %d (%s) from user ID %d (%s): %s", + $other->id, + $other->nickname, + $this->id, + $this->nickname, + $result + ) + ); + return false; } $block->query('COMMIT'); diff --git a/lib/subs.php b/lib/subs.php index 2fc3160de..4b6b03967 100644 --- a/lib/subs.php +++ b/lib/subs.php @@ -127,6 +127,12 @@ function subs_unsubscribe_to($user, $other) if (!$user->isSubscribed($other)) return _('Not subscribed!'); + // Don't allow deleting self subs + + if ($user->id == $other->id) { + return _('Couldn\'t delete self-subscription.'); + } + $sub = DB_DataObject::factory('subscription'); $sub->subscriber = $user->id; -- cgit v1.2.3-54-g00ecf From 40afc7e9877855272caa5c65fb3575e4420b2966 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 4 Dec 2009 01:57:14 -0500 Subject: Add 4 new events: StartCssLinkElement, EndCssLinkElement, StartScriptElement, EndScriptElement --- EVENTS.txt | 21 +++++++++++++++++++++ lib/htmloutputter.php | 42 ++++++++++++++++++++++++------------------ 2 files changed, 45 insertions(+), 18 deletions(-) (limited to 'lib') diff --git a/EVENTS.txt b/EVENTS.txt index 34a222e8f..f4ec62033 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -574,3 +574,24 @@ EndShortenUrl: After a URL has been shortened - $shortenerName: name of the requested shortener - $shortenedUrl: short version of the url +StartCssLinkElement: Before a element is written +- $action +- &$src +- &$theme +- &$media + +EndCssLinkElement: After a element is written +- $action +- $src +- $theme +- $media + +StartScriptElement: Before a element is written +- $action +- &$src +- &$type + +EndScriptElement: After a element is written +- $action +- $src +- $type diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index d267526c8..a7c596917 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -350,14 +350,17 @@ class HTMLOutputter extends XMLOutputter */ function script($src, $type='text/javascript') { - $url = parse_url($src); - if( empty($url->scheme) && empty($url->host) && empty($url->query) && empty($url->fragment)) - { - $src = common_path($src) . '?version=' . STATUSNET_VERSION; + if(Event::handle('StartScriptElement', array($this,&$src,&$type))) { + $url = parse_url($src); + if( empty($url->scheme) && empty($url->host) && empty($url->query) && empty($url->fragment)) + { + $src = common_path($src) . '?version=' . STATUSNET_VERSION; + } + $this->element('script', array('type' => $type, + 'src' => $src), + ' '); + Event::handle('EndScriptElement', array($this,$src,$type)); } - $this->element('script', array('type' => $type, - 'src' => $src), - ' '); } /** @@ -371,19 +374,22 @@ class HTMLOutputter extends XMLOutputter */ function cssLink($src,$theme=null,$media=null) { - $url = parse_url($src); - if( empty($url->scheme) && empty($url->host) && empty($url->query) && empty($url->fragment)) - { - if(file_exists(Theme::file($src,$theme))){ - $src = Theme::path($src, $theme) . '?version=' . STATUSNET_VERSION; - }else{ - $src = common_path($src); + if(Event::handle('StartCssLinkElement', array($this,&$src,&$theme,&$media))) { + $url = parse_url($src); + if( empty($url->scheme) && empty($url->host) && empty($url->query) && empty($url->fragment)) + { + if(file_exists(Theme::file($src,$theme))){ + $src = Theme::path($src, $theme) . '?version=' . STATUSNET_VERSION; + }else{ + $src = common_path($src); + } } + $this->element('link', array('rel' => 'stylesheet', + 'type' => 'text/css', + 'href' => $src, + 'media' => $media)); + Event::handle('EndCssLinkElement', array($this,$src,$theme,$media)); } - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', - 'href' => $src, - 'media' => $media)); } /** -- cgit v1.2.3-54-g00ecf From 2c07d4a530e2e8ea6a48f08806f5026df1132152 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 4 Dec 2009 13:39:51 -0500 Subject: utility function to output inline JavaScript --- lib/htmloutputter.php | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index d267526c8..3fabc4037 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -360,6 +360,25 @@ class HTMLOutputter extends XMLOutputter ' '); } + /** + * output a script (almost always javascript) tag with inline + * code. + * + * @param string $code relative or absolute script path + * @param string $type 'type' attribute value of the tag + * + * @return void + */ + + function inlineScript($code, $type='text/javascript') + { + $this->elementStart('script', array('type' => $type)); + $this->raw('/*raw($code); + $this->raw(' /*]]>*/'); // XHTML compat for Safari + $this->elementEnd('script'); + } + /** * output a css link * @@ -414,7 +433,6 @@ class HTMLOutputter extends XMLOutputter } } - /** * Internal script to autofocus the given element on page onload. * -- cgit v1.2.3-54-g00ecf From e074fe659903cb6cbd3dace96889f34a8c8796c9 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 4 Dec 2009 15:34:25 -0500 Subject: add logging utilities to Plugin class --- lib/plugin.php | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'lib') diff --git a/lib/plugin.php b/lib/plugin.php index 87d7be5a7..2c77c3e12 100644 --- a/lib/plugin.php +++ b/lib/plugin.php @@ -76,4 +76,14 @@ class Plugin { return true; } + + protected function log($level, $msg) + { + common_log($level, get_class($this) . ': '.$msg); + } + + protected function debug($msg) + { + $this->log(LOG_DEBUG, $msg); + } } -- cgit v1.2.3-54-g00ecf From 4881be47c798688c3ae20f621d06e15adbc9c17e Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Fri, 4 Dec 2009 22:40:07 +0000 Subject: Don't depend on a User being available when looking up Design and timezone for a profile (because some profiles are remote, etc.) --- lib/api.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/api.php b/lib/api.php index 5a3bb5ee4..eacb80dbe 100644 --- a/lib/api.php +++ b/lib/api.php @@ -134,19 +134,17 @@ class ApiAction extends Action $twitter_user['protected'] = false; # not supported by StatusNet yet $twitter_user['followers_count'] = $profile->subscriberCount(); - $design = null; $user = $profile->getUser(); + $design = null; // Note: some profiles don't have an associated user + $defaultDesign = Design::siteDesign(); + if (!empty($user)) { $design = $user->getDesign(); } - if (empty($design)) { - $design = Design::siteDesign(); - } - $color = Design::toWebColor(empty($design->backgroundcolor) ? $defaultDesign->backgroundcolor : $design->backgroundcolor); $twitter_user['profile_background_color'] = ($color == null) ? '' : '#'.$color->hexValue(); $color = Design::toWebColor(empty($design->textcolor) ? $defaultDesign->textcolor : $design->textcolor); @@ -165,7 +163,7 @@ class ApiAction extends Action $timezone = 'UTC'; - if ($user->timezone) { + if (!empty($user) && !empty($user->timezone)) { $timezone = $user->timezone; } -- cgit v1.2.3-54-g00ecf From 4c8bed8ba0558c5834621331f253e05029fa4e43 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 4 Dec 2009 19:41:51 -0500 Subject: Use inlineScript() everywhere inline scripts are written --- lib/messageform.php | 3 +-- lib/noticeform.php | 3 +-- plugins/Facebook/FacebookPlugin.php | 4 +--- plugins/GoogleAnalyticsPlugin.php | 8 ++------ plugins/PiwikAnalyticsPlugin.php | 15 +++++---------- plugins/Realtime/RealtimePlugin.php | 6 +----- plugins/UserFlag/UserFlagPlugin.php | 4 +--- 7 files changed, 12 insertions(+), 31 deletions(-) (limited to 'lib') diff --git a/lib/messageform.php b/lib/messageform.php index b034be312..4df193c6d 100644 --- a/lib/messageform.php +++ b/lib/messageform.php @@ -154,8 +154,7 @@ class MessageForm extends Form $contentLimit = Message::maxContent(); - $this->out->element('script', array('type' => 'text/javascript'), - 'maxLength = ' . $contentLimit . ';'); + $this->out->inlineScript('maxLength = ' . $contentLimit . ';'); if ($contentLimit > 0) { $this->out->elementStart('dl', 'form_note'); diff --git a/lib/noticeform.php b/lib/noticeform.php index ec8624597..0dd3f2d77 100644 --- a/lib/noticeform.php +++ b/lib/noticeform.php @@ -178,8 +178,7 @@ class NoticeForm extends Form $contentLimit = Notice::maxContent(); - $this->out->element('script', array('type' => 'text/javascript'), - 'maxLength = ' . $contentLimit . ';'); + $this->out->inlineScript('maxLength = ' . $contentLimit . ';'); if ($contentLimit > 0) { $this->out->elementStart('dl', 'form_note'); diff --git a/plugins/Facebook/FacebookPlugin.php b/plugins/Facebook/FacebookPlugin.php index 047477d9c..40c911cce 100644 --- a/plugins/Facebook/FacebookPlugin.php +++ b/plugins/Facebook/FacebookPlugin.php @@ -185,7 +185,6 @@ class FacebookPlugin extends Plugin // XXX: Facebook says we don't need this FB_RequireFeatures(), // but we actually do, for IE and Safari. Gar. - $js = ''; $js = sprintf($js, $apikey, $login_url, $logout_url); @@ -227,7 +225,7 @@ class FacebookPlugin extends Plugin $js = str_replace(' ', '', $js); - $action->raw(" $js"); // leading two spaces to make it line up + $action->inlineScript($js); } } diff --git a/plugins/GoogleAnalyticsPlugin.php b/plugins/GoogleAnalyticsPlugin.php index 7f3d209ee..6891ee6a7 100644 --- a/plugins/GoogleAnalyticsPlugin.php +++ b/plugins/GoogleAnalyticsPlugin.php @@ -67,11 +67,7 @@ class GoogleAnalyticsPlugin extends Plugin 'pageTracker._trackPageview();'. '} catch(err) {}', $this->code); - $action->elementStart('script', array('type' => 'text/javascript')); - $action->raw($js1); - $action->elementEnd('script'); - $action->elementStart('script', array('type' => 'text/javascript')); - $action->raw($js2); - $action->elementEnd('script'); + $action->inlineScript($js1); + $action->inlineScript($js2); } } diff --git a/plugins/PiwikAnalyticsPlugin.php b/plugins/PiwikAnalyticsPlugin.php index 54faa0bdb..fefd09867 100644 --- a/plugins/PiwikAnalyticsPlugin.php +++ b/plugins/PiwikAnalyticsPlugin.php @@ -81,25 +81,20 @@ class PiwikAnalyticsPlugin extends Plugin function onEndShowScripts($action) { - $piwikCode = << - - - - ENDOFPIWIK; - $action->raw($piwikCode); + $action->inlineScript($piwikCode1); + $action->inlineScript($piwikCode2); return true; } } diff --git a/plugins/Realtime/RealtimePlugin.php b/plugins/Realtime/RealtimePlugin.php index 030df405b..3e33fdaf1 100644 --- a/plugins/Realtime/RealtimePlugin.php +++ b/plugins/Realtime/RealtimePlugin.php @@ -105,15 +105,11 @@ class RealtimePlugin extends Plugin $realtimeUI = ' RealtimeUpdate.initActions("'.$url.'", "'.$timeline.'", "'. $pluginPath .'");'; } - $action->elementStart('script', array('type' => 'text/javascript')); - $script = ' $(document).ready(function() { '. $realtimeUI. $this->_updateInitialize($timeline, $user_id). '}); '; - $action->raw($script); - - $action->elementEnd('script'); + $action->inlineScript($script); return true; } diff --git a/plugins/UserFlag/UserFlagPlugin.php b/plugins/UserFlag/UserFlagPlugin.php index e13c2555a..75dcca4fc 100644 --- a/plugins/UserFlag/UserFlagPlugin.php +++ b/plugins/UserFlag/UserFlagPlugin.php @@ -145,9 +145,7 @@ class UserFlagPlugin extends Plugin function onEndShowScripts($action) { - $action->elementStart('script', array('type' => 'text/javascript')); - $action->raw('/* 0) { SN.U.FormXHR($(".form_entity_flag")); } /*]]>*/'); - $action->elementEnd('script'); + $action->inlineScript('if ($(".form_entity_flag").length > 0) { SN.U.FormXHR($(".form_entity_flag")); }'); return true; } } -- cgit v1.2.3-54-g00ecf From 847013db692303cde10f5f161d9fedd787421a37 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 4 Dec 2009 19:44:45 -0500 Subject: only write the javascript CDATA blocks if the type is javascript (it's not the correct syntax for other languages) --- lib/htmloutputter.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index a0066594f..539e356e8 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -367,7 +367,7 @@ class HTMLOutputter extends XMLOutputter * output a script (almost always javascript) tag with inline * code. * - * @param string $code relative or absolute script path + * @param string $code code to put in the script tag * @param string $type 'type' attribute value of the tag * * @return void @@ -376,9 +376,13 @@ class HTMLOutputter extends XMLOutputter function inlineScript($code, $type='text/javascript') { $this->elementStart('script', array('type' => $type)); - $this->raw('/*raw('/*raw($code); - $this->raw(' /*]]>*/'); // XHTML compat for Safari + if($type == 'text/javascript') { + $this->raw(' /*]]>*/'); // XHTML compat + } $this->elementEnd('script'); } -- cgit v1.2.3-54-g00ecf From 7ddf911f5d54ba4997b3d237ae7cd1effb74a120 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 4 Dec 2009 19:51:44 -0500 Subject: Add 2 new events: StartInlineScriptElement and EndInlineScriptElement --- EVENTS.txt | 10 ++++++++++ lib/htmloutputter.php | 19 +++++++++++-------- 2 files changed, 21 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/EVENTS.txt b/EVENTS.txt index f4ec62033..678df8b0a 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -595,3 +595,13 @@ EndScriptElement: After a element is written - $action - $src - $type + +StartInlineScriptElement: Before a element is written +- $action +- &$code +- &$type + +EndInlineScriptElement: After a element is written +- $action +- $code +- $type diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index 539e356e8..0c2d18da3 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -375,15 +375,18 @@ class HTMLOutputter extends XMLOutputter function inlineScript($code, $type='text/javascript') { - $this->elementStart('script', array('type' => $type)); - if($type == 'text/javascript') { - $this->raw('/*raw($code); - if($type == 'text/javascript') { - $this->raw(' /*]]>*/'); // XHTML compat + if(Event::handle('StartInlineScriptElement', array($this,&$code,&$type))) { + $this->elementStart('script', array('type' => $type)); + if($type == 'text/javascript') { + $this->raw('/*raw($code); + if($type == 'text/javascript') { + $this->raw(' /*]]>*/'); // XHTML compat + } + $this->elementEnd('script'); + Event::handle('EndInlineScriptElement', array($this,$code,$type)); } - $this->elementEnd('script'); } /** -- cgit v1.2.3-54-g00ecf From b3086d3c68ed2d3ceff3ce8fc91a867fc07c441a Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 4 Dec 2009 20:19:55 -0500 Subject: Add style function to output style() tags Add 2 new events: StartStyleElement and EndStyleElement --- EVENTS.txt | 12 ++++++++++++ lib/htmloutputter.php | 21 +++++++++++++++++++++ 2 files changed, 33 insertions(+) (limited to 'lib') diff --git a/EVENTS.txt b/EVENTS.txt index 678df8b0a..a056aa0a1 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -586,6 +586,18 @@ EndCssLinkElement: After a element is written - $theme - $media +StartStyleElement: Before a element is written +- $action +- &$code +- &$type +- &$media + +EndStyleElement: After a element is written +- $action +- $code +- $type +- $media + StartScriptElement: Before a element is written - $action - &$src diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index 0c2d18da3..a88a5b82c 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -418,6 +418,27 @@ class HTMLOutputter extends XMLOutputter } } + /** + * output a style (almost always css) tag with inline + * code. + * + * @param string $code code to put in the style tag + * @param string $type 'type' attribute value of the tag + * @param string $media 'media' attribute value of the tag + * + * @return void + */ + + function style($code, $type = 'text/css', $media = null) + { + if(Event::handle('StartStyleElement', array($this,&$code,&$type,&$media))) { + $this->elementStart('style', array('type' => $type, 'media' => $media)); + $this->raw($code); + $this->elementEnd('style'); + Event::handle('EndStyleElement', array($this,$code,$type,$media)); + } + } + /** * output an HTML textarea and associated elements * -- cgit v1.2.3-54-g00ecf From d41a0a5ed03b2f4bbf8e8b3984960103383090d1 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 4 Dec 2009 20:33:41 -0500 Subject: Use inlineScript() instead of element() to write inline javascript --- lib/htmloutputter.php | 7 ++----- plugins/MobileProfile/MobileProfilePlugin.php | 3 +-- 2 files changed, 3 insertions(+), 7 deletions(-) (limited to 'lib') diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index a88a5b82c..cf93944e7 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -477,13 +477,10 @@ class HTMLOutputter extends XMLOutputter */ function autofocus($id) { - $this->elementStart('script', array('type' => 'text/javascript')); - $this->raw('/*inlineScript( ' $(document).ready(function() {'. ' var el = $("#' . $id . '");'. ' if (el.length) { el.focus(); }'. - ' });'. - ' /*]]>*/'); - $this->elementEnd('script'); + ' });'); } } diff --git a/plugins/MobileProfile/MobileProfilePlugin.php b/plugins/MobileProfile/MobileProfilePlugin.php index 8b5e5f31d..35678bedd 100644 --- a/plugins/MobileProfile/MobileProfilePlugin.php +++ b/plugins/MobileProfile/MobileProfilePlugin.php @@ -352,8 +352,7 @@ class MobileProfilePlugin extends WAP20Plugin $contentLimit = Notice::maxContent(); - $form->out->element('script', array('type' => 'text/javascript'), - 'maxLength = ' . $contentLimit . ';'); + $form->out->inlineScript('maxLength = ' . $contentLimit . ';'); if ($contentLimit > 0) { $form->out->element('div', array('id' => 'notice_text-count'), -- cgit v1.2.3-54-g00ecf From fa6675550885e005f6a69dfd317320dff6c4a3cd Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Fri, 4 Dec 2009 22:05:18 -0500 Subject: Append the StatusNet version to all local, static CSS references --- lib/htmloutputter.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index cf93944e7..fd448ced5 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -405,10 +405,11 @@ class HTMLOutputter extends XMLOutputter if( empty($url->scheme) && empty($url->host) && empty($url->query) && empty($url->fragment)) { if(file_exists(Theme::file($src,$theme))){ - $src = Theme::path($src, $theme) . '?version=' . STATUSNET_VERSION; + $src = Theme::path($src, $theme); }else{ $src = common_path($src); } + $src.= '?version=' . STATUSNET_VERSION; } $this->element('link', array('rel' => 'stylesheet', 'type' => 'text/css', -- cgit v1.2.3-54-g00ecf From 51f0dd5e37db0e8d2a8690655555d399249942df Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sat, 5 Dec 2009 01:03:04 -0500 Subject: Add configuration option to toggle the indenting of the output HTML. Defaults to indent enabled. --- actions/twitapisearchatom.php | 2 +- config.php.sample | 5 +++++ lib/action.php | 2 +- lib/default.php | 1 + lib/error.php | 2 +- lib/htmloutputter.php | 2 +- lib/rssaction.php | 2 +- lib/xmloutputter.php | 5 ++++- plugins/Facebook/facebookaction.php | 2 +- plugins/Facebook/facebookutil.php | 2 +- 10 files changed, 17 insertions(+), 8 deletions(-) (limited to 'lib') diff --git a/actions/twitapisearchatom.php b/actions/twitapisearchatom.php index 526ca2ae8..1cb8d7efe 100644 --- a/actions/twitapisearchatom.php +++ b/actions/twitapisearchatom.php @@ -71,7 +71,7 @@ class TwitapisearchatomAction extends ApiAction * @see Action::__construct */ - function __construct($output='php://output', $indent=true) + function __construct($output='php://output', $indent=null) { parent::__construct($output, $indent); } diff --git a/config.php.sample b/config.php.sample index 9fccb84f3..473eb74e2 100644 --- a/config.php.sample +++ b/config.php.sample @@ -236,6 +236,11 @@ $config['sphinx']['port'] = 3312; // Use a different hostname for SSL-encrypted pages // $config['site']['sslserver'] = 'secure.example.org'; +// Indent HTML and XML +// Enable (default) for easier to read markup for developers, +// disable to save some bandwidth. +// $config['site']['indent'] = true; + // If you have a lot of status networks on the same server, you can // store the site data in a database and switch as follows // Status_network::setupDB('localhost', 'statusnet', 'statuspass', 'statusnet'); diff --git a/lib/action.php b/lib/action.php index 8ad391755..87d8a4399 100644 --- a/lib/action.php +++ b/lib/action.php @@ -68,7 +68,7 @@ class Action extends HTMLOutputter // lawsuit * @see XMLOutputter::__construct * @see HTMLOutputter::__construct */ - function __construct($output='php://output', $indent=true) + function __construct($output='php://output', $indent=null) { parent::__construct($output, $indent); } diff --git a/lib/default.php b/lib/default.php index d4ef045ea..db90aeca3 100644 --- a/lib/default.php +++ b/lib/default.php @@ -53,6 +53,7 @@ $default = 'shorturllength' => 30, 'dupelimit' => 60, # default for same person saying the same thing 'textlimit' => 140, + 'indent' => true, ), 'db' => array('database' => 'YOU HAVE TO SET THIS IN config.php', diff --git a/lib/error.php b/lib/error.php index 3162cfe65..87a4d913b 100644 --- a/lib/error.php +++ b/lib/error.php @@ -50,7 +50,7 @@ class ErrorAction extends Action var $message = null; var $default = null; - function __construct($message, $code, $output='php://output', $indent=true) + function __construct($message, $code, $output='php://output', $indent=null) { parent::__construct($output, $indent); diff --git a/lib/htmloutputter.php b/lib/htmloutputter.php index fd448ced5..2091c6e2c 100644 --- a/lib/htmloutputter.php +++ b/lib/htmloutputter.php @@ -67,7 +67,7 @@ class HTMLOutputter extends XMLOutputter * @param boolean $indent Whether to indent output, default true */ - function __construct($output='php://output', $indent=true) + function __construct($output='php://output', $indent=null) { parent::__construct($output, $indent); } diff --git a/lib/rssaction.php b/lib/rssaction.php index d591c99ed..62e3f21b6 100644 --- a/lib/rssaction.php +++ b/lib/rssaction.php @@ -52,7 +52,7 @@ class Rss10Action extends Action * @see Action::__construct */ - function __construct($output='php://output', $indent=true) + function __construct($output='php://output', $indent=null) { parent::__construct($output, $indent); } diff --git a/lib/xmloutputter.php b/lib/xmloutputter.php index 5f06e491d..15b18e7d9 100644 --- a/lib/xmloutputter.php +++ b/lib/xmloutputter.php @@ -67,10 +67,13 @@ class XMLOutputter * @param boolean $indent Whether to indent output, default true */ - function __construct($output='php://output', $indent=true) + function __construct($output='php://output', $indent=null) { $this->xw = new XMLWriter(); $this->xw->openURI($output); + if(is_null($indent)) { + $indent = common_config('site', 'indent'); + } $this->xw->setIndent($indent); } diff --git a/plugins/Facebook/facebookaction.php b/plugins/Facebook/facebookaction.php index c852bbf5e..b090e9bd9 100644 --- a/plugins/Facebook/facebookaction.php +++ b/plugins/Facebook/facebookaction.php @@ -44,7 +44,7 @@ class FacebookAction extends Action var $app_uri = null; var $app_name = null; - function __construct($output='php://output', $indent=true, $facebook=null, $flink=null) + function __construct($output='php://output', $indent=null, $facebook=null, $flink=null) { parent::__construct($output, $indent); diff --git a/plugins/Facebook/facebookutil.php b/plugins/Facebook/facebookutil.php index 6f50c173a..2abcbb14e 100644 --- a/plugins/Facebook/facebookutil.php +++ b/plugins/Facebook/facebookutil.php @@ -168,7 +168,7 @@ function facebookBroadcastNotice($notice) function updateProfileBox($facebook, $flink, $notice) { $fbaction = new FacebookAction($output = 'php://output', - $indent = true, $facebook, $flink); + $indent = null, $facebook, $flink); $fbaction->updateProfileBox($notice); } -- cgit v1.2.3-54-g00ecf From 2ab01e040e224943b1b15131a6e51fe6b5d6e580 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sat, 5 Dec 2009 02:11:27 -0500 Subject: Add 2 new events to enable logger pluginization: StartLog and EndLog --- EVENTS.txt | 11 +++++++++++ lib/util.php | 25 ++++++++++++++----------- 2 files changed, 25 insertions(+), 11 deletions(-) (limited to 'lib') diff --git a/EVENTS.txt b/EVENTS.txt index a056aa0a1..e0516f8f4 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -617,3 +617,14 @@ EndInlineScriptElement: After a element is written - $action - $code - $type + +StartLog: Before writing to the logs +- &$priority +- &$msg +- &$filename + +EndLog: After writing to the logs +- $priority +- $msg +- $filename + diff --git a/lib/util.php b/lib/util.php index ab046e871..14d666503 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1070,18 +1070,21 @@ function common_request_id() function common_log($priority, $msg, $filename=null) { - $msg = '[' . common_request_id() . '] ' . $msg; - $logfile = common_config('site', 'logfile'); - if ($logfile) { - $log = fopen($logfile, "a"); - if ($log) { - $output = common_log_line($priority, $msg); - fwrite($log, $output); - fclose($log); + if(Event::handle('StartLog', array(&$priority, &$msg, &$filename))){ + $msg = '[' . common_request_id() . '] ' . $msg; + $logfile = common_config('site', 'logfile'); + if ($logfile) { + $log = fopen($logfile, "a"); + if ($log) { + $output = common_log_line($priority, $msg); + fwrite($log, $output); + fclose($log); + } + } else { + common_ensure_syslog(); + syslog($priority, $msg); } - } else { - common_ensure_syslog(); - syslog($priority, $msg); + Event::handle('EndLog', array($priority, $msg, $filename)); } } -- cgit v1.2.3-54-g00ecf From 75cac0fd6b94f77ec8ff32ebc89ec513ee102831 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sat, 5 Dec 2009 21:03:27 -0500 Subject: Added 'login' command that gives you a link that can be used to login to the website --- actions/login.php | 9 +++------ classes/Login_token.php | 42 ++++++++++++++++++++++++++++++++++++++++++ classes/statusnet.ini | 1 + db/08to09.sql | 11 ++++++++++- db/08to09_pg.sql | 10 +++++++++- db/statusnet.sql | 10 ++++++++++ db/statusnet_pg.sql | 12 +++++++++++- lib/command.php | 27 +++++++++++++++++++++++++++ lib/commandinterpreter.php | 6 ++++++ lib/router.php | 2 ++ 10 files changed, 121 insertions(+), 9 deletions(-) create mode 100644 classes/Login_token.php (limited to 'lib') diff --git a/actions/login.php b/actions/login.php index cd1326813..cee29fd09 100644 --- a/actions/login.php +++ b/actions/login.php @@ -79,6 +79,8 @@ class LoginAction extends Action $this->clientError(_('Already logged in.')); } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { $this->checkLogin(); + } else if (isset($args['user_id']) && isset($args['token'])){ + $this->checkLogin($args['user_id'],$args['token']); } else { common_ensure_session(); $this->showForm(); @@ -95,7 +97,7 @@ class LoginAction extends Action * @return void */ - function checkLogin() + function checkLogin($user_id=null, $token=null) { if(isset($token) && isset($user_id)){ //Token based login (from the LoginCommand) @@ -137,11 +139,6 @@ class LoginAction extends Action $user = common_check_user($nickname, $password); } - $nickname = common_canonical_nickname($this->trimmed('nickname')); - $password = $this->arg('password'); - - $user = common_check_user($nickname, $password); - if (!$user) { $this->showForm(_('Incorrect username or password.')); return; diff --git a/classes/Login_token.php b/classes/Login_token.php new file mode 100644 index 000000000..c172b30ab --- /dev/null +++ b/classes/Login_token.php @@ -0,0 +1,42 @@ +. + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } + +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; + +class Login_token extends Memcached_DataObject +{ + ###START_AUTOCODE + /* the code below is auto generated do not remove the above tag */ + + public $__table = 'login_token'; // table name + public $user_id; // int(4) primary_key not_null + public $token; // char(32) not_null + public $created; // datetime() not_null + public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP + + /* Static get */ + function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('Login_token',$k,$v); } + + /* the code above is auto generated do not remove the tag below */ + ###END_AUTOCODE +} diff --git a/classes/statusnet.ini b/classes/statusnet.ini index 835faeb0b..253f45879 100644 --- a/classes/statusnet.ini +++ b/classes/statusnet.ini @@ -260,6 +260,7 @@ modified = 384 [login_token__keys] user_id = K +token = K [message] id = 129 diff --git a/db/08to09.sql b/db/08to09.sql index 8d463fab4..64640f4ce 100644 --- a/db/08to09.sql +++ b/db/08to09.sql @@ -72,4 +72,13 @@ create table location_namespace ( created datetime not null comment 'date the record was created', modified timestamp comment 'date this record was modified' -) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; \ No newline at end of file +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table login_token ( + user_id integer not null comment 'user owning this token' references user (id), + token char(32) not null comment 'token useable for logging in', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + constraint primary key (user_id) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; diff --git a/db/08to09_pg.sql b/db/08to09_pg.sql index b312d47dd..0bd47dea5 100644 --- a/db/08to09_pg.sql +++ b/db/08to09_pg.sql @@ -39,6 +39,15 @@ create table profile_role ( ); +create table login_token ( + user_id integer not null /* comment 'user owning this token'*/ references "user" (id), + token char(32) not null /* comment 'token useable for logging in'*/, + created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created'*/, + modified timestamp /* comment 'date this record was modified'*/, + + primary key (user_id) +); + DROP index fave_user_id_idx; CREATE index fave_user_id_idx on fave (user_id,modified); @@ -60,4 +69,3 @@ ALTER TABLE profile ADD COLUMN lat decimal(10,7) /*comment 'latitude'*/ ; ALTER TABLE profile ADD COLUMN lon decimal(10,7) /*comment 'longitude'*/; ALTER TABLE profile ADD COLUMN location_id integer /* comment 'location id if possible'*/; ALTER TABLE profile ADD COLUMN location_ns integer /* comment 'namespace for location'*/; - \ No newline at end of file diff --git a/db/statusnet.sql b/db/statusnet.sql index f7b3b113b..18abcdfdb 100644 --- a/db/statusnet.sql +++ b/db/statusnet.sql @@ -575,3 +575,13 @@ create table location_namespace ( modified timestamp comment 'date this record was modified' ) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + +create table login_token ( + user_id integer not null comment 'user owning this token' references user (id), + token char(32) not null comment 'token useable for logging in', + created datetime not null comment 'date this record was created', + modified timestamp comment 'date this record was modified', + + constraint primary key (user_id) +) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin; + diff --git a/db/statusnet_pg.sql b/db/statusnet_pg.sql index cd72d66ea..81b329d1e 100644 --- a/db/statusnet_pg.sql +++ b/db/statusnet_pg.sql @@ -570,4 +570,14 @@ create table profile_role ( primary key (profile_id, role) -); \ No newline at end of file +); + +create table login_token ( + user_id integer not null /* comment 'user owning this token'*/ references "user" (id), + token char(32) not null /* comment 'token useable for logging in'*/, + created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created'*/, + modified timestamp /* comment 'date this record was modified'*/, + + primary key (user_id) +); + diff --git a/lib/command.php b/lib/command.php index bcc551c81..7e98156b6 100644 --- a/lib/command.php +++ b/lib/command.php @@ -579,6 +579,32 @@ class OnCommand extends Command } } +class LoginCommand extends Command +{ + function execute($channel) + { + $login_token = Login_token::staticGet('user_id',$this->user->id); + if($login_token){ + $login_token->delete(); + } + $login_token = new Login_token(); + $login_token->user_id = $this->user->id; + $login_token->token = common_good_rand(16); + $login_token->created = common_sql_now(); + $result = $login_token->insert(); + if (!$result) { + common_log_db_error($login_token, 'INSERT', __FILE__); + $channel->error($this->user, sprintf(_('Could not create login token for %s'), + $this->user->nickname)); + return; + } + $channel->output($this->user, + sprintf(_('This link is useable only once, and is good for only 2 minutes: %s'), + common_local_url('login', + array('user_id'=>$login_token->user_id, 'token'=>$login_token->token)))); + } +} + class SubscriptionsCommand extends Command { function execute($channel) @@ -666,6 +692,7 @@ class HelpCommand extends Command "reply # - reply to notice with a given id\n". "reply - reply to the last notice from user\n". "join - join group\n". + "login - Get a link to login to the web interface\n". "drop - leave group\n". "stats - get your stats\n". "stop - same as 'off'\n". diff --git a/lib/commandinterpreter.php b/lib/commandinterpreter.php index 25f2e4b3e..665015afc 100644 --- a/lib/commandinterpreter.php +++ b/lib/commandinterpreter.php @@ -41,6 +41,12 @@ class CommandInterpreter return null; } return new HelpCommand($user); + case 'login': + if ($arg) { + return null; + } else { + return new LoginCommand($user); + } case 'subscribers': if ($arg) { return null; diff --git a/lib/router.php b/lib/router.php index 1a090861e..37525319f 100644 --- a/lib/router.php +++ b/lib/router.php @@ -88,6 +88,8 @@ class Router $m->connect('doc/:title', array('action' => 'doc')); + $m->connect('main/login?user_id=:user_id&token=:token', array('action'=>'login'), array('user_id'=> '[0-9]+', 'token'=>'.+')); + // main stuff is repetitive $main = array('login', 'logout', 'register', 'subscribe', -- cgit v1.2.3-54-g00ecf From 3b14b61fa745d4906796ac49e78ae712f61e9643 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sat, 5 Dec 2009 21:04:20 -0500 Subject: Add a configuration option to disable the login command. $config['logincommand']['disabled'] = true; This commit should be reverted once the command has been sufficiently tested and trusted. --- actions/login.php | 5 ++++- lib/command.php | 5 +++++ 2 files changed, 9 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/actions/login.php b/actions/login.php index cee29fd09..a6f86c0ca 100644 --- a/actions/login.php +++ b/actions/login.php @@ -75,11 +75,14 @@ class LoginAction extends Action function handle($args) { parent::handle($args); + + $disabled = common_config('logincommand','disabled'); + if (common_is_real_login()) { $this->clientError(_('Already logged in.')); } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { $this->checkLogin(); - } else if (isset($args['user_id']) && isset($args['token'])){ + } else if (!isset($disabled) && isset($args['user_id']) && isset($args['token'])){ $this->checkLogin($args['user_id'],$args['token']); } else { common_ensure_session(); diff --git a/lib/command.php b/lib/command.php index 7e98156b6..e2a665511 100644 --- a/lib/command.php +++ b/lib/command.php @@ -583,6 +583,11 @@ class LoginCommand extends Command { function execute($channel) { + $disabled = common_config('logincommand','disabled'); + if(isset($disabled)) { + $channel->error($this->user, _('Login command is disabled')); + return; + } $login_token = Login_token::staticGet('user_id',$this->user->id); if($login_token){ $login_token->delete(); -- cgit v1.2.3-54-g00ecf From 3536f01258dc43bee764c98fbdda5a6f1df7bcb2 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 8 Dec 2009 09:57:37 -0800 Subject: Make default & sample val for $config['queue']['queue_basename'] actually work! Now matches the recommendation in README which is in fact correct. Must include the /queue/ prefix (unless somthing else actually makes sense) --- config.php.sample | 2 +- lib/default.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/config.php.sample b/config.php.sample index 473eb74e2..91e6614c0 100644 --- a/config.php.sample +++ b/config.php.sample @@ -154,7 +154,7 @@ $config['sphinx']['port'] = 3312; // $config['queue']['subsystem'] = 'stomp'; // $config['queue']['stomp_server'] = 'tcp://localhost:61613'; // use different queue_basename for each statusnet instance managed by the server -// $config['queue']['queue_basename'] = 'statusnet'; +// $config['queue']['queue_basename'] = '/queue/statusnet/'; // The following customise the behaviour of the various daemons: // $config['daemon']['piddir'] = '/var/run'; diff --git a/lib/default.php b/lib/default.php index db90aeca3..ebb6f8d01 100644 --- a/lib/default.php +++ b/lib/default.php @@ -75,7 +75,7 @@ $default = array('enabled' => false, 'subsystem' => 'db', # default to database, or 'stomp' 'stomp_server' => null, - 'queue_basename' => 'statusnet', + 'queue_basename' => '/queue/statusnet/', 'stomp_username' => null, 'stomp_password' => null, ), -- cgit v1.2.3-54-g00ecf From 4b5e977a7b1c390555d880d3dc7f8b8c6744646c Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 8 Dec 2009 12:17:11 -0800 Subject: New _m() gettext wrapper with smart detection of plugin domains. Plugin base class registers your gettext files if present at initialization. update_pot.sh replaced with update_po_templates.php which can do core, plugins, or all (default). Top-level Makefile added to build .mo files for plugins as well as core. As described on list: http://lists.status.net/pipermail/statusnet-dev/2009-December/002869.html --- Makefile | 18 ++ lib/language.php | 125 ++++++- lib/plugin.php | 19 ++ plugins/Facebook/FBConnectAuth.php | 62 ++-- plugins/Facebook/FBConnectLogin.php | 6 +- plugins/Facebook/FBConnectSettings.php | 30 +- plugins/Facebook/FacebookPlugin.php | 10 +- plugins/Facebook/facebookaction.php | 34 +- plugins/Facebook/facebookhome.php | 20 +- plugins/Facebook/facebookinvite.php | 12 +- plugins/Facebook/facebooklogin.php | 2 +- plugins/Facebook/facebookremove.php | 2 +- plugins/Facebook/facebooksettings.php | 20 +- plugins/Facebook/facebookutil.php | 4 +- plugins/Facebook/locale/Facebook.po | 394 +++++++++++++++++++++++ plugins/FeedSub/FeedSubPlugin.php | 5 +- plugins/FeedSub/actions/feedsubsettings.php | 40 ++- plugins/FeedSub/feedmunger.php | 2 +- plugins/FeedSub/locale/FeedSub.po | 104 ++++++ plugins/FeedSub/locale/fr/LC_MESSAGES/FeedSub.po | 106 ++++++ plugins/FeedSub/tests/gettext-speedtest.php | 78 +++++ plugins/Mapstraction/MapstractionPlugin.php | 4 +- plugins/Mapstraction/allmap.php | 4 +- plugins/Mapstraction/locale/Mapstraction.po | 48 +++ plugins/Mapstraction/map.php | 4 +- plugins/Mapstraction/usermap.php | 2 +- plugins/OpenID/OpenIDPlugin.php | 8 +- plugins/OpenID/finishaddopenid.php | 16 +- plugins/OpenID/finishopenidlogin.php | 62 ++-- plugins/OpenID/locale/OpenID.po | 344 ++++++++++++++++++++ plugins/OpenID/openid.php | 18 +- plugins/OpenID/openidlogin.php | 22 +- plugins/OpenID/openidserver.php | 4 +- plugins/OpenID/openidsettings.php | 30 +- plugins/OpenID/openidtrust.php | 10 +- plugins/Sample/SamplePlugin.php | 59 ++++ plugins/TwitterBridge/TwitterBridgePlugin.php | 4 +- plugins/TwitterBridge/locale/TwitterBridge.po | 128 ++++++++ plugins/TwitterBridge/twitter.php | 4 +- plugins/TwitterBridge/twitterauthorization.php | 10 +- plugins/TwitterBridge/twittersettings.php | 42 +-- scripts/update_po_templates.php | 211 ++++++++++++ scripts/update_pot.sh | 13 - 43 files changed, 1873 insertions(+), 267 deletions(-) create mode 100644 Makefile create mode 100644 plugins/Facebook/locale/Facebook.po create mode 100644 plugins/FeedSub/locale/FeedSub.po create mode 100644 plugins/FeedSub/locale/fr/LC_MESSAGES/FeedSub.po create mode 100644 plugins/FeedSub/tests/gettext-speedtest.php create mode 100644 plugins/Mapstraction/locale/Mapstraction.po create mode 100644 plugins/OpenID/locale/OpenID.po create mode 100644 plugins/Sample/SamplePlugin.php create mode 100644 plugins/TwitterBridge/locale/TwitterBridge.po create mode 100755 scripts/update_po_templates.php delete mode 100755 scripts/update_pot.sh (limited to 'lib') diff --git a/Makefile b/Makefile new file mode 100644 index 000000000..6f45c1b83 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +# Warning: do not transform tabs to spaces in this file. + +all : translations + +core_mo = $(patsubst %.po,%.mo,$(wildcard locale/*/LC_MESSAGES/statusnet.po)) +plugin_mo = $(patsubst %.po,%.mo,$(wildcard plugins/*/locale/*/LC_MESSAGES/*.po)) + +translations : $(core_mo) $(plugin_mo) + +clean : + rm -f $(core_mo) $(plugin_mo) + +updatepo : + php scripts/update_po_templates.php --all + +%.mo : %.po + msgfmt -o $@ $< + diff --git a/lib/language.php b/lib/language.php index 4fc45bafe..ab46f1a65 100644 --- a/lib/language.php +++ b/lib/language.php @@ -36,6 +36,33 @@ if (!function_exists('gettext')) { require_once("php-gettext/gettext.inc"); } + +if (!function_exists('dpgettext')) { + /** + * Context-aware dgettext wrapper; use when messages in different contexts + * won't be distinguished from the English source but need different translations. + * The context string will appear as msgctxt in the .po files. + * + * Not currently exposed in PHP's gettext module; implemented to be compat + * with gettext.h's macros. + * + * @param string $domain domain identifier, or null for default domain + * @param string $context context identifier, should be some key like "menu|file" + * @param string $msgid English source text + * @return string original or translated message + */ + function dpgettext($domain, $context, $msg) + { + $msgid = $context . "\004" . $msg; + $out = dcgettext($domain, $msgid, LC_MESSAGES); + if ($out == $msgid) { + return $msg; + } else { + return $out; + } + } +} + if (!function_exists('pgettext')) { /** * Context-aware gettext wrapper; use when messages in different contexts @@ -50,9 +77,31 @@ if (!function_exists('pgettext')) { * @return string original or translated message */ function pgettext($context, $msg) + { + return dpgettext(textdomain(NULL), $context, $msg); + } +} + +if (!function_exists('dnpgettext')) { + /** + * Context-aware dngettext wrapper; use when messages in different contexts + * won't be distinguished from the English source but need different translations. + * The context string will appear as msgctxt in the .po files. + * + * Not currently exposed in PHP's gettext module; implemented to be compat + * with gettext.h's macros. + * + * @param string $domain domain identifier, or null for default domain + * @param string $context context identifier, should be some key like "menu|file" + * @param string $msg singular English source text + * @param string $plural plural English source text + * @param int $n number of items to control plural selection + * @return string original or translated message + */ + function dnpgettext($domain, $context, $msg, $plural, $n) { $msgid = $context . "\004" . $msg; - $out = dcgettext(textdomain(NULL), $msgid, LC_MESSAGES); + $out = dcngettext($domain, $msgid, $plural, $n, LC_MESSAGES); if ($out == $msgid) { return $msg; } else { @@ -78,14 +127,78 @@ if (!function_exists('npgettext')) { */ function npgettext($context, $msg, $plural, $n) { - $msgid = $context . "\004" . $msg; - $out = dcngettext(textdomain(NULL), $msgid, $plural, $n, LC_MESSAGES); - if ($out == $msgid) { - return $msg; + return dnpgettext(textdomain(NULL), $msgid, $plural, $n, LC_MESSAGES); + } +} + +/** + * Shortcut for *gettext functions with smart domain detection. + * + * If calling from a plugin, this function checks which plugin was + * being called from and uses that as text domain, which will have + * been set up during plugin initialization. + * + * Also handles plurals and contexts depending on what parameters + * are passed to it: + * + * gettext -> _m($msg) + * ngettext -> _m($msg1, $msg2, $n) + * pgettext -> _m($ctx, $msg) + * npgettext -> _m($ctx, $msg1, $msg2, $n) + * + * @fixme may not work properly in eval'd code + * + * @param string $msg + * @return string + */ +function _m($msg/*, ...*/) +{ + $domain = _mdomain(debug_backtrace(false)); + $args = func_get_args(); + switch(count($args)) { + case 1: return dgettext($domain, $msg); + case 2: return dpgettext($domain, $args[0], $args[1]); + case 3: return dngettext($domain, $args[0], $args[1], $args[2]); + case 4: return dnpgettext($domain, $args[0], $args[1], $args[2], $args[3]); + default: throw new Exception("Bad parameter count to _m()"); + } +} + +/** + * Looks for which plugin we've been called from to set the gettext domain. + * + * @param array $backtrace debug_backtrace() output + * @return string + * @private + * @fixme could explode if SN is under a 'plugins' folder or share name. + */ +function _mdomain($backtrace) +{ + /* + 0 => + array + 'file' => string '/var/www/mublog/plugins/FeedSub/FeedSubPlugin.php' (length=49) + 'line' => int 77 + 'function' => string '_m' (length=2) + 'args' => + array + 0 => &string 'Feeds' (length=5) + */ + static $cached; + $path = $backtrace[0]['file']; + if (!isset($cached[$path])) { + if (DIRECTORY_SEPARATOR !== '/') { + $path = strtr($path, DIRECTORY_SEPARATOR, '/'); + } + $cut = strpos($path, '/plugins/') + 9; + $cut2 = strpos($path, '/', $cut); + if ($cut && $cut2) { + $cached[$path] = substr($path, $cut, $cut2 - $cut); } else { - return $out; + return null; } } + return $cached[$path]; } diff --git a/lib/plugin.php b/lib/plugin.php index 2c77c3e12..de7313e59 100644 --- a/lib/plugin.php +++ b/lib/plugin.php @@ -65,6 +65,8 @@ class Plugin Event::addHandler(mb_substr($method, 2), array($this, $method)); } } + + $this->setupGettext(); } function initialize() @@ -77,6 +79,22 @@ class Plugin return true; } + /** + * Checks if this plugin has localization that needs to be set up. + * Gettext localizations can be called via the _m() helper function. + */ + protected function setupGettext() + { + $class = get_class($this); + if (substr($class, -6) == 'Plugin') { + $name = substr($class, 0, -6); + $path = INSTALLDIR . "/plugins/$name/locale"; + if (file_exists($path) && is_dir($path)) { + bindtextdomain($name, $path); + } + } + } + protected function log($level, $msg) { common_log($level, get_class($this) . ': '.$msg); @@ -87,3 +105,4 @@ class Plugin $this->log(LOG_DEBUG, $msg); } } + diff --git a/plugins/Facebook/FBConnectAuth.php b/plugins/Facebook/FBConnectAuth.php index b909a4977..51bfc3865 100644 --- a/plugins/Facebook/FBConnectAuth.php +++ b/plugins/Facebook/FBConnectAuth.php @@ -48,8 +48,8 @@ class FBConnectauthAction extends Action common_log(LOG_WARNING, 'Facebook Connect Plugin - ' . "Failed auth attempt, proxy = $proxy, ip = $ip."); - $this->clientError(_('You must be logged into Facebook to ' . - 'use Facebook Connect.')); + $this->clientError(_m('You must be logged into Facebook to ' . + 'use Facebook Connect.')); } return true; @@ -74,7 +74,7 @@ class FBConnectauthAction extends Action // We don't want these cookies getFacebook()->clear_cookie_state(); - $this->clientError(_('There is already a local user linked with this Facebook.')); + $this->clientError(_m('There is already a local user linked with this Facebook.')); } else { @@ -87,12 +87,12 @@ class FBConnectauthAction extends Action $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { - $this->showForm(_('There was a problem with your session token. Try again, please.')); + $this->showForm(_m('There was a problem with your session token. Try again, please.')); return; } if ($this->arg('create')) { if (!$this->boolean('license')) { - $this->showForm(_('You can\'t register if you don\'t agree to the license.'), + $this->showForm(_m('You can\'t register if you don\'t agree to the license.'), $this->trimmed('newname')); return; } @@ -102,7 +102,7 @@ class FBConnectauthAction extends Action } else { common_debug('Facebook Connect Plugin - ' . print_r($this->args, true)); - $this->showForm(_('Something weird happened.'), + $this->showForm(_m('Something weird happened.'), $this->trimmed('newname')); } } else { @@ -116,13 +116,13 @@ class FBConnectauthAction extends Action $this->element('div', array('class' => 'error'), $this->error); } else { $this->element('div', 'instructions', - sprintf(_('This is the first time you\'ve logged into %s so we must connect your Facebook to a local account. You can either create a new account, or connect with your existing account, if you have one.'), common_config('site', 'name'))); + sprintf(_m('This is the first time you\'ve logged into %s so we must connect your Facebook to a local account. You can either create a new account, or connect with your existing account, if you have one.'), common_config('site', 'name'))); } } function title() { - return _('Facebook Account Setup'); + return _m('Facebook Account Setup'); } function showForm($error=null, $username=null) @@ -150,7 +150,7 @@ class FBConnectauthAction extends Action 'class' => 'form_settings', 'action' => common_local_url('FBConnectAuth'))); $this->elementStart('fieldset', array('id' => 'settings_facebook_connect_options')); - $this->element('legend', null, _('Connection options')); + $this->element('legend', null, _m('Connection options')); $this->elementStart('ul', 'form_data'); $this->elementStart('li'); $this->element('input', array('type' => 'checkbox', @@ -159,10 +159,10 @@ class FBConnectauthAction extends Action 'name' => 'license', 'value' => 'true')); $this->elementStart('label', array('class' => 'checkbox', 'for' => 'license')); - $this->text(_('My text and files are available under ')); + $this->text(_m('My text and files are available under ')); $this->element('a', array('href' => common_config('license', 'url')), common_config('license', 'title')); - $this->text(_(' except this private data: password, email address, IM address, phone number.')); + $this->text(_m(' except this private data: password, email address, IM address, phone number.')); $this->elementEnd('label'); $this->elementEnd('li'); $this->elementEnd('ul'); @@ -170,33 +170,33 @@ class FBConnectauthAction extends Action $this->elementStart('fieldset'); $this->hidden('token', common_session_token()); $this->element('legend', null, - _('Create new account')); + _m('Create new account')); $this->element('p', null, - _('Create a new user with this nickname.')); + _m('Create a new user with this nickname.')); $this->elementStart('ul', 'form_data'); $this->elementStart('li'); - $this->input('newname', _('New nickname'), + $this->input('newname', _m('New nickname'), ($this->username) ? $this->username : '', - _('1-64 lowercase letters or numbers, no punctuation or spaces')); + _m('1-64 lowercase letters or numbers, no punctuation or spaces')); $this->elementEnd('li'); $this->elementEnd('ul'); - $this->submit('create', _('Create')); + $this->submit('create', _m('Create')); $this->elementEnd('fieldset'); $this->elementStart('fieldset'); $this->element('legend', null, - _('Connect existing account')); + _m('Connect existing account')); $this->element('p', null, - _('If you already have an account, login with your username and password to connect it to your Facebook.')); + _m('If you already have an account, login with your username and password to connect it to your Facebook.')); $this->elementStart('ul', 'form_data'); $this->elementStart('li'); - $this->input('nickname', _('Existing nickname')); + $this->input('nickname', _m('Existing nickname')); $this->elementEnd('li'); $this->elementStart('li'); - $this->password('password', _('Password')); + $this->password('password', _m('Password')); $this->elementEnd('li'); $this->elementEnd('ul'); - $this->submit('connect', _('Connect')); + $this->submit('connect', _m('Connect')); $this->elementEnd('fieldset'); $this->elementEnd('fieldset'); @@ -212,7 +212,7 @@ class FBConnectauthAction extends Action function createNewUser() { if (common_config('site', 'closed')) { - $this->clientError(_('Registration not allowed.')); + $this->clientError(_m('Registration not allowed.')); return; } @@ -221,14 +221,14 @@ class FBConnectauthAction extends Action if (common_config('site', 'inviteonly')) { $code = $_SESSION['invitecode']; if (empty($code)) { - $this->clientError(_('Registration not allowed.')); + $this->clientError(_m('Registration not allowed.')); return; } $invite = Invitation::staticGet($code); if (empty($invite)) { - $this->clientError(_('Not a valid invitation code.')); + $this->clientError(_m('Not a valid invitation code.')); return; } } @@ -238,17 +238,17 @@ class FBConnectauthAction extends Action if (!Validate::string($nickname, array('min_length' => 1, 'max_length' => 64, 'format' => NICKNAME_FMT))) { - $this->showForm(_('Nickname must have only lowercase letters and numbers and no spaces.')); + $this->showForm(_m('Nickname must have only lowercase letters and numbers and no spaces.')); return; } if (!User::allowed_nickname($nickname)) { - $this->showForm(_('Nickname not allowed.')); + $this->showForm(_m('Nickname not allowed.')); return; } if (User::staticGet('nickname', $nickname)) { - $this->showForm(_('Nickname already in use. Try another one.')); + $this->showForm(_m('Nickname already in use. Try another one.')); return; } @@ -266,7 +266,7 @@ class FBConnectauthAction extends Action $result = $this->flinkUser($user->id, $this->fbuid); if (!$result) { - $this->serverError(_('Error connecting user to Facebook.')); + $this->serverError(_m('Error connecting user to Facebook.')); return; } @@ -286,7 +286,7 @@ class FBConnectauthAction extends Action $password = $this->trimmed('password'); if (!common_check_user($nickname, $password)) { - $this->showForm(_('Invalid username or password.')); + $this->showForm(_m('Invalid username or password.')); return; } @@ -300,7 +300,7 @@ class FBConnectauthAction extends Action $result = $this->flinkUser($user->id, $this->fbuid); if (!$result) { - $this->serverError(_('Error connecting user to Facebook.')); + $this->serverError(_m('Error connecting user to Facebook.')); return; } @@ -320,7 +320,7 @@ class FBConnectauthAction extends Action $result = $this->flinkUser($user->id, $this->fbuid); if (empty($result)) { - $this->serverError(_('Error connecting user to Facebook.')); + $this->serverError(_m('Error connecting user to Facebook.')); return; } diff --git a/plugins/Facebook/FBConnectLogin.php b/plugins/Facebook/FBConnectLogin.php index d2bb8054c..20c409f3e 100644 --- a/plugins/Facebook/FBConnectLogin.php +++ b/plugins/Facebook/FBConnectLogin.php @@ -30,7 +30,7 @@ class FBConnectLoginAction extends Action parent::handle($args); if (common_is_real_login()) { - $this->clientError(_('Already logged in.')); + $this->clientError(_m('Already logged in.')); } $this->showPage(); @@ -38,7 +38,7 @@ class FBConnectLoginAction extends Action function getInstructions() { - return _('Login with your Facebook Account'); + return _m('Login with your Facebook Account'); } function showPageNotice() @@ -52,7 +52,7 @@ class FBConnectLoginAction extends Action function title() { - return _('Facebook Login'); + return _m('Facebook Login'); } function showContent() { diff --git a/plugins/Facebook/FBConnectSettings.php b/plugins/Facebook/FBConnectSettings.php index 911c56787..590dffd8a 100644 --- a/plugins/Facebook/FBConnectSettings.php +++ b/plugins/Facebook/FBConnectSettings.php @@ -53,7 +53,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction function title() { - return _('Facebook Connect Settings'); + return _m('Facebook Connect Settings'); } /** @@ -64,7 +64,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction function getInstructions() { - return _('Manage how your account connects to Facebook'); + return _m('Manage how your account connects to Facebook'); } /** @@ -89,7 +89,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction if (!$flink) { $this->element('p', 'instructions', - _('There is no Facebook user connected to this account.')); + _m('There is no Facebook user connected to this account.')); $this->element('fb:login-button', array('onlogin' => 'goto_login()', 'length' => 'long')); @@ -97,7 +97,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction } else { $this->element('p', 'form_note', - _('Connected Facebook user')); + _m('Connected Facebook user')); $this->elementStart('p', array('class' => 'facebook-user-display')); $this->elementStart('fb:profile-pic', @@ -116,18 +116,18 @@ class FBConnectSettingsAction extends ConnectSettingsAction $this->elementStart('fieldset'); - $this->element('legend', null, _('Disconnect my account from Facebook')); + $this->element('legend', null, _m('Disconnect my account from Facebook')); if (!$user->password) { $this->elementStart('p', array('class' => 'form_guide')); - $this->text(_('Disconnecting your Faceboook ' . - 'would make it impossible to log in! Please ')); + $this->text(_m('Disconnecting your Faceboook ' . + 'would make it impossible to log in! Please ')); $this->element('a', array('href' => common_local_url('passwordsettings')), - _('set a password')); + _m('set a password')); - $this->text(_(' first.')); + $this->text(_m(' first.')); $this->elementEnd('p'); } else { @@ -139,7 +139,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction $this->element('p', 'instructions', sprintf($note, $site, $site)); - $this->submit('disconnect', _('Disconnect')); + $this->submit('disconnect', _m('Disconnect')); } $this->elementEnd('fieldset'); @@ -161,8 +161,8 @@ class FBConnectSettingsAction extends ConnectSettingsAction // CSRF protection $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { - $this->showForm(_('There was a problem with your session token. '. - 'Try again, please.')); + $this->showForm(_m('There was a problem with your session token. '. + 'Try again, please.')); return; } @@ -175,7 +175,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction if ($result === false) { common_log_db_error($user, 'DELETE', __FILE__); - $this->serverError(_('Couldn\'t delete link to Facebook.')); + $this->serverError(_m('Couldn\'t delete link to Facebook.')); return; } @@ -191,10 +191,10 @@ class FBConnectSettingsAction extends ConnectSettingsAction $e->getMessage()); } - $this->showForm(_('You have disconnected from Facebook.'), true); + $this->showForm(_m('You have disconnected from Facebook.'), true); } else { - $this->showForm(_('Not sure what you\'re trying to do.')); + $this->showForm(_m('Not sure what you\'re trying to do.')); return; } diff --git a/plugins/Facebook/FacebookPlugin.php b/plugins/Facebook/FacebookPlugin.php index 40c911cce..39b2ef287 100644 --- a/plugins/Facebook/FacebookPlugin.php +++ b/plugins/Facebook/FacebookPlugin.php @@ -406,9 +406,9 @@ class FacebookPlugin extends Plugin $action_name = $action->trimmed('action'); $action->menuItem(common_local_url('FBConnectLogin'), - _('Facebook'), - _('Login or register using Facebook'), - 'FBConnectLogin' === $action_name); + _m('Facebook'), + _m('Login or register using Facebook'), + 'FBConnectLogin' === $action_name); return true; } @@ -426,8 +426,8 @@ class FacebookPlugin extends Plugin $action_name = $action->trimmed('action'); $action->menuItem(common_local_url('FBConnectSettings'), - _('Facebook'), - _('Facebook Connect Settings'), + _m('Facebook'), + _m('Facebook Connect Settings'), $action_name === 'FBConnectSettings'); return true; diff --git a/plugins/Facebook/facebookaction.php b/plugins/Facebook/facebookaction.php index b090e9bd9..705bb2780 100644 --- a/plugins/Facebook/facebookaction.php +++ b/plugins/Facebook/facebookaction.php @@ -168,7 +168,7 @@ class FacebookAction extends Action $this->elementStart('li', array('class' => ($this->action == 'facebookhome') ? 'current' : 'facebook_home')); $this->element('a', - array('href' => 'index.php', 'title' => _('Home')), _('Home')); + array('href' => 'index.php', 'title' => _m('Home')), _m('Home')); $this->elementEnd('li'); if (common_config('invite', 'enabled')) { @@ -176,7 +176,7 @@ class FacebookAction extends Action array('class' => ($this->action == 'facebookinvite') ? 'current' : 'facebook_invite')); $this->element('a', - array('href' => 'invite.php', 'title' => _('Invite')), _('Invite')); + array('href' => 'invite.php', 'title' => _m('Invite')), _m('Invite')); $this->elementEnd('li'); } @@ -185,7 +185,7 @@ class FacebookAction extends Action ($this->action == 'facebooksettings') ? 'current' : 'facebook_settings')); $this->element('a', array('href' => 'settings.php', - 'title' => _('Settings')), _('Settings')); + 'title' => _m('Settings')), _m('Settings')); $this->elementEnd('li'); $this->elementEnd('ul'); @@ -225,15 +225,15 @@ class FacebookAction extends Action $this->elementStart('dl', array('class' => 'system_notice')); $this->element('dt', null, 'Page Notice'); - $loginmsg_part1 = _('To use the %s Facebook Application you need to login ' . + $loginmsg_part1 = _m('To use the %s Facebook Application you need to login ' . 'with your username and password. Don\'t have a username yet? '); - $loginmsg_part2 = _(' a new account.'); + $loginmsg_part2 = _m(' a new account.'); $this->elementStart('dd'); $this->elementStart('p'); $this->text(sprintf($loginmsg_part1, common_config('site', 'name'))); $this->element('a', - array('href' => common_local_url('register')), _('Register')); + array('href' => common_local_url('register')), _m('Register')); $this->text($loginmsg_part2); $this->elementEnd('p'); $this->elementEnd('dd'); @@ -246,7 +246,7 @@ class FacebookAction extends Action { $this->elementStart('div', array('id' => 'content')); - $this->element('h1', null, _('Login')); + $this->element('h1', null, _m('Login')); if ($msg) { $this->element('fb:error', array('message' => $msg)); @@ -265,20 +265,20 @@ class FacebookAction extends Action $this->elementStart('ul', array('class' => 'form_datas')); $this->elementStart('li'); - $this->input('nickname', _('Nickname')); + $this->input('nickname', _m('Nickname')); $this->elementEnd('li'); $this->elementStart('li'); - $this->password('password', _('Password')); + $this->password('password', _m('Password')); $this->elementEnd('li'); $this->elementEnd('ul'); - $this->submit('submit', _('Login')); + $this->submit('submit', _m('Login')); $this->elementEnd('fieldset'); $this->elementEnd('form'); $this->elementStart('p'); $this->element('a', array('href' => common_local_url('recoverpassword')), - _('Lost or forgotten password?')); + _m('Lost or forgotten password?')); $this->elementEnd('p'); $this->elementEnd('div'); @@ -383,7 +383,7 @@ class FacebookAction extends Action // Does a little before-after block for next/prev page if ($have_before || $have_after) { $this->elementStart('dl', 'pagination'); - $this->element('dt', null, _('Pagination')); + $this->element('dt', null, _m('Pagination')); $this->elementStart('dd', null); $this->elementStart('ul', array('class' => 'nav')); } @@ -392,7 +392,7 @@ class FacebookAction extends Action $newargs = $args ? array_merge($args, $pargs) : $pargs; $this->elementStart('li', array('class' => 'nav_prev')); $this->element('a', array('href' => "$this->app_uri/$action?page=$newargs[page]", 'rel' => 'prev'), - _('After')); + _m('After')); $this->elementEnd('li'); } if ($have_after) { @@ -400,7 +400,7 @@ class FacebookAction extends Action $newargs = $args ? array_merge($args, $pargs) : $pargs; $this->elementStart('li', array('class' => 'nav_next')); $this->element('a', array('href' => "$this->app_uri/$action?page=$newargs[page]", 'rel' => 'next'), - _('Before')); + _m('Before')); $this->elementEnd('li'); } if ($have_before || $have_after) { @@ -418,13 +418,13 @@ class FacebookAction extends Action $content = $this->trimmed('status_textarea'); if (!$content) { - $this->showPage(_('No notice content!')); + $this->showPage(_m('No notice content!')); return; } else { $content_shortened = common_shorten_links($content); if (Notice::contentTooLong($content_shortened)) { - $this->showPage(sprintf(_('That\'s too long. Max notice size is %d chars.'), + $this->showPage(sprintf(_m('That\'s too long. Max notice size is %d chars.'), Notice::maxContent())); return; } @@ -520,7 +520,7 @@ class FacebookNoticeList extends NoticeList function show() { $this->out->elementStart('div', array('id' =>'notices_primary')); - $this->out->element('h2', null, _('Notices')); + $this->out->element('h2', null, _m('Notices')); $this->out->elementStart('ul', array('class' => 'notices')); $cnt = 0; diff --git a/plugins/Facebook/facebookhome.php b/plugins/Facebook/facebookhome.php index ea141c2c2..60782f63c 100644 --- a/plugins/Facebook/facebookhome.php +++ b/plugins/Facebook/facebookhome.php @@ -108,7 +108,7 @@ class FacebookhomeAction extends FacebookAction $user = User::staticGet('nickname', $nickname); if (!$user) { - $this->showLoginForm(_("Server error - couldn't get user!")); + $this->showLoginForm(_m("Server error - couldn't get user!")); } $flink = DB_DataObject::factory('foreign_link'); @@ -128,7 +128,7 @@ class FacebookhomeAction extends FacebookAction return; } else { - $msg = _('Incorrect username or password.'); + $msg = _m('Incorrect username or password.'); } } @@ -155,9 +155,9 @@ class FacebookhomeAction extends FacebookAction function title() { if ($this->page > 1) { - return sprintf(_("%s and friends, page %d"), $this->user->nickname, $this->page); + return sprintf(_m("%s and friends, page %d"), $this->user->nickname, $this->page); } else { - return sprintf(_("%s and friends"), $this->user->nickname); + return sprintf(_m("%s and friends"), $this->user->nickname); } } @@ -186,7 +186,7 @@ class FacebookhomeAction extends FacebookAction $this->elementStart('div', array('class' => 'facebook_guide')); - $instructions = sprintf(_('If you would like the %s app to automatically update ' . + $instructions = sprintf(_m('If you would like the %s app to automatically update ' . 'your Facebook status with your latest notice, you need ' . 'to give it permission.'), $this->app_name); @@ -210,13 +210,13 @@ class FacebookhomeAction extends FacebookAction $this->elementStart('span', array('class' => 'facebook-button')); $this->element('a', array('href' => $auth_url), - sprintf(_('Okay, do it!'), $this->app_name)); + sprintf(_m('Okay, do it!'), $this->app_name)); $this->elementEnd('span'); $this->elementEnd('li'); $this->elementStart('li', array('id' => 'fb-permissions-item')); - $this->submit('skip', _('Skip')); + $this->submit('skip', _m('Skip')); $this->elementEnd('li'); $this->elementEnd('ul'); @@ -245,7 +245,7 @@ class FacebookhomeAction extends FacebookAction if ($have_before || $have_after) { $this->elementStart('dl', 'pagination'); - $this->element('dt', null, _('Pagination')); + $this->element('dt', null, _m('Pagination')); $this->elementStart('dd', null); $this->elementStart('ul', array('class' => 'nav')); } @@ -254,7 +254,7 @@ class FacebookhomeAction extends FacebookAction $newargs = $args ? array_merge($args, $pargs) : $pargs; $this->elementStart('li', array('class' => 'nav_prev')); $this->element('a', array('href' => "$action?page=$newargs[page]", 'rel' => 'prev'), - _('After')); + _m('After')); $this->elementEnd('li'); } if ($have_after) { @@ -262,7 +262,7 @@ class FacebookhomeAction extends FacebookAction $newargs = $args ? array_merge($args, $pargs) : $pargs; $this->elementStart('li', array('class' => 'nav_next')); $this->element('a', array('href' => "$action?page=$newargs[page]", 'rel' => 'next'), - _('Before')); + _m('Before')); $this->elementEnd('li'); } if ($have_before || $have_after) { diff --git a/plugins/Facebook/facebookinvite.php b/plugins/Facebook/facebookinvite.php index 3380b4c85..e02c7bf3e 100644 --- a/plugins/Facebook/facebookinvite.php +++ b/plugins/Facebook/facebookinvite.php @@ -69,9 +69,9 @@ class FacebookinviteAction extends FacebookAction function showSuccessContent() { - $this->element('h2', null, sprintf(_('Thanks for inviting your friends to use %s'), + $this->element('h2', null, sprintf(_m('Thanks for inviting your friends to use %s'), common_config('site', 'name'))); - $this->element('p', null, _('Invitations have been sent to the following users:')); + $this->element('p', null, _m('Invitations have been sent to the following users:')); $friend_ids = $_POST['ids']; // XXX: Hmm... is this the best way to access the list? @@ -91,7 +91,7 @@ class FacebookinviteAction extends FacebookAction function showFormContent() { - $content = sprintf(_('You have been invited to %s'), common_config('site', 'name')) . + $content = sprintf(_m('You have been invited to %s'), common_config('site', 'name')) . htmlentities(''); $this->elementStart('fb:request-form', array('action' => 'invite.php', @@ -100,7 +100,7 @@ class FacebookinviteAction extends FacebookAction 'type' => common_config('site', 'name'), 'content' => $content)); $this->hidden('invite', 'true'); - $actiontext = sprintf(_('Invite your friends to use %s'), common_config('site', 'name')); + $actiontext = sprintf(_m('Invite your friends to use %s'), common_config('site', 'name')); $multi_params = array('showborder' => 'false'); $multi_params['actiontext'] = $actiontext; @@ -122,7 +122,7 @@ class FacebookinviteAction extends FacebookAction if ($exclude_ids) { - $this->element('h2', null, sprintf(_('Friends already using %s:'), + $this->element('h2', null, sprintf(_m('Friends already using %s:'), common_config('site', 'name'))); $this->elementStart('ul', array('id' => 'facebook-friends')); @@ -140,7 +140,7 @@ class FacebookinviteAction extends FacebookAction function title() { - return sprintf(_('Send invitations')); + return sprintf(_m('Send invitations')); } } diff --git a/plugins/Facebook/facebooklogin.php b/plugins/Facebook/facebooklogin.php index f77aecca3..7a173ddae 100644 --- a/plugins/Facebook/facebooklogin.php +++ b/plugins/Facebook/facebooklogin.php @@ -88,7 +88,7 @@ class FacebookinviteAction extends FacebookAction function title() { - return sprintf(_('Login')); + return sprintf(_m('Login')); } function redirectHome() diff --git a/plugins/Facebook/facebookremove.php b/plugins/Facebook/facebookremove.php index 8531a8e6e..09cb33342 100644 --- a/plugins/Facebook/facebookremove.php +++ b/plugins/Facebook/facebookremove.php @@ -55,7 +55,7 @@ class FacebookremoveAction extends FacebookAction if (!$result) { common_log_db_error($flink, 'DELETE', __FILE__); - $this->serverError(_('Couldn\'t remove Facebook user.')); + $this->serverError(_m('Couldn\'t remove Facebook user.')); return; } diff --git a/plugins/Facebook/facebooksettings.php b/plugins/Facebook/facebooksettings.php index d1269f101..766d0e199 100644 --- a/plugins/Facebook/facebooksettings.php +++ b/plugins/Facebook/facebooksettings.php @@ -71,9 +71,9 @@ class FacebooksettingsAction extends FacebookAction $trimmed); if ($result === false) { - $this->showForm(_('There was a problem saving your sync preferences!')); + $this->showForm(_m('There was a problem saving your sync preferences!')); } else { - $this->showForm(_('Sync preferences saved.'), true); + $this->showForm(_m('Sync preferences saved.'), true); } } @@ -96,14 +96,14 @@ class FacebooksettingsAction extends FacebookAction $this->elementStart('li'); - $this->checkbox('noticesync', _('Automatically update my Facebook status with my notices.'), + $this->checkbox('noticesync', _m('Automatically update my Facebook status with my notices.'), ($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND) : true); $this->elementEnd('li'); $this->elementStart('li'); - $this->checkbox('replysync', _('Send "@" replies to Facebook.'), + $this->checkbox('replysync', _m('Send "@" replies to Facebook.'), ($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true); $this->elementEnd('li'); @@ -112,15 +112,15 @@ class FacebooksettingsAction extends FacebookAction $prefix = trim($this->facebook->api_client->data_getUserPreference(FACEBOOK_NOTICE_PREFIX)); - $this->input('prefix', _('Prefix'), + $this->input('prefix', _m('Prefix'), ($prefix) ? $prefix : null, - _('A string to prefix notices with.')); + _m('A string to prefix notices with.')); $this->elementEnd('li'); $this->elementStart('li'); - $this->submit('save', _('Save')); + $this->submit('save', _m('Save')); $this->elementEnd('li'); @@ -130,7 +130,7 @@ class FacebooksettingsAction extends FacebookAction } else { - $instructions = sprintf(_('If you would like %s to automatically update ' . + $instructions = sprintf(_m('If you would like %s to automatically update ' . 'your Facebook status with your latest notice, you need ' . 'to give it permission.'), $this->app_name); @@ -143,7 +143,7 @@ class FacebooksettingsAction extends FacebookAction $this->elementStart('fb:prompt-permission', array('perms' => 'publish_stream', 'next_fbjs' => 'document.setLocation(\'' . "$this->app_uri/settings.php" . '\')')); $this->element('span', array('class' => 'facebook-button'), - sprintf(_('Allow %s to update my Facebook status'), common_config('site', 'name'))); + sprintf(_m('Allow %s to update my Facebook status'), common_config('site', 'name'))); $this->elementEnd('fb:prompt-permission'); $this->elementEnd('li'); $this->elementEnd('ul'); @@ -153,7 +153,7 @@ class FacebooksettingsAction extends FacebookAction function title() { - return _('Sync preferences'); + return _m('Sync preferences'); } } diff --git a/plugins/Facebook/facebookutil.php b/plugins/Facebook/facebookutil.php index 2abcbb14e..2ec6db6b8 100644 --- a/plugins/Facebook/facebookutil.php +++ b/plugins/Facebook/facebookutil.php @@ -277,10 +277,10 @@ function mail_facebook_app_removed($user) $site_name = common_config('site', 'name'); $subject = sprintf( - _('Your %1$s Facebook application access has been disabled.', + _m('Your %1$s Facebook application access has been disabled.', $site_name)); - $body = sprintf(_("Hi, %1\$s. We're sorry to inform you that we are " . + $body = sprintf(_m("Hi, %1\$s. We're sorry to inform you that we are " . 'unable to update your Facebook status from %2$s, and have disabled ' . 'the Facebook application for your account. This may be because ' . 'you have removed the Facebook application\'s authorization, or ' . diff --git a/plugins/Facebook/locale/Facebook.po b/plugins/Facebook/locale/Facebook.po new file mode 100644 index 000000000..5b313c8c5 --- /dev/null +++ b/plugins/Facebook/locale/Facebook.po @@ -0,0 +1,394 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-07 20:38-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: facebookaction.php:171 +msgid "Home" +msgstr "" + +#: facebookaction.php:179 +msgid "Invite" +msgstr "" + +#: facebookaction.php:188 +msgid "Settings" +msgstr "" + +#: facebookaction.php:228 +#, php-format +msgid "" +"To use the %s Facebook Application you need to login with your username and " +"password. Don't have a username yet? " +msgstr "" + +#: facebookaction.php:230 +msgid " a new account." +msgstr "" + +#: facebookaction.php:236 +msgid "Register" +msgstr "" + +#: facebookaction.php:249 facebookaction.php:275 facebooklogin.php:91 +msgid "Login" +msgstr "" + +#: facebookaction.php:268 +msgid "Nickname" +msgstr "" + +#: facebookaction.php:271 FBConnectAuth.php:196 +msgid "Password" +msgstr "" + +#: facebookaction.php:281 +msgid "Lost or forgotten password?" +msgstr "" + +#: facebookaction.php:386 facebookhome.php:248 +msgid "Pagination" +msgstr "" + +#: facebookaction.php:395 facebookhome.php:257 +msgid "After" +msgstr "" + +#: facebookaction.php:403 facebookhome.php:265 +msgid "Before" +msgstr "" + +#: facebookaction.php:421 +msgid "No notice content!" +msgstr "" + +#: facebookaction.php:427 +#, php-format +msgid "That's too long. Max notice size is %d chars." +msgstr "" + +#: facebookaction.php:523 +msgid "Notices" +msgstr "" + +#: facebookutil.php:280 +#, php-format +msgid "Your %1$s Facebook application access has been disabled." +msgstr "" + +#: facebookutil.php:283 +#, php-format +msgid "" +"Hi, %1$s. We're sorry to inform you that we are unable to update your " +"Facebook status from %2$s, and have disabled the Facebook application for " +"your account. This may be because you have removed the Facebook " +"application's authorization, or have deleted your Facebook account. You can " +"re-enable the Facebook application and automatic status updating by re-" +"installing the %2$s Facebook application.\n" +"\n" +"Regards,\n" +"\n" +"%2$s" +msgstr "" + +#: FBConnectLogin.php:33 +msgid "Already logged in." +msgstr "" + +#: FBConnectLogin.php:41 +msgid "Login with your Facebook Account" +msgstr "" + +#: FBConnectLogin.php:55 +msgid "Facebook Login" +msgstr "" + +#: facebookhome.php:111 +msgid "Server error - couldn't get user!" +msgstr "" + +#: facebookhome.php:131 +msgid "Incorrect username or password." +msgstr "" + +#: facebookhome.php:158 +#, php-format +msgid "%s and friends, page %d" +msgstr "" + +#: facebookhome.php:160 +#, php-format +msgid "%s and friends" +msgstr "" + +#: facebookhome.php:189 +#, php-format +msgid "" +"If you would like the %s app to automatically update your Facebook status " +"with your latest notice, you need to give it permission." +msgstr "" + +#: facebookhome.php:213 +msgid "Okay, do it!" +msgstr "" + +#: facebookhome.php:219 +msgid "Skip" +msgstr "" + +#: facebooksettings.php:74 +msgid "There was a problem saving your sync preferences!" +msgstr "" + +#: facebooksettings.php:76 +msgid "Sync preferences saved." +msgstr "" + +#: facebooksettings.php:99 +msgid "Automatically update my Facebook status with my notices." +msgstr "" + +#: facebooksettings.php:106 +msgid "Send \"@\" replies to Facebook." +msgstr "" + +#: facebooksettings.php:115 +msgid "Prefix" +msgstr "" + +#: facebooksettings.php:117 +msgid "A string to prefix notices with." +msgstr "" + +#: facebooksettings.php:123 +msgid "Save" +msgstr "" + +#: facebooksettings.php:133 +#, php-format +msgid "" +"If you would like %s to automatically update your Facebook status with your " +"latest notice, you need to give it permission." +msgstr "" + +#: facebooksettings.php:146 +#, php-format +msgid "Allow %s to update my Facebook status" +msgstr "" + +#: facebooksettings.php:156 +msgid "Sync preferences" +msgstr "" + +#: facebookinvite.php:72 +#, php-format +msgid "Thanks for inviting your friends to use %s" +msgstr "" + +#: facebookinvite.php:74 +msgid "Invitations have been sent to the following users:" +msgstr "" + +#: facebookinvite.php:94 +#, php-format +msgid "You have been invited to %s" +msgstr "" + +#: facebookinvite.php:103 +#, php-format +msgid "Invite your friends to use %s" +msgstr "" + +#: facebookinvite.php:125 +#, php-format +msgid "Friends already using %s:" +msgstr "" + +#: facebookinvite.php:143 +msgid "Send invitations" +msgstr "" + +#: facebookremove.php:58 +msgid "Couldn't remove Facebook user." +msgstr "" + +#: FBConnectSettings.php:56 FacebookPlugin.php:430 +msgid "Facebook Connect Settings" +msgstr "" + +#: FBConnectSettings.php:67 +msgid "Manage how your account connects to Facebook" +msgstr "" + +#: FBConnectSettings.php:92 +msgid "There is no Facebook user connected to this account." +msgstr "" + +#: FBConnectSettings.php:100 +msgid "Connected Facebook user" +msgstr "" + +#: FBConnectSettings.php:119 +msgid "Disconnect my account from Facebook" +msgstr "" + +#: FBConnectSettings.php:124 +msgid "" +"Disconnecting your Faceboook would make it impossible to log in! Please " +msgstr "" + +#: FBConnectSettings.php:128 +msgid "set a password" +msgstr "" + +#: FBConnectSettings.php:130 +msgid " first." +msgstr "" + +#: FBConnectSettings.php:142 +msgid "Disconnect" +msgstr "" + +#: FBConnectSettings.php:164 FBConnectAuth.php:90 +msgid "There was a problem with your session token. Try again, please." +msgstr "" + +#: FBConnectSettings.php:178 +msgid "Couldn't delete link to Facebook." +msgstr "" + +#: FBConnectSettings.php:194 +msgid "You have disconnected from Facebook." +msgstr "" + +#: FBConnectSettings.php:197 +msgid "Not sure what you're trying to do." +msgstr "" + +#: FBConnectAuth.php:51 +msgid "You must be logged into Facebook to use Facebook Connect." +msgstr "" + +#: FBConnectAuth.php:77 +msgid "There is already a local user linked with this Facebook." +msgstr "" + +#: FBConnectAuth.php:95 +msgid "You can't register if you don't agree to the license." +msgstr "" + +#: FBConnectAuth.php:105 +msgid "Something weird happened." +msgstr "" + +#: FBConnectAuth.php:119 +#, php-format +msgid "" +"This is the first time you've logged into %s so we must connect your " +"Facebook to a local account. You can either create a new account, or connect " +"with your existing account, if you have one." +msgstr "" + +#: FBConnectAuth.php:125 +msgid "Facebook Account Setup" +msgstr "" + +#: FBConnectAuth.php:153 +msgid "Connection options" +msgstr "" + +#: FBConnectAuth.php:162 +msgid "My text and files are available under " +msgstr "" + +#: FBConnectAuth.php:165 +msgid "" +" except this private data: password, email address, IM address, phone number." +msgstr "" + +#: FBConnectAuth.php:173 +msgid "Create new account" +msgstr "" + +#: FBConnectAuth.php:175 +msgid "Create a new user with this nickname." +msgstr "" + +#: FBConnectAuth.php:178 +msgid "New nickname" +msgstr "" + +#: FBConnectAuth.php:180 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces" +msgstr "" + +#: FBConnectAuth.php:183 +msgid "Create" +msgstr "" + +#: FBConnectAuth.php:188 +msgid "Connect existing account" +msgstr "" + +#: FBConnectAuth.php:190 +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your Facebook." +msgstr "" + +#: FBConnectAuth.php:193 +msgid "Existing nickname" +msgstr "" + +#: FBConnectAuth.php:199 +msgid "Connect" +msgstr "" + +#: FBConnectAuth.php:215 FBConnectAuth.php:224 +msgid "Registration not allowed." +msgstr "" + +#: FBConnectAuth.php:231 +msgid "Not a valid invitation code." +msgstr "" + +#: FBConnectAuth.php:241 +msgid "Nickname must have only lowercase letters and numbers and no spaces." +msgstr "" + +#: FBConnectAuth.php:246 +msgid "Nickname not allowed." +msgstr "" + +#: FBConnectAuth.php:251 +msgid "Nickname already in use. Try another one." +msgstr "" + +#: FBConnectAuth.php:269 FBConnectAuth.php:303 FBConnectAuth.php:323 +msgid "Error connecting user to Facebook." +msgstr "" + +#: FBConnectAuth.php:289 +msgid "Invalid username or password." +msgstr "" + +#: FacebookPlugin.php:409 FacebookPlugin.php:429 +msgid "Facebook" +msgstr "" + +#: FacebookPlugin.php:410 +msgid "Login or register using Facebook" +msgstr "" diff --git a/plugins/FeedSub/FeedSubPlugin.php b/plugins/FeedSub/FeedSubPlugin.php index 36d4e7802..857a9794d 100644 --- a/plugins/FeedSub/FeedSubPlugin.php +++ b/plugins/FeedSub/FeedSubPlugin.php @@ -51,7 +51,6 @@ class FeedSubPlugin extends Plugin * @param Net_URL_Mapper $m path-to-action mapper * @return boolean hook return */ - function onRouterInitialized($m) { $m->connect('feedsub/callback/:feed', @@ -74,8 +73,8 @@ class FeedSubPlugin extends Plugin $action_name = $action->trimmed('action'); $action->menuItem(common_local_url('feedsubsettings'), - dgettext('FeebSubPlugin', 'Feeds'), - dgettext('FeedSubPlugin', 'Feed subscription options'), + _m('Feeds'), + _m('Feed subscription options'), $action_name === 'feedsubsettings'); return true; diff --git a/plugins/FeedSub/actions/feedsubsettings.php b/plugins/FeedSub/actions/feedsubsettings.php index 242224fac..0fba20a39 100644 --- a/plugins/FeedSub/actions/feedsubsettings.php +++ b/plugins/FeedSub/actions/feedsubsettings.php @@ -38,7 +38,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction function title() { - return dgettext('FeedSubPlugin', 'Feed subscriptions'); + return _m('Feed subscriptions'); } /** @@ -49,9 +49,8 @@ class FeedSubSettingsAction extends ConnectSettingsAction function getInstructions() { - return dgettext('FeedSubPlugin', - 'You can subscribe to feeds from other sites; ' . - 'updates will appear in your personal timeline.'); + return _m('You can subscribe to feeds from other sites; ' . + 'updates will appear in your personal timeline.'); } /** @@ -94,9 +93,9 @@ class FeedSubSettingsAction extends ConnectSettingsAction $this->elementEnd('ul'); if ($this->preview) { - $this->submit('subscribe', dgettext('FeedSubPlugin', 'Subscribe')); + $this->submit('subscribe', _m('Subscribe')); } else { - $this->submit('validate', dgettext('FeedSubPlugin', 'Continue')); + $this->submit('validate', _m('Continue')); } $this->elementEnd('fieldset'); @@ -149,8 +148,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction $feedurl = trim($this->arg('feedurl')); if ($feedurl == '') { - $this->showForm(dgettext('FeedSubPlugin', - 'Empty feed URL!')); + $this->showForm(_m('Empty feed URL!')); return; } $this->feedurl = $feedurl; @@ -160,26 +158,26 @@ class FeedSubSettingsAction extends ConnectSettingsAction $discover = new FeedDiscovery(); $uri = $discover->discoverFromURL($feedurl); } catch (FeedSubBadURLException $e) { - $this->showForm(dgettext('FeedSubPlugin', 'Invalid URL or could not reach server.')); + $this->showForm(_m('Invalid URL or could not reach server.')); return false; } catch (FeedSubBadResponseException $e) { - $this->showForm(dgettext('FeedSubPlugin', 'Cannot read feed; server returned error.')); + $this->showForm(_m('Cannot read feed; server returned error.')); return false; } catch (FeedSubEmptyException $e) { - $this->showForm(dgettext('FeedSubPlugin', 'Cannot read feed; server returned an empty page.')); + $this->showForm(_m('Cannot read feed; server returned an empty page.')); return false; } catch (FeedSubBadHTMLException $e) { - $this->showForm(dgettext('FeedSubPlugin', 'Bad HTML, could not find feed link.')); + $this->showForm(_m('Bad HTML, could not find feed link.')); return false; } catch (FeedSubNoFeedException $e) { - $this->showForm(dgettext('FeedSubPlugin', 'Could not find a feed linked from this URL.')); + $this->showForm(_m('Could not find a feed linked from this URL.')); return false; } catch (FeedSubUnrecognizedTypeException $e) { - $this->showForm(dgettext('FeedSubPlugin', 'Not a recognized feed type.')); + $this->showForm(_m('Not a recognized feed type.')); return false; } catch (FeedSubException $e) { // Any new ones we forgot about - $this->showForm(dgettext('FeedSubPlugin', 'Bad feed URL.')); + $this->showForm(_m('Bad feed URL.')); return false; } @@ -187,7 +185,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction $this->feedinfo = $this->munger->feedInfo(); if ($this->feedinfo->huburi == '') { - $this->showForm(dgettext('FeedSubPlugin', 'Feed is not PuSH-enabled; cannot subscribe.')); + $this->showForm(_m('Feed is not PuSH-enabled; cannot subscribe.')); return false; } @@ -207,7 +205,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction $ok = $this->feedinfo->subscribe(); common_log(LOG_INFO, __METHOD__ . ": sub was $ok"); if (!$ok) { - $this->showForm(dgettext('FeedSubPlugin', 'Feed subscription failed! Bad response from hub.')); + $this->showForm(_m('Feed subscription failed! Bad response from hub.')); return; } } @@ -217,11 +215,11 @@ class FeedSubSettingsAction extends ConnectSettingsAction $profile = $this->feedinfo->getProfile(); if ($user->isSubscribed($profile)) { - $this->showForm(dgettext('FeedSubPlugin', 'Already subscribed!')); + $this->showForm(_m('Already subscribed!')); } elseif ($user->subscribeTo($profile)) { - $this->showForm(dgettext('FeedSubPlugin', 'Feed subscribed!')); + $this->showForm(_m('Feed subscribed!')); } else { - $this->showForm(dgettext('FeedSubPlugin', 'Feed subscription failed!')); + $this->showForm(_m('Feed subscription failed!')); } } } @@ -230,7 +228,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction { if ($this->validateFeed()) { $this->preview = true; - $this->showForm(dgettext('FeedSubPlugin', 'Previewing feed:')); + $this->showForm(_m('Previewing feed:')); } } diff --git a/plugins/FeedSub/feedmunger.php b/plugins/FeedSub/feedmunger.php index bb8075da9..f3618b8eb 100644 --- a/plugins/FeedSub/feedmunger.php +++ b/plugins/FeedSub/feedmunger.php @@ -212,7 +212,7 @@ class FeedMunger // try adding #hashtags from the categories/tags on a post. // @todo Should we force a language here? - $format = dgettext("FeedSubPlugin", 'New post: "%1$s" %2$s'); + $format = _m('New post: "%1$s" %2$s'); $title = $entry->title; $link = $this->getAltLink($entry); $out = sprintf($format, $title, $link); diff --git a/plugins/FeedSub/locale/FeedSub.po b/plugins/FeedSub/locale/FeedSub.po new file mode 100644 index 000000000..dedc018e3 --- /dev/null +++ b/plugins/FeedSub/locale/FeedSub.po @@ -0,0 +1,104 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-07 20:38-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: tests/gettext-speedtest.php:57 FeedSubPlugin.php:76 +msgid "Feeds" +msgstr "" + +#: FeedSubPlugin.php:77 +msgid "Feed subscription options" +msgstr "" + +#: feedmunger.php:215 +#, php-format +msgid "New post: \"%1$s\" %2$s" +msgstr "" + +#: actions/feedsubsettings.php:41 +msgid "Feed subscriptions" +msgstr "" + +#: actions/feedsubsettings.php:52 +msgid "" +"You can subscribe to feeds from other sites; updates will appear in your " +"personal timeline." +msgstr "" + +#: actions/feedsubsettings.php:96 +msgid "Subscribe" +msgstr "" + +#: actions/feedsubsettings.php:98 +msgid "Continue" +msgstr "" + +#: actions/feedsubsettings.php:151 +msgid "Empty feed URL!" +msgstr "" + +#: actions/feedsubsettings.php:161 +msgid "Invalid URL or could not reach server." +msgstr "" + +#: actions/feedsubsettings.php:164 +msgid "Cannot read feed; server returned error." +msgstr "" + +#: actions/feedsubsettings.php:167 +msgid "Cannot read feed; server returned an empty page." +msgstr "" + +#: actions/feedsubsettings.php:170 +msgid "Bad HTML, could not find feed link." +msgstr "" + +#: actions/feedsubsettings.php:173 +msgid "Could not find a feed linked from this URL." +msgstr "" + +#: actions/feedsubsettings.php:176 +msgid "Not a recognized feed type." +msgstr "" + +#: actions/feedsubsettings.php:180 +msgid "Bad feed URL." +msgstr "" + +#: actions/feedsubsettings.php:188 +msgid "Feed is not PuSH-enabled; cannot subscribe." +msgstr "" + +#: actions/feedsubsettings.php:208 +msgid "Feed subscription failed! Bad response from hub." +msgstr "" + +#: actions/feedsubsettings.php:218 +msgid "Already subscribed!" +msgstr "" + +#: actions/feedsubsettings.php:220 +msgid "Feed subscribed!" +msgstr "" + +#: actions/feedsubsettings.php:222 +msgid "Feed subscription failed!" +msgstr "" + +#: actions/feedsubsettings.php:231 +msgid "Previewing feed:" +msgstr "" diff --git a/plugins/FeedSub/locale/fr/LC_MESSAGES/FeedSub.po b/plugins/FeedSub/locale/fr/LC_MESSAGES/FeedSub.po new file mode 100644 index 000000000..f17dfa50a --- /dev/null +++ b/plugins/FeedSub/locale/fr/LC_MESSAGES/FeedSub.po @@ -0,0 +1,106 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-07 14:14-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" + +#: FeedSubPlugin.php:77 +msgid "Feeds" +msgstr "Flux" + +#: FeedSubPlugin.php:78 +msgid "Feed subscription options" +msgstr "Préférences pour abonnement flux" + +#: feedmunger.php:215 +#, php-format +msgid "New post: \"%1$s\" %2$s" +msgstr "Nouveau: \"%1$s\" %2$s" + +#: actions/feedsubsettings.php:41 +msgid "Feed subscriptions" +msgstr "Abonnements aux fluxes" + +#: actions/feedsubsettings.php:52 +msgid "" +"You can subscribe to feeds from other sites; updates will appear in your " +"personal timeline." +msgstr "" +"Abonner aux fluxes RSS ou Atom des autres sites web; les temps se trouverair" +"en votre flux personnel." + +#: actions/feedsubsettings.php:96 +msgid "Subscribe" +msgstr "Abonner" + +#: actions/feedsubsettings.php:98 +msgid "Continue" +msgstr "Prochaine" + +#: actions/feedsubsettings.php:151 +msgid "Empty feed URL!" +msgstr "" + +#: actions/feedsubsettings.php:161 +msgid "Invalid URL or could not reach server." +msgstr "" + +#: actions/feedsubsettings.php:164 +msgid "Cannot read feed; server returned error." +msgstr "" + +#: actions/feedsubsettings.php:167 +msgid "Cannot read feed; server returned an empty page." +msgstr "" + +#: actions/feedsubsettings.php:170 +msgid "Bad HTML, could not find feed link." +msgstr "" + +#: actions/feedsubsettings.php:173 +msgid "Could not find a feed linked from this URL." +msgstr "" + +#: actions/feedsubsettings.php:176 +msgid "Not a recognized feed type." +msgstr "" + +#: actions/feedsubsettings.php:180 +msgid "Bad feed URL." +msgstr "" + +#: actions/feedsubsettings.php:188 +msgid "Feed is not PuSH-enabled; cannot subscribe." +msgstr "" + +#: actions/feedsubsettings.php:208 +msgid "Feed subscription failed! Bad response from hub." +msgstr "" + +#: actions/feedsubsettings.php:218 +msgid "Already subscribed!" +msgstr "" + +#: actions/feedsubsettings.php:220 +msgid "Feed subscribed!" +msgstr "" + +#: actions/feedsubsettings.php:222 +msgid "Feed subscription failed!" +msgstr "" + +#: actions/feedsubsettings.php:231 +msgid "Previewing feed:" +msgstr "" diff --git a/plugins/FeedSub/tests/gettext-speedtest.php b/plugins/FeedSub/tests/gettext-speedtest.php new file mode 100644 index 000000000..8bbdf5e89 --- /dev/null +++ b/plugins/FeedSub/tests/gettext-speedtest.php @@ -0,0 +1,78 @@ + $bits) { + list($time, $result) = $bits; + $ms = $time * 1000.0; + printf("%10s %2.4fms %s\n", $func, $ms, $result); +} + + +function fake($str) { + return $str; +} + diff --git a/plugins/Mapstraction/MapstractionPlugin.php b/plugins/Mapstraction/MapstractionPlugin.php index f20e81b0e..93679e56c 100644 --- a/plugins/Mapstraction/MapstractionPlugin.php +++ b/plugins/Mapstraction/MapstractionPlugin.php @@ -177,7 +177,7 @@ class MapstractionPlugin extends Plugin $action->elementStart('div', array('id' => 'entity_map', 'class' => 'section')); - $action->element('h2', null, _('Map')); + $action->element('h2', null, _m('Map')); $action->element('div', array('id' => 'map_canvas', 'class' => 'gray smallmap', @@ -188,7 +188,7 @@ class MapstractionPlugin extends Plugin array('nickname' => $action->trimmed('nickname'))); $action->element('a', array('href' => $mapUrl), - _("Full size")); + _m("Full size")); $action->elementEnd('div'); } diff --git a/plugins/Mapstraction/allmap.php b/plugins/Mapstraction/allmap.php index 0c4f03b31..e73aa76e8 100644 --- a/plugins/Mapstraction/allmap.php +++ b/plugins/Mapstraction/allmap.php @@ -68,10 +68,10 @@ class AllmapAction extends MapAction } if ($this->page == 1) { - return sprintf(_("%s friends map"), + return sprintf(_m("%s friends map"), $base); } else { - return sprintf(_("%s friends map, page %d"), + return sprintf(_m("%s friends map, page %d"), $base, $this->page); } diff --git a/plugins/Mapstraction/locale/Mapstraction.po b/plugins/Mapstraction/locale/Mapstraction.po new file mode 100644 index 000000000..c1c50bf50 --- /dev/null +++ b/plugins/Mapstraction/locale/Mapstraction.po @@ -0,0 +1,48 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-07 20:38-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: allmap.php:71 +#, php-format +msgid "%s friends map" +msgstr "" + +#: allmap.php:74 +#, php-format +msgid "%s friends map, page %d" +msgstr "" + +#: map.php:72 +msgid "No such user." +msgstr "" + +#: map.php:79 +msgid "User has no profile." +msgstr "" + +#: usermap.php:71 +#, php-format +msgid "%s map, page %d" +msgstr "" + +#: MapstractionPlugin.php:180 +msgid "Map" +msgstr "" + +#: MapstractionPlugin.php:191 +msgid "Full size" +msgstr "" diff --git a/plugins/Mapstraction/map.php b/plugins/Mapstraction/map.php index 734e48088..a33dfc736 100644 --- a/plugins/Mapstraction/map.php +++ b/plugins/Mapstraction/map.php @@ -69,14 +69,14 @@ class MapAction extends OwnerDesignAction $this->user = User::staticGet('nickname', $nickname); if (!$this->user) { - $this->clientError(_('No such user.'), 404); + $this->clientError(_m('No such user.'), 404); return false; } $this->profile = $this->user->getProfile(); if (!$this->profile) { - $this->serverError(_('User has no profile.')); + $this->serverError(_m('User has no profile.')); return false; } diff --git a/plugins/Mapstraction/usermap.php b/plugins/Mapstraction/usermap.php index 3e517ee86..ff47b6ada 100644 --- a/plugins/Mapstraction/usermap.php +++ b/plugins/Mapstraction/usermap.php @@ -68,7 +68,7 @@ class UsermapAction extends MapAction if ($this->page == 1) { return $base; } else { - return sprintf(_("%s map, page %d"), + return sprintf(_m("%s map, page %d"), $base, $this->page); } diff --git a/plugins/OpenID/OpenIDPlugin.php b/plugins/OpenID/OpenIDPlugin.php index e86725d70..a37d5465e 100644 --- a/plugins/OpenID/OpenIDPlugin.php +++ b/plugins/OpenID/OpenIDPlugin.php @@ -120,8 +120,8 @@ class OpenIDPlugin extends Plugin $action_name = $action->trimmed('action'); $action->menuItem(common_local_url('openidlogin'), - _('OpenID'), - _('Login or register with OpenID'), + _m('OpenID'), + _m('Login or register with OpenID'), $action_name === 'openidlogin'); return true; @@ -132,8 +132,8 @@ class OpenIDPlugin extends Plugin $action_name = $action->trimmed('action'); $action->menuItem(common_local_url('openidsettings'), - _('OpenID'), - _('Add or remove OpenIDs'), + _m('OpenID'), + _m('Add or remove OpenIDs'), $action_name === 'openidsettings'); return true; diff --git a/plugins/OpenID/finishaddopenid.php b/plugins/OpenID/finishaddopenid.php index 7cd916523..991e6584e 100644 --- a/plugins/OpenID/finishaddopenid.php +++ b/plugins/OpenID/finishaddopenid.php @@ -64,7 +64,7 @@ class FinishaddopenidAction extends Action { parent::handle($args); if (!common_logged_in()) { - $this->clientError(_('Not logged in.')); + $this->clientError(_m('Not logged in.')); } else { $this->tryLogin(); } @@ -85,11 +85,11 @@ class FinishaddopenidAction extends Action $response = $consumer->complete(common_local_url('finishaddopenid')); if ($response->status == Auth_OpenID_CANCEL) { - $this->message(_('OpenID authentication cancelled.')); + $this->message(_m('OpenID authentication cancelled.')); return; } else if ($response->status == Auth_OpenID_FAILURE) { // Authentication failed; display the error message. - $this->message(sprintf(_('OpenID authentication failed: %s'), + $this->message(sprintf(_m('OpenID authentication failed: %s'), $response->message)); } else if ($response->status == Auth_OpenID_SUCCESS) { @@ -109,9 +109,9 @@ class FinishaddopenidAction extends Action if ($other) { if ($other->id == $cur->id) { - $this->message(_('You already have this OpenID!')); + $this->message(_m('You already have this OpenID!')); } else { - $this->message(_('Someone else already has this OpenID.')); + $this->message(_m('Someone else already has this OpenID.')); } return; } @@ -123,12 +123,12 @@ class FinishaddopenidAction extends Action $result = oid_link_user($cur->id, $canonical, $display); if (!$result) { - $this->message(_('Error connecting user.')); + $this->message(_m('Error connecting user.')); return; } if ($sreg) { if (!oid_update_user($cur, $sreg)) { - $this->message(_('Error updating profile')); + $this->message(_m('Error updating profile')); return; } } @@ -167,7 +167,7 @@ class FinishaddopenidAction extends Action function title() { - return _('OpenID Login'); + return _m('OpenID Login'); } /** diff --git a/plugins/OpenID/finishopenidlogin.php b/plugins/OpenID/finishopenidlogin.php index e5551b412..987fa9213 100644 --- a/plugins/OpenID/finishopenidlogin.php +++ b/plugins/OpenID/finishopenidlogin.php @@ -31,16 +31,16 @@ class FinishopenidloginAction extends Action { parent::handle($args); if (common_is_real_login()) { - $this->clientError(_('Already logged in.')); + $this->clientError(_m('Already logged in.')); } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { - $this->showForm(_('There was a problem with your session token. Try again, please.')); + $this->showForm(_m('There was a problem with your session token. Try again, please.')); return; } if ($this->arg('create')) { if (!$this->boolean('license')) { - $this->showForm(_('You can\'t register if you don\'t agree to the license.'), + $this->showForm(_m('You can\'t register if you don\'t agree to the license.'), $this->trimmed('newname')); return; } @@ -49,7 +49,7 @@ class FinishopenidloginAction extends Action $this->connectUser(); } else { common_debug(print_r($this->args, true), __FILE__); - $this->showForm(_('Something weird happened.'), + $this->showForm(_m('Something weird happened.'), $this->trimmed('newname')); } } else { @@ -63,13 +63,13 @@ class FinishopenidloginAction extends Action $this->element('div', array('class' => 'error'), $this->error); } else { $this->element('div', 'instructions', - sprintf(_('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), common_config('site', 'name'))); + sprintf(_m('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), common_config('site', 'name'))); } } function title() { - return _('OpenID Account Setup'); + return _m('OpenID Account Setup'); } function showForm($error=null, $username=null) @@ -94,14 +94,14 @@ class FinishopenidloginAction extends Action $this->hidden('token', common_session_token()); $this->elementStart('fieldset', array('id' => 'form_openid_createaccount')); $this->element('legend', null, - _('Create new account')); + _m('Create new account')); $this->element('p', null, - _('Create a new user with this nickname.')); + _m('Create a new user with this nickname.')); $this->elementStart('ul', 'form_data'); $this->elementStart('li'); - $this->input('newname', _('New nickname'), + $this->input('newname', _m('New nickname'), ($this->username) ? $this->username : '', - _('1-64 lowercase letters or numbers, no punctuation or spaces')); + _m('1-64 lowercase letters or numbers, no punctuation or spaces')); $this->elementEnd('li'); $this->elementStart('li'); $this->element('input', array('type' => 'checkbox', @@ -111,30 +111,30 @@ class FinishopenidloginAction extends Action 'value' => 'true')); $this->elementStart('label', array('for' => 'license', 'class' => 'checkbox')); - $this->text(_('My text and files are available under ')); + $this->text(_m('My text and files are available under ')); $this->element('a', array('href' => common_config('license', 'url')), common_config('license', 'title')); - $this->text(_(' except this private data: password, email address, IM address, phone number.')); + $this->text(_m(' except this private data: password, email address, IM address, phone number.')); $this->elementEnd('label'); $this->elementEnd('li'); $this->elementEnd('ul'); - $this->submit('create', _('Create')); + $this->submit('create', _m('Create')); $this->elementEnd('fieldset'); $this->elementStart('fieldset', array('id' => 'form_openid_createaccount')); $this->element('legend', null, - _('Connect existing account')); + _m('Connect existing account')); $this->element('p', null, - _('If you already have an account, login with your username and password to connect it to your OpenID.')); + _m('If you already have an account, login with your username and password to connect it to your OpenID.')); $this->elementStart('ul', 'form_data'); $this->elementStart('li'); - $this->input('nickname', _('Existing nickname')); + $this->input('nickname', _m('Existing nickname')); $this->elementEnd('li'); $this->elementStart('li'); - $this->password('password', _('Password')); + $this->password('password', _m('Password')); $this->elementEnd('li'); $this->elementEnd('ul'); - $this->submit('connect', _('Connect')); + $this->submit('connect', _m('Connect')); $this->elementEnd('fieldset'); $this->elementEnd('form'); } @@ -146,11 +146,11 @@ class FinishopenidloginAction extends Action $response = $consumer->complete(common_local_url('finishopenidlogin')); if ($response->status == Auth_OpenID_CANCEL) { - $this->message(_('OpenID authentication cancelled.')); + $this->message(_m('OpenID authentication cancelled.')); return; } else if ($response->status == Auth_OpenID_FAILURE) { // Authentication failed; display the error message. - $this->message(sprintf(_('OpenID authentication failed: %s'), $response->message)); + $this->message(sprintf(_m('OpenID authentication failed: %s'), $response->message)); } else if ($response->status == Auth_OpenID_SUCCESS) { // This means the authentication succeeded; extract the // identity URL and Simple Registration data (if it was @@ -212,7 +212,7 @@ class FinishopenidloginAction extends Action # FIXME: save invite code before redirect, and check here if (common_config('site', 'closed')) { - $this->clientError(_('Registration not allowed.')); + $this->clientError(_m('Registration not allowed.')); return; } @@ -221,14 +221,14 @@ class FinishopenidloginAction extends Action if (common_config('site', 'inviteonly')) { $code = $_SESSION['invitecode']; if (empty($code)) { - $this->clientError(_('Registration not allowed.')); + $this->clientError(_m('Registration not allowed.')); return; } $invite = Invitation::staticGet($code); if (empty($invite)) { - $this->clientError(_('Not a valid invitation code.')); + $this->clientError(_m('Not a valid invitation code.')); return; } } @@ -238,24 +238,24 @@ class FinishopenidloginAction extends Action if (!Validate::string($nickname, array('min_length' => 1, 'max_length' => 64, 'format' => NICKNAME_FMT))) { - $this->showForm(_('Nickname must have only lowercase letters and numbers and no spaces.')); + $this->showForm(_m('Nickname must have only lowercase letters and numbers and no spaces.')); return; } if (!User::allowed_nickname($nickname)) { - $this->showForm(_('Nickname not allowed.')); + $this->showForm(_m('Nickname not allowed.')); return; } if (User::staticGet('nickname', $nickname)) { - $this->showForm(_('Nickname already in use. Try another one.')); + $this->showForm(_m('Nickname already in use. Try another one.')); return; } list($display, $canonical, $sreg) = $this->getSavedValues(); if (!$display || !$canonical) { - $this->serverError(_('Stored OpenID not found.')); + $this->serverError(_m('Stored OpenID not found.')); return; } @@ -264,7 +264,7 @@ class FinishopenidloginAction extends Action $other = oid_get_user($canonical); if ($other) { - $this->serverError(_('Creating new account for OpenID that already has a user.')); + $this->serverError(_m('Creating new account for OpenID that already has a user.')); return; } @@ -324,7 +324,7 @@ class FinishopenidloginAction extends Action $password = $this->trimmed('password'); if (!common_check_user($nickname, $password)) { - $this->showForm(_('Invalid username or password.')); + $this->showForm(_m('Invalid username or password.')); return; } @@ -335,14 +335,14 @@ class FinishopenidloginAction extends Action list($display, $canonical, $sreg) = $this->getSavedValues(); if (!$display || !$canonical) { - $this->serverError(_('Stored OpenID not found.')); + $this->serverError(_m('Stored OpenID not found.')); return; } $result = oid_link_user($user->id, $canonical, $display); if (!$result) { - $this->serverError(_('Error connecting user to OpenID.')); + $this->serverError(_m('Error connecting user to OpenID.')); return; } diff --git a/plugins/OpenID/locale/OpenID.po b/plugins/OpenID/locale/OpenID.po new file mode 100644 index 000000000..34738bc75 --- /dev/null +++ b/plugins/OpenID/locale/OpenID.po @@ -0,0 +1,344 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-07 20:38-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: openidlogin.php:30 finishopenidlogin.php:34 +msgid "Already logged in." +msgstr "" + +#: openidlogin.php:37 openidsettings.php:194 finishopenidlogin.php:38 +msgid "There was a problem with your session token. Try again, please." +msgstr "" + +#: openidlogin.php:66 +#, php-format +msgid "" +"For security reasons, please re-login with your [OpenID](%%doc.openid%%) " +"before changing your settings." +msgstr "" + +#: openidlogin.php:70 +#, php-format +msgid "Login with an [OpenID](%%doc.openid%%) account." +msgstr "" + +#: openidlogin.php:95 finishaddopenid.php:170 +msgid "OpenID Login" +msgstr "" + +#: openidlogin.php:112 +msgid "OpenID login" +msgstr "" + +#: openidlogin.php:117 openidsettings.php:107 +msgid "OpenID URL" +msgstr "" + +#: openidlogin.php:119 +msgid "Your OpenID URL" +msgstr "" + +#: openidlogin.php:122 +msgid "Remember me" +msgstr "" + +#: openidlogin.php:123 +msgid "Automatically login in the future; not for shared computers!" +msgstr "" + +#: openidlogin.php:127 +msgid "Login" +msgstr "" + +#: openidserver.php:106 +#, php-format +msgid "You are not authorized to use the identity %s" +msgstr "" + +#: openidserver.php:126 +msgid "Just an OpenID provider. Nothing to see here, move along..." +msgstr "" + +#: OpenIDPlugin.php:123 OpenIDPlugin.php:135 +msgid "OpenID" +msgstr "" + +#: OpenIDPlugin.php:124 +msgid "Login or register with OpenID" +msgstr "" + +#: OpenIDPlugin.php:136 +msgid "Add or remove OpenIDs" +msgstr "" + +#: openid.php:141 +msgid "Cannot instantiate OpenID consumer object." +msgstr "" + +#: openid.php:151 +msgid "Not a valid OpenID." +msgstr "" + +#: openid.php:153 +#, php-format +msgid "OpenID failure: %s" +msgstr "" + +#: openid.php:180 +#, php-format +msgid "Could not redirect to server: %s" +msgstr "" + +#: openid.php:198 +#, php-format +msgid "Could not create OpenID form: %s" +msgstr "" + +#: openid.php:214 +msgid "" +"This form should automatically submit itself. If not, click the submit " +"button to go to your OpenID provider." +msgstr "" + +#: openid.php:246 +msgid "Error saving the profile." +msgstr "" + +#: openid.php:257 +msgid "Error saving the user." +msgstr "" + +#: openid.php:277 +msgid "OpenID Auto-Submit" +msgstr "" + +#: openidtrust.php:51 +msgid "OpenID Identity Verification" +msgstr "" + +#: openidtrust.php:69 +msgid "" +"This page should only be reached during OpenID processing, not directly." +msgstr "" + +#: openidtrust.php:118 +#, php-format +msgid "" +"%s has asked to verify your identity. Click Continue to verify your " +"identity and login without creating a new password." +msgstr "" + +#: openidtrust.php:136 +msgid "Continue" +msgstr "" + +#: openidtrust.php:137 +msgid "Cancel" +msgstr "" + +#: finishaddopenid.php:67 +msgid "Not logged in." +msgstr "" + +#: finishaddopenid.php:88 finishopenidlogin.php:149 +msgid "OpenID authentication cancelled." +msgstr "" + +#: finishaddopenid.php:92 finishopenidlogin.php:153 +#, php-format +msgid "OpenID authentication failed: %s" +msgstr "" + +#: finishaddopenid.php:112 +msgid "You already have this OpenID!" +msgstr "" + +#: finishaddopenid.php:114 +msgid "Someone else already has this OpenID." +msgstr "" + +#: finishaddopenid.php:126 +msgid "Error connecting user." +msgstr "" + +#: finishaddopenid.php:131 +msgid "Error updating profile" +msgstr "" + +#: openidsettings.php:59 +msgid "OpenID settings" +msgstr "" + +#: openidsettings.php:70 +#, php-format +msgid "" +"[OpenID](%%doc.openid%%) lets you log into many sites with the same user " +"account. Manage your associated OpenIDs from here." +msgstr "" + +#: openidsettings.php:99 +msgid "Add OpenID" +msgstr "" + +#: openidsettings.php:102 +msgid "" +"If you want to add an OpenID to your account, enter it in the box below and " +"click \"Add\"." +msgstr "" + +#: openidsettings.php:117 +msgid "Add" +msgstr "" + +#: openidsettings.php:129 +msgid "Remove OpenID" +msgstr "" + +#: openidsettings.php:134 +msgid "" +"Removing your only OpenID would make it impossible to log in! If you need to " +"remove it, add another OpenID first." +msgstr "" + +#: openidsettings.php:149 +msgid "" +"You can remove an OpenID from your account by clicking the button marked " +"\"Remove\"." +msgstr "" + +#: openidsettings.php:172 +msgid "Remove" +msgstr "" + +#: openidsettings.php:208 finishopenidlogin.php:52 +msgid "Something weird happened." +msgstr "" + +#: openidsettings.php:228 +msgid "No such OpenID." +msgstr "" + +#: openidsettings.php:233 +msgid "That OpenID does not belong to you." +msgstr "" + +#: openidsettings.php:237 +msgid "OpenID removed." +msgstr "" + +#: finishopenidlogin.php:43 +msgid "You can't register if you don't agree to the license." +msgstr "" + +#: finishopenidlogin.php:66 +#, php-format +msgid "" +"This is the first time you've logged into %s so we must connect your OpenID " +"to a local account. You can either create a new account, or connect with " +"your existing account, if you have one." +msgstr "" + +#: finishopenidlogin.php:72 +msgid "OpenID Account Setup" +msgstr "" + +#: finishopenidlogin.php:97 +msgid "Create new account" +msgstr "" + +#: finishopenidlogin.php:99 +msgid "Create a new user with this nickname." +msgstr "" + +#: finishopenidlogin.php:102 +msgid "New nickname" +msgstr "" + +#: finishopenidlogin.php:104 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces" +msgstr "" + +#: finishopenidlogin.php:114 +msgid "My text and files are available under " +msgstr "" + +#: finishopenidlogin.php:117 +msgid "" +" except this private data: password, email address, IM address, phone number." +msgstr "" + +#: finishopenidlogin.php:121 +msgid "Create" +msgstr "" + +#: finishopenidlogin.php:126 +msgid "Connect existing account" +msgstr "" + +#: finishopenidlogin.php:128 +msgid "" +"If you already have an account, login with your username and password to " +"connect it to your OpenID." +msgstr "" + +#: finishopenidlogin.php:131 +msgid "Existing nickname" +msgstr "" + +#: finishopenidlogin.php:134 +msgid "Password" +msgstr "" + +#: finishopenidlogin.php:137 +msgid "Connect" +msgstr "" + +#: finishopenidlogin.php:215 finishopenidlogin.php:224 +msgid "Registration not allowed." +msgstr "" + +#: finishopenidlogin.php:231 +msgid "Not a valid invitation code." +msgstr "" + +#: finishopenidlogin.php:241 +msgid "Nickname must have only lowercase letters and numbers and no spaces." +msgstr "" + +#: finishopenidlogin.php:246 +msgid "Nickname not allowed." +msgstr "" + +#: finishopenidlogin.php:251 +msgid "Nickname already in use. Try another one." +msgstr "" + +#: finishopenidlogin.php:258 finishopenidlogin.php:338 +msgid "Stored OpenID not found." +msgstr "" + +#: finishopenidlogin.php:267 +msgid "Creating new account for OpenID that already has a user." +msgstr "" + +#: finishopenidlogin.php:327 +msgid "Invalid username or password." +msgstr "" + +#: finishopenidlogin.php:345 +msgid "Error connecting user to OpenID." +msgstr "" diff --git a/plugins/OpenID/openid.php b/plugins/OpenID/openid.php index dd628e773..8f949c9c5 100644 --- a/plugins/OpenID/openid.php +++ b/plugins/OpenID/openid.php @@ -138,7 +138,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false) $consumer = oid_consumer(); if (!$consumer) { - common_server_error(_('Cannot instantiate OpenID consumer object.')); + common_server_error(_m('Cannot instantiate OpenID consumer object.')); return false; } @@ -148,9 +148,9 @@ function oid_authenticate($openid_url, $returnto, $immediate=false) // Handle failure status return values. if (!$auth_request) { - return _('Not a valid OpenID.'); + return _m('Not a valid OpenID.'); } else if (Auth_OpenID::isFailure($auth_request)) { - return sprintf(_('OpenID failure: %s'), $auth_request->message); + return sprintf(_m('OpenID failure: %s'), $auth_request->message); } $sreg_request = Auth_OpenID_SRegRequest::build(// Required @@ -177,7 +177,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false) $immediate); if (!$redirect_url) { } else if (Auth_OpenID::isFailure($redirect_url)) { - return sprintf(_('Could not redirect to server: %s'), $redirect_url->message); + return sprintf(_m('Could not redirect to server: %s'), $redirect_url->message); } else { common_redirect($redirect_url, 303); } @@ -195,7 +195,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false) // Display an error if the form markup couldn't be generated; // otherwise, render the HTML. if (Auth_OpenID::isFailure($form_html)) { - common_server_error(sprintf(_('Could not create OpenID form: %s'), $form_html->message)); + common_server_error(sprintf(_m('Could not create OpenID form: %s'), $form_html->message)); } else { $action = new AutosubmitAction(); // see below $action->form_html = $form_html; @@ -211,7 +211,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false) function _oid_print_instructions() { common_element('div', 'instructions', - _('This form should automatically submit itself. '. + _m('This form should automatically submit itself. '. 'If not, click the submit button to go to your '. 'OpenID provider.')); } @@ -243,7 +243,7 @@ function oid_update_user(&$user, &$sreg) # XXX save timezone if it's passed if (!$profile->update($orig_profile)) { - common_server_error(_('Error saving the profile.')); + common_server_error(_m('Error saving the profile.')); return false; } @@ -254,7 +254,7 @@ function oid_update_user(&$user, &$sreg) } if (!$user->update($orig_user)) { - common_server_error(_('Error saving the user.')); + common_server_error(_m('Error saving the user.')); return false; } @@ -274,7 +274,7 @@ class AutosubmitAction extends Action function title() { - return _('OpenID Auto-Submit'); + return _m('OpenID Auto-Submit'); } function showContent() diff --git a/plugins/OpenID/openidlogin.php b/plugins/OpenID/openidlogin.php index 29e89234e..9ba55911c 100644 --- a/plugins/OpenID/openidlogin.php +++ b/plugins/OpenID/openidlogin.php @@ -27,14 +27,14 @@ class OpenidloginAction extends Action { parent::handle($args); if (common_is_real_login()) { - $this->clientError(_('Already logged in.')); + $this->clientError(_m('Already logged in.')); } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { $openid_url = $this->trimmed('openid_url'); # CSRF protection $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { - $this->showForm(_('There was a problem with your session token. Try again, please.'), $openid_url); + $this->showForm(_m('There was a problem with your session token. Try again, please.'), $openid_url); return; } @@ -63,11 +63,11 @@ class OpenidloginAction extends Action common_get_returnto()) { // rememberme logins have to reauthenticate before // changing any profile settings (cookie-stealing protection) - return _('For security reasons, please re-login with your ' . + return _m('For security reasons, please re-login with your ' . '[OpenID](%%doc.openid%%) ' . 'before changing your settings.'); } else { - return _('Login with an [OpenID](%%doc.openid%%) account.'); + return _m('Login with an [OpenID](%%doc.openid%%) account.'); } } @@ -92,7 +92,7 @@ class OpenidloginAction extends Action function title() { - return _('OpenID Login'); + return _m('OpenID Login'); } function showForm($error=null, $openid_url) @@ -109,22 +109,22 @@ class OpenidloginAction extends Action 'class' => 'form_settings', 'action' => $formaction)); $this->elementStart('fieldset'); - $this->element('legend', null, _('OpenID login')); + $this->element('legend', null, _m('OpenID login')); $this->hidden('token', common_session_token()); $this->elementStart('ul', 'form_data'); $this->elementStart('li'); - $this->input('openid_url', _('OpenID URL'), + $this->input('openid_url', _m('OpenID URL'), $this->openid_url, - _('Your OpenID URL')); + _m('Your OpenID URL')); $this->elementEnd('li'); $this->elementStart('li', array('id' => 'settings_rememberme')); - $this->checkbox('rememberme', _('Remember me'), false, - _('Automatically login in the future; ' . + $this->checkbox('rememberme', _m('Remember me'), false, + _m('Automatically login in the future; ' . 'not for shared computers!')); $this->elementEnd('li'); $this->elementEnd('ul'); - $this->submit('submit', _('Login')); + $this->submit('submit', _m('Login')); $this->elementEnd('fieldset'); $this->elementEnd('form'); } diff --git a/plugins/OpenID/openidserver.php b/plugins/OpenID/openidserver.php index dab97c93e..181cbdf45 100644 --- a/plugins/OpenID/openidserver.php +++ b/plugins/OpenID/openidserver.php @@ -103,7 +103,7 @@ class OpenidserverAction extends Action $response = $this->generateDenyResponse($request); } else { //invalid - $this->clientError(sprintf(_('You are not authorized to use the identity %s'),$request->identity),$code=403); + $this->clientError(sprintf(_m('You are not authorized to use the identity %s'),$request->identity),$code=403); } } else { $response = $this->oserver->handleRequest($request); @@ -123,7 +123,7 @@ class OpenidserverAction extends Action } $this->raw($response->body); }else{ - $this->clientError(_('Just an OpenID provider. Nothing to see here, move along...'),$code=500); + $this->clientError(_m('Just an OpenID provider. Nothing to see here, move along...'),$code=500); } } diff --git a/plugins/OpenID/openidsettings.php b/plugins/OpenID/openidsettings.php index 3ad46f5f5..3fc3d6128 100644 --- a/plugins/OpenID/openidsettings.php +++ b/plugins/OpenID/openidsettings.php @@ -56,7 +56,7 @@ class OpenidsettingsAction extends AccountSettingsAction function title() { - return _('OpenID settings'); + return _m('OpenID settings'); } /** @@ -67,7 +67,7 @@ class OpenidsettingsAction extends AccountSettingsAction function getInstructions() { - return _('[OpenID](%%doc.openid%%) lets you log into many sites' . + return _m('[OpenID](%%doc.openid%%) lets you log into many sites' . ' with the same user account.'. ' Manage your associated OpenIDs from here.'); } @@ -96,15 +96,15 @@ class OpenidsettingsAction extends AccountSettingsAction 'action' => common_local_url('openidsettings'))); $this->elementStart('fieldset', array('id' => 'settings_openid_add')); - $this->element('legend', null, _('Add OpenID')); + $this->element('legend', null, _m('Add OpenID')); $this->hidden('token', common_session_token()); $this->element('p', 'form_guide', - _('If you want to add an OpenID to your account, ' . + _m('If you want to add an OpenID to your account, ' . 'enter it in the box below and click "Add".')); $this->elementStart('ul', 'form_data'); $this->elementStart('li'); $this->element('label', array('for' => 'openid_url'), - _('OpenID URL')); + _m('OpenID URL')); $this->element('input', array('name' => 'openid_url', 'type' => 'text', 'id' => 'openid_url')); @@ -114,7 +114,7 @@ class OpenidsettingsAction extends AccountSettingsAction 'id' => 'settings_openid_add_action-submit', 'name' => 'add', 'class' => 'submit', - 'value' => _('Add'))); + 'value' => _m('Add'))); $this->elementEnd('fieldset'); $this->elementEnd('form'); @@ -126,12 +126,12 @@ class OpenidsettingsAction extends AccountSettingsAction if ($cnt > 0) { - $this->element('h2', null, _('Remove OpenID')); + $this->element('h2', null, _m('Remove OpenID')); if ($cnt == 1 && !$user->password) { $this->element('p', 'form_guide', - _('Removing your only OpenID '. + _m('Removing your only OpenID '. 'would make it impossible to log in! ' . 'If you need to remove it, '. 'add another OpenID first.')); @@ -146,7 +146,7 @@ class OpenidsettingsAction extends AccountSettingsAction } else { $this->element('p', 'form_guide', - _('You can remove an OpenID from your account '. + _m('You can remove an OpenID from your account '. 'by clicking the button marked "Remove".')); $idx = 0; @@ -169,7 +169,7 @@ class OpenidsettingsAction extends AccountSettingsAction 'id' => 'remove'.$idx, 'name' => 'remove', 'class' => 'submit remove', - 'value' => _('Remove'))); + 'value' => _m('Remove'))); $this->elementEnd('fieldset'); $this->elementEnd('form'); $idx++; @@ -191,7 +191,7 @@ class OpenidsettingsAction extends AccountSettingsAction // CSRF protection $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { - $this->showForm(_('There was a problem with your session token. '. + $this->showForm(_m('There was a problem with your session token. '. 'Try again, please.')); return; } @@ -205,7 +205,7 @@ class OpenidsettingsAction extends AccountSettingsAction } else if ($this->arg('remove')) { $this->removeOpenid(); } else { - $this->showForm(_('Something weird happened.')); + $this->showForm(_m('Something weird happened.')); } } @@ -225,16 +225,16 @@ class OpenidsettingsAction extends AccountSettingsAction $oid = User_openid::staticGet('canonical', $openid_url); if (!$oid) { - $this->showForm(_('No such OpenID.')); + $this->showForm(_m('No such OpenID.')); return; } $cur = common_current_user(); if (!$cur || $oid->user_id != $cur->id) { - $this->showForm(_('That OpenID does not belong to you.')); + $this->showForm(_m('That OpenID does not belong to you.')); return; } $oid->delete(); - $this->showForm(_('OpenID removed.'), true); + $this->showForm(_m('OpenID removed.'), true); return; } } diff --git a/plugins/OpenID/openidtrust.php b/plugins/OpenID/openidtrust.php index 29c7bdc23..fa7ea36e2 100644 --- a/plugins/OpenID/openidtrust.php +++ b/plugins/OpenID/openidtrust.php @@ -48,7 +48,7 @@ class OpenidtrustAction extends Action function title() { - return _('OpenID Identity Verification'); + return _m('OpenID Identity Verification'); } function prepare($args) @@ -66,7 +66,7 @@ class OpenidtrustAction extends Action $this->allowUrl = $_SESSION['openid_allow_url']; $this->denyUrl = $_SESSION['openid_deny_url']; if(empty($this->trust_root) || empty($this->allowUrl) || empty($this->denyUrl)){ - $this->clientError(_('This page should only be reached during OpenID processing, not directly.')); + $this->clientError(_m('This page should only be reached during OpenID processing, not directly.')); return; } return true; @@ -115,7 +115,7 @@ class OpenidtrustAction extends Action function showPageNotice() { - $this->element('p',null,sprintf(_('%s has asked to verify your identity. Click Continue to verify your identity and login without creating a new password.'),$this->trust_root)); + $this->element('p',null,sprintf(_m('%s has asked to verify your identity. Click Continue to verify your identity and login without creating a new password.'),$this->trust_root)); } /** @@ -133,8 +133,8 @@ class OpenidtrustAction extends Action 'class' => 'form_settings', 'action' => common_local_url('openidtrust'))); $this->elementStart('fieldset'); - $this->submit('allow', _('Continue')); - $this->submit('deny', _('Cancel')); + $this->submit('allow', _m('Continue')); + $this->submit('deny', _m('Cancel')); $this->elementEnd('fieldset'); $this->elementEnd('form'); diff --git a/plugins/Sample/SamplePlugin.php b/plugins/Sample/SamplePlugin.php new file mode 100644 index 000000000..6e361aafb --- /dev/null +++ b/plugins/Sample/SamplePlugin.php @@ -0,0 +1,59 @@ +. + */ + +/** + * @package SamplePlugin + * @maintainer Your Name + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +class SamplePlugin extends Plugin +{ + function onInitializePlugin() + { + // Event handlers normally return true to indicate that all is well. + // + // Returning false will cancel further processing of any other + // plugins or core code hooking the same event. + return true; + } + + /** + * Hook for RouterInitialized event. + * + * @param Net_URL_Mapper $m path-to-action mapper + * @return boolean hook return + */ + + function onRouterInitialized($m) + { + $m->connect(':nickname/samples', + array('action' => 'showsamples'), + array('feed' => '[A-Za-z0-9_-]+')); + $m->connect('settings/sample', + array('action' => 'samplesettings')); + return true; + } +} + diff --git a/plugins/TwitterBridge/TwitterBridgePlugin.php b/plugins/TwitterBridge/TwitterBridgePlugin.php index adf9ceda3..de1181903 100644 --- a/plugins/TwitterBridge/TwitterBridgePlugin.php +++ b/plugins/TwitterBridge/TwitterBridgePlugin.php @@ -86,8 +86,8 @@ class TwitterBridgePlugin extends Plugin $action_name = $action->trimmed('action'); $action->menuItem(common_local_url('twittersettings'), - _('Twitter'), - _('Twitter integration options'), + _m('Twitter'), + _m('Twitter integration options'), $action_name === 'twittersettings'); return true; diff --git a/plugins/TwitterBridge/locale/TwitterBridge.po b/plugins/TwitterBridge/locale/TwitterBridge.po new file mode 100644 index 000000000..14c30f1c9 --- /dev/null +++ b/plugins/TwitterBridge/locale/TwitterBridge.po @@ -0,0 +1,128 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-07 20:38-0800\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" + +#: twitterauthorization.php:81 +msgid "Not logged in." +msgstr "" + +#: twitterauthorization.php:131 twitterauthorization.php:150 +#: twitterauthorization.php:170 twitterauthorization.php:217 +msgid "Couldn't link your Twitter account." +msgstr "" + +#: TwitterBridgePlugin.php:89 +msgid "Twitter" +msgstr "" + +#: TwitterBridgePlugin.php:90 +msgid "Twitter integration options" +msgstr "" + +#: twittersettings.php:59 +msgid "Twitter settings" +msgstr "" + +#: twittersettings.php:70 +msgid "" +"Connect your Twitter account to share your updates with your Twitter friends " +"and vice-versa." +msgstr "" + +#: twittersettings.php:118 +msgid "Twitter account" +msgstr "" + +#: twittersettings.php:123 +msgid "Connected Twitter account" +msgstr "" + +#: twittersettings.php:125 +msgid "Remove" +msgstr "" + +#: twittersettings.php:131 +msgid "Preferences" +msgstr "" + +#: twittersettings.php:135 +msgid "Automatically send my notices to Twitter." +msgstr "" + +#: twittersettings.php:142 +msgid "Send local \"@\" replies to Twitter." +msgstr "" + +#: twittersettings.php:149 +msgid "Subscribe to my Twitter friends here." +msgstr "" + +#: twittersettings.php:158 +msgid "Import my Friends Timeline." +msgstr "" + +#: twittersettings.php:174 +msgid "Save" +msgstr "" + +#: twittersettings.php:176 +msgid "Add" +msgstr "" + +#: twittersettings.php:201 +msgid "There was a problem with your session token. Try again, please." +msgstr "" + +#: twittersettings.php:211 +msgid "Unexpected form submission." +msgstr "" + +#: twittersettings.php:230 +msgid "Couldn't remove Twitter user." +msgstr "" + +#: twittersettings.php:234 +msgid "Twitter account removed." +msgstr "" + +#: twittersettings.php:255 twittersettings.php:265 +msgid "Couldn't save Twitter preferences." +msgstr "" + +#: twittersettings.php:269 +msgid "Twitter preferences saved." +msgstr "" + +#: twitter.php:333 +msgid "Your Twitter bridge has been disabled." +msgstr "" + +#: twitter.php:337 +#, php-format +msgid "" +"Hi, %1$s. We're sorry to inform you that your link to Twitter has been " +"disabled. We no longer seem to have permission to update your Twitter " +"status. (Did you revoke %3$s's access?)\n" +"\n" +"You can re-enable your Twitter bridge by visiting your Twitter settings " +"page:\n" +"\n" +"\t%2$s\n" +"\n" +"Regards,\n" +"%3$s\n" +msgstr "" diff --git a/plugins/TwitterBridge/twitter.php b/plugins/TwitterBridge/twitter.php index fd5150638..b338a200d 100644 --- a/plugins/TwitterBridge/twitter.php +++ b/plugins/TwitterBridge/twitter.php @@ -330,11 +330,11 @@ function mail_twitter_bridge_removed($user) $profile = $user->getProfile(); - $subject = sprintf(_('Your Twitter bridge has been disabled.')); + $subject = sprintf(_m('Your Twitter bridge has been disabled.')); $site_name = common_config('site', 'name'); - $body = sprintf(_('Hi, %1$s. We\'re sorry to inform you that your ' . + $body = sprintf(_m('Hi, %1$s. We\'re sorry to inform you that your ' . 'link to Twitter has been disabled. We no longer seem to have ' . 'permission to update your Twitter status. (Did you revoke ' . '%3$s\'s access?)' . "\n\n" . diff --git a/plugins/TwitterBridge/twitterauthorization.php b/plugins/TwitterBridge/twitterauthorization.php index f1daefab1..4af2f0394 100644 --- a/plugins/TwitterBridge/twitterauthorization.php +++ b/plugins/TwitterBridge/twitterauthorization.php @@ -78,7 +78,7 @@ class TwitterauthorizationAction extends Action parent::handle($args); if (!common_logged_in()) { - $this->clientError(_('Not logged in.'), 403); + $this->clientError(_m('Not logged in.'), 403); } $user = common_current_user(); @@ -128,7 +128,7 @@ class TwitterauthorizationAction extends Action } catch (OAuthClientException $e) { $msg = sprintf('OAuth client cURL error - code: %1s, msg: %2s', $e->getCode(), $e->getMessage()); - $this->serverError(_('Couldn\'t link your Twitter account.')); + $this->serverError(_m('Couldn\'t link your Twitter account.')); } common_redirect($auth_link); @@ -147,7 +147,7 @@ class TwitterauthorizationAction extends Action // token we sent them if ($_SESSION['twitter_request_token'] != $this->oauth_token) { - $this->serverError(_('Couldn\'t link your Twitter account.')); + $this->serverError(_m('Couldn\'t link your Twitter account.')); } try { @@ -167,7 +167,7 @@ class TwitterauthorizationAction extends Action } catch (OAuthClientException $e) { $msg = sprintf('OAuth client cURL error - code: %1$s, msg: %2$s', $e->getCode(), $e->getMessage()); - $this->serverError(_('Couldn\'t link your Twitter account.')); + $this->serverError(_m('Couldn\'t link your Twitter account.')); } // Save the access token and Twitter user info @@ -214,7 +214,7 @@ class TwitterauthorizationAction extends Action if (empty($flink_id)) { common_log_db_error($flink, 'INSERT', __FILE__); - $this->serverError(_('Couldn\'t link your Twitter account.')); + $this->serverError(_m('Couldn\'t link your Twitter account.')); } save_twitter_user($twitter_user->id, $twitter_user->screen_name); diff --git a/plugins/TwitterBridge/twittersettings.php b/plugins/TwitterBridge/twittersettings.php index ca22c9553..bc9a636a1 100644 --- a/plugins/TwitterBridge/twittersettings.php +++ b/plugins/TwitterBridge/twittersettings.php @@ -56,7 +56,7 @@ class TwittersettingsAction extends ConnectSettingsAction function title() { - return _('Twitter settings'); + return _m('Twitter settings'); } /** @@ -67,8 +67,8 @@ class TwittersettingsAction extends ConnectSettingsAction function getInstructions() { - return _('Connect your Twitter account to share your updates ' . - 'with your Twitter friends and vice-versa.'); + return _m('Connect your Twitter account to share your updates ' . + 'with your Twitter friends and vice-versa.'); } /** @@ -115,38 +115,38 @@ class TwittersettingsAction extends ConnectSettingsAction $this->elementEnd('fieldset'); } else { - $this->element('legend', null, _('Twitter account')); + $this->element('legend', null, _m('Twitter account')); $this->elementStart('p', array('id' => 'form_confirmed')); $this->element('a', array('href' => $fuser->uri), $fuser->nickname); $this->elementEnd('p'); $this->element('p', 'form_note', - _('Connected Twitter account')); + _m('Connected Twitter account')); - $this->submit('remove', _('Remove')); + $this->submit('remove', _m('Remove')); $this->elementEnd('fieldset'); $this->elementStart('fieldset', array('id' => 'settings_twitter_preferences')); - $this->element('legend', null, _('Preferences')); + $this->element('legend', null, _m('Preferences')); $this->elementStart('ul', 'form_data'); $this->elementStart('li'); $this->checkbox('noticesend', - _('Automatically send my notices to Twitter.'), + _m('Automatically send my notices to Twitter.'), ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND) : true); $this->elementEnd('li'); $this->elementStart('li'); $this->checkbox('replysync', - _('Send local "@" replies to Twitter.'), + _m('Send local "@" replies to Twitter.'), ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true); $this->elementEnd('li'); $this->elementStart('li'); $this->checkbox('friendsync', - _('Subscribe to my Twitter friends here.'), + _m('Subscribe to my Twitter friends here.'), ($flink) ? ($flink->friendsync & FOREIGN_FRIEND_RECV) : false); @@ -155,7 +155,7 @@ class TwittersettingsAction extends ConnectSettingsAction if (common_config('twitterimport','enabled')) { $this->elementStart('li'); $this->checkbox('noticerecv', - _('Import my Friends Timeline.'), + _m('Import my Friends Timeline.'), ($flink) ? ($flink->noticesync & FOREIGN_NOTICE_RECV) : false); @@ -171,9 +171,9 @@ class TwittersettingsAction extends ConnectSettingsAction $this->elementEnd('ul'); if ($flink) { - $this->submit('save', _('Save')); + $this->submit('save', _m('Save')); } else { - $this->submit('add', _('Add')); + $this->submit('add', _m('Add')); } $this->elementEnd('fieldset'); @@ -198,8 +198,8 @@ class TwittersettingsAction extends ConnectSettingsAction // CSRF protection $token = $this->trimmed('token'); if (!$token || $token != common_session_token()) { - $this->showForm(_('There was a problem with your session token. '. - 'Try again, please.')); + $this->showForm(_m('There was a problem with your session token. '. + 'Try again, please.')); return; } @@ -208,7 +208,7 @@ class TwittersettingsAction extends ConnectSettingsAction } else if ($this->arg('remove')) { $this->removeTwitterAccount(); } else { - $this->showForm(_('Unexpected form submission.')); + $this->showForm(_m('Unexpected form submission.')); } } @@ -227,11 +227,11 @@ class TwittersettingsAction extends ConnectSettingsAction if (empty($result)) { common_log_db_error($flink, 'DELETE', __FILE__); - $this->serverError(_('Couldn\'t remove Twitter user.')); + $this->serverError(_m('Couldn\'t remove Twitter user.')); return; } - $this->showForm(_('Twitter account removed.'), true); + $this->showForm(_m('Twitter account removed.'), true); } /** @@ -252,7 +252,7 @@ class TwittersettingsAction extends ConnectSettingsAction if (empty($flink)) { common_log_db_error($flink, 'SELECT', __FILE__); - $this->showForm(_('Couldn\'t save Twitter preferences.')); + $this->showForm(_m('Couldn\'t save Twitter preferences.')); return; } @@ -262,11 +262,11 @@ class TwittersettingsAction extends ConnectSettingsAction if ($result === false) { common_log_db_error($flink, 'UPDATE', __FILE__); - $this->showForm(_('Couldn\'t save Twitter preferences.')); + $this->showForm(_m('Couldn\'t save Twitter preferences.')); return; } - $this->showForm(_('Twitter preferences saved.'), true); + $this->showForm(_m('Twitter preferences saved.'), true); } } diff --git a/scripts/update_po_templates.php b/scripts/update_po_templates.php new file mode 100755 index 000000000..83bff6d80 --- /dev/null +++ b/scripts/update_po_templates.php @@ -0,0 +1,211 @@ +#!/usr/bin/env php +. + */ + +// Abort if called from a web server +if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) { + print "This script must be run from the command line\n"; + exit(); +} + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); + +function update_core($dir, $domain) +{ + $old = getcwd(); + chdir($dir); + passthru(<<isDir() && !$item->isDot()) { + $name = $item->getBasename(); + if (file_exists("$dir/plugins/$name/{$name}Plugin.php")) { + $plugins[] = $name; + } + } + } + return $plugins; +} + +function get_plugin_sources($dir) +{ + $files = array(); + + $dirs = new RecursiveDirectoryIterator($dir); + $iter = new RecursiveIteratorIterator($dirs); + foreach ($iter as $pathname => $item) { + if ($item->isFile() && preg_match('/\.php$/', $item->getBaseName())) { + $files[] = $pathname; + } + } + return $files; +} + +function plugin_using_gettext($dir) +{ + $files = get_plugin_sources($dir); + foreach ($files as $pathname) { + // Check if the file is using our _m gettext wrapper + $code = file_get_contents($pathname); + if (preg_match('/\b_m\(/', $code)) { + return true; + } + } + + return false; +} + +function update_plugin($basedir, $name) +{ + $dir = "$basedir/plugins/$name"; + if (plugin_using_gettext($dir)) { + do_update_plugin($dir, $name); + do_translatewiki_plugin($basedir, $name); + return true; + } else { + return false; + } +} + +$args = $_SERVER['argv']; +array_shift($args); + +$all = false; +$core = false; +$allplugins = false; +$plugins = array(); +if (count($args) == 0) { + $all = true; +} +foreach ($args as $arg) { + if ($arg == '--all') { + $all = true; + } elseif ($arg == "--core") { + $core = true; + } elseif ($arg == "--plugins") { + $allplugins = true; + } elseif (substr($arg, 0, 9) == "--plugin=") { + $plugins[] = substr($arg, 9); + } +} + + + +if ($all || $core) { + echo "core..."; + update_core(INSTALLDIR, 'statusnet'); + echo " ok\n"; +} +if ($all || $allplugins) { + $plugins = get_plugins(INSTALLDIR); +} +if ($plugins) { + foreach ($plugins as $plugin) { + echo "$plugin..."; + if (update_plugin(INSTALLDIR, $plugin)) { + echo " ok\n"; + } else { + echo " not localized\n"; + } + } +} + diff --git a/scripts/update_pot.sh b/scripts/update_pot.sh deleted file mode 100755 index de53fe7c9..000000000 --- a/scripts/update_pot.sh +++ /dev/null @@ -1,13 +0,0 @@ -cd `dirname $0` -cd .. -xgettext \ - --from-code=UTF-8 \ - --default-domain=statusnet \ - --output=locale/statusnet.po \ - --language=PHP \ - --keyword="pgettext:1c,2" \ - --keyword="npgettext:1c,2,3" \ - actions/*.php \ - classes/*.php \ - lib/*.php \ - scripts/*.php -- cgit v1.2.3-54-g00ecf From 48a93810abe5fd5098ef4f91e2b9d5991e217748 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 8 Dec 2009 17:20:45 -0500 Subject: action to forward a notice --- actions/forward.php | 117 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/router.php | 2 +- 2 files changed, 118 insertions(+), 1 deletion(-) create mode 100644 actions/forward.php (limited to 'lib') diff --git a/actions/forward.php b/actions/forward.php new file mode 100644 index 000000000..87365c2d3 --- /dev/null +++ b/actions/forward.php @@ -0,0 +1,117 @@ + + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + * + * StatusNet - the distributed open-source microblogging tool + * Copyright (C) 2008, 2009, StatusNet, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Forward action + * + * @category Action + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + */ + +class ForwardAction extends Action +{ + var $user = null; + var $notice = null; + + function prepare($args) + { + parent::prepare($args); + + $this->user = common_current_user(); + + if (empty($this->user)) { + $this->clientError(_("Only logged-in users can forward notices.")); + return false; + } + + $id = $this->trimmed('notice'); + + if (empty($id)) { + $this->clientError(_("No notice specified.")); + return false; + } + + $this->notice = Notice::staticGet('id', $id); + + if (empty($this->notice)) { + $this->clientError(_("No notice specified.")); + return false; + } + + $token = $this->trimmed('token'); + + if (empty($token) || $token != common_session_token()) { + $this->clientError(_("There was a problem with your session token. Try again, please.")); + return false; + } + + $profile = $this->user->getProfile(); + + if ($profile->hasForwarded($id)) { + $this->clientError(_("You already forwarded that notice.")); + return false; + } + + return true; + } + + /** + * Class handler. + * + * @param array $args query arguments + * + * @return void + */ + + function handle($args) + { + $forward = Forward::saveNew($this->user->id, $this->notice->id); + + if ($this->boolean('ajax')) { + $this->startHTML('text/xml;charset=utf-8'); + $this->elementStart('head'); + $this->element('title', null, _('Forwarded')); + $this->elementEnd('head'); + $this->elementStart('body'); + $this->element('p', array('id' => 'forward_response'), _('Forwarded!')); + $this->elementEnd('body'); + $this->elementEnd('html'); + } else { + // FIXME! + } + } +} diff --git a/lib/router.php b/lib/router.php index 37525319f..398135a3e 100644 --- a/lib/router.php +++ b/lib/router.php @@ -99,7 +99,7 @@ class Router 'groupblock', 'groupunblock', 'sandbox', 'unsandbox', 'silence', 'unsilence', - 'deleteuser'); + 'deleteuser', 'forward'); foreach ($main as $a) { $m->connect('main/'.$a, array('action' => $a)); -- cgit v1.2.3-54-g00ecf From 41cbb90faeabc0a6002b41d40d392f45a59a7aba Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 8 Dec 2009 17:31:23 -0500 Subject: add (ugly) form to forward notices --- actions/forward.php | 2 +- js/util.js | 10 ++-- lib/forwardform.php | 147 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/noticelist.php | 21 ++++++++ 4 files changed, 176 insertions(+), 4 deletions(-) create mode 100644 lib/forwardform.php (limited to 'lib') diff --git a/actions/forward.php b/actions/forward.php index 87365c2d3..867ed97d2 100644 --- a/actions/forward.php +++ b/actions/forward.php @@ -72,7 +72,7 @@ class ForwardAction extends Action return false; } - $token = $this->trimmed('token'); + $token = $this->trimmed('token-'.$id); if (empty($token) || $token != common_session_token()) { $this->clientError(_("There was a problem with your session token. Try again, please.")); diff --git a/js/util.js b/js/util.js index ed6a781f7..67df73507 100644 --- a/js/util.js +++ b/js/util.js @@ -208,7 +208,7 @@ var SN = { // StatusNet $('#'+form_id+' .form_response').remove(); var result; if ($('#'+SN.C.S.Error, data).length > 0) { - result = document._importNode($('p', data)[0], true); + result = document._importNode($('p', data)[0], true); result = result.textContent || result.innerHTML; form.append('

'+result+'

'); } @@ -306,8 +306,12 @@ var SN = { // StatusNet $('.form_disfavor').each(function() { SN.U.FormXHR($(this)); }); }, + NoticeForward: function() { + $('.form_forward').each(function() { SN.U.FormXHR($(this)); }); + }, + NoticeAttachments: function() { - $('.notice a.attachment').each(function() { + $('.notice a.attachment').each(function() { SN.U.NoticeWithAttachment($(this).closest('.notice')); }); }, @@ -439,7 +443,7 @@ var SN = { // StatusNet Notices: function() { if ($('body.user_in').length > 0) { SN.U.NoticeFavor(); - + SN.U.NoticeForward(); SN.U.NoticeReply(); } diff --git a/lib/forwardform.php b/lib/forwardform.php new file mode 100644 index 000000000..2052856ae --- /dev/null +++ b/lib/forwardform.php @@ -0,0 +1,147 @@ +. + * + * @category Form + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/form.php'; + +/** + * Form for forwarding a notice + * + * @category Form + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ForwardForm extends Form +{ + /** + * Notice to forward + */ + + var $notice = null; + + /** + * Constructor + * + * @param HTMLOutputter $out output channel + * @param Notice $notice notice to forward + */ + + function __construct($out=null, $notice=null) + { + parent::__construct($out); + + $this->notice = $notice; + } + + /** + * ID of the form + * + * @return int ID of the form + */ + + function id() + { + return 'forward-' . $this->notice->id; + } + + /** + * Action of the form + * + * @return string URL of the action + */ + + function action() + { + return common_local_url('forward'); + } + + /** + * Include a session token for CSRF protection + * + * @return void + */ + + function sessionToken() + { + $this->out->hidden('token-' . $this->notice->id, + common_session_token()); + } + + /** + * Legend of the Form + * + * @return void + */ + function formLegend() + { + $this->out->element('legend', null, _('Forward this notice')); + } + + /** + * Data elements + * + * @return void + */ + + function formData() + { + $this->out->hidden('notice-n'.$this->notice->id, + $this->notice->id, + 'notice'); + } + + /** + * Action elements + * + * @return void + */ + + function formActions() + { + $this->out->submit('forward-submit-' . $this->notice->id, + _('Forward'), 'submit', null, _('Forward this notice')); + } + + /** + * Class of the form. + * + * @return string the form's class + */ + + function formClass() + { + return 'form_forward'; + } +} diff --git a/lib/noticelist.php b/lib/noticelist.php index 21cec528f..b38860880 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -212,6 +212,7 @@ class NoticeListItem extends Widget $this->out->elementStart('div', 'notice-options'); $this->showFaveForm(); $this->showReplyLink(); + $this->showForwardForm(); $this->showDeleteLink(); $this->out->elementEnd('div'); } @@ -530,6 +531,26 @@ class NoticeListItem extends Widget } } + /** + * show the form to forward a notice + * + * @return void + */ + + function showForwardForm() + { + $user = common_current_user(); + if ($user) { + $profile = $user->getProfile(); + if ($profile->hasForwarded($this->notice->id)) { + $this->out->text(_('Forwarded')); + } else { + $ff = new ForwardForm($this->out, $this->notice); + $ff->show(); + } + } + } + /** * if the user is the author, let them delete the notice * -- cgit v1.2.3-54-g00ecf From 21757186e9a7ffd2e3330fd4ef61ffeb2dc0229b Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 8 Dec 2009 17:52:20 -0500 Subject: don't allow forwarding your own notice --- actions/forward.php | 5 +++++ lib/noticelist.php | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/actions/forward.php b/actions/forward.php index 867ed97d2..194833fe0 100644 --- a/actions/forward.php +++ b/actions/forward.php @@ -72,6 +72,11 @@ class ForwardAction extends Action return false; } + if ($this->user->id == $this->notice->profile_id) { + $this->clientError(_("You can't forward your own notice.")); + return false; + } + $token = $this->trimmed('token-'.$id); if (empty($token) || $token != common_session_token()) { diff --git a/lib/noticelist.php b/lib/noticelist.php index b38860880..d6ffc9ca9 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -540,7 +540,7 @@ class NoticeListItem extends Widget function showForwardForm() { $user = common_current_user(); - if ($user) { + if ($user && $user->id != $this->notice->profile_id) { $profile = $user->getProfile(); if ($profile->hasForwarded($this->notice->id)) { $this->out->text(_('Forwarded')); -- cgit v1.2.3-54-g00ecf From 2f59f0ddb5cc6030671af7e751e0ae85e4751497 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 8 Dec 2009 17:35:27 -0800 Subject: Compat fix for PHP 5.2.4 -- drop unneeded new param to debug_backtrace(), caused error spew on older PHP (introduced PHP 5.2.5) Fix for regression in 4b5e977a7b1c390555d880d3dc7f8b8c6744646c --- lib/language.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/language.php b/lib/language.php index ab46f1a65..916cee7ed 100644 --- a/lib/language.php +++ b/lib/language.php @@ -153,7 +153,7 @@ if (!function_exists('npgettext')) { */ function _m($msg/*, ...*/) { - $domain = _mdomain(debug_backtrace(false)); + $domain = _mdomain(debug_backtrace()); $args = func_get_args(); switch(count($args)) { case 1: return dgettext($domain, $msg); -- cgit v1.2.3-54-g00ecf From 1e166e1bc4a8b16ad2ef8e99db6a112f47803eda Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Thu, 10 Dec 2009 14:16:07 +0100 Subject: Updated FormNoticeEnhancements and Counter to use the max text value from HTML. It also allows each .form_notice to have its own counter. --- js/util.js | 38 ++++++++++++++++++++++---------------- lib/messageform.php | 2 -- lib/noticeform.php | 2 -- 3 files changed, 22 insertions(+), 20 deletions(-) (limited to 'lib') diff --git a/js/util.js b/js/util.js index 67df73507..60865d352 100644 --- a/js/util.js +++ b/js/util.js @@ -57,21 +57,28 @@ var SN = { // StatusNet U: { // Utils FormNoticeEnhancements: function(form) { form_id = form.attr('id'); - $('#'+form_id+' #'+SN.C.S.NoticeDataText).unbind('keyup'); - $('#'+form_id+' #'+SN.C.S.NoticeDataText).unbind('keydown'); - if (maxLength > 0) { - $('#'+form_id+' #'+SN.C.S.NoticeDataText).bind('keyup', function(e) { + + if (jQuery.data(form[0], 'ElementData') === undefined) { + MaxLength = $('#'+form_id+' #'+SN.C.S.NoticeTextCount).text(); + if (typeof(MaxLength) == 'undefined') { + MaxLength = SN.C.I.MaxLength; + } + jQuery.data(form[0], 'ElementData', {MaxLength:MaxLength}); + + SN.U.Counter(form); + + NDT = $('#'+form_id+' #'+SN.C.S.NoticeDataText); + + NDT.bind('keyup', function(e) { SN.U.Counter(form); }); - // run once in case there's something in there - SN.U.Counter(form); - } - $('#'+form_id+' #'+SN.C.S.NoticeDataText).bind('keydown', function(e) { - SN.U.SubmitOnReturn(e, form); - }); + NDT.bind('keydown', function(e) { + SN.U.SubmitOnReturn(e, form); + }); + } - if($('body')[0].id != 'conversation') { + if ($('body')[0].id != 'conversation') { $('#'+form_id+' textarea').focus(); } }, @@ -91,15 +98,14 @@ var SN = { // StatusNet Counter: function(form) { SN.C.I.FormNoticeCurrent = form; form_id = form.attr('id'); - if (typeof(maxLength) == "undefined") { - maxLength = SN.C.I.MaxLength; - } - if (maxLength <= 0) { + var MaxLength = jQuery.data(form[0], 'ElementData').MaxLength; + + if (MaxLength <= 0) { return; } - var remaining = maxLength - $('#'+form_id+' #'+SN.C.S.NoticeDataText).val().length; + var remaining = MaxLength - $('#'+form_id+' #'+SN.C.S.NoticeDataText).val().length; var counter = $('#'+form_id+' #'+SN.C.S.NoticeTextCount); if (remaining.toString() != counter.text()) { diff --git a/lib/messageform.php b/lib/messageform.php index 4df193c6d..0c568e1bd 100644 --- a/lib/messageform.php +++ b/lib/messageform.php @@ -154,8 +154,6 @@ class MessageForm extends Form $contentLimit = Message::maxContent(); - $this->out->inlineScript('maxLength = ' . $contentLimit . ';'); - if ($contentLimit > 0) { $this->out->elementStart('dl', 'form_note'); $this->out->element('dt', null, _('Available characters')); diff --git a/lib/noticeform.php b/lib/noticeform.php index 0dd3f2d77..593a1e932 100644 --- a/lib/noticeform.php +++ b/lib/noticeform.php @@ -178,8 +178,6 @@ class NoticeForm extends Form $contentLimit = Notice::maxContent(); - $this->out->inlineScript('maxLength = ' . $contentLimit . ';'); - if ($contentLimit > 0) { $this->out->elementStart('dl', 'form_note'); $this->out->element('dt', null, _('Available characters')); -- cgit v1.2.3-54-g00ecf From b07e1143cc8f07bf0613835debe08be227970c73 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 10 Dec 2009 13:08:24 -0500 Subject: Override login_token's sequenceKey() so that it behaves correctly --- classes/Login_token.php | 13 +++++++++++++ lib/command.php | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/classes/Login_token.php b/classes/Login_token.php index c172b30ab..746cd7f22 100644 --- a/classes/Login_token.php +++ b/classes/Login_token.php @@ -39,4 +39,17 @@ class Login_token extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + /* + DB_DataObject calculates the sequence key(s) by taking the first key returned by the keys() function. + In this case, the keys() function returns user_id as the first key. user_id is not a sequence, but + DB_DataObject's sequenceKey() will incorrectly think it is. Then, since the sequenceKey() is a numeric + type, but is not set to autoincrement in the database, DB_DataObject will create a _seq table and + manage the sequence itself. This is not the correct behavior for the user_id in this class. + So we override that incorrect behavior, and simply say there is no sequence key. + */ + function sequenceKey() + { + return array(false,false); + } } diff --git a/lib/command.php b/lib/command.php index e2a665511..af8855a7f 100644 --- a/lib/command.php +++ b/lib/command.php @@ -584,7 +584,7 @@ class LoginCommand extends Command function execute($channel) { $disabled = common_config('logincommand','disabled'); - if(isset($disabled)) { + if(isset($disabled) && $disabled) { $channel->error($this->user, _('Login command is disabled')); return; } -- cgit v1.2.3-54-g00ecf From b36ec6da87056324ce0cdf98a4745cdc992c5d52 Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Thu, 10 Dec 2009 13:22:46 -0500 Subject: Fixed incorrect disabling of login_token. --- actions/login.php | 3 ++- lib/command.php | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/actions/login.php b/actions/login.php index a6f86c0ca..c775fa692 100644 --- a/actions/login.php +++ b/actions/login.php @@ -77,12 +77,13 @@ class LoginAction extends Action parent::handle($args); $disabled = common_config('logincommand','disabled'); + $disabled = isset($disabled) && $disabled; if (common_is_real_login()) { $this->clientError(_('Already logged in.')); } else if ($_SERVER['REQUEST_METHOD'] == 'POST') { $this->checkLogin(); - } else if (!isset($disabled) && isset($args['user_id']) && isset($args['token'])){ + } else if (!$disabled && isset($args['user_id']) && isset($args['token'])){ $this->checkLogin($args['user_id'],$args['token']); } else { common_ensure_session(); diff --git a/lib/command.php b/lib/command.php index af8855a7f..450db9da3 100644 --- a/lib/command.php +++ b/lib/command.php @@ -584,7 +584,8 @@ class LoginCommand extends Command function execute($channel) { $disabled = common_config('logincommand','disabled'); - if(isset($disabled) && $disabled) { + $disabled = isset($disabled) && $disabled; + if($disabled) { $channel->error($this->user, _('Login command is disabled')); return; } -- cgit v1.2.3-54-g00ecf From 37b0852fdb8b82741b327af57d898d4d89c2f177 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 10 Dec 2009 14:33:15 -0500 Subject: move forward form to plugin --- lib/forwardform.php | 147 ----------------------------------------- lib/noticelist.php | 21 ------ plugins/Repeat/forwardform.php | 147 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 147 insertions(+), 168 deletions(-) delete mode 100644 lib/forwardform.php create mode 100644 plugins/Repeat/forwardform.php (limited to 'lib') diff --git a/lib/forwardform.php b/lib/forwardform.php deleted file mode 100644 index 2052856ae..000000000 --- a/lib/forwardform.php +++ /dev/null @@ -1,147 +0,0 @@ -. - * - * @category Form - * @package StatusNet - * @author Evan Prodromou - * @copyright 2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once INSTALLDIR.'/lib/form.php'; - -/** - * Form for forwarding a notice - * - * @category Form - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -class ForwardForm extends Form -{ - /** - * Notice to forward - */ - - var $notice = null; - - /** - * Constructor - * - * @param HTMLOutputter $out output channel - * @param Notice $notice notice to forward - */ - - function __construct($out=null, $notice=null) - { - parent::__construct($out); - - $this->notice = $notice; - } - - /** - * ID of the form - * - * @return int ID of the form - */ - - function id() - { - return 'forward-' . $this->notice->id; - } - - /** - * Action of the form - * - * @return string URL of the action - */ - - function action() - { - return common_local_url('forward'); - } - - /** - * Include a session token for CSRF protection - * - * @return void - */ - - function sessionToken() - { - $this->out->hidden('token-' . $this->notice->id, - common_session_token()); - } - - /** - * Legend of the Form - * - * @return void - */ - function formLegend() - { - $this->out->element('legend', null, _('Forward this notice')); - } - - /** - * Data elements - * - * @return void - */ - - function formData() - { - $this->out->hidden('notice-n'.$this->notice->id, - $this->notice->id, - 'notice'); - } - - /** - * Action elements - * - * @return void - */ - - function formActions() - { - $this->out->submit('forward-submit-' . $this->notice->id, - _('Forward'), 'submit', null, _('Forward this notice')); - } - - /** - * Class of the form. - * - * @return string the form's class - */ - - function formClass() - { - return 'form_forward'; - } -} diff --git a/lib/noticelist.php b/lib/noticelist.php index d6ffc9ca9..21cec528f 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -212,7 +212,6 @@ class NoticeListItem extends Widget $this->out->elementStart('div', 'notice-options'); $this->showFaveForm(); $this->showReplyLink(); - $this->showForwardForm(); $this->showDeleteLink(); $this->out->elementEnd('div'); } @@ -531,26 +530,6 @@ class NoticeListItem extends Widget } } - /** - * show the form to forward a notice - * - * @return void - */ - - function showForwardForm() - { - $user = common_current_user(); - if ($user && $user->id != $this->notice->profile_id) { - $profile = $user->getProfile(); - if ($profile->hasForwarded($this->notice->id)) { - $this->out->text(_('Forwarded')); - } else { - $ff = new ForwardForm($this->out, $this->notice); - $ff->show(); - } - } - } - /** * if the user is the author, let them delete the notice * diff --git a/plugins/Repeat/forwardform.php b/plugins/Repeat/forwardform.php new file mode 100644 index 000000000..2052856ae --- /dev/null +++ b/plugins/Repeat/forwardform.php @@ -0,0 +1,147 @@ +. + * + * @category Form + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/form.php'; + +/** + * Form for forwarding a notice + * + * @category Form + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ForwardForm extends Form +{ + /** + * Notice to forward + */ + + var $notice = null; + + /** + * Constructor + * + * @param HTMLOutputter $out output channel + * @param Notice $notice notice to forward + */ + + function __construct($out=null, $notice=null) + { + parent::__construct($out); + + $this->notice = $notice; + } + + /** + * ID of the form + * + * @return int ID of the form + */ + + function id() + { + return 'forward-' . $this->notice->id; + } + + /** + * Action of the form + * + * @return string URL of the action + */ + + function action() + { + return common_local_url('forward'); + } + + /** + * Include a session token for CSRF protection + * + * @return void + */ + + function sessionToken() + { + $this->out->hidden('token-' . $this->notice->id, + common_session_token()); + } + + /** + * Legend of the Form + * + * @return void + */ + function formLegend() + { + $this->out->element('legend', null, _('Forward this notice')); + } + + /** + * Data elements + * + * @return void + */ + + function formData() + { + $this->out->hidden('notice-n'.$this->notice->id, + $this->notice->id, + 'notice'); + } + + /** + * Action elements + * + * @return void + */ + + function formActions() + { + $this->out->submit('forward-submit-' . $this->notice->id, + _('Forward'), 'submit', null, _('Forward this notice')); + } + + /** + * Class of the form. + * + * @return string the form's class + */ + + function formClass() + { + return 'form_forward'; + } +} -- cgit v1.2.3-54-g00ecf From eceb5e8a0fbf798e42fb9c1d0598d9dc0f4b7550 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Thu, 10 Dec 2009 14:42:13 -0500 Subject: remove forward action from router --- lib/router.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/router.php b/lib/router.php index 398135a3e..37525319f 100644 --- a/lib/router.php +++ b/lib/router.php @@ -99,7 +99,7 @@ class Router 'groupblock', 'groupunblock', 'sandbox', 'unsandbox', 'silence', 'unsilence', - 'deleteuser', 'forward'); + 'deleteuser'); foreach ($main as $a) { $m->connect('main/'.$a, array('action' => $a)); -- cgit v1.2.3-54-g00ecf From a5724cca4956e3fcfe359bd72b4d874832b31393 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 11 Dec 2009 10:10:25 -0500 Subject: do some moving around of forwarding stuff --- actions/repeat.php | 122 ++++++++++++++++++++++++++++++ lib/repeatform.php | 147 +++++++++++++++++++++++++++++++++++++ plugins/Repeat/Forward.php | 127 -------------------------------- plugins/Repeat/forward.php | 122 ------------------------------ plugins/Repeat/forwardform.php | 147 ------------------------------------- plugins/Repeat/inboxnoticelist.php | 85 --------------------- 6 files changed, 269 insertions(+), 481 deletions(-) create mode 100644 actions/repeat.php create mode 100644 lib/repeatform.php delete mode 100644 plugins/Repeat/Forward.php delete mode 100644 plugins/Repeat/forward.php delete mode 100644 plugins/Repeat/forwardform.php delete mode 100644 plugins/Repeat/inboxnoticelist.php (limited to 'lib') diff --git a/actions/repeat.php b/actions/repeat.php new file mode 100644 index 000000000..194833fe0 --- /dev/null +++ b/actions/repeat.php @@ -0,0 +1,122 @@ + + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + * + * StatusNet - the distributed open-source microblogging tool + * Copyright (C) 2008, 2009, StatusNet, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +/** + * Forward action + * + * @category Action + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 + * @link http://status.net/ + */ + +class ForwardAction extends Action +{ + var $user = null; + var $notice = null; + + function prepare($args) + { + parent::prepare($args); + + $this->user = common_current_user(); + + if (empty($this->user)) { + $this->clientError(_("Only logged-in users can forward notices.")); + return false; + } + + $id = $this->trimmed('notice'); + + if (empty($id)) { + $this->clientError(_("No notice specified.")); + return false; + } + + $this->notice = Notice::staticGet('id', $id); + + if (empty($this->notice)) { + $this->clientError(_("No notice specified.")); + return false; + } + + if ($this->user->id == $this->notice->profile_id) { + $this->clientError(_("You can't forward your own notice.")); + return false; + } + + $token = $this->trimmed('token-'.$id); + + if (empty($token) || $token != common_session_token()) { + $this->clientError(_("There was a problem with your session token. Try again, please.")); + return false; + } + + $profile = $this->user->getProfile(); + + if ($profile->hasForwarded($id)) { + $this->clientError(_("You already forwarded that notice.")); + return false; + } + + return true; + } + + /** + * Class handler. + * + * @param array $args query arguments + * + * @return void + */ + + function handle($args) + { + $forward = Forward::saveNew($this->user->id, $this->notice->id); + + if ($this->boolean('ajax')) { + $this->startHTML('text/xml;charset=utf-8'); + $this->elementStart('head'); + $this->element('title', null, _('Forwarded')); + $this->elementEnd('head'); + $this->elementStart('body'); + $this->element('p', array('id' => 'forward_response'), _('Forwarded!')); + $this->elementEnd('body'); + $this->elementEnd('html'); + } else { + // FIXME! + } + } +} diff --git a/lib/repeatform.php b/lib/repeatform.php new file mode 100644 index 000000000..2052856ae --- /dev/null +++ b/lib/repeatform.php @@ -0,0 +1,147 @@ +. + * + * @category Form + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET') && !defined('LACONICA')) { + exit(1); +} + +require_once INSTALLDIR.'/lib/form.php'; + +/** + * Form for forwarding a notice + * + * @category Form + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ForwardForm extends Form +{ + /** + * Notice to forward + */ + + var $notice = null; + + /** + * Constructor + * + * @param HTMLOutputter $out output channel + * @param Notice $notice notice to forward + */ + + function __construct($out=null, $notice=null) + { + parent::__construct($out); + + $this->notice = $notice; + } + + /** + * ID of the form + * + * @return int ID of the form + */ + + function id() + { + return 'forward-' . $this->notice->id; + } + + /** + * Action of the form + * + * @return string URL of the action + */ + + function action() + { + return common_local_url('forward'); + } + + /** + * Include a session token for CSRF protection + * + * @return void + */ + + function sessionToken() + { + $this->out->hidden('token-' . $this->notice->id, + common_session_token()); + } + + /** + * Legend of the Form + * + * @return void + */ + function formLegend() + { + $this->out->element('legend', null, _('Forward this notice')); + } + + /** + * Data elements + * + * @return void + */ + + function formData() + { + $this->out->hidden('notice-n'.$this->notice->id, + $this->notice->id, + 'notice'); + } + + /** + * Action elements + * + * @return void + */ + + function formActions() + { + $this->out->submit('forward-submit-' . $this->notice->id, + _('Forward'), 'submit', null, _('Forward this notice')); + } + + /** + * Class of the form. + * + * @return string the form's class + */ + + function formClass() + { + return 'form_forward'; + } +} diff --git a/plugins/Repeat/Forward.php b/plugins/Repeat/Forward.php deleted file mode 100644 index 09b2d6a4e..000000000 --- a/plugins/Repeat/Forward.php +++ /dev/null @@ -1,127 +0,0 @@ -. - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -/** - * Table Definition for location_namespace - */ - -require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; - -class Forward extends Memcached_DataObject -{ - ###START_AUTOCODE - /* the code below is auto generated do not remove the above tag */ - - public $__table = 'forward'; // table name - public $profile_id; // int(4) primary_key not_null - public $notice_id; // int(4) primary_key not_null - public $created; // datetime not_null default_0000-00-00%2000%3A00%3A00 - - /* Static get */ - function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('Forward',$k,$v); } - - /* the code above is auto generated do not remove the tag below */ - ###END_AUTOCODE - - function &pkeyGet($kv) - { - return Memcached_DataObject::pkeyGet('Forward', $kv); - } - - static function saveNew($profile_id, $notice_id) - { - $forward = new Forward(); - - $forward->profile_id = $profile_id; - $forward->notice_id = $notice_id; - $forward->created = common_sql_now(); - - $forward->query('BEGIN'); - - if (!$forward->insert()) { - throw new ServerException(_("Couldn't insert forward.")); - } - - $ni = $forward->addToInboxes(); - - $forward->query('COMMIT'); - - $forward->blowCache($ni); - - return $forward; - } - - function addToInboxes() - { - $inbox = new Notice_inbox(); - - $user = new User(); - - $usertable = common_database_tablename('user'); - $user->query("SELECT $usertable.* FROM $usertable INNER JOIN subscription ON $usertable.id = subscription.subscriber ". - 'WHERE subscription.subscribed = '.$this->profile_id); - - $ni = array(); - - $notice = Notice::staticGet('id', $this->notice_id); - - $author = Profile::staticGet('id', $notice->profile_id); - - while ($user->fetch()) { - $inbox = Notice_inbox::pkeyGet(array('user_id' => $user->id, - 'notice_id' => $this->notice_id)); - - if (empty($inbox)) { - if (!$user->hasBlocked($author)) { - $ni[$user->id] = NOTICE_INBOX_SOURCE_FORWARD; - } - } else { - $inbox->free(); - } - } - - $user->free(); - $author->free(); - - unset($user); - unset($author); - - Notice_inbox::bulkInsert($this->notice_id, $this->created, $ni); - - return $ni; - } - - function blowCache($ni) - { - $cache = common_memcache(); - - if (!empty($cache)) { - foreach ($ni as $id => $source) { - $cache->delete(common_cache_key('notice_inbox:by_user:'.$id)); - $cache->delete(common_cache_key('notice_inbox:by_user_own:'.$id)); - $cache->delete(common_cache_key('notice_inbox:by_user:'.$id.';last')); - $cache->delete(common_cache_key('notice_inbox:by_user_own:'.$id.';last')); - } - } - } -} diff --git a/plugins/Repeat/forward.php b/plugins/Repeat/forward.php deleted file mode 100644 index 194833fe0..000000000 --- a/plugins/Repeat/forward.php +++ /dev/null @@ -1,122 +0,0 @@ - - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ - * - * StatusNet - the distributed open-source microblogging tool - * Copyright (C) 2008, 2009, StatusNet, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -/** - * Forward action - * - * @category Action - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 - * @link http://status.net/ - */ - -class ForwardAction extends Action -{ - var $user = null; - var $notice = null; - - function prepare($args) - { - parent::prepare($args); - - $this->user = common_current_user(); - - if (empty($this->user)) { - $this->clientError(_("Only logged-in users can forward notices.")); - return false; - } - - $id = $this->trimmed('notice'); - - if (empty($id)) { - $this->clientError(_("No notice specified.")); - return false; - } - - $this->notice = Notice::staticGet('id', $id); - - if (empty($this->notice)) { - $this->clientError(_("No notice specified.")); - return false; - } - - if ($this->user->id == $this->notice->profile_id) { - $this->clientError(_("You can't forward your own notice.")); - return false; - } - - $token = $this->trimmed('token-'.$id); - - if (empty($token) || $token != common_session_token()) { - $this->clientError(_("There was a problem with your session token. Try again, please.")); - return false; - } - - $profile = $this->user->getProfile(); - - if ($profile->hasForwarded($id)) { - $this->clientError(_("You already forwarded that notice.")); - return false; - } - - return true; - } - - /** - * Class handler. - * - * @param array $args query arguments - * - * @return void - */ - - function handle($args) - { - $forward = Forward::saveNew($this->user->id, $this->notice->id); - - if ($this->boolean('ajax')) { - $this->startHTML('text/xml;charset=utf-8'); - $this->elementStart('head'); - $this->element('title', null, _('Forwarded')); - $this->elementEnd('head'); - $this->elementStart('body'); - $this->element('p', array('id' => 'forward_response'), _('Forwarded!')); - $this->elementEnd('body'); - $this->elementEnd('html'); - } else { - // FIXME! - } - } -} diff --git a/plugins/Repeat/forwardform.php b/plugins/Repeat/forwardform.php deleted file mode 100644 index 2052856ae..000000000 --- a/plugins/Repeat/forwardform.php +++ /dev/null @@ -1,147 +0,0 @@ -. - * - * @category Form - * @package StatusNet - * @author Evan Prodromou - * @copyright 2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET') && !defined('LACONICA')) { - exit(1); -} - -require_once INSTALLDIR.'/lib/form.php'; - -/** - * Form for forwarding a notice - * - * @category Form - * @package StatusNet - * @author Evan Prodromou - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -class ForwardForm extends Form -{ - /** - * Notice to forward - */ - - var $notice = null; - - /** - * Constructor - * - * @param HTMLOutputter $out output channel - * @param Notice $notice notice to forward - */ - - function __construct($out=null, $notice=null) - { - parent::__construct($out); - - $this->notice = $notice; - } - - /** - * ID of the form - * - * @return int ID of the form - */ - - function id() - { - return 'forward-' . $this->notice->id; - } - - /** - * Action of the form - * - * @return string URL of the action - */ - - function action() - { - return common_local_url('forward'); - } - - /** - * Include a session token for CSRF protection - * - * @return void - */ - - function sessionToken() - { - $this->out->hidden('token-' . $this->notice->id, - common_session_token()); - } - - /** - * Legend of the Form - * - * @return void - */ - function formLegend() - { - $this->out->element('legend', null, _('Forward this notice')); - } - - /** - * Data elements - * - * @return void - */ - - function formData() - { - $this->out->hidden('notice-n'.$this->notice->id, - $this->notice->id, - 'notice'); - } - - /** - * Action elements - * - * @return void - */ - - function formActions() - { - $this->out->submit('forward-submit-' . $this->notice->id, - _('Forward'), 'submit', null, _('Forward this notice')); - } - - /** - * Class of the form. - * - * @return string the form's class - */ - - function formClass() - { - return 'form_forward'; - } -} diff --git a/plugins/Repeat/inboxnoticelist.php b/plugins/Repeat/inboxnoticelist.php deleted file mode 100644 index 809fbe8af..000000000 --- a/plugins/Repeat/inboxnoticelist.php +++ /dev/null @@ -1,85 +0,0 @@ -owner = $owner; - } - - function newListItem($notice) - { - return new InboxNoticeListItem($notice, $this->owner, $this->out); - } -} - -class InboxNoticeListItem extends NoticeListItem -{ - var $owner = null; - var $ib = null; - - function __construct($notice, $owner, $out=null) - { - parent::__construct($notice, $out); - $this->owner = $owner; - - $this->ib = Notice_inbox::pkeyGet(array('user_id' => $owner->id, - 'notice_id' => $notice->id)); - } - - function showAuthor() - { - parent::showAuthor(); - if ($this->ib->source == NOTICE_INBOX_SOURCE_FORWARD) { - $this->out->element('span', 'forward', _('Fwd')); - } - } - - function showEnd() - { - if ($this->ib->source == NOTICE_INBOX_SOURCE_FORWARD) { - - $forward = new Forward(); - - // FIXME: scary join! - - $forward->query('SELECT profile_id '. - 'FROM forward JOIN subscription ON forward.profile_id = subscription.subscribed '. - 'WHERE subscription.subscriber = ' . $this->owner->id . ' '. - 'AND forward.notice_id = ' . $this->notice->id . ' '. - 'ORDER BY forward.created '); - - $n = 0; - - $firstForwarder = null; - - while ($forward->fetch()) { - if (empty($firstForwarder)) { - $firstForwarder = Profile::staticGet('id', $forward->profile_id); - } - $n++; - } - - $forward->free(); - unset($forward); - - $this->out->elementStart('span', 'forwards'); - - $link = XMLStringer::estring('a', array('href' => $firstForwarder->profileurl), - $firstForwarder->nickname); - - if ($n == 1) { - $this->out->raw(sprintf(_('Forwarded by %s'), $link)); - } else { - // XXX: use that cool ngettext thing - $this->out->raw(sprintf(_('Forwarded by %s and %d other(s)'), $link, $n - 1)); - } - - $this->out->elementEnd('span'); - } - parent::showEnd(); - } -} -- cgit v1.2.3-54-g00ecf From 81843f2acd5375a9072d091fd58c6a6af079295e Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 11 Dec 2009 10:49:26 -0500 Subject: show the repeat form in notice lists --- classes/Profile.php | 11 +++++++++++ lib/noticelist.php | 21 +++++++++++++++++++++ lib/repeatform.php | 26 ++++++++++++-------------- 3 files changed, 44 insertions(+), 14 deletions(-) (limited to 'lib') diff --git a/classes/Profile.php b/classes/Profile.php index 4b2e09006..03196447b 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -716,4 +716,15 @@ class Profile extends Memcached_DataObject } return $result; } + + function hasRepeated($notice_id) + { + // XXX: not really a pkey, but should work + + $notice = Memcached_DataObject::pkeyGet('Notice', + array('profile_id' => $this->id, + 'repeat_of' => $notice_id)); + + return !empty($notice); + } } diff --git a/lib/noticelist.php b/lib/noticelist.php index 21cec528f..924056ece 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -212,6 +212,7 @@ class NoticeListItem extends Widget $this->out->elementStart('div', 'notice-options'); $this->showFaveForm(); $this->showReplyLink(); + $this->showRepeatForm(); $this->showDeleteLink(); $this->out->elementEnd('div'); } @@ -551,6 +552,26 @@ class NoticeListItem extends Widget } } + /** + * show the form to repeat a notice + * + * @return void + */ + + function showRepeatForm() + { + $user = common_current_user(); + if ($user && $user->id != $this->notice->profile_id) { + $profile = $user->getProfile(); + if ($profile->hasRepeated($this->notice->id)) { + $this->out->text(_('Repeated')); + } else { + $rf = new RepeatForm($this->out, $this->notice); + $rf->show(); + } + } + } + /** * finish the notice * diff --git a/lib/repeatform.php b/lib/repeatform.php index 2052856ae..50e5d6dbe 100644 --- a/lib/repeatform.php +++ b/lib/repeatform.php @@ -2,7 +2,7 @@ /** * StatusNet, the distributed open-source microblogging tool * - * Form for forwarding a notice + * Form for repeating a notice * * PHP version 5 * @@ -27,14 +27,12 @@ * @link http://status.net/ */ -if (!defined('STATUSNET') && !defined('LACONICA')) { +if (!defined('STATUSNET')) { exit(1); } -require_once INSTALLDIR.'/lib/form.php'; - /** - * Form for forwarding a notice + * Form for repeating a notice * * @category Form * @package StatusNet @@ -43,10 +41,10 @@ require_once INSTALLDIR.'/lib/form.php'; * @link http://status.net/ */ -class ForwardForm extends Form +class RepeatForm extends Form { /** - * Notice to forward + * Notice to repeat */ var $notice = null; @@ -55,7 +53,7 @@ class ForwardForm extends Form * Constructor * * @param HTMLOutputter $out output channel - * @param Notice $notice notice to forward + * @param Notice $notice notice to repeat */ function __construct($out=null, $notice=null) @@ -73,7 +71,7 @@ class ForwardForm extends Form function id() { - return 'forward-' . $this->notice->id; + return 'repeat-' . $this->notice->id; } /** @@ -84,7 +82,7 @@ class ForwardForm extends Form function action() { - return common_local_url('forward'); + return common_local_url('repeat'); } /** @@ -106,7 +104,7 @@ class ForwardForm extends Form */ function formLegend() { - $this->out->element('legend', null, _('Forward this notice')); + $this->out->element('legend', null, _('Repeat this notice')); } /** @@ -130,8 +128,8 @@ class ForwardForm extends Form function formActions() { - $this->out->submit('forward-submit-' . $this->notice->id, - _('Forward'), 'submit', null, _('Forward this notice')); + $this->out->submit('repeat-submit-' . $this->notice->id, + _('Repeat'), 'submit', null, _('Repeat this notice')); } /** @@ -142,6 +140,6 @@ class ForwardForm extends Form function formClass() { - return 'form_forward'; + return 'form_repeat'; } } -- cgit v1.2.3-54-g00ecf From 79f81ad76d413908c097c121912eff233aebc483 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 11 Dec 2009 11:29:51 -0500 Subject: change Notice::saveNew() to use named arguments for little-used options --- actions/apistatusesupdate.php | 29 ++++++++++++++++------------- actions/newnotice.php | 10 ++++++---- classes/Notice.php | 15 ++++++++++++--- lib/command.php | 5 +++-- lib/oauthstore.php | 5 ++--- plugins/Facebook/facebookaction.php | 5 +++-- 6 files changed, 42 insertions(+), 27 deletions(-) (limited to 'lib') diff --git a/actions/apistatusesupdate.php b/actions/apistatusesupdate.php index 85a7c8c08..10bbc5ace 100644 --- a/actions/apistatusesupdate.php +++ b/actions/apistatusesupdate.php @@ -231,19 +231,22 @@ class ApiStatusesUpdateAction extends ApiAuthAction } } - $this->notice = Notice::saveNew( - $this->user->id, - html_entity_decode($status_shortened, ENT_NOQUOTES, 'UTF-8'), - $this->source, - 1, - $reply_to, - null, - null, - empty($location) ? null : $location->lat, - empty($location) ? null : $location->lon, - empty($location) ? null : $location->location_id, - empty($location) ? null : $location->location_ns - ); + $content = html_entity_decode($status_shortened, ENT_NOQUOTES, 'UTF-8'), + + $options = array('reply_to' => $reply_to); + + if (!empty($location)) { + $options['lat'] = $location->lat; + $options['lon'] = $location->lon; + $options['location_id'] = $location->location_id; + $options['location_ns'] = $location->location_ns; + } + + $this->notice = + Notice::saveNew($this->user->id, + $content, + $this->source, + $options); if (isset($upload)) { $upload->attachToNotice($this->notice); diff --git a/actions/newnotice.php b/actions/newnotice.php index dd6da0b01..c6c70e326 100644 --- a/actions/newnotice.php +++ b/actions/newnotice.php @@ -187,10 +187,12 @@ class NewnoticeAction extends Action } } - $notice = Notice::saveNew($user->id, $content_shortened, 'web', 1, - ($replyto == 'false') ? null : $replyto, - null, null, - $lat, $lon, $location_id, $location_ns); + $notice = Notice::saveNew($user->id, $content_shortened, 'web', + array('reply_to' => ($replyto == 'false') ? null : $replyto, + 'lat' => $lat, + 'lon' => $lon, + 'location_id' => $location_id, + 'location_ns' => $location_ns)); if (isset($upload)) { $upload->attachToNotice($notice); diff --git a/classes/Notice.php b/classes/Notice.php index c36c5a9c6..4422866fa 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -167,9 +167,18 @@ class Notice extends Memcached_DataObject } } - static function saveNew($profile_id, $content, $source=null, - $is_local=Notice::LOCAL_PUBLIC, $reply_to=null, $uri=null, $created=null, - $lat=null, $lon=null, $location_id=null, $location_ns=null) { + static function saveNew($profile_id, $content, $source, $options=null) { + + if (!empty($options)) { + extract($options); + if (!isset($reply_to)) { + $reply_to = NULL; + } + } + + if (empty($is_local)) { + $is_local = Notice::LOCAL_PUBLIC; + } $profile = Profile::staticGet($profile_id); diff --git a/lib/command.php b/lib/command.php index 450db9da3..085331f82 100644 --- a/lib/command.php +++ b/lib/command.php @@ -433,8 +433,9 @@ class ReplyCommand extends Command return; } - $notice = Notice::saveNew($this->user->id, $this->text, $channel->source(), 1, - $notice->id); + $notice = Notice::saveNew($this->user->id, $this->text, $channel->source(), + array('reply_to' => $notice->id)); + if ($notice) { $channel->output($this->user, sprintf(_('Reply to %s sent'), $recipient->nickname)); } else { diff --git a/lib/oauthstore.php b/lib/oauthstore.php index e34bf8a5e..df63cc151 100644 --- a/lib/oauthstore.php +++ b/lib/oauthstore.php @@ -359,9 +359,8 @@ class StatusNetOAuthDataStore extends OAuthDataStore $notice = Notice::saveNew($author->id, $omb_notice->getContent(), 'omb', - false, - null, - $omb_notice->getIdentifierURI()); + array('is_local' => Notice::REMOTE_OMB, + 'uri' => $omb_notice->getIdentifierURI())); common_broadcast_notice($notice, true); } diff --git a/plugins/Facebook/facebookaction.php b/plugins/Facebook/facebookaction.php index 705bb2780..24bf215fd 100644 --- a/plugins/Facebook/facebookaction.php +++ b/plugins/Facebook/facebookaction.php @@ -445,8 +445,9 @@ class FacebookAction extends Action $replyto = $this->trimmed('inreplyto'); try { - $notice = Notice::saveNew($user->id, $content, - 'web', 1, ($replyto == 'false') ? null : $replyto); + $notice = Notice::saveNew($user->id, $content, 'web', + array('reply_to' => ($replyto == 'false') ? null : $replyto)); + } catch (Exception $e) { $this->showPage($e->getMessage()); return; -- cgit v1.2.3-54-g00ecf From afc86a86d36dc8101c81d5d009546e4629db34a3 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 11 Dec 2009 11:51:09 -0500 Subject: save repeats from the form --- actions/repeat.php | 20 ++++++++++---------- classes/Notice.php | 23 ++++++++++++++++++++++- lib/router.php | 1 + 3 files changed, 33 insertions(+), 11 deletions(-) (limited to 'lib') diff --git a/actions/repeat.php b/actions/repeat.php index 194833fe0..a1c5f443f 100644 --- a/actions/repeat.php +++ b/actions/repeat.php @@ -1,7 +1,7 @@ user = common_current_user(); if (empty($this->user)) { - $this->clientError(_("Only logged-in users can forward notices.")); + $this->clientError(_("Only logged-in users can repeat notices.")); return false; } @@ -73,7 +73,7 @@ class ForwardAction extends Action } if ($this->user->id == $this->notice->profile_id) { - $this->clientError(_("You can't forward your own notice.")); + $this->clientError(_("You can't repeat your own notice.")); return false; } @@ -86,8 +86,8 @@ class ForwardAction extends Action $profile = $this->user->getProfile(); - if ($profile->hasForwarded($id)) { - $this->clientError(_("You already forwarded that notice.")); + if ($profile->hasRepeated($id)) { + $this->clientError(_("You already repeated that notice.")); return false; } @@ -104,15 +104,15 @@ class ForwardAction extends Action function handle($args) { - $forward = Forward::saveNew($this->user->id, $this->notice->id); + $repeat = $this->notice->repeat($this->user->id, 'web'); if ($this->boolean('ajax')) { $this->startHTML('text/xml;charset=utf-8'); $this->elementStart('head'); - $this->element('title', null, _('Forwarded')); + $this->element('title', null, _('Repeated')); $this->elementEnd('head'); $this->elementStart('body'); - $this->element('p', array('id' => 'forward_response'), _('Forwarded!')); + $this->element('p', array('id' => 'repeat_response'), _('Repeated!')); $this->elementEnd('body'); $this->elementEnd('html'); } else { diff --git a/classes/Notice.php b/classes/Notice.php index 228201188..82753fbdd 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -236,7 +236,14 @@ class Notice extends Memcached_DataObject $notice->source = $source; $notice->uri = $uri; - $notice->reply_to = self::getReplyTo($reply_to, $profile_id, $source, $final); + // Handle repeat case + + if (isset($repeat_of)) { + $notice->repeat_of = $repeat_of; + $notice->reply_to = $repeat_of; + } else { + $notice->reply_to = self::getReplyTo($reply_to, $profile_id, $source, $final); + } if (!empty($notice->reply_to)) { $reply = Notice::staticGet('id', $notice->reply_to); @@ -1434,4 +1441,18 @@ class Notice extends Memcached_DataObject return $location; } + + function repeat($repeater_id, $source) + { + $author = Profile::staticGet('id', $this->profile_id); + + // FIXME: truncate on long repeats...? + + $content = sprintf(_('RT @%1$s %2$s'), + $author->nickname, + $this->content); + + return self::saveNew($repeater_id, $content, $source, + array('repeat_of' => $this->id)); + } } diff --git a/lib/router.php b/lib/router.php index 37525319f..142206c16 100644 --- a/lib/router.php +++ b/lib/router.php @@ -99,6 +99,7 @@ class Router 'groupblock', 'groupunblock', 'sandbox', 'unsandbox', 'silence', 'unsilence', + 'repeat', 'deleteuser'); foreach ($main as $a) { -- cgit v1.2.3-54-g00ecf From 962f391f3ebd4908ae7187673426f03e57083b02 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 11 Dec 2009 12:10:58 -0500 Subject: show original notice in repeat, with repeat info below --- lib/noticelist.php | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 58 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/noticelist.php b/lib/noticelist.php index 924056ece..7319a62ea 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -147,6 +147,10 @@ class NoticeListItem extends Widget var $notice = null; + /** The notice that was repeated. */ + + var $repeat = null; + /** The profile of the author of the notice, extracted once for convenience. */ var $profile = null; @@ -162,8 +166,13 @@ class NoticeListItem extends Widget function __construct($notice, $out=null) { parent::__construct($out); - $this->notice = $notice; - $this->profile = $notice->getProfile(); + if (!empty($notice->repeat_of)) { + $this->notice = Notice::staticGet('id', $notice->repeat_of); + $this->repeat = $notice; + } else { + $this->notice = $notice; + } + $this->profile = $this->notice->getProfile(); } /** @@ -202,6 +211,7 @@ class NoticeListItem extends Widget $this->showNoticeSource(); $this->showNoticeLocation(); $this->showContext(); + $this->showRepeat(); $this->out->elementEnd('div'); } @@ -508,6 +518,52 @@ class NoticeListItem extends Widget } } + /** + * show a link to the author of repeat + * + * @return void + */ + + function showRepeat() + { + if (!empty($this->repeat)) { + + $repeater = Profile::staticGet('id', $this->repeat->profile_id); + + $attrs = array('href' => $repeater->profileurl, + 'class' => 'url'); + + if (!empty($repeater->fullname)) { + $attrs['title'] = $repeater->fullname . ' (' . $repeater->nickname . ')'; + } + + $this->out->elementStart('span', 'repeat'); + + $this->out->elementStart('a', $attrs); + + $avatar = $repeater->getAvatar(AVATAR_MINI_SIZE); + + $this->out->element('img', array('src' => ($avatar) ? + $avatar->displayUrl() : + Avatar::defaultImage(AVATAR_MINI_SIZE), + 'class' => 'avatar photo', + 'width' => AVATAR_MINI_SIZE, + 'height' => AVATAR_MINI_SIZE, + 'alt' => + ($repeater->fullname) ? + $repeater->fullname : + $repeater->nickname)); + + $this->out->elementEnd('a'); + + $text_link = XMLStringer::estring('a', $attrs, $repeater->nickname); + + $this->out->raw(sprintf(_('Repeated by %s'), $text_link)); + + $this->out->elementEnd('span'); + } + } + /** * show a link to reply to the current notice * -- cgit v1.2.3-54-g00ecf From 1c370bb277d9b707a5f1956dd5e6856a9b278f5e Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 11 Dec 2009 12:39:29 -0500 Subject: show repeated notices correctly in API output --- lib/api.php | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/api.php b/lib/api.php index eacb80dbe..12e3ba531 100644 --- a/lib/api.php +++ b/lib/api.php @@ -213,6 +213,20 @@ class ApiAction extends Action } function twitterStatusArray($notice, $include_user=true) + { + $base = $this->twitterSimpleStatusArray($notice, $include_user); + + if (empty($notice->repeat_of)) { + return $base; + } else { + $original = Notice::staticGet('id', $notice->repeat_of); + $original_array = $this->twitterSimpleStatusArray($original, $include_user); + $original_array['retweeted_status'] = $base; + return $original_array; + } + } + + function twitterSimpleStatusArray($notice, $include_user=true) { $profile = $notice->getProfile(); @@ -446,9 +460,9 @@ class ApiAction extends Action } } - function showTwitterXmlStatus($twitter_status) + function showTwitterXmlStatus($twitter_status, $tag='status') { - $this->elementStart('status'); + $this->elementStart($tag); foreach($twitter_status as $element => $value) { switch ($element) { case 'user': @@ -463,11 +477,14 @@ class ApiAction extends Action case 'geo': $this->showGeoRSS($value); break; + case 'retweeted_status': + $this->showTwitterXmlStatus($value, 'retweeted_status'); + break; default: $this->element($element, null, $value); } } - $this->elementEnd('status'); + $this->elementEnd($tag); } function showTwitterXmlGroup($twitter_group) -- cgit v1.2.3-54-g00ecf From 683edfd199ae150afa74993521c4c65d76b1e19d Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Fri, 11 Dec 2009 12:40:05 -0500 Subject: show repeated notices correctly in API output --- actions/apistatusesretweet.php | 136 +++++++++++++++++++++++++++++++++++++++++ lib/router.php | 5 ++ 2 files changed, 141 insertions(+) create mode 100644 actions/apistatusesretweet.php (limited to 'lib') diff --git a/actions/apistatusesretweet.php b/actions/apistatusesretweet.php new file mode 100644 index 000000000..fc71d2274 --- /dev/null +++ b/actions/apistatusesretweet.php @@ -0,0 +1,136 @@ +. + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR . '/lib/apiauth.php'; +require_once INSTALLDIR . '/lib/mediafile.php'; + +/** + * Repeat a notice through the API + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ApiStatusesRetweetAction extends ApiAuthAction +{ + var $original = null; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + * + */ + + function prepare($args) + { + parent::prepare($args); + + if ($_SERVER['REQUEST_METHOD'] != 'POST') { + $this->clientError(_('This method requires a POST.'), + 400, $this->format); + return false; + } + + $id = $this->trimmed('id'); + + $this->original = Notice::staticGet('id', $id); + + if (empty($this->original)) { + $this->clientError(_('No such notice'), + 400, $this->format); + return false; + } + + $this->user = $this->auth_user; + + if ($this->user->id == $notice->profile_id) { + $this->clientError(_('Cannot repeat your own notice')); + 400, $this->format); + return false; + } + + $profile = $this->user->getProfile(); + + if ($profile->hasRepeated($id)) { + $this->clientError(_('Already repeated that notice'), + 400, $this->format); + return false; + } + + return true; + } + + /** + * Handle the request + * + * Make a new notice for the update, save it, and show it + * + * @param array $args $_REQUEST data (unused) + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + + $repeat = $this->original->repeat($this->user->id, $this->source); + + common_broadcast_notice($repeat); + + $this->showNotice($repeat); + } + + /** + * Show the resulting notice + * + * @return void + */ + + function showNotice($notice) + { + if (!empty($notice)) { + if ($this->format == 'xml') { + $this->showSingleXmlStatus($notice); + } elseif ($this->format == 'json') { + $this->show_single_json_status($notice); + } + } + } +} diff --git a/lib/router.php b/lib/router.php index 142206c16..835339720 100644 --- a/lib/router.php +++ b/lib/router.php @@ -359,6 +359,11 @@ class Router 'id' => '[0-9]+', 'format' => '(xml|json)')); + $m->connect('api/statuses/retweet/:id.:format', + array('action' => 'ApiStatusesRetweet', + 'id' => '[0-9]+', + 'format' => '(xml|json)')); + // users $m->connect('api/users/show.:format', -- cgit v1.2.3-54-g00ecf From 59e5958d3afa0a5613efbc1ed4546ce63946fe43 Mon Sep 17 00:00:00 2001 From: Hue Bastard Date: Tue, 8 Dec 2009 21:28:11 +1000 Subject: ticket 2055: added logos to Atom and RSS feeds --- actions/apitimelinefavorites.php | 6 ++++-- actions/apitimelinefriends.php | 6 ++++-- actions/apitimelinegroup.php | 7 +++++-- actions/apitimelinementions.php | 6 ++++-- actions/apitimelinepublic.php | 5 +++-- actions/apitimelinetag.php | 6 ++++-- actions/apitimelineuser.php | 6 ++++-- lib/api.php | 27 +++++++++++++++++++++------ 8 files changed, 49 insertions(+), 20 deletions(-) (limited to 'lib') diff --git a/actions/apitimelinefavorites.php b/actions/apitimelinefavorites.php index f84d7b4cb..77e5cea1b 100644 --- a/actions/apitimelinefavorites.php +++ b/actions/apitimelinefavorites.php @@ -101,6 +101,7 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction function showTimeline() { $profile = $this->user->getProfile(); + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); $sitename = common_config('site', 'name'); $title = sprintf( @@ -121,20 +122,21 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction $profile->getBestName(), $this->user->nickname ); + $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); switch($this->format) { case 'xml': $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle); + $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo, null, $logo); break; case 'atom': $selfuri = common_root_url() . ltrim($_SERVER['QUERY_STRING'], 'p='); $this->showAtomTimeline( $this->notices, $title, $id, $link, $subtitle, - null, $selfuri + null, $selfuri, $logo ); break; case 'json': diff --git a/actions/apitimelinefriends.php b/actions/apitimelinefriends.php index e84f77372..09ba7a969 100644 --- a/actions/apitimelinefriends.php +++ b/actions/apitimelinefriends.php @@ -110,6 +110,7 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction function showTimeline() { $profile = $this->user->getProfile(); + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); $sitename = common_config('site', 'name'); $title = sprintf(_("%s and friends"), $this->user->nickname); $taguribase = common_config('integration', 'taguri'); @@ -121,13 +122,14 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction _('Updates from %1$s and friends on %2$s!'), $this->user->nickname, $sitename ); + $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); switch($this->format) { case 'xml': $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle); + $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo); break; case 'atom': @@ -144,7 +146,7 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction $this->showAtomTimeline( $this->notices, $title, $id, $link, - $subtitle, null, $selfuri + $subtitle, null, $selfuri, $logo ); break; case 'json': diff --git a/actions/apitimelinegroup.php b/actions/apitimelinegroup.php index de13e7eb9..22c577f39 100644 --- a/actions/apitimelinegroup.php +++ b/actions/apitimelinegroup.php @@ -105,6 +105,7 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction function showTimeline() { $sitename = common_config('site', 'name'); + $avatar = $this->group->homepage_logo; $title = sprintf(_("%s timeline"), $this->group->nickname); $taguribase = common_config('integration', 'taguri'); $id = "tag:$taguribase:GroupTimeline:" . $this->group->id; @@ -117,13 +118,14 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction $this->group->nickname, $sitename ); + $logo = ($avatar) ? $avatar : User_group::defaultLogo(AVATAR_PROFILE_SIZE); switch($this->format) { case 'xml': $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle); + $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo); break; case 'atom': $selfuri = common_root_url() . @@ -136,7 +138,8 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction $link, $subtitle, null, - $selfuri + $selfuri, + $logo ); break; case 'json': diff --git a/actions/apitimelinementions.php b/actions/apitimelinementions.php index 0956ccdce..19f40aebc 100644 --- a/actions/apitimelinementions.php +++ b/actions/apitimelinementions.php @@ -110,6 +110,7 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction function showTimeline() { $profile = $this->user->getProfile(); + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); $sitename = common_config('site', 'name'); $title = sprintf( @@ -126,20 +127,21 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction _('%1$s updates that reply to updates from %2$s / %3$s.'), $sitename, $this->user->nickname, $profile->getBestName() ); + $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); switch($this->format) { case 'xml': $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle); + $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo); break; case 'atom': $selfuri = common_root_url() . ltrim($_SERVER['QUERY_STRING'], 'p='); $this->showAtomTimeline( $this->notices, $title, $id, $link, $subtitle, - null, $selfuri + null, $selfuri, $logo ); break; case 'json': diff --git a/actions/apitimelinepublic.php b/actions/apitimelinepublic.php index 7a8504259..633f3c36e 100644 --- a/actions/apitimelinepublic.php +++ b/actions/apitimelinepublic.php @@ -103,6 +103,7 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction function showTimeline() { $sitename = common_config('site', 'name'); + $sitelogo = (common_config('site', 'logo')) ? common_config('site', 'logo') : Theme::path('logo.png'); $title = sprintf(_("%s public timeline"), $sitename); $taguribase = common_config('integration', 'taguri'); $id = "tag:$taguribase:PublicTimeline"; @@ -114,13 +115,13 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle); + $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $sitelogo); break; case 'atom': $selfuri = common_root_url() . 'api/statuses/public_timeline.atom'; $this->showAtomTimeline( $this->notices, $title, $id, $link, - $subtitle, null, $selfuri + $subtitle, null, $selfuri, $sitelogo ); break; case 'json': diff --git a/actions/apitimelinetag.php b/actions/apitimelinetag.php index 452593c11..1a50520f4 100644 --- a/actions/apitimelinetag.php +++ b/actions/apitimelinetag.php @@ -98,6 +98,7 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction function showTimeline() { $sitename = common_config('site', 'name'); + $sitelogo = (common_config('site', 'logo')) ? common_config('site', 'logo') : Theme::path('logo.png'); $title = sprintf(_("Notices tagged with %s"), $this->tag); $link = common_local_url( 'tag', @@ -116,7 +117,7 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction $this->showXmlTimeline($this->notices); break; case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle); + $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $sitelogo); break; case 'atom': $selfuri = common_root_url() . @@ -129,7 +130,8 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction $link, $subtitle, null, - $selfuri + $selfuri, + $sitelogo ); break; case 'json': diff --git a/actions/apitimelineuser.php b/actions/apitimelineuser.php index ca1d21772..14c62a52e 100644 --- a/actions/apitimelineuser.php +++ b/actions/apitimelineuser.php @@ -112,6 +112,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction function showTimeline() { $profile = $this->user->getProfile(); + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); $sitename = common_config('site', 'name'); $title = sprintf(_("%s timeline"), $this->user->nickname); @@ -125,6 +126,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction _('Updates from %1$s on %2$s!'), $this->user->nickname, $sitename ); + $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); // FriendFeed's SUP protocol // Also added RSS and Atom feeds @@ -139,7 +141,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction case 'rss': $this->showRssTimeline( $this->notices, $title, $link, - $subtitle, $suplink + $subtitle, $suplink, $logo ); break; case 'atom': @@ -153,7 +155,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction } $this->showAtomTimeline( $this->notices, $title, $id, $link, - $subtitle, $suplink, $selfuri + $subtitle, $suplink, $selfuri, $logo ); break; case 'json': diff --git a/lib/api.php b/lib/api.php index eacb80dbe..7ebe65dbb 100644 --- a/lib/api.php +++ b/lib/api.php @@ -134,17 +134,19 @@ class ApiAction extends Action $twitter_user['protected'] = false; # not supported by StatusNet yet $twitter_user['followers_count'] = $profile->subscriberCount(); - $user = $profile->getUser(); $design = null; + $user = $profile->getUser(); // Note: some profiles don't have an associated user - $defaultDesign = Design::siteDesign(); - if (!empty($user)) { $design = $user->getDesign(); } + if (empty($design)) { + $design = Design::siteDesign(); + } + $color = Design::toWebColor(empty($design->backgroundcolor) ? $defaultDesign->backgroundcolor : $design->backgroundcolor); $twitter_user['profile_background_color'] = ($color == null) ? '' : '#'.$color->hexValue(); $color = Design::toWebColor(empty($design->textcolor) ? $defaultDesign->textcolor : $design->textcolor); @@ -163,7 +165,7 @@ class ApiAction extends Action $timezone = 'UTC'; - if (!empty($user) && !empty($user->timezone)) { + if ($user->timezone) { $timezone = $user->timezone; } @@ -586,7 +588,7 @@ class ApiAction extends Action $this->endDocument('xml'); } - function showRssTimeline($notice, $title, $link, $subtitle, $suplink=null) + function showRssTimeline($notice, $title, $link, $subtitle, $suplink=null, $logo=null) { $this->initDocument('rss'); @@ -600,6 +602,15 @@ class ApiAction extends Action 'href' => $suplink, 'type' => 'application/json')); } + + if (!is_null($logo)) { + $this->elementStart('image'); + $this->element('link', null, $link); + $this->element('title', null, $title); + $this->element('url', null, $logo); + $this->elementEnd('image'); + } + $this->element('description', null, $subtitle); $this->element('language', null, 'en-us'); $this->element('ttl', null, '40'); @@ -619,7 +630,7 @@ class ApiAction extends Action $this->endTwitterRss(); } - function showAtomTimeline($notice, $title, $id, $link, $subtitle=null, $suplink=null, $selfuri=null) + function showAtomTimeline($notice, $title, $id, $link, $subtitle=null, $suplink=null, $selfuri=null, $logo=null) { $this->initDocument('atom'); @@ -628,6 +639,10 @@ class ApiAction extends Action $this->element('id', null, $id); $this->element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), null); + if (!is_null($logo)) { + $this->element('logo',null,$logo); + } + if (!is_null($suplink)) { # For FriendFeed's SUP protocol $this->element('link', array('rel' => 'http://api.friendfeed.com/2008/03#sup', -- cgit v1.2.3-54-g00ecf From 78a649ca0af3ffbf1fd23d5ae9e84def7befa79e Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sat, 12 Dec 2009 18:21:57 +0100 Subject: Localisation updates for !StatusNet from !translatewiki.net !sntrans * add Egyptian Spoken Arabic (arz) --- lib/language.php | 1 + locale/arz/LC_MESSAGES/statusnet.po | 5214 +++++++++++++++++++++++++++++++++++ 2 files changed, 5215 insertions(+) create mode 100644 locale/arz/LC_MESSAGES/statusnet.po (limited to 'lib') diff --git a/lib/language.php b/lib/language.php index 916cee7ed..c037d30c3 100644 --- a/lib/language.php +++ b/lib/language.php @@ -272,6 +272,7 @@ function get_nice_language_list() function get_all_languages() { return array( 'ar' => array('q' => 0.8, 'lang' => 'ar', 'name' => 'Arabic', 'direction' => 'rtl'), + 'arz' => array('q' => 0.8, 'lang' => 'arz', 'name' => 'Egyptian Spoken Arabic', 'direction' => 'rtl'), 'bg' => array('q' => 0.8, 'lang' => 'bg', 'name' => 'Bulgarian', 'direction' => 'ltr'), 'ca' => array('q' => 0.5, 'lang' => 'ca', 'name' => 'Catalan', 'direction' => 'ltr'), 'cs' => array('q' => 0.5, 'lang' => 'cs', 'name' => 'Czech', 'direction' => 'ltr'), diff --git a/locale/arz/LC_MESSAGES/statusnet.po b/locale/arz/LC_MESSAGES/statusnet.po new file mode 100644 index 000000000..6a2ccdf61 --- /dev/null +++ b/locale/arz/LC_MESSAGES/statusnet.po @@ -0,0 +1,5214 @@ +# Translation of StatusNet to Egyptian Spoken Arabic +# +# Author@translatewiki.net: Meno25 +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-12 17:09+0000\n" +"PO-Revision-Date: 2009-12-12 17:09:12+0000\n" +"Language-Team: Arabic\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: MediaWiki 1.16alpha (r59992); Translate extension (2009-12-06)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: arz\n" +"X-Message-Group: out-statusnet\n" +"Plural-Forms: nplurals=6; plural= n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " +"&& n%100<=10 ? 3 : n%100>=11 && n%100<=99 ? 4 : 5;\n" + +#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 +#: actions/showfavorites.php:137 actions/tag.php:51 +msgid "No such page" +msgstr "لا صفحه كهذه" + +#: actions/all.php:74 actions/allrss.php:68 +#: actions/apiaccountupdatedeliverydevice.php:113 +#: actions/apiaccountupdateprofile.php:105 +#: actions/apiaccountupdateprofilebackgroundimage.php:116 +#: actions/apiaccountupdateprofileimage.php:105 actions/apiblockcreate.php:97 +#: actions/apiblockdestroy.php:96 actions/apidirectmessage.php:77 +#: actions/apidirectmessagenew.php:75 actions/apigroupcreate.php:112 +#: actions/apigroupismember.php:90 actions/apigroupjoin.php:99 +#: actions/apigroupleave.php:99 actions/apigrouplist.php:90 +#: actions/apistatusesupdate.php:144 actions/apisubscriptions.php:87 +#: actions/apitimelinefavorites.php:70 actions/apitimelinefriends.php:79 +#: actions/apitimelinementions.php:79 actions/apitimelineuser.php:81 +#: actions/avatarbynickname.php:75 actions/favoritesrss.php:74 +#: actions/foaf.php:40 actions/foaf.php:58 actions/microsummary.php:62 +#: actions/newmessage.php:116 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:311 +#: lib/command.php:364 lib/command.php:411 lib/command.php:467 +#: lib/galleryaction.php:59 lib/mailbox.php:82 lib/profileaction.php:77 +#: lib/subs.php:34 lib/subs.php:116 +msgid "No such user." +msgstr "لا مستخدم كهذا." + +#: actions/all.php:84 +#, php-format +msgid "%s and friends, page %d" +msgstr "" + +#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#: actions/apitimelinefriends.php:115 lib/personalgroupnav.php:100 +#, php-format +msgid "%s and friends" +msgstr "%s والأصدقاء" + +#: actions/all.php:99 +#, php-format +msgid "Feed for friends of %s (RSS 1.0)" +msgstr "" + +#: actions/all.php:107 +#, php-format +msgid "Feed for friends of %s (RSS 2.0)" +msgstr "" + +#: actions/all.php:115 +#, php-format +msgid "Feed for friends of %s (Atom)" +msgstr "" + +#: actions/all.php:127 +#, php-format +msgid "" +"This is the timeline for %s and friends but no one has posted anything yet." +msgstr "" + +#: actions/all.php:132 +#, php-format +msgid "" +"Try subscribing to more people, [join a group](%%action.groups%%) or post " +"something yourself." +msgstr "" + +#: actions/all.php:134 +#, php-format +msgid "" +"You can try to [nudge %s](../%s) from his profile or [post something to his " +"or her attention](%%%%action.newnotice%%%%?status_textarea=%s)." +msgstr "" + +#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:202 +#, php-format +msgid "" +"Why not [register an account](%%%%action.register%%%%) and then nudge %s or " +"post a notice to his or her attention." +msgstr "" + +#: actions/all.php:165 +msgid "You and friends" +msgstr "أنت والأصدقاء" + +#: actions/allrss.php:119 actions/apitimelinefriends.php:122 +#, php-format +msgid "Updates from %1$s and friends on %2$s!" +msgstr "" + +#: actions/apiaccountratelimitstatus.php:70 +#: actions/apiaccountupdatedeliverydevice.php:93 +#: actions/apiaccountupdateprofile.php:97 +#: actions/apiaccountupdateprofilebackgroundimage.php:94 +#: actions/apiaccountupdateprofilecolors.php:118 +#, fuzzy +msgid "API method not found." +msgstr "لم يوجد رمز التأكيد." + +#: actions/apiaccountupdatedeliverydevice.php:85 +#: actions/apiaccountupdateprofile.php:89 +#: actions/apiaccountupdateprofilebackgroundimage.php:86 +#: actions/apiaccountupdateprofilecolors.php:110 +#: actions/apiaccountupdateprofileimage.php:84 actions/apiblockcreate.php:89 +#: actions/apiblockdestroy.php:88 actions/apidirectmessagenew.php:117 +#: actions/apifavoritecreate.php:90 actions/apifavoritedestroy.php:91 +#: actions/apifriendshipscreate.php:91 actions/apifriendshipsdestroy.php:91 +#: actions/apigroupcreate.php:104 actions/apigroupjoin.php:91 +#: actions/apigroupleave.php:91 actions/apistatusesupdate.php:114 +msgid "This method requires a POST." +msgstr "تتطلب هذه الطريقه POST." + +#: actions/apiaccountupdatedeliverydevice.php:105 +msgid "" +"You must specify a parameter named 'device' with a value of one of: sms, im, " +"none" +msgstr "" + +#: actions/apiaccountupdatedeliverydevice.php:132 +msgid "Could not update user." +msgstr "تعذّر تحديث المستخدم." + +#: actions/apiaccountupdateprofile.php:112 +#: actions/apiaccountupdateprofilebackgroundimage.php:194 +#: actions/apiaccountupdateprofilecolors.php:185 +#: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 +#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +msgid "User has no profile." +msgstr "ليس للمستخدم ملف شخصى." + +#: actions/apiaccountupdateprofile.php:147 +#, fuzzy +msgid "Could not save profile." +msgstr "تعذّر حفظ الملف الشخصى." + +#: actions/apiaccountupdateprofilebackgroundimage.php:108 +#: actions/apiaccountupdateprofileimage.php:97 +#: actions/apistatusesupdate.php:127 actions/avatarsettings.php:257 +#: actions/designadminpanel.php:122 actions/newnotice.php:94 +#: lib/designsettings.php:283 +#, php-format +msgid "" +"The server was unable to handle that much POST data (%s bytes) due to its " +"current configuration." +msgstr "" + +#: actions/apiaccountupdateprofilebackgroundimage.php:136 +#: actions/apiaccountupdateprofilebackgroundimage.php:146 +#: actions/apiaccountupdateprofilecolors.php:164 +#: actions/apiaccountupdateprofilecolors.php:174 +msgid "Unable to save your design settings." +msgstr "" + +#: actions/apiaccountupdateprofilebackgroundimage.php:187 +#: actions/apiaccountupdateprofilecolors.php:142 +msgid "Could not update your design." +msgstr "تعذّر تحديث تصميمك." + +#: actions/apiblockcreate.php:105 +#, fuzzy +msgid "You cannot block yourself!" +msgstr "لا يمكنك حذف المستخدمين." + +#: actions/apiblockcreate.php:119 +msgid "Block user failed." +msgstr "فشل منع المستخدم." + +#: actions/apiblockdestroy.php:107 +msgid "Unblock user failed." +msgstr "فشل إلغاء منع المستخدم." + +#: actions/apidirectmessage.php:89 +#, php-format +msgid "Direct messages from %s" +msgstr "رسائل مباشره من %s" + +#: actions/apidirectmessage.php:93 +#, php-format +msgid "All the direct messages sent from %s" +msgstr "" + +#: actions/apidirectmessage.php:101 +#, php-format +msgid "Direct messages to %s" +msgstr "رساله مباشره %s" + +#: actions/apidirectmessage.php:105 +#, php-format +msgid "All the direct messages sent to %s" +msgstr "" + +#: actions/apidirectmessage.php:156 actions/apifavoritecreate.php:99 +#: actions/apifavoritedestroy.php:100 actions/apifriendshipscreate.php:100 +#: actions/apifriendshipsdestroy.php:100 actions/apifriendshipsshow.php:129 +#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114 +#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141 +#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120 +#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105 +#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102 +#: actions/apistatusesshow.php:108 actions/apistatusnetconfig.php:133 +#: actions/apistatusnetversion.php:93 actions/apisubscriptions.php:111 +#: actions/apitimelinefavorites.php:146 actions/apitimelinefriends.php:156 +#: actions/apitimelinegroup.php:150 actions/apitimelinementions.php:151 +#: actions/apitimelinepublic.php:131 actions/apitimelinetag.php:141 +#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +msgid "API method not found!" +msgstr "" + +#: actions/apidirectmessagenew.php:126 +msgid "No message text!" +msgstr "لا نص فى الرسالة!" + +#: actions/apidirectmessagenew.php:135 actions/newmessage.php:150 +#, php-format +msgid "That's too long. Max message size is %d chars." +msgstr "" + +#: actions/apidirectmessagenew.php:146 +msgid "Recipient user not found." +msgstr "لم يُعثر على المستخدم المستلم." + +#: actions/apidirectmessagenew.php:150 +msgid "Can't send direct messages to users who aren't your friend." +msgstr "" + +#: actions/apifavoritecreate.php:108 actions/apifavoritedestroy.php:109 +#: actions/apistatusesdestroy.php:113 +msgid "No status found with that ID." +msgstr "" + +#: actions/apifavoritecreate.php:119 +msgid "This status is already a favorite!" +msgstr "" + +#: actions/apifavoritecreate.php:130 actions/favor.php:84 lib/command.php:176 +msgid "Could not create favorite." +msgstr "تعذّر إنشاء مفضله." + +#: actions/apifavoritedestroy.php:122 +msgid "That status is not a favorite!" +msgstr "تلك الحاله ليست مفضلة!" + +#: actions/apifavoritedestroy.php:134 actions/disfavor.php:87 +msgid "Could not delete favorite." +msgstr "تعذّر حذف المفضله." + +#: actions/apifriendshipscreate.php:109 +msgid "Could not follow user: User not found." +msgstr "" + +#: actions/apifriendshipscreate.php:118 +#, php-format +msgid "Could not follow user: %s is already on your list." +msgstr "" + +#: actions/apifriendshipsdestroy.php:109 +msgid "Could not unfollow user: User not found." +msgstr "" + +#: actions/apifriendshipsdestroy.php:120 +msgid "You cannot unfollow yourself!" +msgstr "" + +#: actions/apifriendshipsexists.php:94 +msgid "Two user ids or screen_names must be supplied." +msgstr "" + +#: actions/apifriendshipsshow.php:135 +msgid "Could not determine source user." +msgstr "" + +#: actions/apifriendshipsshow.php:143 +msgid "Could not find target user." +msgstr "تعذّر إيجاد المستخدم الهدف." + +#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/newgroup.php:126 actions/profilesettings.php:208 +#: actions/register.php:205 +msgid "Nickname must have only lowercase letters and numbers and no spaces." +msgstr "" + +#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/newgroup.php:130 actions/profilesettings.php:231 +#: actions/register.php:208 +msgid "Nickname already in use. Try another one." +msgstr "" + +#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/newgroup.php:133 actions/profilesettings.php:211 +#: actions/register.php:210 +msgid "Not a valid nickname." +msgstr "ليس اسمًا مستعارًا صحيحًا." + +#: actions/apigroupcreate.php:196 actions/editgroup.php:195 +#: actions/newgroup.php:139 actions/profilesettings.php:215 +#: actions/register.php:217 +msgid "Homepage is not a valid URL." +msgstr "الصفحه الرئيسيه ليست عنونًا صالحًا." + +#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/newgroup.php:142 actions/profilesettings.php:218 +#: actions/register.php:220 +msgid "Full name is too long (max 255 chars)." +msgstr "الاسم الكامل طويل جدا (الأقصى 255 حرفًا)" + +#: actions/apigroupcreate.php:213 +#, php-format +msgid "Description is too long (max %d chars)." +msgstr "" + +#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/newgroup.php:148 actions/profilesettings.php:225 +#: actions/register.php:227 +msgid "Location is too long (max 255 chars)." +msgstr "" + +#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/newgroup.php:159 +#, php-format +msgid "Too many aliases! Maximum %d." +msgstr "" + +#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/newgroup.php:168 +#, php-format +msgid "Invalid alias: \"%s\"" +msgstr "كنيه غير صالحة: \"%s\"" + +#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/newgroup.php:172 +#, php-format +msgid "Alias \"%s\" already in use. Try another one." +msgstr "" + +#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/newgroup.php:178 +msgid "Alias can't be the same as nickname." +msgstr "" + +#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104 +#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91 +#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91 +msgid "Group not found!" +msgstr "لم توجد المجموعة!" + +#: actions/apigroupjoin.php:110 +msgid "You are already a member of that group." +msgstr "" + +#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +msgid "You have been blocked from that group by the admin." +msgstr "" + +#: actions/apigroupjoin.php:138 +#, php-format +msgid "Could not join user %s to group %s." +msgstr "" + +#: actions/apigroupleave.php:114 +msgid "You are not a member of this group." +msgstr "" + +#: actions/apigroupleave.php:124 +#, php-format +msgid "Could not remove user %s to group %s." +msgstr "" + +#: actions/apigrouplist.php:95 +#, php-format +msgid "%s's groups" +msgstr "مجموعات %s" + +#: actions/apigrouplist.php:103 +#, php-format +msgid "Groups %s is a member of on %s." +msgstr "" + +#: actions/apigrouplistall.php:90 actions/usergroups.php:62 +#, php-format +msgid "%s groups" +msgstr "مجموعات %s" + +#: actions/apigrouplistall.php:94 +#, php-format +msgid "groups on %s" +msgstr "مجموعات %s" + +#: actions/apistatusesdestroy.php:107 +msgid "This method requires a POST or DELETE." +msgstr "" + +#: actions/apistatusesdestroy.php:130 +msgid "You may not delete another user's status." +msgstr "" + +#: actions/apistatusesshow.php:138 +msgid "Status deleted." +msgstr "حُذِفت الحاله." + +#: actions/apistatusesshow.php:144 +msgid "No status with that ID found." +msgstr "" + +#: actions/apistatusesupdate.php:157 actions/newnotice.php:155 +#: scripts/maildaemon.php:71 +#, php-format +msgid "That's too long. Max notice size is %d chars." +msgstr "" + +#: actions/apistatusesupdate.php:198 +msgid "Not found" +msgstr "لم يوجد" + +#: actions/apistatusesupdate.php:227 actions/newnotice.php:183 +#, php-format +msgid "Max notice size is %d chars, including attachment URL." +msgstr "" + +#: actions/apisubscriptions.php:231 actions/apisubscriptions.php:261 +msgid "Unsupported format." +msgstr "نسق غير مدعوم." + +#: actions/apitimelinefavorites.php:108 +#, php-format +msgid "%s / Favorites from %s" +msgstr "" + +#: actions/apitimelinefavorites.php:120 +#, php-format +msgid "%s updates favorited by %s / %s." +msgstr "" + +#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 +#: actions/grouprss.php:131 actions/userrss.php:90 +#, php-format +msgid "%s timeline" +msgstr "مسار %s الزمني" + +#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126 +#: actions/userrss.php:92 +#, php-format +msgid "Updates from %1$s on %2$s!" +msgstr "" + +#: actions/apitimelinementions.php:117 +#, php-format +msgid "%1$s / Updates mentioning %2$s" +msgstr "" + +#: actions/apitimelinementions.php:127 +#, php-format +msgid "%1$s updates that reply to updates from %2$s / %3$s." +msgstr "" + +#: actions/apitimelinepublic.php:107 actions/publicrss.php:103 +#, php-format +msgid "%s public timeline" +msgstr "مسار %s الزمنى العام" + +#: actions/apitimelinepublic.php:111 actions/publicrss.php:105 +#, php-format +msgid "%s updates from everyone!" +msgstr "" + +#: actions/apitimelinetag.php:102 actions/tag.php:66 +#, php-format +msgid "Notices tagged with %s" +msgstr "الإشعارات الموسومه ب%s" + +#: actions/apitimelinetag.php:108 actions/tagrss.php:64 +#, php-format +msgid "Updates tagged with %1$s on %2$s!" +msgstr "" + +#: actions/apiusershow.php:96 +msgid "Not found." +msgstr "لم يوجد." + +#: actions/attachment.php:73 +msgid "No such attachment." +msgstr "لا مرفق كهذا." + +#: actions/avatarbynickname.php:59 actions/leavegroup.php:76 +msgid "No nickname." +msgstr "لا اسم مستعار." + +#: actions/avatarbynickname.php:64 +msgid "No size." +msgstr "لا حجم." + +#: actions/avatarbynickname.php:69 +msgid "Invalid size." +msgstr "حجم غير صالح." + +#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: lib/accountsettingsaction.php:112 +msgid "Avatar" +msgstr "أفتار" + +#: actions/avatarsettings.php:78 +#, php-format +msgid "You can upload your personal avatar. The maximum file size is %s." +msgstr "" + +#: actions/avatarsettings.php:106 actions/avatarsettings.php:185 +#: actions/grouplogo.php:178 actions/remotesubscribe.php:191 +#: actions/userauthorization.php:72 actions/userrss.php:103 +msgid "User without matching profile" +msgstr "" + +#: actions/avatarsettings.php:119 actions/avatarsettings.php:197 +#: actions/grouplogo.php:251 +msgid "Avatar settings" +msgstr "إعدادات الأفتار" + +#: actions/avatarsettings.php:127 actions/avatarsettings.php:205 +#: actions/grouplogo.php:199 actions/grouplogo.php:259 +msgid "Original" +msgstr "الأصلي" + +#: actions/avatarsettings.php:142 actions/avatarsettings.php:217 +#: actions/grouplogo.php:210 actions/grouplogo.php:271 +msgid "Preview" +msgstr "عاين" + +#: actions/avatarsettings.php:149 lib/deleteuserform.php:66 +#: lib/noticelist.php:550 +msgid "Delete" +msgstr "احذف" + +#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +msgid "Upload" +msgstr "ارفع" + +#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +msgid "Crop" +msgstr "" + +#: actions/avatarsettings.php:268 actions/disfavor.php:74 +#: actions/emailsettings.php:238 actions/favor.php:75 +#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupunblock.php:66 actions/imsettings.php:206 +#: actions/invite.php:56 actions/login.php:135 actions/makeadmin.php:66 +#: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 +#: actions/othersettings.php:145 actions/passwordsettings.php:138 +#: actions/profilesettings.php:187 actions/recoverpassword.php:337 +#: actions/register.php:165 actions/remotesubscribe.php:77 +#: actions/smssettings.php:228 actions/subedit.php:38 actions/subscribe.php:46 +#: actions/tagother.php:166 actions/unsubscribe.php:69 +#: actions/userauthorization.php:52 lib/designsettings.php:294 +msgid "There was a problem with your session token. Try again, please." +msgstr "" + +#: actions/avatarsettings.php:281 actions/designadminpanel.php:103 +#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/imsettings.php:220 actions/recoverpassword.php:44 +#: actions/smssettings.php:248 lib/designsettings.php:304 +msgid "Unexpected form submission." +msgstr "" + +#: actions/avatarsettings.php:328 +msgid "Pick a square area of the image to be your avatar" +msgstr "" + +#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +msgid "Lost our file data." +msgstr "" + +#: actions/avatarsettings.php:366 +msgid "Avatar updated." +msgstr "رُفع الأفتار." + +#: actions/avatarsettings.php:369 +msgid "Failed updating avatar." +msgstr "فشل تحديث الأفتار." + +#: actions/avatarsettings.php:393 +msgid "Avatar deleted." +msgstr "حُذف الأفتار." + +#: actions/block.php:69 +msgid "You already blocked that user." +msgstr "لقد منعت مسبقا هذا المستخدم." + +#: actions/block.php:105 actions/block.php:128 actions/groupblock.php:160 +msgid "Block user" +msgstr "امنع المستخدم" + +#: actions/block.php:130 +msgid "" +"Are you sure you want to block this user? Afterwards, they will be " +"unsubscribed from you, unable to subscribe to you in the future, and you " +"will not be notified of any @-replies from them." +msgstr "" + +#: actions/block.php:143 actions/deletenotice.php:145 +#: actions/deleteuser.php:147 actions/groupblock.php:178 +msgid "No" +msgstr "لا" + +#: actions/block.php:143 actions/deleteuser.php:147 +msgid "Do not block this user" +msgstr "لا تمنع هذا المستخدم" + +#: actions/block.php:144 actions/deletenotice.php:146 +#: actions/deleteuser.php:148 actions/groupblock.php:179 +msgid "Yes" +msgstr "نعم" + +#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +msgid "Block this user" +msgstr "امنع هذا المستخدم" + +#: actions/block.php:162 +msgid "Failed to save block information." +msgstr "فشل حفظ معلومات المنع." + +#: actions/blockedfromgroup.php:73 actions/editgroup.php:84 +#: actions/groupdesignsettings.php:84 actions/grouplogo.php:86 +#: actions/groupmembers.php:76 actions/grouprss.php:91 +#: actions/joingroup.php:76 actions/showgroup.php:121 +msgid "No nickname" +msgstr "لا اسم مستعار" + +#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 +#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 +#: actions/grouplogo.php:99 actions/groupmembers.php:83 +#: actions/grouprss.php:98 actions/joingroup.php:83 actions/showgroup.php:137 +msgid "No such group" +msgstr "لا مجموعه كهذه" + +#: actions/blockedfromgroup.php:90 +#, php-format +msgid "%s blocked profiles" +msgstr "" + +#: actions/blockedfromgroup.php:93 +#, php-format +msgid "%s blocked profiles, page %d" +msgstr "" + +#: actions/blockedfromgroup.php:108 +msgid "A list of the users blocked from joining this group." +msgstr "" + +#: actions/blockedfromgroup.php:281 +msgid "Unblock user from group" +msgstr "ألغ منع المستخدم من المجموعة" + +#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +msgid "Unblock" +msgstr "ألغِ المنع" + +#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +msgid "Unblock this user" +msgstr "ألغِ منع هذا المستخدم" + +#: actions/bookmarklet.php:50 +msgid "Post to " +msgstr "" + +#: actions/confirmaddress.php:75 +msgid "No confirmation code." +msgstr "لا رمز تأكيد." + +#: actions/confirmaddress.php:80 +msgid "Confirmation code not found." +msgstr "لم يوجد رمز التأكيد." + +#: actions/confirmaddress.php:85 +msgid "That confirmation code is not for you!" +msgstr "رمز التأكيد ليس لك!" + +#: actions/confirmaddress.php:90 +#, php-format +msgid "Unrecognized address type %s" +msgstr "" + +#: actions/confirmaddress.php:94 +msgid "That address has already been confirmed." +msgstr "" + +#: actions/confirmaddress.php:114 actions/emailsettings.php:296 +#: actions/emailsettings.php:427 actions/imsettings.php:258 +#: actions/imsettings.php:401 actions/othersettings.php:174 +#: actions/profilesettings.php:276 actions/smssettings.php:278 +#: actions/smssettings.php:420 +msgid "Couldn't update user." +msgstr "تعذّر تحديث المستخدم." + +#: actions/confirmaddress.php:126 actions/emailsettings.php:391 +#: actions/imsettings.php:363 actions/smssettings.php:382 +msgid "Couldn't delete email confirmation." +msgstr "تعذّر حذف تأكيد البريد الإلكترونى." + +#: actions/confirmaddress.php:144 +msgid "Confirm Address" +msgstr "عنوان التأكيد" + +#: actions/confirmaddress.php:159 +#, php-format +msgid "The address \"%s\" has been confirmed for your account." +msgstr "" + +#: actions/conversation.php:99 +msgid "Conversation" +msgstr "محادثة" + +#: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87 +#: lib/profileaction.php:216 lib/searchgroupnav.php:82 +msgid "Notices" +msgstr "الإشعارات" + +#: actions/deletenotice.php:52 actions/shownotice.php:92 +msgid "No such notice." +msgstr "لا إشعار كهذا." + +#: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 +#: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 +#: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 +#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:30 +#: actions/unsubscribe.php:52 lib/adminpanelaction.php:72 +#: lib/profileformaction.php:63 lib/settingsaction.php:72 +msgid "Not logged in." +msgstr "لست والجًا." + +#: actions/deletenotice.php:71 +msgid "Can't delete this notice." +msgstr "تعذّر حذف هذا الإشعار." + +#: actions/deletenotice.php:103 +msgid "" +"You are about to permanently delete a notice. Once this is done, it cannot " +"be undone." +msgstr "" + +#: actions/deletenotice.php:109 actions/deletenotice.php:141 +msgid "Delete notice" +msgstr "احذف الإشعار" + +#: actions/deletenotice.php:144 +msgid "Are you sure you want to delete this notice?" +msgstr "أمتأكد من أنك تريد حذف هذا الإشعار؟" + +#: actions/deletenotice.php:145 +msgid "Do not delete this notice" +msgstr "لا تحذف هذا الإشعار" + +#: actions/deletenotice.php:146 lib/noticelist.php:550 +msgid "Delete this notice" +msgstr "احذف هذا الإشعار" + +#: actions/deletenotice.php:157 +msgid "There was a problem with your session token. Try again, please." +msgstr "" + +#: actions/deleteuser.php:67 +msgid "You cannot delete users." +msgstr "لا يمكنك حذف المستخدمين." + +#: actions/deleteuser.php:74 +msgid "You can only delete local users." +msgstr "يمكنك حذف المستخدمين المحليين فقط." + +#: actions/deleteuser.php:110 actions/deleteuser.php:133 +msgid "Delete user" +msgstr "احذف المستخدم" + +#: actions/deleteuser.php:135 +msgid "" +"Are you sure you want to delete this user? This will clear all data about " +"the user from the database, without a backup." +msgstr "" + +#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +msgid "Delete this user" +msgstr "احذف هذا المستخدم" + +#: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 +#: lib/adminpanelaction.php:302 lib/groupnav.php:119 +msgid "Design" +msgstr "التصميم" + +#: actions/designadminpanel.php:73 +msgid "Design settings for this StatusNet site." +msgstr "" + +#: actions/designadminpanel.php:275 +msgid "Invalid logo URL." +msgstr "مسار شعار غير صالح." + +#: actions/designadminpanel.php:279 +#, php-format +msgid "Theme not available: %s" +msgstr "السمه غير متوفرة: %s" + +#: actions/designadminpanel.php:375 +msgid "Change logo" +msgstr "غيّر الشعار" + +#: actions/designadminpanel.php:380 +msgid "Site logo" +msgstr "شعار الموقع" + +#: actions/designadminpanel.php:387 +msgid "Change theme" +msgstr "غيّر السمة" + +#: actions/designadminpanel.php:404 +msgid "Site theme" +msgstr "سمه الموقع" + +#: actions/designadminpanel.php:405 +msgid "Theme for the site." +msgstr "سمه الموقع." + +#: actions/designadminpanel.php:417 lib/designsettings.php:101 +msgid "Change background image" +msgstr "تغيير صوره الخلفية" + +#: actions/designadminpanel.php:422 actions/designadminpanel.php:497 +#: lib/designsettings.php:178 +msgid "Background" +msgstr "الخلفية" + +#: actions/designadminpanel.php:427 +#, php-format +msgid "" +"You can upload a background image for the site. The maximum file size is %1" +"$s." +msgstr "" + +#: actions/designadminpanel.php:457 lib/designsettings.php:139 +msgid "On" +msgstr "مكّن" + +#: actions/designadminpanel.php:473 lib/designsettings.php:155 +msgid "Off" +msgstr "عطّل" + +#: actions/designadminpanel.php:474 lib/designsettings.php:156 +msgid "Turn background image on or off." +msgstr "مكّن صوره الخلفيه أو عطّلها." + +#: actions/designadminpanel.php:479 lib/designsettings.php:161 +msgid "Tile background image" +msgstr "" + +#: actions/designadminpanel.php:488 lib/designsettings.php:170 +msgid "Change colours" +msgstr "تغيير الألوان" + +#: actions/designadminpanel.php:510 lib/designsettings.php:191 +msgid "Content" +msgstr "المحتوى" + +#: actions/designadminpanel.php:523 lib/designsettings.php:204 +msgid "Sidebar" +msgstr "الشريط الجانبي" + +#: actions/designadminpanel.php:536 lib/designsettings.php:217 +msgid "Text" +msgstr "النص" + +#: actions/designadminpanel.php:549 lib/designsettings.php:230 +msgid "Links" +msgstr "وصلات" + +#: actions/designadminpanel.php:577 lib/designsettings.php:247 +msgid "Use defaults" +msgstr "استخدم المبدئيات" + +#: actions/designadminpanel.php:578 lib/designsettings.php:248 +msgid "Restore default designs" +msgstr "استعد التصميمات المبدئية" + +#: actions/designadminpanel.php:584 lib/designsettings.php:254 +msgid "Reset back to default" +msgstr "ارجع إلى المبدئي" + +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:296 actions/profilesettings.php:167 +#: actions/siteadminpanel.php:421 actions/smssettings.php:181 +#: actions/subscriptions.php:203 actions/tagother.php:154 +#: actions/useradminpanel.php:313 lib/designsettings.php:256 +#: lib/groupeditform.php:202 +msgid "Save" +msgstr "أرسل" + +#: actions/designadminpanel.php:587 lib/designsettings.php:257 +msgid "Save design" +msgstr "احفظ التصميم" + +#: actions/disfavor.php:81 +msgid "This notice is not a favorite!" +msgstr "هذا الشعار ليس مفضلًا!" + +#: actions/disfavor.php:94 +msgid "Add to favorites" +msgstr "أضف إلى المفضلات" + +#: actions/doc.php:69 +msgid "No such document." +msgstr "لا مستند كهذا." + +#: actions/editgroup.php:56 +#, php-format +msgid "Edit %s group" +msgstr "عدّل مجموعه %s" + +#: actions/editgroup.php:68 actions/grouplogo.php:70 actions/newgroup.php:65 +msgid "You must be logged in to create a group." +msgstr "يجب أن تكون والجًا لتنشئ مجموعه." + +#: actions/editgroup.php:103 actions/editgroup.php:168 +#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +msgid "You must be an admin to edit the group" +msgstr "يجب أن تكون إداريًا لتعدّل المجموعة" + +#: actions/editgroup.php:154 +msgid "Use this form to edit the group." +msgstr "استخدم هذا النموذج لتعديل المجموعه." + +#: actions/editgroup.php:201 actions/newgroup.php:145 +#, php-format +msgid "description is too long (max %d chars)." +msgstr "" + +#: actions/editgroup.php:253 +msgid "Could not update group." +msgstr "تعذر تحديث المجموعه." + +#: actions/editgroup.php:259 classes/User_group.php:390 +msgid "Could not create aliases." +msgstr "تعذّر إنشاء الكنى." + +#: actions/editgroup.php:269 +msgid "Options saved." +msgstr "حُفظت الخيارات." + +#: actions/emailsettings.php:60 +msgid "Email Settings" +msgstr "إعدادات البريد الإلكتروني" + +#: actions/emailsettings.php:71 +#, php-format +msgid "Manage how you get email from %%site.name%%." +msgstr "أدر كيف تستلم البريد الإلكترونى من %%site.name%%." + +#: actions/emailsettings.php:100 actions/imsettings.php:100 +#: actions/smssettings.php:104 +msgid "Address" +msgstr "العنوان" + +#: actions/emailsettings.php:105 +msgid "Current confirmed email address." +msgstr "عنوان البريد الإلكترونى المُؤكد الحالى." + +#: actions/emailsettings.php:107 actions/emailsettings.php:140 +#: actions/imsettings.php:108 actions/smssettings.php:115 +#: actions/smssettings.php:158 +msgid "Remove" +msgstr "أزل" + +#: actions/emailsettings.php:113 +msgid "" +"Awaiting confirmation on this address. Check your inbox (and spam box!) for " +"a message with further instructions." +msgstr "" + +#: actions/emailsettings.php:117 actions/imsettings.php:120 +#: actions/smssettings.php:126 +msgid "Cancel" +msgstr "ألغِ" + +#: actions/emailsettings.php:121 +msgid "Email Address" +msgstr "عنوان البريد الإلكتروني" + +#: actions/emailsettings.php:123 +msgid "Email address, like \"UserName@example.org\"" +msgstr "عنوان البريد الإلكترونى، مثل \"UserName@example.org\"" + +#: actions/emailsettings.php:126 actions/imsettings.php:133 +#: actions/smssettings.php:145 +msgid "Add" +msgstr "أضف" + +#: actions/emailsettings.php:133 actions/smssettings.php:152 +msgid "Incoming email" +msgstr "البريد الإلكترونى الوارد" + +#: actions/emailsettings.php:138 actions/smssettings.php:157 +msgid "Send email to this address to post new notices." +msgstr "أرسل بريدًا إلكترونيًا إلى هذا العنوان لترسل إشعارات جديده." + +#: actions/emailsettings.php:145 actions/smssettings.php:162 +msgid "Make a new email address for posting to; cancels the old one." +msgstr "أنشئ عنوان بريد إلكترونى لترسل إليه؛ ألغِ القديم." + +#: actions/emailsettings.php:148 actions/smssettings.php:164 +msgid "New" +msgstr "جديد" + +#: actions/emailsettings.php:153 actions/imsettings.php:139 +#: actions/smssettings.php:169 +msgid "Preferences" +msgstr "التفضيلات" + +#: actions/emailsettings.php:158 +msgid "Send me notices of new subscriptions through email." +msgstr "أرسل لى إشعارات بالاشتراكات الجديده عبر البريد الإلكترونى." + +#: actions/emailsettings.php:163 +msgid "Send me email when someone adds my notice as a favorite." +msgstr "أرسل لى بريدًا إلكرتونيًا عندما يضيف أحدهم إشعارى مفضله." + +#: actions/emailsettings.php:169 +msgid "Send me email when someone sends me a private message." +msgstr "" + +#: actions/emailsettings.php:174 +msgid "Send me email when someone sends me an \"@-reply\"." +msgstr "أرسل لى بريدًا إلكترونيًا عندما يرسل لى أحدهم \"@-رد\"." + +#: actions/emailsettings.php:179 +msgid "Allow friends to nudge me and send me an email." +msgstr "" + +#: actions/emailsettings.php:185 +msgid "I want to post notices by email." +msgstr "أريد أن أرسل الملاحظات عبر البريد الإلكترونى." + +#: actions/emailsettings.php:191 +msgid "Publish a MicroID for my email address." +msgstr "" + +#: actions/emailsettings.php:302 actions/imsettings.php:264 +#: actions/othersettings.php:180 actions/smssettings.php:284 +msgid "Preferences saved." +msgstr "حُفِظت التفضيلات." + +#: actions/emailsettings.php:320 +msgid "No email address." +msgstr "لا عنوان بريد إلكترونى." + +#: actions/emailsettings.php:327 +msgid "Cannot normalize that email address" +msgstr "" + +#: actions/emailsettings.php:331 actions/siteadminpanel.php:158 +msgid "Not a valid email address" +msgstr "ليس عنوان بريد صالح" + +#: actions/emailsettings.php:334 +msgid "That is already your email address." +msgstr "هذا هو عنوان بريدك الإكترونى سابقًا." + +#: actions/emailsettings.php:337 +msgid "That email address already belongs to another user." +msgstr "هذا البريد الإلكترونى ملك مستخدم آخر بالفعل." + +#: actions/emailsettings.php:353 actions/imsettings.php:317 +#: actions/smssettings.php:337 +msgid "Couldn't insert confirmation code." +msgstr "تعذّر إدراج رمز التأكيد." + +#: actions/emailsettings.php:359 +msgid "" +"A confirmation code was sent to the email address you added. Check your " +"inbox (and spam box!) for the code and instructions on how to use it." +msgstr "" + +#: actions/emailsettings.php:379 actions/imsettings.php:351 +#: actions/smssettings.php:370 +msgid "No pending confirmation to cancel." +msgstr "" + +#: actions/emailsettings.php:383 actions/imsettings.php:355 +msgid "That is the wrong IM address." +msgstr "هذا عنوان محادثه فوريه خاطئ." + +#: actions/emailsettings.php:395 actions/imsettings.php:367 +#: actions/smssettings.php:386 +msgid "Confirmation cancelled." +msgstr "أُلغى التأكيد." + +#: actions/emailsettings.php:413 +msgid "That is not your email address." +msgstr "هذا ليس عنوان بريدك الإلكترونى." + +#: actions/emailsettings.php:432 actions/imsettings.php:408 +#: actions/smssettings.php:425 +msgid "The address was removed." +msgstr "أزيل هذا العنوان." + +#: actions/emailsettings.php:446 actions/smssettings.php:518 +msgid "No incoming email address." +msgstr "" + +#: actions/emailsettings.php:456 actions/emailsettings.php:478 +#: actions/smssettings.php:528 actions/smssettings.php:552 +msgid "Couldn't update user record." +msgstr "" + +#: actions/emailsettings.php:459 actions/smssettings.php:531 +msgid "Incoming email address removed." +msgstr "" + +#: actions/emailsettings.php:481 actions/smssettings.php:555 +msgid "New incoming email address added." +msgstr "" + +#: actions/favor.php:79 +msgid "This notice is already a favorite!" +msgstr "هذا الإشعار مفضله مسبقًا!" + +#: actions/favor.php:92 lib/disfavorform.php:140 +msgid "Disfavor favorite" +msgstr "ألغِ تفضيل المفضلة" + +#: actions/favorited.php:65 lib/popularnoticesection.php:88 +#: lib/publicgroupnav.php:93 +msgid "Popular notices" +msgstr "إشعارات مشهورة" + +#: actions/favorited.php:67 +#, php-format +msgid "Popular notices, page %d" +msgstr "إشعارات مشهوره، الصفحه %d" + +#: actions/favorited.php:79 +msgid "The most popular notices on the site right now." +msgstr "أشهر الإشعارات على الموقع حاليًا." + +#: actions/favorited.php:150 +msgid "Favorite notices appear on this page but no one has favorited one yet." +msgstr "" + +#: actions/favorited.php:153 +msgid "" +"Be the first to add a notice to your favorites by clicking the fave button " +"next to any notice you like." +msgstr "" + +#: actions/favorited.php:156 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to add a " +"notice to your favorites!" +msgstr "" + +#: actions/favoritesrss.php:111 actions/showfavorites.php:77 +#: lib/personalgroupnav.php:115 +#, php-format +msgid "%s's favorite notices" +msgstr "إشعارات %s المُفضلة" + +#: actions/favoritesrss.php:115 +#, php-format +msgid "Updates favored by %1$s on %2$s!" +msgstr "" + +#: actions/featured.php:69 lib/featureduserssection.php:87 +#: lib/publicgroupnav.php:89 +msgid "Featured users" +msgstr "مستخدمون مختارون" + +#: actions/featured.php:71 +#, php-format +msgid "Featured users, page %d" +msgstr "مستخدمون مختارون، صفحه %d" + +#: actions/featured.php:99 +#, php-format +msgid "A selection of some of the great users on %s" +msgstr "قسم للمستخدمين المتميزين على %s" + +#: actions/file.php:34 +msgid "No notice id" +msgstr "لا هويه إشعار" + +#: actions/file.php:38 +msgid "No notice" +msgstr "لا إشعار" + +#: actions/file.php:42 +msgid "No attachments" +msgstr "لا مرفقات" + +#: actions/file.php:51 +msgid "No uploaded attachments" +msgstr "لا مرفقات مرفوعة" + +#: actions/finishremotesubscribe.php:69 +msgid "Not expecting this response!" +msgstr "لم أتوقع هذا الرد!" + +#: actions/finishremotesubscribe.php:80 +msgid "User being listened to does not exist." +msgstr "المستخدم الذى تستمع إليه غير موجود." + +#: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59 +msgid "You can use the local subscription!" +msgstr "" + +#: actions/finishremotesubscribe.php:99 +msgid "That user has blocked you from subscribing." +msgstr "" + +#: actions/finishremotesubscribe.php:110 +msgid "You are not authorized." +msgstr "لا تملك تصريحًا." + +#: actions/finishremotesubscribe.php:113 +msgid "Could not convert request token to access token." +msgstr "" + +#: actions/finishremotesubscribe.php:118 +msgid "Remote service uses unknown version of OMB protocol." +msgstr "" + +#: actions/finishremotesubscribe.php:138 lib/oauthstore.php:306 +msgid "Error updating remote profile" +msgstr "خطأ أثناء تحديث الملف الشخصى البعيد" + +#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 +#: actions/groupunblock.php:86 actions/leavegroup.php:83 +#: actions/makeadmin.php:86 lib/command.php:212 lib/command.php:263 +msgid "No such group." +msgstr "لا مجموعه كهذه." + +#: actions/getfile.php:75 +msgid "No such file." +msgstr "لا ملف كهذا." + +#: actions/getfile.php:79 +msgid "Cannot read file." +msgstr "تعذّرت قراءه الملف." + +#: actions/groupblock.php:71 actions/groupunblock.php:71 +#: actions/makeadmin.php:71 actions/subedit.php:46 +#: lib/profileformaction.php:70 +msgid "No profile specified." +msgstr "لا ملف شخصى مُحدّد." + +#: actions/groupblock.php:76 actions/groupunblock.php:76 +#: actions/makeadmin.php:76 actions/subedit.php:53 actions/tagother.php:46 +#: lib/profileformaction.php:77 +msgid "No profile with that ID." +msgstr "لا ملف شخصى بهذه الهويه." + +#: actions/groupblock.php:81 actions/groupunblock.php:81 +#: actions/makeadmin.php:81 +msgid "No group specified." +msgstr "لا مجموعه مُحدّده." + +#: actions/groupblock.php:91 +msgid "Only an admin can block group members." +msgstr "" + +#: actions/groupblock.php:95 +msgid "User is already blocked from group." +msgstr "" + +#: actions/groupblock.php:100 +msgid "User is not a member of group." +msgstr "المستخدم ليس عضوًا فى المجموعه." + +#: actions/groupblock.php:136 actions/groupmembers.php:314 +msgid "Block user from group" +msgstr "امنع المستخدم من المجموعة" + +#: actions/groupblock.php:162 +#, php-format +msgid "" +"Are you sure you want to block user \"%s\" from the group \"%s\"? They will " +"be removed from the group, unable to post, and unable to subscribe to the " +"group in the future." +msgstr "" + +#: actions/groupblock.php:178 +msgid "Do not block this user from this group" +msgstr "لا تمنع هذا المستخدم من هذه المجموعة" + +#: actions/groupblock.php:179 +msgid "Block this user from this group" +msgstr "امنع هذا المستخدم من هذه المجموعة" + +#: actions/groupblock.php:196 +msgid "Database error blocking user from group." +msgstr "خطأ فى قاعده البيانات أثناء منع المستخدم من المجموعه." + +#: actions/groupbyid.php:74 +msgid "No ID" +msgstr "لا هوية" + +#: actions/groupdesignsettings.php:68 +msgid "You must be logged in to edit a group." +msgstr "يجب أن تلج لتُعدّل المجموعات." + +#: actions/groupdesignsettings.php:141 +msgid "Group design" +msgstr "تصميم المجموعة" + +#: actions/groupdesignsettings.php:152 +msgid "" +"Customize the way your group looks with a background image and a colour " +"palette of your choice." +msgstr "" + +#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: lib/designsettings.php:391 lib/designsettings.php:413 +msgid "Couldn't update your design." +msgstr "تعذّر تحديث تصميمك." + +#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 +#: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 +msgid "Unable to save your design settings!" +msgstr "" + +#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +msgid "Design preferences saved." +msgstr "" + +#: actions/grouplogo.php:139 actions/grouplogo.php:192 +msgid "Group logo" +msgstr "شعار المجموعة" + +#: actions/grouplogo.php:150 +#, php-format +msgid "" +"You can upload a logo image for your group. The maximum file size is %s." +msgstr "" + +#: actions/grouplogo.php:362 +msgid "Pick a square area of the image to be the logo." +msgstr "" + +#: actions/grouplogo.php:396 +msgid "Logo updated." +msgstr "حُدّث الشعار." + +#: actions/grouplogo.php:398 +msgid "Failed updating logo." +msgstr "فشل رفع الشعار." + +#: actions/groupmembers.php:93 lib/groupnav.php:92 +#, php-format +msgid "%s group members" +msgstr "أعضاء مجموعه %s" + +#: actions/groupmembers.php:96 +#, php-format +msgid "%s group members, page %d" +msgstr "" + +#: actions/groupmembers.php:111 +msgid "A list of the users in this group." +msgstr "قائمه بمستخدمى هذه المجموعه." + +#: actions/groupmembers.php:175 lib/action.php:440 lib/groupnav.php:107 +msgid "Admin" +msgstr "إداري" + +#: actions/groupmembers.php:346 lib/blockform.php:69 +msgid "Block" +msgstr "امنع" + +#: actions/groupmembers.php:441 +msgid "Make user an admin of the group" +msgstr "" + +#: actions/groupmembers.php:473 +msgid "Make Admin" +msgstr "" + +#: actions/groupmembers.php:473 +msgid "Make this user an admin" +msgstr "اجعل هذا المستخدم إداريًا" + +#: actions/grouprss.php:133 +#, php-format +msgid "Updates from members of %1$s on %2$s!" +msgstr "" + +#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230 +#: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98 +msgid "Groups" +msgstr "مجموعات" + +#: actions/groups.php:64 +#, php-format +msgid "Groups, page %d" +msgstr "المجموعات، صفحه %d" + +#: actions/groups.php:90 +#, php-format +msgid "" +"%%%%site.name%%%% groups let you find and talk with people of similar " +"interests. After you join a group you can send messages to all other members " +"using the syntax \"!groupname\". Don't see a group you like? Try [searching " +"for one](%%%%action.groupsearch%%%%) or [start your own!](%%%%action.newgroup" +"%%%%)" +msgstr "" + +#: actions/groups.php:107 actions/usergroups.php:124 lib/groupeditform.php:122 +msgid "Create a new group" +msgstr "أنشئ مجموعه جديدة" + +#: actions/groupsearch.php:52 +#, php-format +msgid "" +"Search for groups on %%site.name%% by their name, location, or description. " +"Separate the terms by spaces; they must be 3 characters or more." +msgstr "" + +#: actions/groupsearch.php:58 +msgid "Group search" +msgstr "بحث فى المجموعات" + +#: actions/groupsearch.php:79 actions/noticesearch.php:117 +#: actions/peoplesearch.php:83 +msgid "No results." +msgstr "لا نتائج." + +#: actions/groupsearch.php:82 +#, php-format +msgid "" +"If you can't find the group you're looking for, you can [create it](%%action." +"newgroup%%) yourself." +msgstr "" + +#: actions/groupsearch.php:85 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and [create the group](%%" +"action.newgroup%%) yourself!" +msgstr "" + +#: actions/groupunblock.php:91 +msgid "Only an admin can unblock group members." +msgstr "" + +#: actions/groupunblock.php:95 +msgid "User is not blocked from group." +msgstr "المستخدم ليس ممنوعًا من المجموعه." + +#: actions/groupunblock.php:128 actions/unblock.php:77 +msgid "Error removing the block." +msgstr "خطأ أثناء منع الحجب." + +#: actions/imsettings.php:59 +msgid "IM Settings" +msgstr "إعدادات المراسله الفورية" + +#: actions/imsettings.php:70 +#, php-format +msgid "" +"You can send and receive notices through Jabber/GTalk [instant messages](%%" +"doc.im%%). Configure your address and settings below." +msgstr "" + +#: actions/imsettings.php:89 +msgid "IM is not available." +msgstr "المراسله الفوريه غير متوفره." + +#: actions/imsettings.php:106 +msgid "Current confirmed Jabber/GTalk address." +msgstr "" + +#: actions/imsettings.php:114 +#, php-format +msgid "" +"Awaiting confirmation on this address. Check your Jabber/GTalk account for a " +"message with further instructions. (Did you add %s to your buddy list?)" +msgstr "" + +#: actions/imsettings.php:124 +msgid "IM Address" +msgstr "عنوان المراسله الفورية" + +#: actions/imsettings.php:126 +#, php-format +msgid "" +"Jabber or GTalk address, like \"UserName@example.org\". First, make sure to " +"add %s to your buddy list in your IM client or on GTalk." +msgstr "" + +#: actions/imsettings.php:143 +msgid "Send me notices through Jabber/GTalk." +msgstr "" + +#: actions/imsettings.php:148 +msgid "Post a notice when my Jabber/GTalk status changes." +msgstr "" + +#: actions/imsettings.php:153 +msgid "Send me replies through Jabber/GTalk from people I'm not subscribed to." +msgstr "" + +#: actions/imsettings.php:159 +msgid "Publish a MicroID for my Jabber/GTalk address." +msgstr "" + +#: actions/imsettings.php:285 +msgid "No Jabber ID." +msgstr "لا هويه جابر." + +#: actions/imsettings.php:292 +msgid "Cannot normalize that Jabber ID" +msgstr "" + +#: actions/imsettings.php:296 +msgid "Not a valid Jabber ID" +msgstr "ليست هويه جابر صالحة" + +#: actions/imsettings.php:299 +msgid "That is already your Jabber ID." +msgstr "" + +#: actions/imsettings.php:302 +msgid "Jabber ID already belongs to another user." +msgstr "" + +#: actions/imsettings.php:327 +#, php-format +msgid "" +"A confirmation code was sent to the IM address you added. You must approve %" +"s for sending messages to you." +msgstr "" + +#: actions/imsettings.php:387 +msgid "That is not your Jabber ID." +msgstr "هذه ليست هويتك فى جابر." + +#: actions/inbox.php:59 +#, php-format +msgid "Inbox for %s - page %d" +msgstr "" + +#: actions/inbox.php:62 +#, php-format +msgid "Inbox for %s" +msgstr "" + +#: actions/inbox.php:115 +msgid "This is your inbox, which lists your incoming private messages." +msgstr "" + +#: actions/invite.php:39 +msgid "Invites have been disabled." +msgstr "" + +#: actions/invite.php:41 +#, php-format +msgid "You must be logged in to invite other users to use %s" +msgstr "" + +#: actions/invite.php:72 +#, php-format +msgid "Invalid email address: %s" +msgstr "عنوان بريد إلكترونى غير صالح: %s" + +#: actions/invite.php:110 +msgid "Invitation(s) sent" +msgstr "أُرسلت الدعوة" + +#: actions/invite.php:112 +msgid "Invite new users" +msgstr "دعوه مستخدمين جدد" + +#: actions/invite.php:128 +msgid "You are already subscribed to these users:" +msgstr "" + +#: actions/invite.php:131 actions/invite.php:139 +#, php-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#: actions/invite.php:136 +msgid "" +"These people are already users and you were automatically subscribed to them:" +msgstr "" + +#: actions/invite.php:144 +msgid "Invitation(s) sent to the following people:" +msgstr "" + +#: actions/invite.php:150 +msgid "" +"You will be notified when your invitees accept the invitation and register " +"on the site. Thanks for growing the community!" +msgstr "" + +#: actions/invite.php:162 +msgid "" +"Use this form to invite your friends and colleagues to use this service." +msgstr "" + +#: actions/invite.php:187 +msgid "Email addresses" +msgstr "عناوين البريد الإلكتروني" + +#: actions/invite.php:189 +msgid "Addresses of friends to invite (one per line)" +msgstr "" + +#: actions/invite.php:192 +msgid "Personal message" +msgstr "رساله شخصية" + +#: actions/invite.php:194 +msgid "Optionally add a personal message to the invitation." +msgstr "" + +#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:222 +msgid "Send" +msgstr "أرسل" + +#: actions/invite.php:226 +#, php-format +msgid "%1$s has invited you to join them on %2$s" +msgstr "" + +#: actions/invite.php:228 +#, php-format +msgid "" +"%1$s has invited you to join them on %2$s (%3$s).\n" +"\n" +"%2$s is a micro-blogging service that lets you keep up-to-date with people " +"you know and people who interest you.\n" +"\n" +"You can also share news about yourself, your thoughts, or your life online " +"with people who know about you. It's also great for meeting new people who " +"share your interests.\n" +"\n" +"%1$s said:\n" +"\n" +"%4$s\n" +"\n" +"You can see %1$s's profile page on %2$s here:\n" +"\n" +"%5$s\n" +"\n" +"If you'd like to try the service, click on the link below to accept the " +"invitation.\n" +"\n" +"%6$s\n" +"\n" +"If not, you can ignore this message. Thanks for your patience and your " +"time.\n" +"\n" +"Sincerely, %2$s\n" +msgstr "" + +#: actions/joingroup.php:60 +msgid "You must be logged in to join a group." +msgstr "" + +#: actions/joingroup.php:90 lib/command.php:217 +msgid "You are already a member of that group" +msgstr "" + +#: actions/joingroup.php:128 lib/command.php:234 +#, php-format +msgid "Could not join user %s to group %s" +msgstr "" + +#: actions/joingroup.php:135 lib/command.php:239 +#, php-format +msgid "%s joined group %s" +msgstr "%s انضم إلى مجموعه %s" + +#: actions/leavegroup.php:60 +msgid "You must be logged in to leave a group." +msgstr "" + +#: actions/leavegroup.php:90 lib/command.php:268 +msgid "You are not a member of that group." +msgstr "لست عضوا فى تلك المجموعه." + +#: actions/leavegroup.php:119 lib/command.php:278 +msgid "Could not find membership record." +msgstr "" + +#: actions/leavegroup.php:127 lib/command.php:284 +#, php-format +msgid "Could not remove user %s to group %s" +msgstr "" + +#: actions/leavegroup.php:134 lib/command.php:289 +#, php-format +msgid "%s left group %s" +msgstr "" + +#: actions/login.php:83 actions/register.php:137 +msgid "Already logged in." +msgstr "والج بالفعل." + +#: actions/login.php:114 actions/login.php:124 +msgid "Invalid or expired token." +msgstr "" + +#: actions/login.php:147 +msgid "Incorrect username or password." +msgstr "اسم المستخدم أو كلمه السر غير صحيحان." + +#: actions/login.php:153 +msgid "Error setting user. You are probably not authorized." +msgstr "خطأ أثناء ضبط المستخدم. لست مُصرحًا على الأرجح." + +#: actions/login.php:208 actions/login.php:261 lib/action.php:458 +#: lib/logingroupnav.php:79 +msgid "Login" +msgstr "لُج" + +#: actions/login.php:247 +msgid "Login to site" +msgstr "لُج إلى الموقع" + +#: actions/login.php:250 actions/profilesettings.php:106 +#: actions/register.php:423 actions/showgroup.php:236 actions/tagother.php:94 +#: lib/groupeditform.php:152 lib/userprofile.php:131 +msgid "Nickname" +msgstr "الاسم المستعار" + +#: actions/login.php:253 actions/register.php:428 +#: lib/accountsettingsaction.php:116 +msgid "Password" +msgstr "كلمه السر" + +#: actions/login.php:256 actions/register.php:477 +msgid "Remember me" +msgstr "تذكّرني" + +#: actions/login.php:257 actions/register.php:479 +msgid "Automatically login in the future; not for shared computers!" +msgstr "" + +#: actions/login.php:267 +msgid "Lost or forgotten password?" +msgstr "أنسيت كلمه السر؟" + +#: actions/login.php:286 +msgid "" +"For security reasons, please re-enter your user name and password before " +"changing your settings." +msgstr "" + +#: actions/login.php:290 +#, php-format +msgid "" +"Login with your username and password. Don't have a username yet? [Register]" +"(%%action.register%%) a new account." +msgstr "" + +#: actions/makeadmin.php:91 +msgid "Only an admin can make another user an admin." +msgstr "" + +#: actions/makeadmin.php:95 +#, php-format +msgid "%s is already an admin for group \"%s\"." +msgstr "" + +#: actions/makeadmin.php:132 +#, php-format +msgid "Can't get membership record for %s in group %s" +msgstr "" + +#: actions/makeadmin.php:145 +#, php-format +msgid "Can't make %s an admin for group %s" +msgstr "" + +#: actions/microsummary.php:69 +msgid "No current status" +msgstr "لا حاله حالية" + +#: actions/newgroup.php:53 +msgid "New group" +msgstr "مجموعه جديدة" + +#: actions/newgroup.php:110 +msgid "Use this form to create a new group." +msgstr "استخدم هذا النموذج لإنشاء مجموعه جديده." + +#: actions/newmessage.php:71 actions/newmessage.php:231 +msgid "New message" +msgstr "رساله جديدة" + +#: actions/newmessage.php:121 actions/newmessage.php:161 lib/command.php:367 +msgid "You can't send a message to this user." +msgstr "" + +#: actions/newmessage.php:144 actions/newnotice.php:136 lib/command.php:351 +#: lib/command.php:424 +msgid "No content!" +msgstr "لا محتوى!" + +#: actions/newmessage.php:158 +msgid "No recipient specified." +msgstr "لا مستلم حُدّد." + +#: actions/newmessage.php:164 lib/command.php:370 +msgid "" +"Don't send a message to yourself; just say it to yourself quietly instead." +msgstr "" + +#: actions/newmessage.php:181 +msgid "Message sent" +msgstr "أُرسلت الرسالة" + +#: actions/newmessage.php:185 lib/command.php:375 +#, php-format +msgid "Direct message to %s sent" +msgstr "" + +#: actions/newmessage.php:210 actions/newnotice.php:242 lib/channel.php:170 +msgid "Ajax Error" +msgstr "خطأ أجاكس" + +#: actions/newnotice.php:69 +msgid "New notice" +msgstr "إشعار جديد" + +#: actions/newnotice.php:208 +msgid "Notice posted" +msgstr "أُرسل الإشعار" + +#: actions/noticesearch.php:68 +#, php-format +msgid "" +"Search for notices on %%site.name%% by their contents. Separate search terms " +"by spaces; they must be 3 characters or more." +msgstr "" + +#: actions/noticesearch.php:78 +msgid "Text search" +msgstr "بحث فى النصوص" + +#: actions/noticesearch.php:91 +#, php-format +msgid "Search results for \"%s\" on %s" +msgstr "نتائج البحث عن \"%s\" فى %s" + +#: actions/noticesearch.php:121 +#, php-format +msgid "" +"Be the first to [post on this topic](%%%%action.newnotice%%%%?" +"status_textarea=%s)!" +msgstr "" + +#: actions/noticesearch.php:124 +#, php-format +msgid "" +"Why not [register an account](%%%%action.register%%%%) and be the first to " +"[post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!" +msgstr "" + +#: actions/noticesearchrss.php:96 +#, php-format +msgid "Updates with \"%s\"" +msgstr "" + +#: actions/noticesearchrss.php:98 +#, php-format +msgid "Updates matching search term \"%1$s\" on %2$s!" +msgstr "" + +#: actions/nudge.php:85 +msgid "" +"This user doesn't allow nudges or hasn't confirmed or set his email yet." +msgstr "" + +#: actions/nudge.php:94 +msgid "Nudge sent" +msgstr "أرسل التنبيه" + +#: actions/nudge.php:97 +msgid "Nudge sent!" +msgstr "أُرسل التنبيه!" + +#: actions/oembed.php:79 actions/shownotice.php:100 +msgid "Notice has no profile" +msgstr "" + +#: actions/oembed.php:86 actions/shownotice.php:180 +#, php-format +msgid "%1$s's status on %2$s" +msgstr "" + +#: actions/oembed.php:157 +msgid "content type " +msgstr "نوع المحتوى " + +#: actions/oembed.php:160 +msgid "Only " +msgstr "" + +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1011 +#: lib/api.php:1039 lib/api.php:1149 +msgid "Not a supported data format." +msgstr "ليس نسق بيانات مدعوم." + +#: actions/opensearch.php:64 +msgid "People Search" +msgstr "بحث فى الأشخاص" + +#: actions/opensearch.php:67 +msgid "Notice Search" +msgstr "بحث الإشعارات" + +#: actions/othersettings.php:60 +msgid "Other Settings" +msgstr "إعدادات أخرى" + +#: actions/othersettings.php:71 +msgid "Manage various other options." +msgstr "أدر خيارات أخرى عديده." + +#: actions/othersettings.php:108 +msgid " (free service)" +msgstr " (خدمه حرة)" + +#: actions/othersettings.php:116 +msgid "Shorten URLs with" +msgstr "قصّر المسارات بـ" + +#: actions/othersettings.php:117 +msgid "Automatic shortening service to use." +msgstr "خدمه التقصير المطلوب استخدامها." + +#: actions/othersettings.php:122 +msgid "View profile designs" +msgstr "اعرض تصاميم الملف الشخصي" + +#: actions/othersettings.php:123 +msgid "Show or hide profile designs." +msgstr "أظهر أو أخفِ تصاميم الملفات الشخصيه." + +#: actions/othersettings.php:153 +msgid "URL shortening service is too long (max 50 chars)." +msgstr "" + +#: actions/outbox.php:58 +#, php-format +msgid "Outbox for %s - page %d" +msgstr "" + +#: actions/outbox.php:61 +#, php-format +msgid "Outbox for %s" +msgstr "" + +#: actions/outbox.php:116 +msgid "This is your outbox, which lists private messages you have sent." +msgstr "" + +#: actions/passwordsettings.php:58 +msgid "Change password" +msgstr "غيّر كلمه السر" + +#: actions/passwordsettings.php:69 +msgid "Change your password." +msgstr "غيّر كلمه سرك." + +#: actions/passwordsettings.php:96 actions/recoverpassword.php:231 +msgid "Password change" +msgstr "تغيير كلمه السر" + +#: actions/passwordsettings.php:104 +msgid "Old password" +msgstr "كلمه السر القديمة" + +#: actions/passwordsettings.php:108 actions/recoverpassword.php:235 +msgid "New password" +msgstr "كلمه سر جديدة" + +#: actions/passwordsettings.php:109 +msgid "6 or more characters" +msgstr "" + +#: actions/passwordsettings.php:112 actions/recoverpassword.php:239 +#: actions/register.php:432 actions/smssettings.php:134 +msgid "Confirm" +msgstr "أكّد" + +#: actions/passwordsettings.php:113 actions/recoverpassword.php:240 +msgid "Same as password above" +msgstr "نفس كلمه السر أعلاه" + +#: actions/passwordsettings.php:117 +msgid "Change" +msgstr "غيّر" + +#: actions/passwordsettings.php:154 actions/register.php:230 +msgid "Password must be 6 or more characters." +msgstr "يجب أن تكون كلمه السر 6 حروف أو أكثر." + +#: actions/passwordsettings.php:157 actions/register.php:233 +msgid "Passwords don't match." +msgstr "كلمتا السر غير متطابقتين." + +#: actions/passwordsettings.php:165 +msgid "Incorrect old password" +msgstr "كلمه السر القديمه غير صحيحة" + +#: actions/passwordsettings.php:181 +msgid "Error saving user; invalid." +msgstr "خطأ أثناء حفظ المستخدم؛ غير صالح." + +#: actions/passwordsettings.php:186 actions/recoverpassword.php:368 +msgid "Can't save new password." +msgstr "تعذّر حفظ كلمه السر الجديده." + +#: actions/passwordsettings.php:192 actions/recoverpassword.php:211 +msgid "Password saved." +msgstr "حُفظت كلمه السر." + +#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:308 +msgid "Paths" +msgstr "المسارات" + +#: actions/pathsadminpanel.php:70 +msgid "Path and server settings for this StatusNet site." +msgstr "" + +#: actions/pathsadminpanel.php:140 +#, php-format +msgid "Theme directory not readable: %s" +msgstr "لا يمكن قراءه دليل السمات: %s" + +#: actions/pathsadminpanel.php:146 +#, php-format +msgid "Avatar directory not writable: %s" +msgstr "لا يمكن الكتابه فى دليل الأفتارات: %s" + +#: actions/pathsadminpanel.php:152 +#, php-format +msgid "Background directory not writable: %s" +msgstr "لا يمكن الكتابه فى دليل الخلفيات: %s" + +#: actions/pathsadminpanel.php:160 +#, php-format +msgid "Locales directory not readable: %s" +msgstr "لا يمكن قراءه دليل المحليات: %s" + +#: actions/pathsadminpanel.php:212 actions/siteadminpanel.php:58 +#: lib/adminpanelaction.php:299 +msgid "Site" +msgstr "الموقع" + +#: actions/pathsadminpanel.php:216 +msgid "Path" +msgstr "المسار" + +#: actions/pathsadminpanel.php:216 +msgid "Site path" +msgstr "مسار الموقع" + +#: actions/pathsadminpanel.php:220 +msgid "Path to locales" +msgstr "مسار المحليات" + +#: actions/pathsadminpanel.php:220 +msgid "Directory path to locales" +msgstr "مسار دليل المحليات" + +#: actions/pathsadminpanel.php:227 +msgid "Theme" +msgstr "السمة" + +#: actions/pathsadminpanel.php:232 +msgid "Theme server" +msgstr "خادوم السمات" + +#: actions/pathsadminpanel.php:236 +msgid "Theme path" +msgstr "مسار السمات" + +#: actions/pathsadminpanel.php:240 +msgid "Theme directory" +msgstr "دليل السمات" + +#: actions/pathsadminpanel.php:247 +msgid "Avatars" +msgstr "أفتارات" + +#: actions/pathsadminpanel.php:252 +msgid "Avatar server" +msgstr "خادوم الأفتارات" + +#: actions/pathsadminpanel.php:256 +msgid "Avatar path" +msgstr "مسار الأفتارات" + +#: actions/pathsadminpanel.php:260 +msgid "Avatar directory" +msgstr "دليل الأفتار." + +#: actions/pathsadminpanel.php:269 +msgid "Backgrounds" +msgstr "خلفيات" + +#: actions/pathsadminpanel.php:273 +msgid "Background server" +msgstr "خادوم الخلفيات" + +#: actions/pathsadminpanel.php:277 +msgid "Background path" +msgstr "مسار الخلفيات" + +#: actions/pathsadminpanel.php:281 +msgid "Background directory" +msgstr "دليل الخلفيات" + +#: actions/pathsadminpanel.php:297 +msgid "Save paths" +msgstr "احفظ المسارات" + +#: actions/peoplesearch.php:52 +#, php-format +msgid "" +"Search for people on %%site.name%% by their name, location, or interests. " +"Separate the terms by spaces; they must be 3 characters or more." +msgstr "" + +#: actions/peoplesearch.php:58 +msgid "People search" +msgstr "بحث فى الأشخاص" + +#: actions/peopletag.php:70 +#, php-format +msgid "Not a valid people tag: %s" +msgstr "ليس وسم أشخاص صالح: %s" + +#: actions/peopletag.php:144 +#, php-format +msgid "Users self-tagged with %s - page %d" +msgstr "" + +#: actions/postnotice.php:84 +msgid "Invalid notice content" +msgstr "محتوى إشعار غير صالح" + +#: actions/postnotice.php:90 +#, php-format +msgid "Notice license ‘%s’ is not compatible with site license ‘%s’." +msgstr "" + +#: actions/profilesettings.php:60 +msgid "Profile settings" +msgstr "إعدادات الملف الشخصي" + +#: actions/profilesettings.php:71 +msgid "" +"You can update your personal profile info here so people know more about you." +msgstr "" + +#: actions/profilesettings.php:99 +msgid "Profile information" +msgstr "معلومات الملف الشخصي" + +#: actions/profilesettings.php:108 lib/groupeditform.php:154 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces" +msgstr "" + +#: actions/profilesettings.php:111 actions/register.php:447 +#: actions/showgroup.php:247 actions/tagother.php:104 +#: lib/groupeditform.php:157 lib/userprofile.php:149 +msgid "Full name" +msgstr "الاسم الكامل" + +#: actions/profilesettings.php:115 actions/register.php:452 +#: lib/groupeditform.php:161 +msgid "Homepage" +msgstr "الصفحه الرئيسية" + +#: actions/profilesettings.php:117 actions/register.php:454 +msgid "URL of your homepage, blog, or profile on another site" +msgstr "" + +#: actions/profilesettings.php:122 actions/register.php:460 +#, php-format +msgid "Describe yourself and your interests in %d chars" +msgstr "" + +#: actions/profilesettings.php:125 actions/register.php:463 +msgid "Describe yourself and your interests" +msgstr "صِف نفسك واهتماماتك" + +#: actions/profilesettings.php:127 actions/register.php:465 +msgid "Bio" +msgstr "السيرة" + +#: actions/profilesettings.php:132 actions/register.php:470 +#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/userauthorization.php:158 lib/groupeditform.php:177 +#: lib/userprofile.php:164 +msgid "Location" +msgstr "الموقع" + +#: actions/profilesettings.php:134 actions/register.php:472 +msgid "Where you are, like \"City, State (or Region), Country\"" +msgstr "" + +#: actions/profilesettings.php:138 actions/tagother.php:149 +#: actions/tagother.php:209 lib/subscriptionlist.php:106 +#: lib/subscriptionlist.php:108 lib/userprofile.php:209 +msgid "Tags" +msgstr "الوسوم" + +#: actions/profilesettings.php:140 +msgid "" +"Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated" +msgstr "" + +#: actions/profilesettings.php:144 actions/siteadminpanel.php:307 +msgid "Language" +msgstr "اللغة" + +#: actions/profilesettings.php:145 +msgid "Preferred language" +msgstr "اللغه المفضلة" + +#: actions/profilesettings.php:154 +msgid "Timezone" +msgstr "المنطقه الزمنية" + +#: actions/profilesettings.php:155 +msgid "What timezone are you normally in?" +msgstr "ما المنطقه الزمنيه التى تتواجد فيها عادة؟" + +#: actions/profilesettings.php:160 +msgid "" +"Automatically subscribe to whoever subscribes to me (best for non-humans)" +msgstr "" + +#: actions/profilesettings.php:221 actions/register.php:223 +#, php-format +msgid "Bio is too long (max %d chars)." +msgstr "" + +#: actions/profilesettings.php:228 actions/siteadminpanel.php:165 +msgid "Timezone not selected." +msgstr "لم تُختر المنطقه الزمنيه." + +#: actions/profilesettings.php:234 +msgid "Language is too long (max 50 chars)." +msgstr "" + +#: actions/profilesettings.php:246 actions/tagother.php:178 +#, php-format +msgid "Invalid tag: \"%s\"" +msgstr "وسم غير صالح: \"%s\"" + +#: actions/profilesettings.php:295 +msgid "Couldn't update user for autosubscribe." +msgstr "" + +#: actions/profilesettings.php:328 +msgid "Couldn't save profile." +msgstr "تعذّر حفظ الملف الشخصى." + +#: actions/profilesettings.php:336 +msgid "Couldn't save tags." +msgstr "تعذّر حفظ الوسوم." + +#: actions/profilesettings.php:344 lib/adminpanelaction.php:126 +msgid "Settings saved." +msgstr "حُفظت الإعدادات." + +#: actions/public.php:83 +#, php-format +msgid "Beyond the page limit (%s)" +msgstr "وراء حد الصفحه (%s)" + +#: actions/public.php:92 +msgid "Could not retrieve public stream." +msgstr "" + +#: actions/public.php:129 +#, php-format +msgid "Public timeline, page %d" +msgstr "المسار الزمنى العام، صفحه %d" + +#: actions/public.php:131 lib/publicgroupnav.php:79 +msgid "Public timeline" +msgstr "المسار الزمنى العام" + +#: actions/public.php:151 +msgid "Public Stream Feed (RSS 1.0)" +msgstr "" + +#: actions/public.php:155 +msgid "Public Stream Feed (RSS 2.0)" +msgstr "" + +#: actions/public.php:159 +msgid "Public Stream Feed (Atom)" +msgstr "" + +#: actions/public.php:179 +#, php-format +msgid "" +"This is the public timeline for %%site.name%% but no one has posted anything " +"yet." +msgstr "" + +#: actions/public.php:182 +msgid "Be the first to post!" +msgstr "كن أول من يُرسل!" + +#: actions/public.php:186 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to post!" +msgstr "" + +#: actions/public.php:233 +#, php-format +msgid "" +"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" +"blogging) service based on the Free Software [StatusNet](http://status.net/) " +"tool. [Join now](%%action.register%%) to share notices about yourself with " +"friends, family, and colleagues! ([Read more](%%doc.help%%))" +msgstr "" +"هنا %%site.name%%، خدمه [التدوين المُصغّر](http://en.wikipedia.org/wiki/Micro-" +"blogging) المبنيه على البرنامج الحر [StatusNet](http://status.net/). [انضم " +"الآن](%%action.register%%) لتشارك اشعاراتك مع أصدقائك وعائلتك وزملائك! " +"([اقرأ المزيد](%%doc.help%%))" + +#: actions/public.php:238 +#, php-format +msgid "" +"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" +"blogging) service based on the Free Software [StatusNet](http://status.net/) " +"tool." +msgstr "" +"هنا %%site.name%%، خدمه [التدوين المُصغّر](http://en.wikipedia.org/wiki/Micro-" +"blogging) المبنيه على البرنامج الحر [StatusNet](http://status.net/)." + +#: actions/publictagcloud.php:57 +msgid "Public tag cloud" +msgstr "سحابه الوسوم العمومية" + +#: actions/publictagcloud.php:63 +#, php-format +msgid "These are most popular recent tags on %s " +msgstr "هذه هى أكثر الوسوم شهره على %s " + +#: actions/publictagcloud.php:69 +#, php-format +msgid "No one has posted a notice with a [hashtag](%%doc.tags%%) yet." +msgstr "" + +#: actions/publictagcloud.php:72 +msgid "Be the first to post one!" +msgstr "كن أول من يُرسل!" + +#: actions/publictagcloud.php:75 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to post " +"one!" +msgstr "" + +#: actions/publictagcloud.php:135 +msgid "Tag cloud" +msgstr "سحابه الوسوم" + +#: actions/recoverpassword.php:36 +msgid "You are already logged in!" +msgstr "أنت والج بالفعل!" + +#: actions/recoverpassword.php:62 +msgid "No such recovery code." +msgstr "لا رمز استعاده كهذا." + +#: actions/recoverpassword.php:66 +msgid "Not a recovery code." +msgstr "ليس رمز استعاده." + +#: actions/recoverpassword.php:73 +msgid "Recovery code for unknown user." +msgstr "رمز استعاده لمستخدم غير معروف." + +#: actions/recoverpassword.php:86 +msgid "Error with confirmation code." +msgstr "خطأ فى رمز التأكيد." + +#: actions/recoverpassword.php:97 +msgid "This confirmation code is too old. Please start again." +msgstr "رمز التأكيد هذا قديم جدًا. من فضلك ابدأ من جديد." + +#: actions/recoverpassword.php:111 +msgid "Could not update user with confirmed email address." +msgstr "" + +#: actions/recoverpassword.php:152 +msgid "" +"If you have forgotten or lost your password, you can get a new one sent to " +"the email address you have stored in your account." +msgstr "" + +#: actions/recoverpassword.php:158 +msgid "You have been identified. Enter a new password below. " +msgstr "" + +#: actions/recoverpassword.php:188 +msgid "Password recovery" +msgstr "استعاده كلمه السر" + +#: actions/recoverpassword.php:191 +msgid "Nickname or email address" +msgstr "الاسم المستعار أو البريد الإلكتروني" + +#: actions/recoverpassword.php:193 +msgid "Your nickname on this server, or your registered email address." +msgstr "" + +#: actions/recoverpassword.php:199 actions/recoverpassword.php:200 +msgid "Recover" +msgstr "استرجع" + +#: actions/recoverpassword.php:208 +msgid "Reset password" +msgstr "أعد ضبط كلمه السر" + +#: actions/recoverpassword.php:209 +msgid "Recover password" +msgstr "استعد كلمه السر" + +#: actions/recoverpassword.php:210 actions/recoverpassword.php:322 +msgid "Password recovery requested" +msgstr "طُلبت استعاده كلمه السر" + +#: actions/recoverpassword.php:213 +msgid "Unknown action" +msgstr "إجراء غير معروف" + +#: actions/recoverpassword.php:236 +msgid "6 or more characters, and don't forget it!" +msgstr "" + +#: actions/recoverpassword.php:243 +msgid "Reset" +msgstr "أعد الضبط" + +#: actions/recoverpassword.php:252 +msgid "Enter a nickname or email address." +msgstr "أدخل اسمًا مستعارًا أو عنوان بريد إلكترونى." + +#: actions/recoverpassword.php:272 +msgid "No user with that email address or username." +msgstr "" + +#: actions/recoverpassword.php:287 +msgid "No registered email address for that user." +msgstr "" + +#: actions/recoverpassword.php:301 +msgid "Error saving address confirmation." +msgstr "خطأ أثناء حفظ تأكيد العنوان." + +#: actions/recoverpassword.php:325 +msgid "" +"Instructions for recovering your password have been sent to the email " +"address registered to your account." +msgstr "" + +#: actions/recoverpassword.php:344 +msgid "Unexpected password reset." +msgstr "" + +#: actions/recoverpassword.php:352 +msgid "Password must be 6 chars or more." +msgstr "يجب أن تكون كلمه السر 6 محارف أو أكثر." + +#: actions/recoverpassword.php:356 +msgid "Password and confirmation do not match." +msgstr "" + +#: actions/recoverpassword.php:375 actions/register.php:248 +msgid "Error setting user." +msgstr "خطأ أثناء ضبط المستخدم." + +#: actions/recoverpassword.php:382 +msgid "New password successfully saved. You are now logged in." +msgstr "" + +#: actions/register.php:85 actions/register.php:189 actions/register.php:404 +msgid "Sorry, only invited people can register." +msgstr "عذرًا، الأشخاص المدعوون وحدهم يستطيعون التسجيل." + +#: actions/register.php:92 +msgid "Sorry, invalid invitation code." +msgstr "عذرا، رمز دعوه غير صالح." + +#: actions/register.php:112 +msgid "Registration successful" +msgstr "نجح التسجيل" + +#: actions/register.php:114 actions/register.php:502 lib/action.php:455 +#: lib/logingroupnav.php:85 +msgid "Register" +msgstr "سجّل" + +#: actions/register.php:135 +msgid "Registration not allowed." +msgstr "لا يُسمح بالتسجيل." + +#: actions/register.php:198 +msgid "You can't register if you don't agree to the license." +msgstr "" + +#: actions/register.php:201 +msgid "Not a valid email address." +msgstr "ليس عنوان بريد صالح." + +#: actions/register.php:212 +msgid "Email address already exists." +msgstr "عنوان البريد الإلكترونى موجود مسبقًا." + +#: actions/register.php:243 actions/register.php:264 +msgid "Invalid username or password." +msgstr "اسم مستخدم أو كلمه سر غير صالحه." + +#: actions/register.php:342 +msgid "" +"With this form you can create a new account. You can then post notices and " +"link up to friends and colleagues. " +msgstr "" + +#: actions/register.php:424 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required." +msgstr "" + +#: actions/register.php:429 +msgid "6 or more characters. Required." +msgstr "6 حروف أو أكثر. مطلوب." + +#: actions/register.php:433 +msgid "Same as password above. Required." +msgstr "نفس كلمه السر أعلاه. مطلوب." + +#: actions/register.php:437 actions/register.php:441 +#: actions/siteadminpanel.php:283 lib/accountsettingsaction.php:120 +msgid "Email" +msgstr "البريد الإلكتروني" + +#: actions/register.php:438 actions/register.php:442 +msgid "Used only for updates, announcements, and password recovery" +msgstr "" + +#: actions/register.php:449 +msgid "Longer name, preferably your \"real\" name" +msgstr "" + +#: actions/register.php:493 +msgid "My text and files are available under " +msgstr "نصوصى وملفاتى متاحه تحت رخصه " + +#: actions/register.php:495 +msgid "Creative Commons Attribution 3.0" +msgstr "المشاع المبدع نسبه المنصف إلى مؤلفه 3.0" + +#: actions/register.php:496 +msgid "" +" except this private data: password, email address, IM address, and phone " +"number." +msgstr "" + +#: actions/register.php:537 +#, php-format +msgid "" +"Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may " +"want to...\n" +"\n" +"* Go to [your profile](%s) and post your first message.\n" +"* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send " +"notices through instant messages.\n" +"* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that " +"share your interests. \n" +"* Update your [profile settings](%%%%action.profilesettings%%%%) to tell " +"others more about you. \n" +"* Read over the [online docs](%%%%doc.help%%%%) for features you may have " +"missed. \n" +"\n" +"Thanks for signing up and we hope you enjoy using this service." +msgstr "" + +#: actions/register.php:561 +msgid "" +"(You should receive a message by email momentarily, with instructions on how " +"to confirm your email address.)" +msgstr "" + +#: actions/remotesubscribe.php:98 +#, php-format +msgid "" +"To subscribe, you can [login](%%action.login%%), or [register](%%action." +"register%%) a new account. If you already have an account on a [compatible " +"microblogging site](%%doc.openmublog%%), enter your profile URL below." +msgstr "" + +#: actions/remotesubscribe.php:112 +msgid "Remote subscribe" +msgstr "اشتراك بعيد" + +#: actions/remotesubscribe.php:124 +msgid "Subscribe to a remote user" +msgstr "اشترك بمستخدم بعيد" + +#: actions/remotesubscribe.php:129 +msgid "User nickname" +msgstr "اسم المستخدم المستعار" + +#: actions/remotesubscribe.php:130 +msgid "Nickname of the user you want to follow" +msgstr "" + +#: actions/remotesubscribe.php:133 +msgid "Profile URL" +msgstr "مسار الملف الشخصي" + +#: actions/remotesubscribe.php:134 +msgid "URL of your profile on another compatible microblogging service" +msgstr "" + +#: actions/remotesubscribe.php:137 lib/subscribeform.php:139 +#: lib/userprofile.php:365 +msgid "Subscribe" +msgstr "اشترك" + +#: actions/remotesubscribe.php:159 +msgid "Invalid profile URL (bad format)" +msgstr "" + +#: actions/remotesubscribe.php:168 +msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)." +msgstr "" + +#: actions/remotesubscribe.php:176 +msgid "That’s a local profile! Login to subscribe." +msgstr "" + +#: actions/remotesubscribe.php:183 +msgid "Couldn’t get a request token." +msgstr "" + +#: actions/replies.php:125 actions/repliesrss.php:68 +#: lib/personalgroupnav.php:105 +#, php-format +msgid "Replies to %s" +msgstr "الردود على %s" + +#: actions/replies.php:127 +#, php-format +msgid "Replies to %s, page %d" +msgstr "الردود على %s، الصفحه %d" + +#: actions/replies.php:144 +#, php-format +msgid "Replies feed for %s (RSS 1.0)" +msgstr "" + +#: actions/replies.php:151 +#, php-format +msgid "Replies feed for %s (RSS 2.0)" +msgstr "" + +#: actions/replies.php:158 +#, php-format +msgid "Replies feed for %s (Atom)" +msgstr "" + +#: actions/replies.php:198 +#, php-format +msgid "" +"This is the timeline showing replies to %s but %s hasn't received a notice " +"to his attention yet." +msgstr "" + +#: actions/replies.php:203 +#, php-format +msgid "" +"You can engage other users in a conversation, subscribe to more people or " +"[join groups](%%action.groups%%)." +msgstr "" + +#: actions/replies.php:205 +#, php-format +msgid "" +"You can try to [nudge %s](../%s) or [post something to his or her attention]" +"(%%%%action.newnotice%%%%?status_textarea=%s)." +msgstr "" + +#: actions/repliesrss.php:72 +#, php-format +msgid "Replies to %1$s on %2$s!" +msgstr "" + +#: actions/sandbox.php:65 actions/unsandbox.php:65 +msgid "You cannot sandbox users on this site." +msgstr "" + +#: actions/sandbox.php:72 +msgid "User is already sandboxed." +msgstr "" + +#: actions/showfavorites.php:79 +#, php-format +msgid "%s's favorite notices, page %d" +msgstr "" + +#: actions/showfavorites.php:132 +msgid "Could not retrieve favorite notices." +msgstr "" + +#: actions/showfavorites.php:170 +#, php-format +msgid "Feed for favorites of %s (RSS 1.0)" +msgstr "" + +#: actions/showfavorites.php:177 +#, php-format +msgid "Feed for favorites of %s (RSS 2.0)" +msgstr "" + +#: actions/showfavorites.php:184 +#, php-format +msgid "Feed for favorites of %s (Atom)" +msgstr "" + +#: actions/showfavorites.php:205 +msgid "" +"You haven't chosen any favorite notices yet. Click the fave button on " +"notices you like to bookmark them for later or shed a spotlight on them." +msgstr "" + +#: actions/showfavorites.php:207 +#, php-format +msgid "" +"%s hasn't added any notices to his favorites yet. Post something interesting " +"they would add to their favorites :)" +msgstr "" +"%s لم يضف أى إشعارات إلى مفضلته إلى الآن. أرسل شيئًا شيقًا ليضيفه إلى " +"مفضلته. :)" + +#: actions/showfavorites.php:211 +#, php-format +msgid "" +"%s hasn't added any notices to his favorites yet. Why not [register an " +"account](%%%%action.register%%%%) and then post something interesting they " +"would add to their favorites :)" +msgstr "" +"%s لم يضف أى إشعارات إلى مفضلته إلى الآن. لمّ لا [تسجل حسابًا](%%%%action." +"register%%%%) وترسل شيئًا شيقًا ليضيفه إلى مفضلته. :)" + +#: actions/showfavorites.php:242 +msgid "This is a way to share what you like." +msgstr "إنها إحدى وسائل مشاركه ما تحب." + +#: actions/showgroup.php:82 lib/groupnav.php:86 +#, php-format +msgid "%s group" +msgstr "مجموعه %s" + +#: actions/showgroup.php:84 +#, php-format +msgid "%s group, page %d" +msgstr "" + +#: actions/showgroup.php:218 +msgid "Group profile" +msgstr "ملف المجموعه الشخصي" + +#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/userauthorization.php:167 lib/userprofile.php:177 +msgid "URL" +msgstr "مسار" + +#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/userauthorization.php:179 lib/userprofile.php:194 +msgid "Note" +msgstr "ملاحظة" + +#: actions/showgroup.php:284 lib/groupeditform.php:184 +msgid "Aliases" +msgstr "الكنى" + +#: actions/showgroup.php:293 +msgid "Group actions" +msgstr "" + +#: actions/showgroup.php:328 +#, php-format +msgid "Notice feed for %s group (RSS 1.0)" +msgstr "" + +#: actions/showgroup.php:334 +#, php-format +msgid "Notice feed for %s group (RSS 2.0)" +msgstr "" + +#: actions/showgroup.php:340 +#, php-format +msgid "Notice feed for %s group (Atom)" +msgstr "" + +#: actions/showgroup.php:345 +#, php-format +msgid "FOAF for %s group" +msgstr "" + +#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +msgid "Members" +msgstr "الأعضاء" + +#: actions/showgroup.php:386 lib/profileaction.php:117 +#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 +#: lib/tagcloudsection.php:71 +msgid "(None)" +msgstr "(لا شيء)" + +#: actions/showgroup.php:392 +msgid "All members" +msgstr "جميع الأعضاء" + +#: actions/showgroup.php:429 lib/profileaction.php:174 +msgid "Statistics" +msgstr "إحصاءات" + +#: actions/showgroup.php:432 +msgid "Created" +msgstr "أنشئ" + +#: actions/showgroup.php:448 +#, php-format +msgid "" +"**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. Its members share short messages about " +"their life and interests. [Join now](%%%%action.register%%%%) to become part " +"of this group and many more! ([Read more](%%%%doc.help%%%%))" +msgstr "" + +#: actions/showgroup.php:454 +#, php-format +msgid "" +"**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. Its members share short messages about " +"their life and interests. " +msgstr "" + +#: actions/showgroup.php:482 +msgid "Admins" +msgstr "الإداريون" + +#: actions/showmessage.php:81 +msgid "No such message." +msgstr "لا رساله كهذه." + +#: actions/showmessage.php:98 +msgid "Only the sender and recipient may read this message." +msgstr "يحق للمُرسل والمستلم فقط قراءه هذه الرساله." + +#: actions/showmessage.php:108 +#, php-format +msgid "Message to %1$s on %2$s" +msgstr "" + +#: actions/showmessage.php:113 +#, php-format +msgid "Message from %1$s on %2$s" +msgstr "" + +#: actions/shownotice.php:90 +msgid "Notice deleted." +msgstr "حُذف الإشعار." + +#: actions/showstream.php:73 +#, php-format +msgid " tagged %s" +msgstr "" + +#: actions/showstream.php:79 +#, php-format +msgid "%s, page %d" +msgstr "" + +#: actions/showstream.php:122 +#, php-format +msgid "Notice feed for %s tagged %s (RSS 1.0)" +msgstr "" + +#: actions/showstream.php:129 +#, php-format +msgid "Notice feed for %s (RSS 1.0)" +msgstr "" + +#: actions/showstream.php:136 +#, php-format +msgid "Notice feed for %s (RSS 2.0)" +msgstr "" + +#: actions/showstream.php:143 +#, php-format +msgid "Notice feed for %s (Atom)" +msgstr "" + +#: actions/showstream.php:148 +#, php-format +msgid "FOAF for %s" +msgstr "" + +#: actions/showstream.php:191 +#, php-format +msgid "This is the timeline for %s but %s hasn't posted anything yet." +msgstr "" + +#: actions/showstream.php:196 +msgid "" +"Seen anything interesting recently? You haven't posted any notices yet, now " +"would be a good time to start :)" +msgstr "" + +#: actions/showstream.php:198 +#, php-format +msgid "" +"You can try to nudge %s or [post something to his or her attention](%%%%" +"action.newnotice%%%%?status_textarea=%s)." +msgstr "" + +#: actions/showstream.php:234 +#, php-format +msgid "" +"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. [Join now](%%%%action.register%%%%) to " +"follow **%s**'s notices and many more! ([Read more](%%%%doc.help%%%%))" +msgstr "" + +#: actions/showstream.php:239 +#, php-format +msgid "" +"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. " +msgstr "" + +#: actions/silence.php:65 actions/unsilence.php:65 +msgid "You cannot silence users on this site." +msgstr "لا يمكنك إسكات المستخدمين على هذا الموقع." + +#: actions/silence.php:72 +msgid "User is already silenced." +msgstr "المستخدم مسكت من قبل." + +#: actions/siteadminpanel.php:69 +msgid "Basic settings for this StatusNet site." +msgstr "الإعدادات الأساسيه لموقع StatusNet هذا." + +#: actions/siteadminpanel.php:147 +msgid "Site name must have non-zero length." +msgstr "يجب ألا يكون طول اسم الموقع صفرًا." + +#: actions/siteadminpanel.php:155 +msgid "You must have a valid contact email address" +msgstr "يجب أن تملك عنوان بريد إلكترونى صالح للاتصال" + +#: actions/siteadminpanel.php:173 +#, php-format +msgid "Unknown language \"%s\"" +msgstr "لغه غير معروفه \"%s\"" + +#: actions/siteadminpanel.php:180 +msgid "Invalid snapshot report URL." +msgstr "" + +#: actions/siteadminpanel.php:186 +msgid "Invalid snapshot run value." +msgstr "" + +#: actions/siteadminpanel.php:192 +msgid "Snapshot frequency must be a number." +msgstr "" + +#: actions/siteadminpanel.php:199 +msgid "You must set an SSL server when enabling SSL." +msgstr "" + +#: actions/siteadminpanel.php:204 +msgid "Invalid SSL server. The maximum length is 255 characters." +msgstr "" + +#: actions/siteadminpanel.php:210 +msgid "Minimum text limit is 140 characters." +msgstr "حد النص الأدنى هو 140 حرفًا." + +#: actions/siteadminpanel.php:216 +msgid "Dupe limit must 1 or more seconds." +msgstr "" + +#: actions/siteadminpanel.php:266 +msgid "General" +msgstr "عام" + +#: actions/siteadminpanel.php:269 +msgid "Site name" +msgstr "اسم الموقع" + +#: actions/siteadminpanel.php:270 +msgid "The name of your site, like \"Yourcompany Microblog\"" +msgstr "اسم موقعك، \"التدوين المصغر لشركتك\" مثلا" + +#: actions/siteadminpanel.php:274 +msgid "Brought by" +msgstr "" + +#: actions/siteadminpanel.php:275 +msgid "Text used for credits link in footer of each page" +msgstr "" + +#: actions/siteadminpanel.php:279 +msgid "Brought by URL" +msgstr "" + +#: actions/siteadminpanel.php:280 +msgid "URL used for credits link in footer of each page" +msgstr "" + +#: actions/siteadminpanel.php:284 +msgid "Contact email address for your site" +msgstr "عنوان البريد الإلكترونى للاتصال بموقعك" + +#: actions/siteadminpanel.php:290 +msgid "Local" +msgstr "محلي" + +#: actions/siteadminpanel.php:301 +msgid "Default timezone" +msgstr "المنطقه الزمنيه المبدئية" + +#: actions/siteadminpanel.php:302 +msgid "Default timezone for the site; usually UTC." +msgstr "المنطقه الزمنيه المبدئيه للموقع؛ ت‌ع‌م عاده." + +#: actions/siteadminpanel.php:308 +msgid "Default site language" +msgstr "لغه الموقع المبدئية" + +#: actions/siteadminpanel.php:316 +msgid "URLs" +msgstr "مسارات" + +#: actions/siteadminpanel.php:319 +msgid "Server" +msgstr "خادوم" + +#: actions/siteadminpanel.php:319 +msgid "Site's server hostname." +msgstr "اسم مضيف خادوم الموقع." + +#: actions/siteadminpanel.php:323 +msgid "Fancy URLs" +msgstr "مسارات فاخرة" + +#: actions/siteadminpanel.php:325 +msgid "Use fancy (more readable and memorable) URLs?" +msgstr "أأستخدم مسارات فاخره (يمكن قراءتها وتذكرها بسهوله أكبر)؟" + +#: actions/siteadminpanel.php:331 +msgid "Access" +msgstr "نفاذ" + +#: actions/siteadminpanel.php:334 +msgid "Private" +msgstr "خاص" + +#: actions/siteadminpanel.php:336 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "أأمنع المستخدمين المجهولين (غير الوالجين) من عرض الموقع؟" + +#: actions/siteadminpanel.php:340 +#, fuzzy +msgid "Invite only" +msgstr "ادعُ" + +#: actions/siteadminpanel.php:342 +msgid "Make registration invitation only." +msgstr "" + +#: actions/siteadminpanel.php:346 +msgid "Closed" +msgstr "مُغلق" + +#: actions/siteadminpanel.php:348 +msgid "Disable new registrations." +msgstr "عطّل التسجيل الجديد." + +#: actions/siteadminpanel.php:354 +msgid "Snapshots" +msgstr "" + +#: actions/siteadminpanel.php:357 +msgid "Randomly during Web hit" +msgstr "" + +#: actions/siteadminpanel.php:358 +msgid "In a scheduled job" +msgstr "فى مهمه مُجدولة" + +#: actions/siteadminpanel.php:359 actions/siteadminpanel.php:383 +msgid "Never" +msgstr "مطلقا" + +#: actions/siteadminpanel.php:360 +msgid "Data snapshots" +msgstr "" + +#: actions/siteadminpanel.php:361 +msgid "When to send statistical data to status.net servers" +msgstr "" + +#: actions/siteadminpanel.php:366 +msgid "Frequency" +msgstr "التكرار" + +#: actions/siteadminpanel.php:367 +msgid "Snapshots will be sent once every N web hits" +msgstr "" + +#: actions/siteadminpanel.php:372 +msgid "Report URL" +msgstr "بلّغ عن المسار" + +#: actions/siteadminpanel.php:373 +msgid "Snapshots will be sent to this URL" +msgstr "" + +#: actions/siteadminpanel.php:380 +msgid "SSL" +msgstr "SSL" + +#: actions/siteadminpanel.php:384 +msgid "Sometimes" +msgstr "أحيانًا" + +#: actions/siteadminpanel.php:385 +msgid "Always" +msgstr "دائمًا" + +#: actions/siteadminpanel.php:387 +msgid "Use SSL" +msgstr "استخدم SSL" + +#: actions/siteadminpanel.php:388 +msgid "When to use SSL" +msgstr "" + +#: actions/siteadminpanel.php:393 +msgid "SSL Server" +msgstr "خادوم SSL" + +#: actions/siteadminpanel.php:394 +msgid "Server to direct SSL requests to" +msgstr "" + +#: actions/siteadminpanel.php:400 +msgid "Limits" +msgstr "الحدود" + +#: actions/siteadminpanel.php:403 +msgid "Text limit" +msgstr "حد النص" + +#: actions/siteadminpanel.php:403 +msgid "Maximum number of characters for notices." +msgstr "أقصى عدد للحروف فى الإشعارات." + +#: actions/siteadminpanel.php:407 +msgid "Dupe limit" +msgstr "" + +#: actions/siteadminpanel.php:407 +msgid "How long users must wait (in seconds) to post the same thing again." +msgstr "" + +#: actions/siteadminpanel.php:421 actions/useradminpanel.php:313 +msgid "Save site settings" +msgstr "اذف إعدادت الموقع" + +#: actions/smssettings.php:58 +msgid "SMS Settings" +msgstr "إعدادات الرسائل القصيرة" + +#: actions/smssettings.php:69 +#, php-format +msgid "You can receive SMS messages through email from %%site.name%%." +msgstr "لا يمكنك استلام رسائل قصيره عبر البريد الإلكرتونى من %%site.name%%." + +#: actions/smssettings.php:91 +msgid "SMS is not available." +msgstr "الرسائل القصيره غير متوفره." + +#: actions/smssettings.php:112 +msgid "Current confirmed SMS-enabled phone number." +msgstr "" + +#: actions/smssettings.php:123 +msgid "Awaiting confirmation on this phone number." +msgstr "" + +#: actions/smssettings.php:130 +msgid "Confirmation code" +msgstr "رمز التأكيد" + +#: actions/smssettings.php:131 +msgid "Enter the code you received on your phone." +msgstr "" + +#: actions/smssettings.php:138 +msgid "SMS Phone number" +msgstr "" + +#: actions/smssettings.php:140 +msgid "Phone number, no punctuation or spaces, with area code" +msgstr "" + +#: actions/smssettings.php:174 +msgid "" +"Send me notices through SMS; I understand I may incur exorbitant charges " +"from my carrier." +msgstr "" + +#: actions/smssettings.php:306 +msgid "No phone number." +msgstr "لا رقم هاتف." + +#: actions/smssettings.php:311 +msgid "No carrier selected." +msgstr "" + +#: actions/smssettings.php:318 +msgid "That is already your phone number." +msgstr "" + +#: actions/smssettings.php:321 +msgid "That phone number already belongs to another user." +msgstr "" + +#: actions/smssettings.php:347 +msgid "" +"A confirmation code was sent to the phone number you added. Check your phone " +"for the code and instructions on how to use it." +msgstr "" + +#: actions/smssettings.php:374 +msgid "That is the wrong confirmation number." +msgstr "" + +#: actions/smssettings.php:405 +msgid "That is not your phone number." +msgstr "هذا ليس رقم هاتفك." + +#: actions/smssettings.php:465 +msgid "Mobile carrier" +msgstr "" + +#: actions/smssettings.php:469 +msgid "Select a carrier" +msgstr "" + +#: actions/smssettings.php:476 +#, php-format +msgid "" +"Mobile carrier for your phone. If you know a carrier that accepts SMS over " +"email but isn't listed here, send email to let us know at %s." +msgstr "" + +#: actions/smssettings.php:498 +msgid "No code entered" +msgstr "" + +#: actions/subedit.php:70 +msgid "You are not subscribed to that profile." +msgstr "" + +#: actions/subedit.php:83 +msgid "Could not save subscription." +msgstr "تعذّر حفظ الاشتراك." + +#: actions/subscribe.php:55 +msgid "Not a local user." +msgstr "ليس مُستخدمًا محليًا." + +#: actions/subscribe.php:69 +msgid "Subscribed" +msgstr "مُشترك" + +#: actions/subscribers.php:50 +#, php-format +msgid "%s subscribers" +msgstr "مشتركو %s" + +#: actions/subscribers.php:52 +#, php-format +msgid "%s subscribers, page %d" +msgstr "مشتركو %s، الصفحه %d" + +#: actions/subscribers.php:63 +msgid "These are the people who listen to your notices." +msgstr "هؤلاء هم الأشخاص الذين يستمعون إلى إشعاراتك." + +#: actions/subscribers.php:67 +#, php-format +msgid "These are the people who listen to %s's notices." +msgstr "" + +#: actions/subscribers.php:108 +msgid "" +"You have no subscribers. Try subscribing to people you know and they might " +"return the favor" +msgstr "" + +#: actions/subscribers.php:110 +#, php-format +msgid "%s has no subscribers. Want to be the first?" +msgstr "" + +#: actions/subscribers.php:114 +#, php-format +msgid "" +"%s has no subscribers. Why not [register an account](%%%%action.register%%%" +"%) and be the first?" +msgstr "" + +#: actions/subscriptions.php:52 +#, php-format +msgid "%s subscriptions" +msgstr "اشتراكات %s" + +#: actions/subscriptions.php:54 +#, php-format +msgid "%s subscriptions, page %d" +msgstr "اشتراكات %s، الصفحه %d" + +#: actions/subscriptions.php:65 +msgid "These are the people whose notices you listen to." +msgstr "هؤلاء الأشخاص الذى تستمع إليهم." + +#: actions/subscriptions.php:69 +#, php-format +msgid "These are the people whose notices %s listens to." +msgstr "هؤلاء الأشخاص الذى يستمع %s إليهم." + +#: actions/subscriptions.php:121 +#, php-format +msgid "" +"You're not listening to anyone's notices right now, try subscribing to " +"people you know. Try [people search](%%action.peoplesearch%%), look for " +"members in groups you're interested in and in our [featured users](%%action." +"featured%%). If you're a [Twitter user](%%action.twittersettings%%), you can " +"automatically subscribe to people you already follow there." +msgstr "" + +#: actions/subscriptions.php:123 actions/subscriptions.php:127 +#, php-format +msgid "%s is not listening to anyone." +msgstr "" + +#: actions/subscriptions.php:194 +msgid "Jabber" +msgstr "جابر" + +#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115 +msgid "SMS" +msgstr "رسائل قصيرة" + +#: actions/tag.php:68 +#, php-format +msgid "Notices tagged with %s, page %d" +msgstr "" + +#: actions/tag.php:86 +#, php-format +msgid "Notice feed for tag %s (RSS 1.0)" +msgstr "" + +#: actions/tag.php:92 +#, php-format +msgid "Notice feed for tag %s (RSS 2.0)" +msgstr "" + +#: actions/tag.php:98 +#, php-format +msgid "Notice feed for tag %s (Atom)" +msgstr "" + +#: actions/tagother.php:33 +msgid "Not logged in" +msgstr "لست والجًا" + +#: actions/tagother.php:39 +msgid "No id argument." +msgstr "لا مُدخل هويه." + +#: actions/tagother.php:65 +#, php-format +msgid "Tag %s" +msgstr "" + +#: actions/tagother.php:77 lib/userprofile.php:75 +msgid "User profile" +msgstr "ملف المستخدم الشخصي" + +#: actions/tagother.php:81 lib/userprofile.php:102 +msgid "Photo" +msgstr "صورة" + +#: actions/tagother.php:141 +msgid "Tag user" +msgstr "" + +#: actions/tagother.php:151 +msgid "" +"Tags for this user (letters, numbers, -, ., and _), comma- or space- " +"separated" +msgstr "" + +#: actions/tagother.php:193 +msgid "" +"You can only tag people you are subscribed to or who are subscribed to you." +msgstr "" + +#: actions/tagother.php:200 +msgid "Could not save tags." +msgstr "تعذّر حفظ الوسوم." + +#: actions/tagother.php:236 +msgid "Use this form to add tags to your subscribers or subscriptions." +msgstr "" + +#: actions/tagrss.php:35 +msgid "No such tag." +msgstr "لا وسم كهذا." + +#: actions/twitapitrends.php:87 +msgid "API method under construction." +msgstr "" + +#: actions/unblock.php:59 +msgid "You haven't blocked that user." +msgstr "لم تمنع هذا المستخدم." + +#: actions/unsandbox.php:72 +#, fuzzy +msgid "User is not sandboxed." +msgstr "ليس للمستخدم إشعار أخير" + +#: actions/unsilence.php:72 +msgid "User is not silenced." +msgstr "المستخدم ليس مُسكتًا." + +#: actions/unsubscribe.php:77 +msgid "No profile id in request." +msgstr "" + +#: actions/unsubscribe.php:84 +msgid "No profile with that id." +msgstr "لا ملف بهذه الهويه." + +#: actions/unsubscribe.php:98 +msgid "Unsubscribed" +msgstr "" + +#: actions/updateprofile.php:62 actions/userauthorization.php:330 +#, php-format +msgid "Listenee stream license ‘%s’ is not compatible with site license ‘%s’." +msgstr "" + +#: actions/useradminpanel.php:58 lib/adminpanelaction.php:305 +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "المستخدم" + +#: actions/useradminpanel.php:69 +msgid "User settings for this StatusNet site." +msgstr "" + +#: actions/useradminpanel.php:149 +msgid "Invalid bio limit. Must be numeric." +msgstr "" + +#: actions/useradminpanel.php:155 +msgid "Invalid welcome text. Max length is 255 characters." +msgstr "رساله ترحيب غير صالحه. أقصى طول هو 255 حرف." + +#: actions/useradminpanel.php:165 +#, php-format +msgid "Invalid default subscripton: '%1$s' is not user." +msgstr "" + +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 +#: lib/personalgroupnav.php:109 +msgid "Profile" +msgstr "الملف الشخصي" + +#: actions/useradminpanel.php:222 +msgid "Bio Limit" +msgstr "حد السيرة" + +#: actions/useradminpanel.php:223 +msgid "Maximum length of a profile bio in characters." +msgstr "" + +#: actions/useradminpanel.php:231 +msgid "New users" +msgstr "مستخدمون جدد" + +#: actions/useradminpanel.php:235 +msgid "New user welcome" +msgstr "ترحيب المستخدمين الجدد" + +#: actions/useradminpanel.php:236 +msgid "Welcome text for new users (Max 255 chars)." +msgstr "نص الترحيب بالمستخدمين الجدد (255 حرفًا كحد أقصى)." + +#: actions/useradminpanel.php:241 +msgid "Default subscription" +msgstr "الاشتراك المبدئي" + +#: actions/useradminpanel.php:242 +msgid "Automatically subscribe new users to this user." +msgstr "أشرك المستخدمين الجدد بهذا المستخدم تلقائيًا." + +#: actions/useradminpanel.php:251 +msgid "Invitations" +msgstr "الدعوات" + +#: actions/useradminpanel.php:256 +msgid "Invitations enabled" +msgstr "الدعوات مُفعلة" + +#: actions/useradminpanel.php:258 +msgid "Whether to allow users to invite new users." +msgstr "" + +#: actions/useradminpanel.php:265 +msgid "Sessions" +msgstr "الجلسات" + +#: actions/useradminpanel.php:270 +msgid "Handle sessions" +msgstr "" + +#: actions/useradminpanel.php:272 +msgid "Whether to handle sessions ourselves." +msgstr "" + +#: actions/useradminpanel.php:276 +msgid "Session debugging" +msgstr "تنقيح الجلسة" + +#: actions/useradminpanel.php:278 +msgid "Turn on debugging output for sessions." +msgstr "مكّن تنقيح مُخرجات الجلسه." + +#: actions/userauthorization.php:105 +msgid "Authorize subscription" +msgstr "" + +#: actions/userauthorization.php:110 +msgid "" +"Please check these details to make sure that you want to subscribe to this " +"user’s notices. If you didn’t just ask to subscribe to someone’s notices, " +"click “Reject”." +msgstr "" + +#: actions/userauthorization.php:188 +msgid "License" +msgstr "الرخصة" + +#: actions/userauthorization.php:209 +msgid "Accept" +msgstr "اقبل" + +#: actions/userauthorization.php:210 lib/subscribeform.php:115 +#: lib/subscribeform.php:139 +msgid "Subscribe to this user" +msgstr "اشترك بهذا المستخدم" + +#: actions/userauthorization.php:211 +msgid "Reject" +msgstr "ارفض" + +#: actions/userauthorization.php:212 +msgid "Reject this subscription" +msgstr "ارفض هذا الاشتراك" + +#: actions/userauthorization.php:225 +msgid "No authorization request!" +msgstr "لا طلب استيثاق!" + +#: actions/userauthorization.php:247 +msgid "Subscription authorized" +msgstr "" + +#: actions/userauthorization.php:249 +msgid "" +"The subscription has been authorized, but no callback URL was passed. Check " +"with the site’s instructions for details on how to authorize the " +"subscription. Your subscription token is:" +msgstr "" + +#: actions/userauthorization.php:259 +msgid "Subscription rejected" +msgstr "رُفض الاشتراك" + +#: actions/userauthorization.php:261 +msgid "" +"The subscription has been rejected, but no callback URL was passed. Check " +"with the site’s instructions for details on how to fully reject the " +"subscription." +msgstr "" + +#: actions/userauthorization.php:296 +#, php-format +msgid "Listener URI ‘%s’ not found here" +msgstr "" + +#: actions/userauthorization.php:301 +#, php-format +msgid "Listenee URI ‘%s’ is too long." +msgstr "" + +#: actions/userauthorization.php:307 +#, php-format +msgid "Listenee URI ‘%s’ is a local user." +msgstr "" + +#: actions/userauthorization.php:322 +#, php-format +msgid "Profile URL ‘%s’ is for a local user." +msgstr "" + +#: actions/userauthorization.php:338 +#, php-format +msgid "Avatar URL ‘%s’ is not valid." +msgstr "" + +#: actions/userauthorization.php:343 +#, php-format +msgid "Can’t read avatar URL ‘%s’." +msgstr "" + +#: actions/userauthorization.php:348 +#, php-format +msgid "Wrong image type for avatar URL ‘%s’." +msgstr "" + +#: actions/userbyid.php:70 +msgid "No id." +msgstr "لا هويه." + +#: actions/userdesignsettings.php:76 lib/designsettings.php:65 +msgid "Profile design" +msgstr "تصميم الملف الشخصي" + +#: actions/userdesignsettings.php:87 lib/designsettings.php:76 +msgid "" +"Customize the way your profile looks with a background image and a colour " +"palette of your choice." +msgstr "" + +#: actions/userdesignsettings.php:282 +msgid "Enjoy your hotdog!" +msgstr "استمتع بالنقانق!" + +#: actions/usergroups.php:64 +#, php-format +msgid "%s groups, page %d" +msgstr "مجموعات %s، صفحه %d" + +#: actions/usergroups.php:130 +msgid "Search for more groups" +msgstr "" + +#: actions/usergroups.php:153 +#, php-format +msgid "%s is not a member of any group." +msgstr "" + +#: actions/usergroups.php:158 +#, php-format +msgid "Try [searching for groups](%%action.groupsearch%%) and joining them." +msgstr "" + +#: classes/File.php:137 +#, php-format +msgid "" +"No file may be larger than %d bytes and the file you sent was %d bytes. Try " +"to upload a smaller version." +msgstr "" + +#: classes/File.php:147 +#, php-format +msgid "A file this large would exceed your user quota of %d bytes." +msgstr "" + +#: classes/File.php:154 +#, php-format +msgid "A file this large would exceed your monthly quota of %d bytes." +msgstr "" + +#: classes/Message.php:45 +msgid "You are banned from sending direct messages." +msgstr "أنت ممنوع من إرسال رسائل مباشره." + +#: classes/Message.php:61 +msgid "Could not insert message." +msgstr "تعذّر إدراج الرساله." + +#: classes/Message.php:71 +msgid "Could not update message with new URI." +msgstr "" + +#: classes/Notice.php:164 +#, php-format +msgid "DB error inserting hashtag: %s" +msgstr "" + +#: classes/Notice.php:188 +msgid "Problem saving notice. Too long." +msgstr "مشكله فى حفظ الإشعار. طويل جدًا." + +#: classes/Notice.php:192 +msgid "Problem saving notice. Unknown user." +msgstr "مشكله فى حفظ الإشعار. مستخدم غير معروف." + +#: classes/Notice.php:197 +msgid "" +"Too many notices too fast; take a breather and post again in a few minutes." +msgstr "" + +#: classes/Notice.php:203 +msgid "" +"Too many duplicate messages too quickly; take a breather and post again in a " +"few minutes." +msgstr "" + +#: classes/Notice.php:209 +msgid "You are banned from posting notices on this site." +msgstr "" + +#: classes/Notice.php:274 classes/Notice.php:299 +msgid "Problem saving notice." +msgstr "مشكله أثناء حفظ الإشعار." + +#: classes/Notice.php:1115 +#, php-format +msgid "DB error inserting reply: %s" +msgstr "" + +#: classes/User.php:347 +#, php-format +msgid "Welcome to %1$s, @%2$s!" +msgstr "أهلا بكم فى %1$s يا @%2$s!" + +#: classes/User_group.php:380 +msgid "Could not create group." +msgstr "تعذّر إنشاء المجموعه." + +#: classes/User_group.php:409 +msgid "Could not set group membership." +msgstr "تعذّر ضبط عضويه المجموعه." + +#: lib/accountsettingsaction.php:108 +msgid "Change your profile settings" +msgstr "غيّر إعدادات ملفك الشخصي" + +#: lib/accountsettingsaction.php:112 +msgid "Upload an avatar" +msgstr "ارفع أفتارًا" + +#: lib/accountsettingsaction.php:116 +msgid "Change your password" +msgstr "غير كلمه سرّك" + +#: lib/accountsettingsaction.php:120 +msgid "Change email handling" +msgstr "غير أسلوب التعامل مع البريد الإلكتروني" + +#: lib/accountsettingsaction.php:124 +msgid "Design your profile" +msgstr "صمّم ملفك الشخصي" + +#: lib/accountsettingsaction.php:128 +msgid "Other" +msgstr "أخرى" + +#: lib/accountsettingsaction.php:128 +msgid "Other options" +msgstr "خيارات أخرى" + +#: lib/action.php:144 +#, php-format +msgid "%s - %s" +msgstr "%s - %s" + +#: lib/action.php:159 +msgid "Untitled page" +msgstr "صفحه غير مُعنونة" + +#: lib/action.php:425 +msgid "Primary site navigation" +msgstr "" + +#: lib/action.php:431 +msgid "Home" +msgstr "الرئيسية" + +#: lib/action.php:431 +msgid "Personal profile and friends timeline" +msgstr "الملف الشخصى ومسار الأصدقاء الزمني" + +#: lib/action.php:433 +msgid "Account" +msgstr "الحساب" + +#: lib/action.php:433 +msgid "Change your email, avatar, password, profile" +msgstr "" + +#: lib/action.php:436 +msgid "Connect" +msgstr "اتصل" + +#: lib/action.php:436 +msgid "Connect to services" +msgstr "" + +#: lib/action.php:440 +msgid "Change site configuration" +msgstr "غيّر ضبط الموقع" + +#: lib/action.php:444 lib/subgroupnav.php:105 +msgid "Invite" +msgstr "ادعُ" + +#: lib/action.php:445 lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + +#: lib/action.php:450 +msgid "Logout" +msgstr "اخرج" + +#: lib/action.php:450 +msgid "Logout from the site" +msgstr "اخرج من الموقع" + +#: lib/action.php:455 +msgid "Create an account" +msgstr "أنشئ حسابًا" + +#: lib/action.php:458 +msgid "Login to the site" +msgstr "لُج إلى الموقع" + +#: lib/action.php:461 lib/action.php:724 +msgid "Help" +msgstr "مساعدة" + +#: lib/action.php:461 +msgid "Help me!" +msgstr "ساعدني!" + +#: lib/action.php:464 lib/searchaction.php:127 +msgid "Search" +msgstr "ابحث" + +#: lib/action.php:464 +msgid "Search for people or text" +msgstr "ابحث عن أشخاص أو نص" + +#: lib/action.php:485 +msgid "Site notice" +msgstr "إشعار الموقع" + +#: lib/action.php:551 +msgid "Local views" +msgstr "المشاهدات المحلية" + +#: lib/action.php:617 +msgid "Page notice" +msgstr "إشعار الصفحة" + +#: lib/action.php:719 +msgid "Secondary site navigation" +msgstr "" + +#: lib/action.php:726 +msgid "About" +msgstr "عن" + +#: lib/action.php:728 +msgid "FAQ" +msgstr "الأسئله المكررة" + +#: lib/action.php:732 +msgid "TOS" +msgstr "الشروط" + +#: lib/action.php:735 +msgid "Privacy" +msgstr "خصوصية" + +#: lib/action.php:737 +msgid "Source" +msgstr "المصدر" + +#: lib/action.php:739 +msgid "Contact" +msgstr "اتصل" + +#: lib/action.php:741 +msgid "Badge" +msgstr "" + +#: lib/action.php:769 +msgid "StatusNet software license" +msgstr "" + +#: lib/action.php:772 +#, php-format +msgid "" +"**%%site.name%%** is a microblogging service brought to you by [%%site." +"broughtby%%](%%site.broughtbyurl%%). " +msgstr "" +"**%%site.name%%** خدمه تدوين مصغر يقدمها لك [%%site.broughtby%%](%%site." +"broughtbyurl%%). " + +#: lib/action.php:774 +#, php-format +msgid "**%%site.name%%** is a microblogging service. " +msgstr "" + +#: lib/action.php:776 +#, php-format +msgid "" +"It runs the [StatusNet](http://status.net/) microblogging software, version %" +"s, available under the [GNU Affero General Public License](http://www.fsf." +"org/licensing/licenses/agpl-3.0.html)." +msgstr "" +"يعمل على برنامج التدوين المُصغّر [StatusNet](http://status.net/) -النسخه %s- " +"المتوفر تحت [رخصه غنو أفيرو العمومية](http://www.fsf.org/licensing/licenses/" +"agpl-3.0.html)." + +#: lib/action.php:790 +msgid "Site content license" +msgstr "رخصه محتوى الموقع" + +#: lib/action.php:799 +msgid "All " +msgstr "" + +#: lib/action.php:804 +msgid "license." +msgstr "الرخصه." + +#: lib/action.php:1068 +msgid "Pagination" +msgstr "" + +#: lib/action.php:1077 +msgid "After" +msgstr "بعد" + +#: lib/action.php:1085 +msgid "Before" +msgstr "قبل" + +#: lib/action.php:1133 +msgid "There was a problem with your session token." +msgstr "" + +#: lib/adminpanelaction.php:96 +msgid "You cannot make changes to this site." +msgstr "" + +#: lib/adminpanelaction.php:195 +msgid "showForm() not implemented." +msgstr "" + +#: lib/adminpanelaction.php:224 +msgid "saveSettings() not implemented." +msgstr "" + +#: lib/adminpanelaction.php:247 +msgid "Unable to delete design setting." +msgstr "تعذّر حذف إعدادات التصميم." + +#: lib/adminpanelaction.php:300 +msgid "Basic site configuration" +msgstr "ضبط الموقع الأساسي" + +#: lib/adminpanelaction.php:303 +msgid "Design configuration" +msgstr "ضبط التصميم" + +#: lib/adminpanelaction.php:306 lib/adminpanelaction.php:309 +msgid "Paths configuration" +msgstr "ضبط المسارات" + +#: lib/attachmentlist.php:87 +msgid "Attachments" +msgstr "مرفقات" + +#: lib/attachmentlist.php:265 +msgid "Author" +msgstr "المؤلف" + +#: lib/attachmentlist.php:278 +msgid "Provider" +msgstr "المزود" + +#: lib/attachmentnoticesection.php:67 +msgid "Notices where this attachment appears" +msgstr "" + +#: lib/attachmenttagcloudsection.php:48 +msgid "Tags for this attachment" +msgstr "وسوم هذا المرفق" + +#: lib/channel.php:138 lib/channel.php:158 +msgid "Command results" +msgstr "نتائج الأمر" + +#: lib/channel.php:210 +msgid "Command complete" +msgstr "اكتمل الأمر" + +#: lib/channel.php:221 +msgid "Command failed" +msgstr "فشل الأمر" + +#: lib/command.php:44 +msgid "Sorry, this command is not yet implemented." +msgstr "" + +#: lib/command.php:88 +#, php-format +msgid "Could not find a user with nickname %s" +msgstr "" + +#: lib/command.php:92 +msgid "It does not make a lot of sense to nudge yourself!" +msgstr "" + +#: lib/command.php:99 +#, php-format +msgid "Nudge sent to %s" +msgstr "" + +#: lib/command.php:126 +#, php-format +msgid "" +"Subscriptions: %1$s\n" +"Subscribers: %2$s\n" +"Notices: %3$s" +msgstr "" +"الاشتراكات: %1$s\n" +"المشتركون: %2$s\n" +"الإشعارات: %3$s" + +#: lib/command.php:152 lib/command.php:400 +msgid "Notice with that id does not exist" +msgstr "" + +#: lib/command.php:168 lib/command.php:416 lib/command.php:472 +msgid "User has no last notice" +msgstr "ليس للمستخدم إشعار أخير" + +#: lib/command.php:190 +msgid "Notice marked as fave." +msgstr "" + +#: lib/command.php:315 +#, php-format +msgid "%1$s (%2$s)" +msgstr "%1$s (%2$s)" + +#: lib/command.php:318 +#, php-format +msgid "Fullname: %s" +msgstr "الاسم الكامل: %s" + +#: lib/command.php:321 +#, php-format +msgid "Location: %s" +msgstr "الموقع: %s" + +#: lib/command.php:324 +#, php-format +msgid "Homepage: %s" +msgstr "الصفحه الرئيسية: %s" + +#: lib/command.php:327 +#, php-format +msgid "About: %s" +msgstr "عن: %s" + +#: lib/command.php:358 scripts/xmppdaemon.php:321 +#, php-format +msgid "Message too long - maximum is %d characters, you sent %d" +msgstr "" + +#: lib/command.php:377 +msgid "Error sending direct message." +msgstr "" + +#: lib/command.php:431 +#, php-format +msgid "Notice too long - maximum is %d characters, you sent %d" +msgstr "" + +#: lib/command.php:440 +#, php-format +msgid "Reply to %s sent" +msgstr "رُد على رساله %s" + +#: lib/command.php:442 +msgid "Error saving notice." +msgstr "خطأ أثناء حفظ الإشعار." + +#: lib/command.php:496 +msgid "Specify the name of the user to subscribe to" +msgstr "" + +#: lib/command.php:503 +#, php-format +msgid "Subscribed to %s" +msgstr "مُشترك ب%s" + +#: lib/command.php:524 +msgid "Specify the name of the user to unsubscribe from" +msgstr "" + +#: lib/command.php:531 +#, php-format +msgid "Unsubscribed from %s" +msgstr "" + +#: lib/command.php:549 lib/command.php:572 +msgid "Command not yet implemented." +msgstr "" + +#: lib/command.php:552 +msgid "Notification off." +msgstr "" + +#: lib/command.php:554 +msgid "Can't turn off notification." +msgstr "" + +#: lib/command.php:575 +msgid "Notification on." +msgstr "" + +#: lib/command.php:577 +msgid "Can't turn on notification." +msgstr "" + +#: lib/command.php:590 +msgid "Login command is disabled" +msgstr "" + +#: lib/command.php:604 +#, php-format +msgid "Could not create login token for %s" +msgstr "" + +#: lib/command.php:609 +#, php-format +msgid "This link is useable only once, and is good for only 2 minutes: %s" +msgstr "" + +#: lib/command.php:625 +msgid "You are not subscribed to anyone." +msgstr "لست مُشتركًا بأى أحد." + +#: lib/command.php:627 +msgid "You are subscribed to this person:" +msgid_plural "You are subscribed to these people:" +msgstr[0] "لست مشتركًا بأحد." +msgstr[1] "أنت مشترك بهذا الشخص:" +msgstr[2] "أنت مشترك بهذين الشخصين:" +msgstr[3] "أنت مشترك بهؤلاء الأشخاص:" +msgstr[4] "" +msgstr[5] "" + +#: lib/command.php:647 +msgid "No one is subscribed to you." +msgstr "لا أحد مشترك بك." + +#: lib/command.php:649 +msgid "This person is subscribed to you:" +msgid_plural "These people are subscribed to you:" +msgstr[0] "لا أحد مشترك بك." +msgstr[1] "هذا الشخص مشترك بك:" +msgstr[2] "هذان الشخصان مشتركان بك:" +msgstr[3] "هؤلاء الأشخاص مشتركون بك:" +msgstr[4] "" +msgstr[5] "" + +#: lib/command.php:669 +msgid "You are not a member of any groups." +msgstr "لست عضوًا فى أى مجموعه." + +#: lib/command.php:671 +msgid "You are a member of this group:" +msgid_plural "You are a member of these groups:" +msgstr[0] "لست عضوًا فى أى مجموعه." +msgstr[1] "أنت عضو فى هذه المجموعة:" +msgstr[2] "أنت عضو فى هذين المجموعتين:" +msgstr[3] "أنت عضو فى هذه المجموعات:" +msgstr[4] "" +msgstr[5] "" + +#: lib/command.php:685 +msgid "" +"Commands:\n" +"on - turn on notifications\n" +"off - turn off notifications\n" +"help - show this help\n" +"follow - subscribe to user\n" +"groups - lists the groups you have joined\n" +"subscriptions - list the people you follow\n" +"subscribers - list the people that follow you\n" +"leave - unsubscribe from user\n" +"d - direct message to user\n" +"get - get last notice from user\n" +"whois - get profile info on user\n" +"fav - add user's last notice as a 'fave'\n" +"fav # - add notice with the given id as a 'fave'\n" +"reply # - reply to notice with a given id\n" +"reply - reply to the last notice from user\n" +"join - join group\n" +"login - Get a link to login to the web interface\n" +"drop - leave group\n" +"stats - get your stats\n" +"stop - same as 'off'\n" +"quit - same as 'off'\n" +"sub - same as 'follow'\n" +"unsub - same as 'leave'\n" +"last - same as 'get'\n" +"on - not yet implemented.\n" +"off - not yet implemented.\n" +"nudge - remind a user to update.\n" +"invite - not yet implemented.\n" +"track - not yet implemented.\n" +"untrack - not yet implemented.\n" +"track off - not yet implemented.\n" +"untrack all - not yet implemented.\n" +"tracks - not yet implemented.\n" +"tracking - not yet implemented.\n" +msgstr "" + +#: lib/common.php:199 +msgid "No configuration file found. " +msgstr "" + +#: lib/common.php:200 +msgid "I looked for configuration files in the following places: " +msgstr "" + +#: lib/common.php:201 +msgid "You may wish to run the installer to fix this." +msgstr "" + +#: lib/common.php:202 +msgid "Go to the installer." +msgstr "اذهب إلى المُثبّت." + +#: lib/connectsettingsaction.php:110 +msgid "IM" +msgstr "محادثه فورية" + +#: lib/connectsettingsaction.php:111 +msgid "Updates by instant messenger (IM)" +msgstr "" + +#: lib/connectsettingsaction.php:116 +msgid "Updates by SMS" +msgstr "" + +#: lib/dberroraction.php:60 +msgid "Database error" +msgstr "خطأ قاعده بيانات" + +#: lib/designsettings.php:105 +msgid "Upload file" +msgstr "ارفع ملفًا" + +#: lib/designsettings.php:109 +msgid "" +"You can upload your personal background image. The maximum file size is 2MB." +msgstr "تستطيع رفع صورتك الشخصيه. أقصى حجم للملف هو 2 م.ب." + +#: lib/designsettings.php:418 +msgid "Design defaults restored." +msgstr "استعيدت مبدئيات التصميم." + +#: lib/disfavorform.php:114 lib/disfavorform.php:140 +msgid "Disfavor this notice" +msgstr "ألغِ تفضيل هذا الإشعار" + +#: lib/favorform.php:114 lib/favorform.php:140 +msgid "Favor this notice" +msgstr "فضّل هذا الإشعار" + +#: lib/favorform.php:140 +msgid "Favor" +msgstr "فضّل" + +#: lib/feed.php:85 +msgid "RSS 1.0" +msgstr "آرإس​إس 1.0" + +#: lib/feed.php:87 +msgid "RSS 2.0" +msgstr "آرإس​إس 2.0" + +#: lib/feed.php:89 +msgid "Atom" +msgstr "أتوم" + +#: lib/feed.php:91 +msgid "FOAF" +msgstr "FOAF" + +#: lib/feedlist.php:64 +msgid "Export data" +msgstr "تصدير البيانات" + +#: lib/galleryaction.php:121 +msgid "Filter tags" +msgstr "رشّح الوسوم" + +#: lib/galleryaction.php:131 +msgid "All" +msgstr "الكل" + +#: lib/galleryaction.php:139 +msgid "Select tag to filter" +msgstr "اختر وسمًا لترشيحه" + +#: lib/galleryaction.php:140 +msgid "Tag" +msgstr "الوسم" + +#: lib/galleryaction.php:141 +msgid "Choose a tag to narrow list" +msgstr "" + +#: lib/galleryaction.php:143 +msgid "Go" +msgstr "اذهب" + +#: lib/groupeditform.php:163 +msgid "URL of the homepage or blog of the group or topic" +msgstr "" + +#: lib/groupeditform.php:168 +msgid "Describe the group or topic" +msgstr "" + +#: lib/groupeditform.php:170 +#, php-format +msgid "Describe the group or topic in %d characters" +msgstr "" + +#: lib/groupeditform.php:172 +msgid "Description" +msgstr "الوصف" + +#: lib/groupeditform.php:179 +msgid "" +"Location for the group, if any, like \"City, State (or Region), Country\"" +msgstr "" + +#: lib/groupeditform.php:187 +#, php-format +msgid "Extra nicknames for the group, comma- or space- separated, max %d" +msgstr "" + +#: lib/groupnav.php:85 +msgid "Group" +msgstr "مجموعات" + +#: lib/groupnav.php:101 +msgid "Blocked" +msgstr "ممنوع" + +#: lib/groupnav.php:102 +#, php-format +msgid "%s blocked users" +msgstr "" + +#: lib/groupnav.php:108 +#, php-format +msgid "Edit %s group properties" +msgstr "عدّل خصائص مجموعه %s" + +#: lib/groupnav.php:113 +msgid "Logo" +msgstr "الشعار" + +#: lib/groupnav.php:114 +#, php-format +msgid "Add or edit %s logo" +msgstr "أضف أو عدّل شعار %s" + +#: lib/groupnav.php:120 +#, php-format +msgid "Add or edit %s design" +msgstr "" + +#: lib/groupsbymemberssection.php:71 +msgid "Groups with most members" +msgstr "المجموعات الأكثر أعضاءً" + +#: lib/groupsbypostssection.php:71 +msgid "Groups with most posts" +msgstr "المجموعات الأكثر مرسلات" + +#: lib/grouptagcloudsection.php:56 +#, php-format +msgid "Tags in %s group's notices" +msgstr "" + +#: lib/htmloutputter.php:103 +msgid "This page is not available in a media type you accept" +msgstr "" + +#: lib/imagefile.php:75 +#, php-format +msgid "That file is too big. The maximum file size is %s." +msgstr "هذا الملف كبير جدًا. إن أقصى حجم للملفات هو %s." + +#: lib/imagefile.php:80 +msgid "Partial upload." +msgstr "" + +#: lib/imagefile.php:88 lib/mediafile.php:170 +msgid "System error uploading file." +msgstr "" + +#: lib/imagefile.php:96 +msgid "Not an image or corrupt file." +msgstr "" + +#: lib/imagefile.php:105 +msgid "Unsupported image file format." +msgstr "" + +#: lib/imagefile.php:118 +msgid "Lost our file." +msgstr "" + +#: lib/imagefile.php:150 lib/imagefile.php:197 +msgid "Unknown file type" +msgstr "نوع ملف غير معروف" + +#: lib/imagefile.php:217 +msgid "MB" +msgstr "" + +#: lib/imagefile.php:219 +msgid "kB" +msgstr "" + +#: lib/jabber.php:191 +#, php-format +msgid "[%s]" +msgstr "[%s]" + +#: lib/joinform.php:114 +msgid "Join" +msgstr "انضم" + +#: lib/leaveform.php:114 +msgid "Leave" +msgstr "غادر" + +#: lib/logingroupnav.php:80 +msgid "Login with a username and password" +msgstr "" + +#: lib/logingroupnav.php:86 +msgid "Sign up for a new account" +msgstr "" + +#: lib/mail.php:172 +msgid "Email address confirmation" +msgstr "تأكيد عنوان البريد الإلكتروني" + +#: lib/mail.php:174 +#, php-format +msgid "" +"Hey, %s.\n" +"\n" +"Someone just entered this email address on %s.\n" +"\n" +"If it was you, and you want to confirm your entry, use the URL below:\n" +"\n" +"\t%s\n" +"\n" +"If not, just ignore this message.\n" +"\n" +"Thanks for your time, \n" +"%s\n" +msgstr "" + +#: lib/mail.php:236 +#, php-format +msgid "%1$s is now listening to your notices on %2$s." +msgstr "" + +#: lib/mail.php:241 +#, php-format +msgid "" +"%1$s is now listening to your notices on %2$s.\n" +"\n" +"\t%3$s\n" +"\n" +"%4$s%5$s%6$s\n" +"Faithfully yours,\n" +"%7$s.\n" +"\n" +"----\n" +"Change your email address or notification options at %8$s\n" +msgstr "" + +#: lib/mail.php:254 +#, php-format +msgid "Location: %s\n" +msgstr "الموقع: %s\n" + +#: lib/mail.php:256 +#, php-format +msgid "Homepage: %s\n" +msgstr "الصفحه الرئيسية: %s\n" + +#: lib/mail.php:258 +#, php-format +msgid "" +"Bio: %s\n" +"\n" +msgstr "السيرة: %s\n" + +#: lib/mail.php:286 +#, php-format +msgid "New email address for posting to %s" +msgstr "" + +#: lib/mail.php:289 +#, php-format +msgid "" +"You have a new posting address on %1$s.\n" +"\n" +"Send email to %2$s to post new messages.\n" +"\n" +"More email instructions at %3$s.\n" +"\n" +"Faithfully yours,\n" +"%4$s" +msgstr "" + +#: lib/mail.php:413 +#, php-format +msgid "%s status" +msgstr "حاله %s" + +#: lib/mail.php:439 +msgid "SMS confirmation" +msgstr "" + +#: lib/mail.php:463 +#, php-format +msgid "You've been nudged by %s" +msgstr "" + +#: lib/mail.php:467 +#, php-format +msgid "" +"%1$s (%2$s) is wondering what you are up to these days and is inviting you " +"to post some news.\n" +"\n" +"So let's hear from you :)\n" +"\n" +"%3$s\n" +"\n" +"Don't reply to this email; it won't get to them.\n" +"\n" +"With kind regards,\n" +"%4$s\n" +msgstr "" + +#: lib/mail.php:510 +#, php-format +msgid "New private message from %s" +msgstr "رساله خاصه جديده من %s" + +#: lib/mail.php:514 +#, php-format +msgid "" +"%1$s (%2$s) sent you a private message:\n" +"\n" +"------------------------------------------------------\n" +"%3$s\n" +"------------------------------------------------------\n" +"\n" +"You can reply to their message here:\n" +"\n" +"%4$s\n" +"\n" +"Don't reply to this email; it won't get to them.\n" +"\n" +"With kind regards,\n" +"%5$s\n" +msgstr "" + +#: lib/mail.php:559 +#, php-format +msgid "%s (@%s) added your notice as a favorite" +msgstr "" + +#: lib/mail.php:561 +#, php-format +msgid "" +"%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n" +"\n" +"The URL of your notice is:\n" +"\n" +"%3$s\n" +"\n" +"The text of your notice is:\n" +"\n" +"%4$s\n" +"\n" +"You can see the list of %1$s's favorites here:\n" +"\n" +"%5$s\n" +"\n" +"Faithfully yours,\n" +"%6$s\n" +msgstr "" + +#: lib/mail.php:620 +#, php-format +msgid "%s (@%s) sent a notice to your attention" +msgstr "" + +#: lib/mail.php:622 +#, php-format +msgid "" +"%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n" +"\n" +"The notice is here:\n" +"\n" +"\t%3$s\n" +"\n" +"It reads:\n" +"\n" +"\t%4$s\n" +"\n" +msgstr "" + +#: lib/mailbox.php:89 +msgid "Only the user can read their own mailboxes." +msgstr "" + +#: lib/mailbox.php:139 +msgid "" +"You have no private messages. You can send private message to engage other " +"users in conversation. People can send you messages for your eyes only." +msgstr "" + +#: lib/mailbox.php:227 lib/noticelist.php:452 +msgid "from" +msgstr "من" + +#: lib/mediafile.php:98 lib/mediafile.php:123 +msgid "There was a database error while saving your file. Please try again." +msgstr "" + +#: lib/mediafile.php:142 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini." +msgstr "" + +#: lib/mediafile.php:147 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form." +msgstr "" + +#: lib/mediafile.php:152 +msgid "The uploaded file was only partially uploaded." +msgstr "" + +#: lib/mediafile.php:159 +msgid "Missing a temporary folder." +msgstr "" + +#: lib/mediafile.php:162 +msgid "Failed to write file to disk." +msgstr "فشل فى كتابه الملف إلى القرص." + +#: lib/mediafile.php:165 +msgid "File upload stopped by extension." +msgstr "" + +#: lib/mediafile.php:179 lib/mediafile.php:216 +msgid "File exceeds user's quota!" +msgstr "" + +#: lib/mediafile.php:196 lib/mediafile.php:233 +msgid "File could not be moved to destination directory." +msgstr "" + +#: lib/mediafile.php:201 lib/mediafile.php:237 +msgid "Could not determine file's mime-type!" +msgstr "" + +#: lib/mediafile.php:270 +#, php-format +msgid " Try using another %s format." +msgstr "" + +#: lib/mediafile.php:275 +#, php-format +msgid "%s is not a supported filetype on this server." +msgstr "" + +#: lib/messageform.php:120 +msgid "Send a direct notice" +msgstr "أرسل إشعارًا مباشرًا" + +#: lib/messageform.php:146 +msgid "To" +msgstr "إلى" + +#: lib/messageform.php:159 lib/noticeform.php:183 +msgid "Available characters" +msgstr "المحارف المتوفرة" + +#: lib/noticeform.php:158 +msgid "Send a notice" +msgstr "أرسل إشعارًا" + +#: lib/noticeform.php:171 +#, php-format +msgid "What's up, %s?" +msgstr "ما الأخبار يا %s؟" + +#: lib/noticeform.php:190 +msgid "Attach" +msgstr "أرفق" + +#: lib/noticeform.php:194 +msgid "Attach a file" +msgstr "أرفق ملفًا" + +#: lib/noticelist.php:403 +#, php-format +msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" +msgstr "" + +#: lib/noticelist.php:404 +msgid "N" +msgstr "ش" + +#: lib/noticelist.php:404 +msgid "S" +msgstr "ج" + +#: lib/noticelist.php:405 +msgid "E" +msgstr "ر" + +#: lib/noticelist.php:405 +msgid "W" +msgstr "غ" + +#: lib/noticelist.php:411 +msgid "at" +msgstr "في" + +#: lib/noticelist.php:506 +msgid "in context" +msgstr "فى السياق" + +#: lib/noticelist.php:526 +msgid "Reply to this notice" +msgstr "رُد على هذا الإشعار" + +#: lib/noticelist.php:527 +msgid "Reply" +msgstr "رُد" + +#: lib/nudgeform.php:116 +msgid "Nudge this user" +msgstr "نبّه هذا المستخدم" + +#: lib/nudgeform.php:128 +msgid "Nudge" +msgstr "نبّه" + +#: lib/nudgeform.php:128 +msgid "Send a nudge to this user" +msgstr "" + +#: lib/oauthstore.php:283 +msgid "Error inserting new profile" +msgstr "خطأ أثناء إدراج الملف الشخصى الجديد" + +#: lib/oauthstore.php:291 +msgid "Error inserting avatar" +msgstr "خطأ فى إدراج الأفتار" + +#: lib/oauthstore.php:311 +msgid "Error inserting remote profile" +msgstr "خطأ أثناء إدراج الملف الشخصى البعيد" + +#: lib/oauthstore.php:345 +msgid "Duplicate notice" +msgstr "ضاعف الإشعار" + +#: lib/oauthstore.php:466 lib/subs.php:48 +msgid "You have been banned from subscribing." +msgstr "" + +#: lib/oauthstore.php:491 +msgid "Couldn't insert new subscription." +msgstr "تعذّر إدراج اشتراك جديد." + +#: lib/personalgroupnav.php:99 +msgid "Personal" +msgstr "شخصية" + +#: lib/personalgroupnav.php:104 +msgid "Replies" +msgstr "الردود" + +#: lib/personalgroupnav.php:114 +msgid "Favorites" +msgstr "المفضلات" + +#: lib/personalgroupnav.php:124 +msgid "Inbox" +msgstr "صندوق الوارد" + +#: lib/personalgroupnav.php:125 +msgid "Your incoming messages" +msgstr "رسائلك الواردة" + +#: lib/personalgroupnav.php:129 +msgid "Outbox" +msgstr "صندوق الصادر" + +#: lib/personalgroupnav.php:130 +msgid "Your sent messages" +msgstr "رسائلك المُرسلة" + +#: lib/personaltagcloudsection.php:56 +#, php-format +msgid "Tags in %s's notices" +msgstr "" + +#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82 +msgid "Subscriptions" +msgstr "الاشتراكات" + +#: lib/profileaction.php:126 +msgid "All subscriptions" +msgstr "جميع الاشتراكات" + +#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90 +msgid "Subscribers" +msgstr "المشتركون" + +#: lib/profileaction.php:157 +msgid "All subscribers" +msgstr "جميع المشتركين" + +#: lib/profileaction.php:178 +msgid "User ID" +msgstr "هويه المستخدم" + +#: lib/profileaction.php:183 +msgid "Member since" +msgstr "عضو منذ" + +#: lib/profileaction.php:245 +msgid "All groups" +msgstr "كل المجموعات" + +#: lib/profileformaction.php:123 +#, fuzzy +msgid "No return-to arguments" +msgstr "لا مُدخل هويه." + +#: lib/profileformaction.php:137 +msgid "unimplemented method" +msgstr "" + +#: lib/publicgroupnav.php:78 +msgid "Public" +msgstr "عام" + +#: lib/publicgroupnav.php:82 +msgid "User groups" +msgstr "مجموعات المستخدمين" + +#: lib/publicgroupnav.php:84 lib/publicgroupnav.php:85 +msgid "Recent tags" +msgstr "الوسوم الحديثة" + +#: lib/publicgroupnav.php:88 +msgid "Featured" +msgstr "مُختارون" + +#: lib/publicgroupnav.php:92 +msgid "Popular" +msgstr "مشهورة" + +#: lib/sandboxform.php:67 +msgid "Sandbox" +msgstr "" + +#: lib/sandboxform.php:78 +#, fuzzy +msgid "Sandbox this user" +msgstr "ألغِ منع هذا المستخدم" + +#: lib/searchaction.php:120 +msgid "Search site" +msgstr "ابحث فى الموقع" + +#: lib/searchaction.php:126 +msgid "Keyword(s)" +msgstr "الكلمات المفتاحية" + +#: lib/searchaction.php:162 +msgid "Search help" +msgstr "ابحث فى المساعدة" + +#: lib/searchgroupnav.php:80 +msgid "People" +msgstr "أشخاص" + +#: lib/searchgroupnav.php:81 +msgid "Find people on this site" +msgstr "ابحث عن أشخاص على هذا الموقع" + +#: lib/searchgroupnav.php:83 +msgid "Find content of notices" +msgstr "ابحث عن محتويات فى الإشعارات" + +#: lib/searchgroupnav.php:85 +msgid "Find groups on this site" +msgstr "ابحث عن مجموعات على هذا الموقع" + +#: lib/section.php:89 +msgid "Untitled section" +msgstr "قسم غير مُعنون" + +#: lib/section.php:106 +msgid "More..." +msgstr "المزيد..." + +#: lib/silenceform.php:67 +msgid "Silence" +msgstr "أسكت" + +#: lib/silenceform.php:78 +msgid "Silence this user" +msgstr "أسكت هذا المستخدم" + +#: lib/subgroupnav.php:83 +#, php-format +msgid "People %s subscribes to" +msgstr "الأشخاص الذين اشترك بهم %s" + +#: lib/subgroupnav.php:91 +#, php-format +msgid "People subscribed to %s" +msgstr "الأشخاص المشتركون ب%s" + +#: lib/subgroupnav.php:99 +#, php-format +msgid "Groups %s is a member of" +msgstr "المجموعات التى %s عضو فيها" + +#: lib/subs.php:52 +msgid "Already subscribed!" +msgstr "مُشترك أصلا!" + +#: lib/subs.php:56 +msgid "User has blocked you." +msgstr "لقد منعك المستخدم." + +#: lib/subs.php:60 +msgid "Could not subscribe." +msgstr "تعذّر الاشتراك." + +#: lib/subs.php:79 +msgid "Could not subscribe other to you." +msgstr "" + +#: lib/subs.php:128 +#, fuzzy +msgid "Not subscribed!" +msgstr "لست مُشتركًا!" + +#: lib/subs.php:133 +#, fuzzy +msgid "Couldn't delete self-subscription." +msgstr "تعذّر حذف الاشتراك." + +#: lib/subs.php:146 +msgid "Couldn't delete subscription." +msgstr "تعذّر حذف الاشتراك." + +#: lib/subscriberspeopleselftagcloudsection.php:48 +#: lib/subscriptionspeopleselftagcloudsection.php:48 +msgid "People Tagcloud as self-tagged" +msgstr "" + +#: lib/subscriberspeopletagcloudsection.php:48 +#: lib/subscriptionspeopletagcloudsection.php:48 +msgid "People Tagcloud as tagged" +msgstr "" + +#: lib/subscriptionlist.php:126 +msgid "(none)" +msgstr "(لا شيء)" + +#: lib/tagcloudsection.php:56 +msgid "None" +msgstr "لا شيء" + +#: lib/topposterssection.php:74 +msgid "Top posters" +msgstr "أعلى المرسلين" + +#: lib/unsandboxform.php:69 +msgid "Unsandbox" +msgstr "" + +#: lib/unsandboxform.php:80 +#, fuzzy +msgid "Unsandbox this user" +msgstr "ألغِ منع هذا المستخدم" + +#: lib/unsilenceform.php:67 +msgid "Unsilence" +msgstr "ألغِ الإسكات" + +#: lib/unsilenceform.php:78 +msgid "Unsilence this user" +msgstr "ألغِ إسكات هذا المستخدم" + +#: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137 +msgid "Unsubscribe from this user" +msgstr "ألغِ الاشتراك مع هذا المستخدم" + +#: lib/unsubscribeform.php:137 +msgid "Unsubscribe" +msgstr "ألغِ الاشتراك" + +#: lib/userprofile.php:116 +msgid "Edit Avatar" +msgstr "عدّل الأفتار" + +#: lib/userprofile.php:236 +msgid "User actions" +msgstr "تصرفات المستخدم" + +#: lib/userprofile.php:248 +msgid "Edit profile settings" +msgstr "عدّل إعدادات الملف الشخصي" + +#: lib/userprofile.php:249 +msgid "Edit" +msgstr "عدّل" + +#: lib/userprofile.php:272 +msgid "Send a direct message to this user" +msgstr "أرسل رساله مباشره إلى هذا المستخدم" + +#: lib/userprofile.php:273 +msgid "Message" +msgstr "رسالة" + +#: lib/userprofile.php:311 +msgid "Moderate" +msgstr "" + +#: lib/util.php:825 +msgid "a few seconds ago" +msgstr "قبل لحظات قليلة" + +#: lib/util.php:827 +msgid "about a minute ago" +msgstr "قبل دقيقه تقريبًا" + +#: lib/util.php:829 +#, php-format +msgid "about %d minutes ago" +msgstr "" + +#: lib/util.php:831 +msgid "about an hour ago" +msgstr "قبل ساعه تقريبًا" + +#: lib/util.php:833 +#, php-format +msgid "about %d hours ago" +msgstr "" + +#: lib/util.php:835 +msgid "about a day ago" +msgstr "قبل يوم تقريبا" + +#: lib/util.php:837 +#, php-format +msgid "about %d days ago" +msgstr "" + +#: lib/util.php:839 +msgid "about a month ago" +msgstr "قبل شهر تقريبًا" + +#: lib/util.php:841 +#, php-format +msgid "about %d months ago" +msgstr "" + +#: lib/util.php:843 +msgid "about a year ago" +msgstr "قبل سنه تقريبًا" + +#: lib/webcolor.php:82 +#, php-format +msgid "%s is not a valid color!" +msgstr "%s ليس لونًا صحيحًا!" + +#: lib/webcolor.php:123 +#, php-format +msgid "%s is not a valid color! Use 3 or 6 hex chars." +msgstr "" + +#: scripts/maildaemon.php:48 +msgid "Could not parse message." +msgstr "تعذّر تحليل الرساله." + +#: scripts/maildaemon.php:53 +msgid "Not a registered user." +msgstr "ليس مستخدمًا مسجلًا." + +#: scripts/maildaemon.php:57 +msgid "Sorry, that is not your incoming email address." +msgstr "" + +#: scripts/maildaemon.php:61 +msgid "Sorry, no incoming email allowed." +msgstr "" -- cgit v1.2.3-54-g00ecf From c622d144400026dac65c39303994d11f114c0f5b Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 12 Dec 2009 14:46:24 -0500 Subject: add statuses/retweets to API --- actions/apistatusesretweets.php | 116 ++++++++++++++++++++++++++++++++++++++++ classes/Notice.php | 67 +++++++++++++++++++++++ lib/router.php | 5 ++ 3 files changed, 188 insertions(+) create mode 100644 actions/apistatusesretweets.php (limited to 'lib') diff --git a/actions/apistatusesretweets.php b/actions/apistatusesretweets.php new file mode 100644 index 000000000..c54a374e2 --- /dev/null +++ b/actions/apistatusesretweets.php @@ -0,0 +1,116 @@ +. + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR . '/lib/apiauth.php'; +require_once INSTALLDIR . '/lib/mediafile.php'; + +/** + * Show up to 100 repeats of a notice + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ApiStatusesRetweetsAction extends ApiAuthAction +{ + const MAXCOUNT = 100; + + var $original = null; + var $cnt = self::MAXCOUNT; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + * + */ + + function prepare($args) + { + parent::prepare($args); + + $id = $this->trimmed('id'); + + $this->original = Notice::staticGet('id', $id); + + if (empty($this->original)) { + $this->clientError(_('No such notice'), + 400, $this->format); + return false; + } + + $cnt = $this->trimmed('count'); + + if (empty($cnt) || !is_integer($cnt)) { + $cnt = 100; + } else { + $this->cnt = min((int)$cnt, self::MAXCOUNT); + } + + return true; + } + + /** + * Handle the request + * + * Make a new notice for the update, save it, and show it + * + * @param array $args $_REQUEST data (unused) + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + + $strm = $this->original->repeatStream($this->cnt); + + switch ($this->format) { + case 'xml': + $this->showXmlTimeline($strm); + break; + case 'json': + $this->showJsonTimeline($strm); + break; + default: + $this->clientError(_('API method not found!'), $code = 404); + break; + } + } +} diff --git a/classes/Notice.php b/classes/Notice.php index 82753fbdd..ec80f763f 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -441,10 +441,23 @@ class Notice extends Memcached_DataObject $this->blowTagCache($blowLast); $this->blowGroupCache($blowLast); $this->blowConversationCache($blowLast); + $this->blowRepeatCache(); $profile = Profile::staticGet($this->profile_id); $profile->blowNoticeCount(); } + function blowRepeatCache() + { + if (!empty($this->repeat_of)) { + $cache = common_memcache(); + if (!empty($cache)) { + // XXX: only blow if <100 in cache + $ck = common_cache_key('notice:repeats:'.$this->repeat_of); + $result = $cache->delete($ck); + } + } + } + function blowConversationCache($blowLast=false) { $cache = common_memcache(); @@ -1455,4 +1468,58 @@ class Notice extends Memcached_DataObject return self::saveNew($repeater_id, $content, $source, array('repeat_of' => $this->id)); } + + // These are supposed to be in chron order! + + function repeatStream($limit=100) + { + $cache = common_memcache(); + + if (empty($cache)) { + $ids = $this->_repeatStreamDirect($limit); + } else { + $idstr = $cache->get(common_cache_key('notice:repeats:'.$this->id)); + if (!empty($idstr)) { + $ids = explode(',', $idstr); + } else { + $ids = $this->_repeatStreamDirect(100); + $cache->set(common_cache_key('notice:repeats:'.$this->id), implode(',', $ids)); + } + if ($limit < 100) { + // We do a max of 100, so slice down to limit + $ids = array_slice($ids, 0, $limit); + } + } + + return Notice::getStreamByIds($ids); + } + + function _repeatStreamDirect($limit) + { + $notice = new Notice(); + + $notice->selectAdd(); // clears it + $notice->selectAdd('id'); + + $notice->repeat_of = $this->id; + + $notice->orderBy('created'); // NB: asc! + + if (!is_null($offset)) { + $notice->limit($offset, $limit); + } + + $ids = array(); + + if ($notice->find()) { + while ($notice->fetch()) { + $ids[] = $notice->id; + } + } + + $notice->free(); + $notice = NULL; + + return $ids; + } } diff --git a/lib/router.php b/lib/router.php index 835339720..b0b95b080 100644 --- a/lib/router.php +++ b/lib/router.php @@ -364,6 +364,11 @@ class Router 'id' => '[0-9]+', 'format' => '(xml|json)')); + $m->connect('api/statuses/retweets/:id.:format', + array('action' => 'ApiStatusesRetweets', + 'id' => '[0-9]+', + 'format' => '(xml|json)')); + // users $m->connect('api/users/show.:format', -- cgit v1.2.3-54-g00ecf From b42b2e1d05867b2dd4cdb3e1b7e278c63001d355 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 12 Dec 2009 15:00:09 -0500 Subject: integer utility for arguments --- lib/action.php | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'lib') diff --git a/lib/action.php b/lib/action.php index 87d8a4399..dac0e2583 100644 --- a/lib/action.php +++ b/lib/action.php @@ -951,6 +951,36 @@ class Action extends HTMLOutputter // lawsuit } } + /** + * Integer value of an argument + * + * @param string $key query key we're interested in + * @param string $defValue optional default value (default null) + * @param string $maxValue optional max value (default null) + * @param string $minValue optional min value (default null) + * + * @return integer integer value + */ + + function int($key, $defValue=null, $maxValue=null, $minValue=null) + { + $arg = strtolower($this->trimmed($key)); + + if (is_null($arg) || !is_integer($arg)) { + return $defValue; + } + + if (!is_null($maxValue)) { + $arg = min($arg, $maxValue); + } + + if (!is_null($minValue)) { + $arg = max($arg, $minValue); + } + + return $arg; + } + /** * Server error * -- cgit v1.2.3-54-g00ecf From 138ce0cd05e2e59c79b29f5eeea5c11d1e56e931 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 12 Dec 2009 15:35:05 -0500 Subject: add statuses/retweeted_by_me api action --- actions/apitimelineretweetedbyme.php | 126 +++++++++++++++++++++++++++++++++++ classes/Notice.php | 9 +++ classes/User.php | 52 +++++++++++++++ lib/router.php | 4 ++ 4 files changed, 191 insertions(+) create mode 100644 actions/apitimelineretweetedbyme.php (limited to 'lib') diff --git a/actions/apitimelineretweetedbyme.php b/actions/apitimelineretweetedbyme.php new file mode 100644 index 000000000..1e65678ad --- /dev/null +++ b/actions/apitimelineretweetedbyme.php @@ -0,0 +1,126 @@ +. + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR . '/lib/apiauth.php'; +require_once INSTALLDIR . '/lib/mediafile.php'; + +/** + * Show authenticating user's most recent repeats + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ApiTimelineRetweetedByMeAction extends ApiAuthAction +{ + const DEFAULTCOUNT = 20; + const MAXCOUNT = 200; + const MAXNOTICES = 3200; + + var $repeats = null; + var $cnt = self::DEFAULTCOUNT; + var $page = 1; + var $since_id = null; + var $max_id = null; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + * + */ + + function prepare($args) + { + parent::prepare($args); + + $cnt = $this->int('count', self::DEFAULTCOUNT, self::MAXCOUNT, 1); + + $page = $this->int('page', 1, (self::MAXNOTICES/$this->cnt)); + + $since_id = $this->int('since_id'); + + $max_id = $this->int('max_id'); + + return true; + } + + /** + * Handle the request + * + * show a timeline of the user's repeated notices + * + * @param array $args $_REQUEST data (unused) + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + + $offset = ($this->page-1) * $this->cnt; + $limit = $this->cnt; + + $strm = $this->auth_user->repeatedByMe($offset, $limit, $this->since_id, $this->max_id); + + switch ($this->format) { + case 'xml': + $this->showXmlTimeline($strm); + break; + case 'json': + $this->showJsonTimeline($strm); + break; + case 'atom': + $profile = $this->auth_user->getProfile(); + + $title = sprintf(_("Repeated by %s"), $this->auth_user->nickname); + $taguribase = common_config('integration', 'taguri'); + $id = "tag:$taguribase:RepeatedByMe:" . $this->auth_user->id; + $link = common_local_url('showstream', + array('nickname' => $this->auth_user->nickname)); + + $this->showAtomTimeline($strm, $title, $id, $link); + break; + + default: + $this->clientError(_('API method not found!'), $code = 404); + break; + } + } +} diff --git a/classes/Notice.php b/classes/Notice.php index ec80f763f..6a701ae0c 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -454,6 +454,15 @@ class Notice extends Memcached_DataObject // XXX: only blow if <100 in cache $ck = common_cache_key('notice:repeats:'.$this->repeat_of); $result = $cache->delete($ck); + + $user = User::staticGet('id', $this->profile_id); + + if (!empty($user)) { + $uk = common_cache_key('user:repeated_by_me:'.$user->id); + $cache->delete($uk); + $user->free(); + unset($user); + } } } } diff --git a/classes/User.php b/classes/User.php index 2a4fab7d4..4b7365fc7 100644 --- a/classes/User.php +++ b/classes/User.php @@ -741,4 +741,56 @@ class User extends Memcached_DataObject $profile = $this->getProfile(); return $profile->isSilenced(); } + + function repeatedByMe($offset=0, $limit=20, $since_id=null, $max_id=null) + { + $ids = Notice::stream(array($this, '_repeatedByMeDirect'), + array(), + 'user:repeated_by_me:'.$this->id, + $offset, $limit, $since_id, $max_id, null); + + return Notice::getStreamByIds($ids); + } + + function _repeatedByMeDirect($offset, $limit, $since_id, $max_id, $since) + { + $notice = new Notice(); + + $notice->selectAdd(); // clears it + $notice->selectAdd('id'); + + $notice->profile_id = $this->id; + $notice->whereAdd('repeat_of IS NOT NULL'); + + $notice->orderBy('id DESC'); + + if (!is_null($offset)) { + $notice->limit($offset, $limit); + } + + if ($since_id != 0) { + $notice->whereAdd('id > ' . $since_id); + } + + if ($max_id != 0) { + $notice->whereAdd('id <= ' . $max_id); + } + + if (!is_null($since)) { + $notice->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\''); + } + + $ids = array(); + + if ($notice->find()) { + while ($notice->fetch()) { + $ids[] = $notice->id; + } + } + + $notice->free(); + $notice = NULL; + + return $ids; + } } diff --git a/lib/router.php b/lib/router.php index b0b95b080..5c1bd3c4f 100644 --- a/lib/router.php +++ b/lib/router.php @@ -319,6 +319,10 @@ class Router 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json|rss|atom)')); + $m->connect('api/statuses/retweeted_by_me.:format', + array('action' => 'ApiTimelineRetweetedByMe', + 'format' => '(xml|json|atom)')); + $m->connect('api/statuses/friends.:format', array('action' => 'ApiUserFriends', 'format' => '(xml|json)')); -- cgit v1.2.3-54-g00ecf From cfe67a9c0192129448ea3f0b98aadf49e962fd4d Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 12 Dec 2009 16:00:27 -0500 Subject: add statuses/retweets_of_me to API --- actions/apitimelineretweetsofme.php | 126 ++++++++++++++++++++++++++++++++++++ classes/Notice.php | 14 ++++ classes/User.php | 53 +++++++++++++++ lib/router.php | 4 ++ 4 files changed, 197 insertions(+) create mode 100644 actions/apitimelineretweetsofme.php (limited to 'lib') diff --git a/actions/apitimelineretweetsofme.php b/actions/apitimelineretweetsofme.php new file mode 100644 index 000000000..479bff431 --- /dev/null +++ b/actions/apitimelineretweetsofme.php @@ -0,0 +1,126 @@ +. + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR . '/lib/apiauth.php'; +require_once INSTALLDIR . '/lib/mediafile.php'; + +/** + * Show authenticating user's most recent notices that have been repeated + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ApiTimelineRetweetsOfMeAction extends ApiAuthAction +{ + const DEFAULTCOUNT = 20; + const MAXCOUNT = 200; + const MAXNOTICES = 3200; + + var $repeats = null; + var $cnt = self::DEFAULTCOUNT; + var $page = 1; + var $since_id = null; + var $max_id = null; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + * + */ + + function prepare($args) + { + parent::prepare($args); + + $cnt = $this->int('count', self::DEFAULTCOUNT, self::MAXCOUNT, 1); + + $page = $this->int('page', 1, (self::MAXNOTICES/$this->cnt)); + + $since_id = $this->int('since_id'); + + $max_id = $this->int('max_id'); + + return true; + } + + /** + * Handle the request + * + * show a timeline of the user's repeated notices + * + * @param array $args $_REQUEST data (unused) + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + + $offset = ($this->page-1) * $this->cnt; + $limit = $this->cnt; + + $strm = $this->auth_user->repeatsOfMe($offset, $limit, $this->since_id, $this->max_id); + + switch ($this->format) { + case 'xml': + $this->showXmlTimeline($strm); + break; + case 'json': + $this->showJsonTimeline($strm); + break; + case 'atom': + $profile = $this->auth_user->getProfile(); + + $title = sprintf(_("Repeats of %s"), $this->auth_user->nickname); + $taguribase = common_config('integration', 'taguri'); + $id = "tag:$taguribase:RepeatsOfMe:" . $this->auth_user->id; + $link = common_local_url('showstream', + array('nickname' => $this->auth_user->nickname)); + + $this->showAtomTimeline($strm, $title, $id, $link); + break; + + default: + $this->clientError(_('API method not found!'), $code = 404); + break; + } + } +} diff --git a/classes/Notice.php b/classes/Notice.php index 6a701ae0c..eb611f314 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -463,6 +463,20 @@ class Notice extends Memcached_DataObject $user->free(); unset($user); } + + $original = Notice::staticGet('id', $this->repeat_of); + + if (!empty($original)) { + $originalUser = User::staticGet('id', $original->profile_id); + if (!empty($originalUser)) { + $ouk = common_cache_key('user:repeats_of_me:'.$originalUser->id); + $cache->delete($ouk); + $originalUser->free(); + unset($originalUser); + } + $original->free(); + unset($original); + } } } } diff --git a/classes/User.php b/classes/User.php index 4b7365fc7..b3da448a6 100644 --- a/classes/User.php +++ b/classes/User.php @@ -793,4 +793,57 @@ class User extends Memcached_DataObject return $ids; } + + function repeatsOfMe($offset=0, $limit=20, $since_id=null, $max_id=null) + { + $ids = Notice::stream(array($this, '_repeatsOfMeDirect'), + array(), + 'user:repeats_of_me:'.$this->id, + $offset, $limit, $since_id, $max_id, null); + + return Notice::getStreamByIds($ids); + } + + function _repeatsOfMeDirect($offset, $limit, $since_id, $max_id, $since) + { + $qry = + 'SELECT DISTINCT original.id AS id ' . + 'FROM notice original JOIN notice rept ON original.id = rept.repeat_of ' . + 'WHERE original.profile_id = ' . $this->id . ' '; + + if ($since_id != 0) { + $qry .= 'AND original.id > ' . $since_id . ' '; + } + + if ($max_id != 0) { + $qry .= 'AND original.id <= ' . $max_id . ' '; + } + + if (!is_null($since)) { + $qry .= 'AND original.modified > \'' . date('Y-m-d H:i:s', $since) . '\' '; + } + + // NOTE: we sort by fave time, not by notice time! + + $qry .= 'ORDER BY original.id DESC '; + + if (!is_null($offset)) { + $qry .= "LIMIT $limit OFFSET $offset"; + } + + $ids = array(); + + $notice = new Notice(); + + $notice->query($qry); + + while ($notice->fetch()) { + $ids[] = $notice->id; + } + + $notice->free(); + $notice = NULL; + + return $ids; + } } diff --git a/lib/router.php b/lib/router.php index 5c1bd3c4f..732caa1c7 100644 --- a/lib/router.php +++ b/lib/router.php @@ -323,6 +323,10 @@ class Router array('action' => 'ApiTimelineRetweetedByMe', 'format' => '(xml|json|atom)')); + $m->connect('api/statuses/retweets_of_me.:format', + array('action' => 'ApiTimelineRetweetsOfMe', + 'format' => '(xml|json|atom)')); + $m->connect('api/statuses/friends.:format', array('action' => 'ApiUserFriends', 'format' => '(xml|json)')); -- cgit v1.2.3-54-g00ecf From 1ec54d3433a79f56c14c0a99114bb1e607348899 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 12 Dec 2009 16:15:23 -0500 Subject: add statuses/retweeted_to_me to API --- actions/apitimelineretweetedtome.php | 125 +++++++++++++++++++++++++++++++++++ classes/Notice.php | 14 ++++ classes/User.php | 54 +++++++++++++++ lib/router.php | 4 ++ 4 files changed, 197 insertions(+) create mode 100644 actions/apitimelineretweetedtome.php (limited to 'lib') diff --git a/actions/apitimelineretweetedtome.php b/actions/apitimelineretweetedtome.php new file mode 100644 index 000000000..681b0b9e9 --- /dev/null +++ b/actions/apitimelineretweetedtome.php @@ -0,0 +1,125 @@ +. + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR . '/lib/apiauth.php'; + +/** + * Show most recent notices that are repeats in user's inbox + * + * @category API + * @package StatusNet + * @author Evan Prodromou + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ApiTimelineRetweetedToMeAction extends ApiAuthAction +{ + const DEFAULTCOUNT = 20; + const MAXCOUNT = 200; + const MAXNOTICES = 3200; + + var $repeats = null; + var $cnt = self::DEFAULTCOUNT; + var $page = 1; + var $since_id = null; + var $max_id = null; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + * + */ + + function prepare($args) + { + parent::prepare($args); + + $cnt = $this->int('count', self::DEFAULTCOUNT, self::MAXCOUNT, 1); + + $page = $this->int('page', 1, (self::MAXNOTICES/$this->cnt)); + + $since_id = $this->int('since_id'); + + $max_id = $this->int('max_id'); + + return true; + } + + /** + * Handle the request + * + * show a timeline of the user's repeated notices + * + * @param array $args $_REQUEST data (unused) + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + + $offset = ($this->page-1) * $this->cnt; + $limit = $this->cnt; + + $strm = $this->auth_user->repeatedToMe($offset, $limit, $this->since_id, $this->max_id); + + switch ($this->format) { + case 'xml': + $this->showXmlTimeline($strm); + break; + case 'json': + $this->showJsonTimeline($strm); + break; + case 'atom': + $profile = $this->auth_user->getProfile(); + + $title = sprintf(_("Repeated to %s"), $this->auth_user->nickname); + $taguribase = common_config('integration', 'taguri'); + $id = "tag:$taguribase:RepeatedToMe:" . $this->auth_user->id; + $link = common_local_url('all', + array('nickname' => $this->auth_user->nickname)); + + $this->showAtomTimeline($strm, $title, $id, $link); + break; + + default: + $this->clientError(_('API method not found!'), $code = 404); + break; + } + } +} diff --git a/classes/Notice.php b/classes/Notice.php index a7b0f8cdb..7d2b898d2 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -483,6 +483,20 @@ class Notice extends Memcached_DataObject $original->free(); unset($original); } + + $ni = new Notice_inbox(); + + $ni->notice_id = $this->id; + + if ($ni->find()) { + while ($ni->fetch()) { + $tmk = common_cache_key('user:repeated_to_me:'.$ni->user_id); + $cache->delete($tmk); + } + } + + $ni->free(); + unset($ni); } } } diff --git a/classes/User.php b/classes/User.php index b3da448a6..9c071e06b 100644 --- a/classes/User.php +++ b/classes/User.php @@ -846,4 +846,58 @@ class User extends Memcached_DataObject return $ids; } + + function repeatedToMe($offset=0, $limit=20, $since_id=null, $max_id=null) + { + $ids = Notice::stream(array($this, '_repeatedToMeDirect'), + array(), + 'user:repeated_to_me:'.$this->id, + $offset, $limit, $since_id, $max_id, null); + + return Notice::getStreamByIds($ids); + } + + function _repeatedToMeDirect($offset, $limit, $since_id, $max_id, $since) + { + $qry = + 'SELECT notice.id AS id ' . + 'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' . + 'WHERE notice_inbox.user_id = ' . $this->id . ' ' . + 'AND notice.repeat_of IS NOT NULL '; + + if ($since_id != 0) { + $qry .= 'AND notice.id > ' . $since_id . ' '; + } + + if ($max_id != 0) { + $qry .= 'AND notice.id <= ' . $max_id . ' '; + } + + if (!is_null($since)) { + $qry .= 'AND notice.modified > \'' . date('Y-m-d H:i:s', $since) . '\' '; + } + + // NOTE: we sort by fave time, not by notice time! + + $qry .= 'ORDER BY notice.id DESC '; + + if (!is_null($offset)) { + $qry .= "LIMIT $limit OFFSET $offset"; + } + + $ids = array(); + + $notice = new Notice(); + + $notice->query($qry); + + while ($notice->fetch()) { + $ids[] = $notice->id; + } + + $notice->free(); + $notice = NULL; + + return $ids; + } } diff --git a/lib/router.php b/lib/router.php index 732caa1c7..8f68f86ac 100644 --- a/lib/router.php +++ b/lib/router.php @@ -323,6 +323,10 @@ class Router array('action' => 'ApiTimelineRetweetedByMe', 'format' => '(xml|json|atom)')); + $m->connect('api/statuses/retweeted_to_me.:format', + array('action' => 'ApiTimelineRetweetedToMe', + 'format' => '(xml|json|atom)')); + $m->connect('api/statuses/retweets_of_me.:format', array('action' => 'ApiTimelineRetweetsOfMe', 'format' => '(xml|json|atom)')); -- cgit v1.2.3-54-g00ecf From 304ba80a0f39340c9bb4f15b631cbccf5949afbd Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Sat, 12 Dec 2009 16:33:38 -0500 Subject: make sure to show repeats correctly when original is deleted --- lib/noticelist.php | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/noticelist.php b/lib/noticelist.php index 7319a62ea..aa6ea278c 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -167,8 +167,13 @@ class NoticeListItem extends Widget { parent::__construct($out); if (!empty($notice->repeat_of)) { - $this->notice = Notice::staticGet('id', $notice->repeat_of); - $this->repeat = $notice; + $original = Notice::staticGet('id', $notice->repeat_of); + if (empty($original)) { // could have been deleted + $this->notice = $notice; + } else { + $this->notice = $original; + $this->repeat = $notice; + } } else { $this->notice = $notice; } -- cgit v1.2.3-54-g00ecf From bed4e1c9e96b2bf2208f987479d15e3f624aac6a Mon Sep 17 00:00:00 2001 From: Craig Andrews Date: Sat, 12 Dec 2009 21:24:38 -0500 Subject: Add repeat command --- lib/command.php | 61 ++++++++++++++++++++++++++++++++++++++++++++++ lib/commandinterpreter.php | 13 ++++++++++ 2 files changed, 74 insertions(+) (limited to 'lib') diff --git a/lib/command.php b/lib/command.php index 085331f82..222bd7683 100644 --- a/lib/command.php +++ b/lib/command.php @@ -379,6 +379,65 @@ class MessageCommand extends Command } } +class RepeatCommand extends Command +{ + var $other = null; + function __construct($user, $other) + { + parent::__construct($user); + $this->other = $other; + } + + function execute($channel) + { + if(substr($this->other,0,1)=='#'){ + //repeating a specific notice_id + + $notice = Notice::staticGet(substr($this->other,1)); + if (!$notice) { + $channel->error($this->user, _('Notice with that id does not exist')); + return; + } + $recipient = $notice->getProfile(); + }else{ + //repeating a given user's last notice + + $recipient = + common_relative_profile($this->user, common_canonical_nickname($this->other)); + + if (!$recipient) { + $channel->error($this->user, _('No such user.')); + return; + } + $notice = $recipient->getCurrentNotice(); + if (!$notice) { + $channel->error($this->user, _('User has no last notice')); + return; + } + } + + if($this->user->id == $notice->profile_id) + { + $channel->error($this->user, _('Cannot repeat your own notice')); + return; + } + + if ($recipient->hasRepeated($notice->id)) { + $channel->error($this->user, _('Already repeated that notice')); + return; + } + + $repeat = $notice->repeat($this->user->id, $channel->source); + + if ($repeat) { + common_broadcast_notice($repeat); + $channel->output($this->user, sprintf(_('Notice from %s repeated'), $recipient->nickname)); + } else { + $channel->error($this->user, _('Error repeating notice.')); + } + } +} + class ReplyCommand extends Command { var $other = null; @@ -696,6 +755,8 @@ class HelpCommand extends Command "whois - get profile info on user\n". "fav - add user's last notice as a 'fave'\n". "fav # - add notice with the given id as a 'fave'\n". + "repeat # - repeat a notice with a given id\n". + "repeat - repeat the last notice from user\n". "reply # - reply to notice with a given id\n". "reply - reply to the last notice from user\n". "join - join group\n". diff --git a/lib/commandinterpreter.php b/lib/commandinterpreter.php index 665015afc..c2add7299 100644 --- a/lib/commandinterpreter.php +++ b/lib/commandinterpreter.php @@ -169,6 +169,19 @@ class CommandInterpreter } else { return new ReplyCommand($user, $other, $extra); } + case 'repeat': + case 'rp': + case 'rt': + case 'rd': + if (!$arg) { + return null; + } + list($other, $extra) = $this->split_arg($arg); + if ($extra) { + return null; + } else { + return new RepeatCommand($user, $other); + } case 'whois': if (!$arg) { return null; -- cgit v1.2.3-54-g00ecf From 954eb411e038745ee3e7995364a79d2fbda909bc Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sun, 13 Dec 2009 18:31:14 +0100 Subject: Localisation updates for !StatusNet from !translatewiki.net !sntrans * add Interlingua (ia) --- lib/language.php | 1 + locale/ia/LC_MESSAGES/statusnet.po | 5363 ++++++++++++++++++++++++++++++++++++ 2 files changed, 5364 insertions(+) create mode 100644 locale/ia/LC_MESSAGES/statusnet.po (limited to 'lib') diff --git a/lib/language.php b/lib/language.php index c037d30c3..d8f529201 100644 --- a/lib/language.php +++ b/lib/language.php @@ -287,6 +287,7 @@ function get_all_languages() { 'ga' => array('q' => 0.5, 'lang' => 'ga', 'name' => 'Galician', 'direction' => 'ltr'), 'he' => array('q' => 0.5, 'lang' => 'he', 'name' => 'Hebrew', 'direction' => 'rtl'), 'hsb' => array('q' => 0.8, 'lang' => 'hsb', 'name' => 'Upper Sorbian', 'direction' => 'ltr'), + 'ia' => array('q' => 0.8, 'lang' => 'ia', 'name' => 'Interlingua', 'direction' => 'ltr'), 'is' => array('q' => 0.1, 'lang' => 'is', 'name' => 'Icelandic', 'direction' => 'ltr'), 'it' => array('q' => 1, 'lang' => 'it', 'name' => 'Italian', 'direction' => 'ltr'), 'jp' => array('q' => 0.5, 'lang' => 'ja', 'name' => 'Japanese', 'direction' => 'ltr'), diff --git a/locale/ia/LC_MESSAGES/statusnet.po b/locale/ia/LC_MESSAGES/statusnet.po new file mode 100644 index 000000000..99c3d9ec5 --- /dev/null +++ b/locale/ia/LC_MESSAGES/statusnet.po @@ -0,0 +1,5363 @@ +# Translation of StatusNet to Interlingua +# +# Author@translatewiki.net: McDutchie +# -- +# This file is distributed under the same license as the StatusNet package. +# +msgid "" +msgstr "" +"Project-Id-Version: StatusNet\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2009-12-13 17:29+0000\n" +"PO-Revision-Date: 2009-12-13 17:30:36+0000\n" +"Language-Team: Interlingua\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Generator: MediaWiki 1.16alpha (r60008); Translate extension (2009-12-06)\n" +"X-Translation-Project: translatewiki.net at http://translatewiki.net\n" +"X-Language-Code: ia\n" +"X-Message-Group: out-statusnet\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: actions/all.php:63 actions/public.php:97 actions/replies.php:92 +#: actions/showfavorites.php:137 actions/tag.php:51 +msgid "No such page" +msgstr "Pagina non existe" + +#: actions/all.php:74 actions/allrss.php:68 +#: actions/apiaccountupdatedeliverydevice.php:113 +#: actions/apiaccountupdateprofile.php:105 +#: actions/apiaccountupdateprofilebackgroundimage.php:116 +#: actions/apiaccountupdateprofileimage.php:105 actions/apiblockcreate.php:97 +#: actions/apiblockdestroy.php:96 actions/apidirectmessage.php:77 +#: actions/apidirectmessagenew.php:75 actions/apigroupcreate.php:112 +#: actions/apigroupismember.php:90 actions/apigroupjoin.php:99 +#: actions/apigroupleave.php:99 actions/apigrouplist.php:90 +#: actions/apistatusesupdate.php:144 actions/apisubscriptions.php:87 +#: actions/apitimelinefavorites.php:70 actions/apitimelinefriends.php:79 +#: actions/apitimelinementions.php:79 actions/apitimelineuser.php:81 +#: actions/avatarbynickname.php:75 actions/favoritesrss.php:74 +#: actions/foaf.php:40 actions/foaf.php:58 actions/microsummary.php:62 +#: actions/newmessage.php:116 actions/remotesubscribe.php:145 +#: actions/remotesubscribe.php:154 actions/replies.php:73 +#: actions/repliesrss.php:38 actions/showfavorites.php:105 +#: actions/userbyid.php:74 actions/usergroups.php:91 actions/userrss.php:38 +#: actions/xrds.php:71 lib/command.php:163 lib/command.php:311 +#: lib/command.php:364 lib/command.php:409 lib/command.php:470 +#: lib/command.php:526 lib/galleryaction.php:59 lib/mailbox.php:82 +#: lib/profileaction.php:77 lib/subs.php:34 lib/subs.php:116 +msgid "No such user." +msgstr "Usator non existe." + +#: actions/all.php:84 +#, php-format +msgid "%s and friends, page %d" +msgstr "%s e amicos, pagina %d" + +#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115 +#: actions/apitimelinefriends.php:115 lib/personalgroupnav.php:100 +#, php-format +msgid "%s and friends" +msgstr "%s e amicos" + +#: actions/all.php:99 +#, php-format +msgid "Feed for friends of %s (RSS 1.0)" +msgstr "Syndication pro le amicos de %s (RSS 1.0)" + +#: actions/all.php:107 +#, php-format +msgid "Feed for friends of %s (RSS 2.0)" +msgstr "Syndication pro le amicos de %s (RSS 2.0)" + +#: actions/all.php:115 +#, php-format +msgid "Feed for friends of %s (Atom)" +msgstr "Syndication pro le amicos de %s (Atom)" + +#: actions/all.php:127 +#, php-format +msgid "" +"This is the timeline for %s and friends but no one has posted anything yet." +msgstr "" +"Isto es le chronologia pro %s e su amicos, ma necuno ha ancora publicate " +"alique." + +#: actions/all.php:132 +#, php-format +msgid "" +"Try subscribing to more people, [join a group](%%action.groups%%) or post " +"something yourself." +msgstr "" +"Proba subscriber te a altere personas, [face te membro de un gruppo](%%" +"action.groups%%) o publica alique tu mesme." + +#: actions/all.php:134 +#, php-format +msgid "" +"You can try to [nudge %s](../%s) from his profile or [post something to his " +"or her attention](%%%%action.newnotice%%%%?status_textarea=%s)." +msgstr "" +"Tu pote tentar [dar un pulsata a %s](../%s) in su profilo o [publicar un " +"message a su attention](%%%%action.newnotice%%%%?status_textarea=%s)." + +#: actions/all.php:137 actions/replies.php:209 actions/showstream.php:202 +#, php-format +msgid "" +"Why not [register an account](%%%%action.register%%%%) and then nudge %s or " +"post a notice to his or her attention." +msgstr "" +"Proque non [registrar un conto](%%%%action.register%%%%) e postea dar un " +"pulsata a %s o publicar un message a su attention." + +#: actions/all.php:165 +msgid "You and friends" +msgstr "Tu e amicos" + +#: actions/allrss.php:119 actions/apitimelinefriends.php:122 +#, php-format +msgid "Updates from %1$s and friends on %2$s!" +msgstr "Actualisationes de %1$s e su amicos in %2$s!" + +#: actions/apiaccountratelimitstatus.php:70 +#: actions/apiaccountupdatedeliverydevice.php:93 +#: actions/apiaccountupdateprofile.php:97 +#: actions/apiaccountupdateprofilebackgroundimage.php:94 +#: actions/apiaccountupdateprofilecolors.php:118 +msgid "API method not found." +msgstr "Methodo API non trovate." + +#: actions/apiaccountupdatedeliverydevice.php:85 +#: actions/apiaccountupdateprofile.php:89 +#: actions/apiaccountupdateprofilebackgroundimage.php:86 +#: actions/apiaccountupdateprofilecolors.php:110 +#: actions/apiaccountupdateprofileimage.php:84 actions/apiblockcreate.php:89 +#: actions/apiblockdestroy.php:88 actions/apidirectmessagenew.php:117 +#: actions/apifavoritecreate.php:90 actions/apifavoritedestroy.php:91 +#: actions/apifriendshipscreate.php:91 actions/apifriendshipsdestroy.php:91 +#: actions/apigroupcreate.php:104 actions/apigroupjoin.php:91 +#: actions/apigroupleave.php:91 actions/apistatusesretweet.php:65 +#: actions/apistatusesupdate.php:114 +msgid "This method requires a POST." +msgstr "Iste methodo require un POST." + +#: actions/apiaccountupdatedeliverydevice.php:105 +msgid "" +"You must specify a parameter named 'device' with a value of one of: sms, im, " +"none" +msgstr "" +"Tu debe specificar un parametro nominate 'device' con un del valores: sms, " +"im, none" + +#: actions/apiaccountupdatedeliverydevice.php:132 +msgid "Could not update user." +msgstr "Non poteva actualisar le usator." + +#: actions/apiaccountupdateprofile.php:112 +#: actions/apiaccountupdateprofilebackgroundimage.php:194 +#: actions/apiaccountupdateprofilecolors.php:185 +#: actions/apiaccountupdateprofileimage.php:130 actions/apiusershow.php:108 +#: actions/avatarbynickname.php:80 actions/foaf.php:65 actions/replies.php:80 +#: actions/usergroups.php:98 lib/galleryaction.php:66 lib/profileaction.php:84 +msgid "User has no profile." +msgstr "Le usator non ha un profilo." + +#: actions/apiaccountupdateprofile.php:147 +msgid "Could not save profile." +msgstr "Non poteva salveguardar le profilo." + +#: actions/apiaccountupdateprofilebackgroundimage.php:108 +#: actions/apiaccountupdateprofileimage.php:97 +#: actions/apistatusesupdate.php:127 actions/avatarsettings.php:257 +#: actions/designadminpanel.php:122 actions/newnotice.php:94 +#: lib/designsettings.php:283 +#, php-format +msgid "" +"The server was unable to handle that much POST data (%s bytes) due to its " +"current configuration." +msgstr "" +"Le servitor non ha potite tractar tante datos POST (%s bytes) a causa de su " +"configuration actual." + +#: actions/apiaccountupdateprofilebackgroundimage.php:136 +#: actions/apiaccountupdateprofilebackgroundimage.php:146 +#: actions/apiaccountupdateprofilecolors.php:164 +#: actions/apiaccountupdateprofilecolors.php:174 +msgid "Unable to save your design settings." +msgstr "Impossibile salveguardar le configurationes del apparentia." + +#: actions/apiaccountupdateprofilebackgroundimage.php:187 +#: actions/apiaccountupdateprofilecolors.php:142 +msgid "Could not update your design." +msgstr "Non poteva actualisar le apparentia." + +#: actions/apiblockcreate.php:105 +msgid "You cannot block yourself!" +msgstr "Tu non pote blocar te mesme!" + +#: actions/apiblockcreate.php:119 +msgid "Block user failed." +msgstr "Le blocada del usator ha fallite." + +#: actions/apiblockdestroy.php:107 +msgid "Unblock user failed." +msgstr "Le disblocada del usator ha fallite." + +#: actions/apidirectmessage.php:89 +#, php-format +msgid "Direct messages from %s" +msgstr "Messages directe de %s" + +#: actions/apidirectmessage.php:93 +#, php-format +msgid "All the direct messages sent from %s" +msgstr "Tote le messages directe inviate de %s" + +#: actions/apidirectmessage.php:101 +#, php-format +msgid "Direct messages to %s" +msgstr "Messages directe a %s" + +#: actions/apidirectmessage.php:105 +#, php-format +msgid "All the direct messages sent to %s" +msgstr "Tote le messages directe inviate a %s" + +#: actions/apidirectmessage.php:156 actions/apifavoritecreate.php:99 +#: actions/apifavoritedestroy.php:100 actions/apifriendshipscreate.php:100 +#: actions/apifriendshipsdestroy.php:100 actions/apifriendshipsshow.php:129 +#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114 +#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141 +#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120 +#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105 +#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102 +#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108 +#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93 +#: actions/apisubscriptions.php:111 actions/apitimelinefavorites.php:146 +#: actions/apitimelinefriends.php:156 actions/apitimelinegroup.php:150 +#: actions/apitimelinementions.php:151 actions/apitimelinepublic.php:131 +#: actions/apitimelineretweetedbyme.php:122 +#: actions/apitimelineretweetedtome.php:121 +#: actions/apitimelineretweetsofme.php:122 actions/apitimelinetag.php:141 +#: actions/apitimelineuser.php:165 actions/apiusershow.php:101 +msgid "API method not found!" +msgstr "Methodo API non trovate!" + +#: actions/apidirectmessagenew.php:126 +msgid "No message text!" +msgstr "Message sin texto!" + +#: actions/apidirectmessagenew.php:135 actions/newmessage.php:150 +#, php-format +msgid "That's too long. Max message size is %d chars." +msgstr "Isto es troppo longe. Le maximo es %d characteres." + +#: actions/apidirectmessagenew.php:146 +msgid "Recipient user not found." +msgstr "Usator destinatario non trovate." + +#: actions/apidirectmessagenew.php:150 +msgid "Can't send direct messages to users who aren't your friend." +msgstr "Non pote inviar messages directe a usatores que non es tu amicos." + +#: actions/apifavoritecreate.php:108 actions/apifavoritedestroy.php:109 +#: actions/apistatusesdestroy.php:113 +msgid "No status found with that ID." +msgstr "Nulle stato trovate con iste ID." + +#: actions/apifavoritecreate.php:119 +msgid "This status is already a favorite!" +msgstr "Iste stato es ja favorite!" + +#: actions/apifavoritecreate.php:130 actions/favor.php:84 lib/command.php:176 +msgid "Could not create favorite." +msgstr "Non poteva crear le favorite." + +#: actions/apifavoritedestroy.php:122 +msgid "That status is not a favorite!" +msgstr "Iste stato non es favorite!" + +#: actions/apifavoritedestroy.php:134 actions/disfavor.php:87 +msgid "Could not delete favorite." +msgstr "Non poteva deler le favorite." + +#: actions/apifriendshipscreate.php:109 +msgid "Could not follow user: User not found." +msgstr "Non poteva sequer le usator: Usator non trovate." + +#: actions/apifriendshipscreate.php:118 +#, php-format +msgid "Could not follow user: %s is already on your list." +msgstr "Non poteva sequer le usator: %s es ja in tu lista." + +#: actions/apifriendshipsdestroy.php:109 +msgid "Could not unfollow user: User not found." +msgstr "Non poteva cessar de sequer le usator: Usator non trovate." + +#: actions/apifriendshipsdestroy.php:120 +msgid "You cannot unfollow yourself!" +msgstr "Tu non pote cessar de sequer te mesme!" + +#: actions/apifriendshipsexists.php:94 +msgid "Two user ids or screen_names must be supplied." +msgstr "Duo IDs de usator o pseudonymos debe esser fornite." + +#: actions/apifriendshipsshow.php:135 +msgid "Could not determine source user." +msgstr "Non poteva determinar le usator de origine." + +#: actions/apifriendshipsshow.php:143 +msgid "Could not find target user." +msgstr "Non poteva trovar le usator de destination." + +#: actions/apigroupcreate.php:164 actions/editgroup.php:182 +#: actions/newgroup.php:126 actions/profilesettings.php:208 +#: actions/register.php:205 +msgid "Nickname must have only lowercase letters and numbers and no spaces." +msgstr "Le pseudonymo pote solmente haber minusculas e numeros, sin spatios." + +#: actions/apigroupcreate.php:173 actions/editgroup.php:186 +#: actions/newgroup.php:130 actions/profilesettings.php:231 +#: actions/register.php:208 +msgid "Nickname already in use. Try another one." +msgstr "Pseudonymo ja in uso. Proba un altere." + +#: actions/apigroupcreate.php:180 actions/editgroup.php:189 +#: actions/newgroup.php:133 actions/profilesettings.php:211 +#: actions/register.php:210 +msgid "Not a valid nickname." +msgstr "Non un pseudonymo valide." + +#: actions/apigroupcreate.php:196 actions/editgroup.php:195 +#: actions/newgroup.php:139 actions/profilesettings.php:215 +#: actions/register.php:217 +msgid "Homepage is not a valid URL." +msgstr "Le pagina personal non es un URL valide." + +#: actions/apigroupcreate.php:205 actions/editgroup.php:198 +#: actions/newgroup.php:142 actions/profilesettings.php:218 +#: actions/register.php:220 +msgid "Full name is too long (max 255 chars)." +msgstr "Le nomine complete es troppo longe (max. 255 characteres)." + +#: actions/apigroupcreate.php:213 +#, php-format +msgid "Description is too long (max %d chars)." +msgstr "Description es troppo longe (max %d charachteres)." + +#: actions/apigroupcreate.php:224 actions/editgroup.php:204 +#: actions/newgroup.php:148 actions/profilesettings.php:225 +#: actions/register.php:227 +msgid "Location is too long (max 255 chars)." +msgstr "Loco es troppo longe (max. 255 characteres)." + +#: actions/apigroupcreate.php:243 actions/editgroup.php:215 +#: actions/newgroup.php:159 +#, php-format +msgid "Too many aliases! Maximum %d." +msgstr "Troppo de aliases! Maximo: %d." + +#: actions/apigroupcreate.php:264 actions/editgroup.php:224 +#: actions/newgroup.php:168 +#, php-format +msgid "Invalid alias: \"%s\"" +msgstr "Alias invalide: \"%s\"" + +#: actions/apigroupcreate.php:273 actions/editgroup.php:228 +#: actions/newgroup.php:172 +#, php-format +msgid "Alias \"%s\" already in use. Try another one." +msgstr "Le alias \"%s\" es ja in uso. Proba un altere." + +#: actions/apigroupcreate.php:286 actions/editgroup.php:234 +#: actions/newgroup.php:178 +msgid "Alias can't be the same as nickname." +msgstr "Le alias non pote esser identic al pseudonymo." + +#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104 +#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91 +#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91 +msgid "Group not found!" +msgstr "Gruppo non trovate!" + +#: actions/apigroupjoin.php:110 +msgid "You are already a member of that group." +msgstr "Tu es ja membro de iste gruppo." + +#: actions/apigroupjoin.php:119 actions/joingroup.php:95 lib/command.php:221 +msgid "You have been blocked from that group by the admin." +msgstr "Le administrator te ha blocate de iste gruppo." + +#: actions/apigroupjoin.php:138 +#, php-format +msgid "Could not join user %s to group %s." +msgstr "Non poteva inscriber le usator %s in le gruppo %s." + +#: actions/apigroupleave.php:114 +msgid "You are not a member of this group." +msgstr "Tu non es membro de iste gruppo." + +#: actions/apigroupleave.php:124 +#, php-format +msgid "Could not remove user %s to group %s." +msgstr "Non poteva remover le usator %s del gruppo %s." + +#: actions/apigrouplist.php:95 +#, php-format +msgid "%s's groups" +msgstr "Gruppos de %s" + +#: actions/apigrouplist.php:103 +#, php-format +msgid "Groups %s is a member of on %s." +msgstr "Le gruppos del quales %s es membro in %s." + +#: actions/apigrouplistall.php:90 actions/usergroups.php:62 +#, php-format +msgid "%s groups" +msgstr "Gruppos de %s" + +#: actions/apigrouplistall.php:94 +#, php-format +msgid "groups on %s" +msgstr "gruppos in %s" + +#: actions/apistatusesdestroy.php:107 +msgid "This method requires a POST or DELETE." +msgstr "Iste methodo require un commando POST o DELETE." + +#: actions/apistatusesdestroy.php:130 +msgid "You may not delete another user's status." +msgstr "Tu non pote deler le stato de un altere usator." + +#: actions/apistatusesretweet.php:75 actions/apistatusesretweets.php:72 +#, fuzzy +msgid "No such notice" +msgstr "Nota non trovate." + +#: actions/apistatusesretweet.php:83 lib/command.php:421 +msgid "Cannot repeat your own notice" +msgstr "" + +#: actions/apistatusesretweet.php:91 lib/command.php:426 +#, fuzzy +msgid "Already repeated that notice" +msgstr "Deler iste nota" + +#: actions/apistatusesshow.php:138 +msgid "Status deleted." +msgstr "Stato delite." + +#: actions/apistatusesshow.php:144 +msgid "No status with that ID found." +msgstr "Nulle stato trovate con iste ID." + +#: actions/apistatusesupdate.php:157 actions/newnotice.php:155 +#: scripts/maildaemon.php:71 +#, php-format +msgid "That's too long. Max notice size is %d chars." +msgstr "" +"Isto es troppo longe. Le longitude maximal del notas es %d characteres." + +#: actions/apistatusesupdate.php:198 +msgid "Not found" +msgstr "Non trovate" + +#: actions/apistatusesupdate.php:227 actions/newnotice.php:183 +#, php-format +msgid "Max notice size is %d chars, including attachment URL." +msgstr "" +"Le longitude maximal del notas es %d characteres, includente le URL " +"adjungite." + +#: actions/apisubscriptions.php:231 actions/apisubscriptions.php:261 +msgid "Unsupported format." +msgstr "Formato non supportate." + +#: actions/apitimelinefavorites.php:108 +#, php-format +msgid "%s / Favorites from %s" +msgstr "%s / Favorites de %s" + +#: actions/apitimelinefavorites.php:120 +#, php-format +msgid "%s updates favorited by %s / %s." +msgstr "%s actualisationes favoritisate per %s / %s." + +#: actions/apitimelinegroup.php:109 actions/apitimelineuser.php:118 +#: actions/grouprss.php:131 actions/userrss.php:90 +#, php-format +msgid "%s timeline" +msgstr "Chronologia de %s" + +#: actions/apitimelinegroup.php:117 actions/apitimelineuser.php:126 +#: actions/userrss.php:92 +#, php-format +msgid "Updates from %1$s on %2$s!" +msgstr "Actualisationes de %1$s in %2$s!" + +#: actions/apitimelinementions.php:117 +#, php-format +msgid "%1$s / Updates mentioning %2$s" +msgstr "%1$s / Actualisationes que mentiona %2$s" + +#: actions/apitimelinementions.php:127 +#, php-format +msgid "%1$s updates that reply to updates from %2$s / %3$s." +msgstr "" +"Actualisationes de %1$s que responde al actualisationes de %2$s / %3$s." + +#: actions/apitimelinepublic.php:107 actions/publicrss.php:103 +#, php-format +msgid "%s public timeline" +msgstr "Chronologia public de %s" + +#: actions/apitimelinepublic.php:111 actions/publicrss.php:105 +#, php-format +msgid "%s updates from everyone!" +msgstr "Actualisationes de totes in %s!" + +#: actions/apitimelineretweetedbyme.php:112 lib/noticelist.php:566 +#, php-format +msgid "Repeated by %s" +msgstr "" + +#: actions/apitimelineretweetedtome.php:111 +#, php-format +msgid "Repeated to %s" +msgstr "" + +#: actions/apitimelineretweetsofme.php:112 +#, php-format +msgid "Repeats of %s" +msgstr "" + +#: actions/apitimelinetag.php:102 actions/tag.php:66 +#, php-format +msgid "Notices tagged with %s" +msgstr "Notas con etiquetta %s" + +#: actions/apitimelinetag.php:108 actions/tagrss.php:64 +#, php-format +msgid "Updates tagged with %1$s on %2$s!" +msgstr "Actualisationes con etiquetta %1$s in %2$s!" + +#: actions/apiusershow.php:96 +msgid "Not found." +msgstr "Non trovate." + +#: actions/attachment.php:73 +msgid "No such attachment." +msgstr "Attachamento non existe." + +#: actions/avatarbynickname.php:59 actions/leavegroup.php:76 +msgid "No nickname." +msgstr "Nulle pseudonymo." + +#: actions/avatarbynickname.php:64 +msgid "No size." +msgstr "Nulle dimension." + +#: actions/avatarbynickname.php:69 +msgid "Invalid size." +msgstr "Dimension invalide." + +#: actions/avatarsettings.php:67 actions/showgroup.php:221 +#: lib/accountsettingsaction.php:112 +msgid "Avatar" +msgstr "Avatar" + +#: actions/avatarsettings.php:78 +#, php-format +msgid "You can upload your personal avatar. The maximum file size is %s." +msgstr "Tu pote cargar tu avatar personal. Le dimension maxime del file es %s." + +#: actions/avatarsettings.php:106 actions/avatarsettings.php:185 +#: actions/grouplogo.php:178 actions/remotesubscribe.php:191 +#: actions/userauthorization.php:72 actions/userrss.php:103 +msgid "User without matching profile" +msgstr "Usator sin profilo correspondente" + +#: actions/avatarsettings.php:119 actions/avatarsettings.php:197 +#: actions/grouplogo.php:251 +msgid "Avatar settings" +msgstr "Configuration del avatar" + +#: actions/avatarsettings.php:127 actions/avatarsettings.php:205 +#: actions/grouplogo.php:199 actions/grouplogo.php:259 +msgid "Original" +msgstr "Original" + +#: actions/avatarsettings.php:142 actions/avatarsettings.php:217 +#: actions/grouplogo.php:210 actions/grouplogo.php:271 +msgid "Preview" +msgstr "Previsualisation" + +#: actions/avatarsettings.php:149 lib/deleteuserform.php:66 +#: lib/noticelist.php:612 +msgid "Delete" +msgstr "Deler" + +#: actions/avatarsettings.php:166 actions/grouplogo.php:233 +msgid "Upload" +msgstr "Cargar" + +#: actions/avatarsettings.php:231 actions/grouplogo.php:286 +msgid "Crop" +msgstr "Taliar" + +#: actions/avatarsettings.php:268 actions/disfavor.php:74 +#: actions/emailsettings.php:238 actions/favor.php:75 +#: actions/groupblock.php:66 actions/grouplogo.php:309 +#: actions/groupunblock.php:66 actions/imsettings.php:206 +#: actions/invite.php:56 actions/login.php:135 actions/makeadmin.php:66 +#: actions/newmessage.php:135 actions/newnotice.php:103 actions/nudge.php:80 +#: actions/othersettings.php:145 actions/passwordsettings.php:138 +#: actions/profilesettings.php:187 actions/recoverpassword.php:337 +#: actions/register.php:165 actions/remotesubscribe.php:77 +#: actions/repeat.php:83 actions/smssettings.php:228 actions/subedit.php:38 +#: actions/subscribe.php:46 actions/tagother.php:166 +#: actions/unsubscribe.php:69 actions/userauthorization.php:52 +#: lib/designsettings.php:294 +msgid "There was a problem with your session token. Try again, please." +msgstr "Occurreva un problema con le indicio de tu session. Per favor reproba." + +#: actions/avatarsettings.php:281 actions/designadminpanel.php:103 +#: actions/emailsettings.php:256 actions/grouplogo.php:319 +#: actions/imsettings.php:220 actions/recoverpassword.php:44 +#: actions/smssettings.php:248 lib/designsettings.php:304 +msgid "Unexpected form submission." +msgstr "Submission de formulario inexpectate." + +#: actions/avatarsettings.php:328 +msgid "Pick a square area of the image to be your avatar" +msgstr "Selige un area quadrate del imagine pro facer lo tu avatar" + +#: actions/avatarsettings.php:343 actions/grouplogo.php:377 +msgid "Lost our file data." +msgstr "Datos del file perdite." + +#: actions/avatarsettings.php:366 +msgid "Avatar updated." +msgstr "Avatar actualisate." + +#: actions/avatarsettings.php:369 +msgid "Failed updating avatar." +msgstr "Actualisation del avatar fallite." + +#: actions/avatarsettings.php:393 +msgid "Avatar deleted." +msgstr "Avatar delite." + +#: actions/block.php:69 +msgid "You already blocked that user." +msgstr "Tu ha ja blocate iste usator." + +#: actions/block.php:105 actions/block.php:128 actions/groupblock.php:160 +msgid "Block user" +msgstr "Blocar usator" + +#: actions/block.php:130 +msgid "" +"Are you sure you want to block this user? Afterwards, they will be " +"unsubscribed from you, unable to subscribe to you in the future, and you " +"will not be notified of any @-replies from them." +msgstr "" +"Es tu secur de voler blocar iste usator? Postea, su subscription a te essera " +"cancellate, ille non potera resubscriber se a te in le futuro, e tu non " +"recipera notification de su @-responsas." + +#: actions/block.php:143 actions/deletenotice.php:145 +#: actions/deleteuser.php:147 actions/groupblock.php:178 +msgid "No" +msgstr "No" + +#: actions/block.php:143 actions/deleteuser.php:147 +msgid "Do not block this user" +msgstr "Non blocar iste usator" + +#: actions/block.php:144 actions/deletenotice.php:146 +#: actions/deleteuser.php:148 actions/groupblock.php:179 +msgid "Yes" +msgstr "Si" + +#: actions/block.php:144 actions/groupmembers.php:346 lib/blockform.php:80 +msgid "Block this user" +msgstr "Blocar iste usator" + +#: actions/block.php:162 +msgid "Failed to save block information." +msgstr "Falleva de salveguardar le information del blocada." + +#: actions/blockedfromgroup.php:73 actions/editgroup.php:84 +#: actions/groupdesignsettings.php:84 actions/grouplogo.php:86 +#: actions/groupmembers.php:76 actions/grouprss.php:91 +#: actions/joingroup.php:76 actions/showgroup.php:121 +msgid "No nickname" +msgstr "Nulle pseudonymo" + +#: actions/blockedfromgroup.php:80 actions/editgroup.php:96 +#: actions/groupbyid.php:83 actions/groupdesignsettings.php:97 +#: actions/grouplogo.php:99 actions/groupmembers.php:83 +#: actions/grouprss.php:98 actions/joingroup.php:83 actions/showgroup.php:137 +msgid "No such group" +msgstr "Gruppo non existe" + +#: actions/blockedfromgroup.php:90 +#, php-format +msgid "%s blocked profiles" +msgstr "%s profilos blocate" + +#: actions/blockedfromgroup.php:93 +#, php-format +msgid "%s blocked profiles, page %d" +msgstr "%s profilos blocate, pagina %d" + +#: actions/blockedfromgroup.php:108 +msgid "A list of the users blocked from joining this group." +msgstr "Un lista del usatores excludite del membrato de iste gruppo." + +#: actions/blockedfromgroup.php:281 +msgid "Unblock user from group" +msgstr "Disblocar le usator del gruppo" + +#: actions/blockedfromgroup.php:313 lib/unblockform.php:69 +msgid "Unblock" +msgstr "Disblocar" + +#: actions/blockedfromgroup.php:313 lib/unblockform.php:80 +msgid "Unblock this user" +msgstr "Disblocar iste usator" + +#: actions/bookmarklet.php:50 +msgid "Post to " +msgstr "Publicar in " + +#: actions/confirmaddress.php:75 +msgid "No confirmation code." +msgstr "Nulle codice de confirmation." + +#: actions/confirmaddress.php:80 +msgid "Confirmation code not found." +msgstr "Codice de confirmation non trovate." + +#: actions/confirmaddress.php:85 +msgid "That confirmation code is not for you!" +msgstr "Iste codice de confirmation non es pro te!" + +#: actions/confirmaddress.php:90 +#, php-format +msgid "Unrecognized address type %s" +msgstr "Typo de adresse %s non recognoscite" + +#: actions/confirmaddress.php:94 +msgid "That address has already been confirmed." +msgstr "Iste adresse ha ja essite confirmate." + +#: actions/confirmaddress.php:114 actions/emailsettings.php:296 +#: actions/emailsettings.php:427 actions/imsettings.php:258 +#: actions/imsettings.php:401 actions/othersettings.php:174 +#: actions/profilesettings.php:276 actions/smssettings.php:278 +#: actions/smssettings.php:420 +msgid "Couldn't update user." +msgstr "Non poteva actualisar usator." + +#: actions/confirmaddress.php:126 actions/emailsettings.php:391 +#: actions/imsettings.php:363 actions/smssettings.php:382 +msgid "Couldn't delete email confirmation." +msgstr "Non poteva deler confirmation de e-mail." + +#: actions/confirmaddress.php:144 +msgid "Confirm Address" +msgstr "Confirmar adresse" + +#: actions/confirmaddress.php:159 +#, php-format +msgid "The address \"%s\" has been confirmed for your account." +msgstr "Le adresse \"%s\" ha essite confirmate pro tu conto." + +#: actions/conversation.php:99 +msgid "Conversation" +msgstr "Conversation" + +#: actions/conversation.php:154 lib/mailbox.php:116 lib/noticelist.php:87 +#: lib/profileaction.php:216 lib/searchgroupnav.php:82 +msgid "Notices" +msgstr "Notas" + +#: actions/deletenotice.php:52 actions/shownotice.php:92 +msgid "No such notice." +msgstr "Nota non trovate." + +#: actions/deletenotice.php:67 actions/disfavor.php:61 actions/favor.php:62 +#: actions/groupblock.php:61 actions/groupunblock.php:61 actions/logout.php:69 +#: actions/makeadmin.php:61 actions/newmessage.php:87 actions/newnotice.php:89 +#: actions/nudge.php:63 actions/subedit.php:31 actions/subscribe.php:30 +#: actions/unsubscribe.php:52 lib/adminpanelaction.php:72 +#: lib/profileformaction.php:63 lib/settingsaction.php:72 +msgid "Not logged in." +msgstr "Non identificate." + +#: actions/deletenotice.php:71 +msgid "Can't delete this notice." +msgstr "Non pote deler iste nota." + +#: actions/deletenotice.php:103 +msgid "" +"You are about to permanently delete a notice. Once this is done, it cannot " +"be undone." +msgstr "" +"Tu es super le puncto de deler permanentemente un nota. Un vice facite, isto " +"non pote esser disfacite." + +#: actions/deletenotice.php:109 actions/deletenotice.php:141 +msgid "Delete notice" +msgstr "Deler nota" + +#: actions/deletenotice.php:144 +msgid "Are you sure you want to delete this notice?" +msgstr "Es tu secur de voler deler iste nota?" + +#: actions/deletenotice.php:145 +msgid "Do not delete this notice" +msgstr "Non deler iste nota" + +#: actions/deletenotice.php:146 lib/noticelist.php:612 +msgid "Delete this notice" +msgstr "Deler iste nota" + +#: actions/deletenotice.php:157 +msgid "There was a problem with your session token. Try again, please." +msgstr "Occurreva un problema con le indicio de tu session. Per favor reproba." + +#: actions/deleteuser.php:67 +msgid "You cannot delete users." +msgstr "Tu non pote deler usatores." + +#: actions/deleteuser.php:74 +msgid "You can only delete local users." +msgstr "Tu pote solmente deler usatores local." + +#: actions/deleteuser.php:110 actions/deleteuser.php:133 +msgid "Delete user" +msgstr "Deler usator" + +#: actions/deleteuser.php:135 +msgid "" +"Are you sure you want to delete this user? This will clear all data about " +"the user from the database, without a backup." +msgstr "" +"Es tu secur de voler deler iste usator? Isto radera tote le datos super le " +"usator del base de datos, sin copia de reserva." + +#: actions/deleteuser.php:148 lib/deleteuserform.php:77 +msgid "Delete this user" +msgstr "Deler iste usator" + +#: actions/designadminpanel.php:62 lib/accountsettingsaction.php:124 +#: lib/adminpanelaction.php:302 lib/groupnav.php:119 +msgid "Design" +msgstr "Apparentia" + +#: actions/designadminpanel.php:73 +msgid "Design settings for this StatusNet site." +msgstr "Configuration del apparentia de iste sito StatusNet." + +#: actions/designadminpanel.php:275 +msgid "Invalid logo URL." +msgstr "URL de logotypo invalide." + +#: actions/designadminpanel.php:279 +#, php-format +msgid "Theme not available: %s" +msgstr "Thema non disponibile: %s" + +#: actions/designadminpanel.php:375 +msgid "Change logo" +msgstr "Cambiar logotypo" + +#: actions/designadminpanel.php:380 +msgid "Site logo" +msgstr "Logotypo del sito" + +#: actions/designadminpanel.php:387 +msgid "Change theme" +msgstr "Cambiar thema" + +#: actions/designadminpanel.php:404 +msgid "Site theme" +msgstr "Thema del sito" + +#: actions/designadminpanel.php:405 +msgid "Theme for the site." +msgstr "Le thema de apparentia pro le sito." + +#: actions/designadminpanel.php:417 lib/designsettings.php:101 +msgid "Change background image" +msgstr "Cambiar imagine de fundo" + +#: actions/designadminpanel.php:422 actions/designadminpanel.php:497 +#: lib/designsettings.php:178 +msgid "Background" +msgstr "Fundo" + +#: actions/designadminpanel.php:427 +#, php-format +msgid "" +"You can upload a background image for the site. The maximum file size is %1" +"$s." +msgstr "" +"Tu pote cargar un imagine de fundo pro le sito. Le dimension maxime del file " +"es %1$s." + +#: actions/designadminpanel.php:457 lib/designsettings.php:139 +msgid "On" +msgstr "Active" + +#: actions/designadminpanel.php:473 lib/designsettings.php:155 +msgid "Off" +msgstr "Non active" + +#: actions/designadminpanel.php:474 lib/designsettings.php:156 +msgid "Turn background image on or off." +msgstr "Activar o disactivar le imagine de fundo." + +#: actions/designadminpanel.php:479 lib/designsettings.php:161 +msgid "Tile background image" +msgstr "Tegular le imagine de fundo" + +#: actions/designadminpanel.php:488 lib/designsettings.php:170 +msgid "Change colours" +msgstr "Cambiar colores" + +#: actions/designadminpanel.php:510 lib/designsettings.php:191 +msgid "Content" +msgstr "Contento" + +#: actions/designadminpanel.php:523 lib/designsettings.php:204 +msgid "Sidebar" +msgstr "Barra lateral" + +#: actions/designadminpanel.php:536 lib/designsettings.php:217 +msgid "Text" +msgstr "Texto" + +#: actions/designadminpanel.php:549 lib/designsettings.php:230 +msgid "Links" +msgstr "Ligamines" + +#: actions/designadminpanel.php:577 lib/designsettings.php:247 +msgid "Use defaults" +msgstr "Usar predefinitiones" + +#: actions/designadminpanel.php:578 lib/designsettings.php:248 +msgid "Restore default designs" +msgstr "Restaurar apparentias predefinite" + +#: actions/designadminpanel.php:584 lib/designsettings.php:254 +msgid "Reset back to default" +msgstr "Revenir al predefinitiones" + +#: actions/designadminpanel.php:586 actions/emailsettings.php:195 +#: actions/imsettings.php:163 actions/othersettings.php:126 +#: actions/pathsadminpanel.php:296 actions/profilesettings.php:167 +#: actions/siteadminpanel.php:421 actions/smssettings.php:181 +#: actions/subscriptions.php:203 actions/tagother.php:154 +#: actions/useradminpanel.php:313 lib/designsettings.php:256 +#: lib/groupeditform.php:202 +msgid "Save" +msgstr "Salveguardar" + +#: actions/designadminpanel.php:587 lib/designsettings.php:257 +msgid "Save design" +msgstr "Salveguardar apparentia" + +#: actions/disfavor.php:81 +msgid "This notice is not a favorite!" +msgstr "Iste nota non es favorite!" + +#: actions/disfavor.php:94 +msgid "Add to favorites" +msgstr "Adder al favorites" + +#: actions/doc.php:69 +msgid "No such document." +msgstr "Documento non existe." + +#: actions/editgroup.php:56 +#, php-format +msgid "Edit %s group" +msgstr "Modificar gruppo %s" + +#: actions/editgroup.php:68 actions/grouplogo.php:70 actions/newgroup.php:65 +msgid "You must be logged in to create a group." +msgstr "Tu debe aperir un session pro crear un gruppo." + +#: actions/editgroup.php:103 actions/editgroup.php:168 +#: actions/groupdesignsettings.php:104 actions/grouplogo.php:106 +msgid "You must be an admin to edit the group" +msgstr "Tu debe esser administrator pro modificar le gruppo." + +#: actions/editgroup.php:154 +msgid "Use this form to edit the group." +msgstr "Usa iste formulario pro modificar le gruppo." + +#: actions/editgroup.php:201 actions/newgroup.php:145 +#, php-format +msgid "description is too long (max %d chars)." +msgstr "description es troppo longe (max %d chars)." + +#: actions/editgroup.php:253 +msgid "Could not update group." +msgstr "Non poteva actualisar gruppo." + +#: actions/editgroup.php:259 classes/User_group.php:390 +msgid "Could not create aliases." +msgstr "Non poteva crear aliases." + +#: actions/editgroup.php:269 +msgid "Options saved." +msgstr "Optiones salveguardate." + +#: actions/emailsettings.php:60 +msgid "Email Settings" +msgstr "Configuration de e-mail" + +#: actions/emailsettings.php:71 +#, php-format +msgid "Manage how you get email from %%site.name%%." +msgstr "Configurar como reciper e-mail de %%site.name%%." + +#: actions/emailsettings.php:100 actions/imsettings.php:100 +#: actions/smssettings.php:104 +msgid "Address" +msgstr "Adresse" + +#: actions/emailsettings.php:105 +msgid "Current confirmed email address." +msgstr "Adresse de e-mail actualmente confirmate." + +#: actions/emailsettings.php:107 actions/emailsettings.php:140 +#: actions/imsettings.php:108 actions/smssettings.php:115 +#: actions/smssettings.php:158 +msgid "Remove" +msgstr "Remover" + +#: actions/emailsettings.php:113 +msgid "" +"Awaiting confirmation on this address. Check your inbox (and spam box!) for " +"a message with further instructions." +msgstr "" +"Attende confirmation de iste adresse. Verifica tu cassa de entrata (e de " +"spam!) pro un message con ulterior instructiones." + +#: actions/emailsettings.php:117 actions/imsettings.php:120 +#: actions/smssettings.php:126 +msgid "Cancel" +msgstr "Cancellar" + +#: actions/emailsettings.php:121 +msgid "Email Address" +msgstr "Adresse de e-mail" + +#: actions/emailsettings.php:123 +msgid "Email address, like \"UserName@example.org\"" +msgstr "Le adresse de e-mail, como \"nomine@example.org\"" + +#: actions/emailsettings.php:126 actions/imsettings.php:133 +#: actions/smssettings.php:145 +msgid "Add" +msgstr "Adder" + +#: actions/emailsettings.php:133 actions/smssettings.php:152 +msgid "Incoming email" +msgstr "E-mail entrante" + +#: actions/emailsettings.php:138 actions/smssettings.php:157 +msgid "Send email to this address to post new notices." +msgstr "Invia e-mail a iste adresse pro publicar nove notas." + +#: actions/emailsettings.php:145 actions/smssettings.php:162 +msgid "Make a new email address for posting to; cancels the old one." +msgstr "" +"Face un nove adresse de e-mail per le qual publicar; cancella le vetule." + +#: actions/emailsettings.php:148 actions/smssettings.php:164 +msgid "New" +msgstr "Nove" + +#: actions/emailsettings.php:153 actions/imsettings.php:139 +#: actions/smssettings.php:169 +msgid "Preferences" +msgstr "Preferentias" + +#: actions/emailsettings.php:158 +msgid "Send me notices of new subscriptions through email." +msgstr "Inviar me notificationes de nove subscriptiones per e-mail." + +#: actions/emailsettings.php:163 +msgid "Send me email when someone adds my notice as a favorite." +msgstr "Inviar me e-mail quando alcuno adde mi nota al favorites." + +#: actions/emailsettings.php:169 +msgid "Send me email when someone sends me a private message." +msgstr "Inviar me e-mail quando alcuno me invia un message private." + +#: actions/emailsettings.php:174 +msgid "Send me email when someone sends me an \"@-reply\"." +msgstr "Inviar me e-mail quando alcuno me invia un \"@-responsa\"." + +#: actions/emailsettings.php:179 +msgid "Allow friends to nudge me and send me an email." +msgstr "Permitte que amicos me pulsa e me invia e-mail." + +#: actions/emailsettings.php:185 +msgid "I want to post notices by email." +msgstr "Io vole publicar notas per e-mail." + +#: actions/emailsettings.php:191 +msgid "Publish a MicroID for my email address." +msgstr "Publicar un MicroID pro mi adresse de e-mail." + +#: actions/emailsettings.php:302 actions/imsettings.php:264 +#: actions/othersettings.php:180 actions/smssettings.php:284 +msgid "Preferences saved." +msgstr "Preferentias confirmate." + +#: actions/emailsettings.php:320 +msgid "No email address." +msgstr "Nulle adresse de e-mail." + +#: actions/emailsettings.php:327 +msgid "Cannot normalize that email address" +msgstr "Non pote normalisar iste adresse de e-mail" + +#: actions/emailsettings.php:331 actions/siteadminpanel.php:158 +msgid "Not a valid email address" +msgstr "Adresse de e-mail invalide" + +#: actions/emailsettings.php:334 +msgid "That is already your email address." +msgstr "Isto es ja tu adresse de e-mail." + +#: actions/emailsettings.php:337 +msgid "That email address already belongs to another user." +msgstr "Iste adresse de e-mail pertine ja a un altere usator." + +#: actions/emailsettings.php:353 actions/imsettings.php:317 +#: actions/smssettings.php:337 +msgid "Couldn't insert confirmation code." +msgstr "Non poteva inserer le codice de confirmation." + +#: actions/emailsettings.php:359 +msgid "" +"A confirmation code was sent to the email address you added. Check your " +"inbox (and spam box!) for the code and instructions on how to use it." +msgstr "" +"Un codice de confirmation ha essite inviate al adresse de e-mail que tu " +"addeva. Verifica tu cassa de entrata (e de spam!) pro le codice e le " +"instructiones pro usar lo." + +#: actions/emailsettings.php:379 actions/imsettings.php:351 +#: actions/smssettings.php:370 +msgid "No pending confirmation to cancel." +msgstr "Nulle confirmation pendente a cancellar." + +#: actions/emailsettings.php:383 actions/imsettings.php:355 +msgid "That is the wrong IM address." +msgstr "Iste adresse de messageria instantanee es erronee." + +#: actions/emailsettings.php:395 actions/imsettings.php:367 +#: actions/smssettings.php:386 +msgid "Confirmation cancelled." +msgstr "Confirmation cancellate." + +#: actions/emailsettings.php:413 +msgid "That is not your email address." +msgstr "Isto non es tu adresse de e-mail." + +#: actions/emailsettings.php:432 actions/imsettings.php:408 +#: actions/smssettings.php:425 +msgid "The address was removed." +msgstr "Le adresse ha essite removite." + +#: actions/emailsettings.php:446 actions/smssettings.php:518 +msgid "No incoming email address." +msgstr "Nulle adresse de e-mail entrante." + +#: actions/emailsettings.php:456 actions/emailsettings.php:478 +#: actions/smssettings.php:528 actions/smssettings.php:552 +msgid "Couldn't update user record." +msgstr "Non poteva actualisar le datos del usator." + +#: actions/emailsettings.php:459 actions/smssettings.php:531 +msgid "Incoming email address removed." +msgstr "Adresse de e-mail entrante removite." + +#: actions/emailsettings.php:481 actions/smssettings.php:555 +msgid "New incoming email address added." +msgstr "Nove adresse de e-mail entrante addite." + +#: actions/favor.php:79 +msgid "This notice is already a favorite!" +msgstr "Iste nota es ja favorite!" + +#: actions/favor.php:92 lib/disfavorform.php:140 +msgid "Disfavor favorite" +msgstr "Disfavorir favorite" + +#: actions/favorited.php:65 lib/popularnoticesection.php:88 +#: lib/publicgroupnav.php:93 +msgid "Popular notices" +msgstr "Notas popular" + +#: actions/favorited.php:67 +#, php-format +msgid "Popular notices, page %d" +msgstr "Notas popular, pagina %d" + +#: actions/favorited.php:79 +msgid "The most popular notices on the site right now." +msgstr "Le notas le plus popular del sito in iste momento." + +#: actions/favorited.php:150 +msgid "Favorite notices appear on this page but no one has favorited one yet." +msgstr "" +"Le notas favorite appare in iste pagina, ma necuno ha ancora favoritisate un." + +#: actions/favorited.php:153 +msgid "" +"Be the first to add a notice to your favorites by clicking the fave button " +"next to any notice you like." +msgstr "" +"Sia le prime a adder un nota a tu favorites per cliccar le button Favorite " +"juxta un nota que te place." + +#: actions/favorited.php:156 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to add a " +"notice to your favorites!" +msgstr "" +"Proque non [crear un conto](%%action.register%%) e esser le prime a adder un " +"nota a tu favorites!" + +#: actions/favoritesrss.php:111 actions/showfavorites.php:77 +#: lib/personalgroupnav.php:115 +#, php-format +msgid "%s's favorite notices" +msgstr "Notas favorite de %s" + +#: actions/favoritesrss.php:115 +#, php-format +msgid "Updates favored by %1$s on %2$s!" +msgstr "Actualisationes favorite per %1$s in %2$s!" + +#: actions/featured.php:69 lib/featureduserssection.php:87 +#: lib/publicgroupnav.php:89 +msgid "Featured users" +msgstr "Usatores in evidentia" + +#: actions/featured.php:71 +#, php-format +msgid "Featured users, page %d" +msgstr "Usatores in evidentia, pagina %d" + +#: actions/featured.php:99 +#, php-format +msgid "A selection of some of the great users on %s" +msgstr "Un selection de usatores eminente in %s" + +#: actions/file.php:34 +msgid "No notice id" +msgstr "Nulle ID de nota" + +#: actions/file.php:38 +msgid "No notice" +msgstr "Nulle nota" + +#: actions/file.php:42 +msgid "No attachments" +msgstr "Nulle attachamento" + +#: actions/file.php:51 +msgid "No uploaded attachments" +msgstr "Nulle attachamento cargate" + +#: actions/finishremotesubscribe.php:69 +msgid "Not expecting this response!" +msgstr "Non expectava iste responsa!" + +#: actions/finishremotesubscribe.php:80 +msgid "User being listened to does not exist." +msgstr "Le usator sequite non existe." + +#: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59 +msgid "You can use the local subscription!" +msgstr "Tu pote usar le subscription local!" + +#: actions/finishremotesubscribe.php:99 +msgid "That user has blocked you from subscribing." +msgstr "Iste usator te ha blocate de subscriber." + +#: actions/finishremotesubscribe.php:110 +msgid "You are not authorized." +msgstr "Tu non es autorisate." + +#: actions/finishremotesubscribe.php:113 +msgid "Could not convert request token to access token." +msgstr "Non poteva converter le indicio de requesta in un indicio de accesso." + +#: actions/finishremotesubscribe.php:118 +msgid "Remote service uses unknown version of OMB protocol." +msgstr "Le servicio remote usa un version incognite del protocollo OMB." + +#: actions/finishremotesubscribe.php:138 lib/oauthstore.php:306 +msgid "Error updating remote profile" +msgstr "Error in actualisar le profilo remote" + +#: actions/foafgroup.php:44 actions/foafgroup.php:62 actions/groupblock.php:86 +#: actions/groupunblock.php:86 actions/leavegroup.php:83 +#: actions/makeadmin.php:86 lib/command.php:212 lib/command.php:263 +msgid "No such group." +msgstr "Gruppo non existe." + +#: actions/getfile.php:75 +msgid "No such file." +msgstr "File non existe." + +#: actions/getfile.php:79 +msgid "Cannot read file." +msgstr "Non pote leger file." + +#: actions/groupblock.php:71 actions/groupunblock.php:71 +#: actions/makeadmin.php:71 actions/subedit.php:46 +#: lib/profileformaction.php:70 +msgid "No profile specified." +msgstr "Nulle profilo specificate." + +#: actions/groupblock.php:76 actions/groupunblock.php:76 +#: actions/makeadmin.php:76 actions/subedit.php:53 actions/tagother.php:46 +#: lib/profileformaction.php:77 +msgid "No profile with that ID." +msgstr "Non existe un profilo con iste ID." + +#: actions/groupblock.php:81 actions/groupunblock.php:81 +#: actions/makeadmin.php:81 +msgid "No group specified." +msgstr "Nulle gruppo specificate." + +#: actions/groupblock.php:91 +msgid "Only an admin can block group members." +msgstr "Solmente un administrator pote blocar membros de un gruppo." + +#: actions/groupblock.php:95 +msgid "User is already blocked from group." +msgstr "Le usator es ja blocate del gruppo." + +#: actions/groupblock.php:100 +msgid "User is not a member of group." +msgstr "Le usator non es membro del gruppo." + +#: actions/groupblock.php:136 actions/groupmembers.php:314 +msgid "Block user from group" +msgstr "Blocar usator del gruppo" + +#: actions/groupblock.php:162 +#, php-format +msgid "" +"Are you sure you want to block user \"%s\" from the group \"%s\"? They will " +"be removed from the group, unable to post, and unable to subscribe to the " +"group in the future." +msgstr "" +"Es tu secur de voler blocar le usator \"%s\" del gruppo \"%s\"? Ille essera " +"removite del gruppo, non potera publicar messages, e non potera subscriber " +"se al gruppo in le futuro." + +#: actions/groupblock.php:178 +msgid "Do not block this user from this group" +msgstr "Non blocar iste usator de iste gruppo" + +#: actions/groupblock.php:179 +msgid "Block this user from this group" +msgstr "Blocar iste usator de iste gruppo" + +#: actions/groupblock.php:196 +msgid "Database error blocking user from group." +msgstr "Error del base de datos al blocar le usator del gruppo." + +#: actions/groupbyid.php:74 +msgid "No ID" +msgstr "Nulle ID" + +#: actions/groupdesignsettings.php:68 +msgid "You must be logged in to edit a group." +msgstr "Tu debe aperir un session pro modificar un gruppo." + +#: actions/groupdesignsettings.php:141 +msgid "Group design" +msgstr "Apparentia del gruppo" + +#: actions/groupdesignsettings.php:152 +msgid "" +"Customize the way your group looks with a background image and a colour " +"palette of your choice." +msgstr "" +"Personalisa le apparentia de tu gruppo con un imagine de fundo e un paletta " +"de colores de tu preferentia." + +#: actions/groupdesignsettings.php:263 actions/userdesignsettings.php:186 +#: lib/designsettings.php:391 lib/designsettings.php:413 +msgid "Couldn't update your design." +msgstr "Non poteva actualisar tu apparentia." + +#: actions/groupdesignsettings.php:287 actions/groupdesignsettings.php:297 +#: actions/userdesignsettings.php:210 actions/userdesignsettings.php:220 +#: actions/userdesignsettings.php:263 actions/userdesignsettings.php:273 +msgid "Unable to save your design settings!" +msgstr "Impossibile salveguardar le configuration de tu apparentia!" + +#: actions/groupdesignsettings.php:308 actions/userdesignsettings.php:231 +msgid "Design preferences saved." +msgstr "Preferentias de apparentia salveguardate." + +#: actions/grouplogo.php:139 actions/grouplogo.php:192 +msgid "Group logo" +msgstr "Logotypo del gruppo" + +#: actions/grouplogo.php:150 +#, php-format +msgid "" +"You can upload a logo image for your group. The maximum file size is %s." +msgstr "" +"Tu pote cargar un imagine pro le logotypo de tu gruppo. Le dimension maxime " +"del file es %s." + +#: actions/grouplogo.php:362 +msgid "Pick a square area of the image to be the logo." +msgstr "Selige un area quadrate del imagine que devenira le logotypo." + +#: actions/grouplogo.php:396 +msgid "Logo updated." +msgstr "Logotypo actualisate." + +#: actions/grouplogo.php:398 +msgid "Failed updating logo." +msgstr "Falleva de actualisar le logotypo." + +#: actions/groupmembers.php:93 lib/groupnav.php:92 +#, php-format +msgid "%s group members" +msgstr "Membros del gruppo %s" + +#: actions/groupmembers.php:96 +#, php-format +msgid "%s group members, page %d" +msgstr "Membros del gruppo %s, pagina %d" + +#: actions/groupmembers.php:111 +msgid "A list of the users in this group." +msgstr "Un lista de usatores in iste gruppo." + +#: actions/groupmembers.php:175 lib/action.php:440 lib/groupnav.php:107 +msgid "Admin" +msgstr "Administrator" + +#: actions/groupmembers.php:346 lib/blockform.php:69 +msgid "Block" +msgstr "Blocar" + +#: actions/groupmembers.php:441 +msgid "Make user an admin of the group" +msgstr "Facer le usator administrator del gruppo" + +#: actions/groupmembers.php:473 +msgid "Make Admin" +msgstr "Facer administrator" + +#: actions/groupmembers.php:473 +msgid "Make this user an admin" +msgstr "Facer iste usator administrator" + +#: actions/grouprss.php:133 +#, php-format +msgid "Updates from members of %1$s on %2$s!" +msgstr "Actualisationes de membros de %1$s in %2$s!" + +#: actions/groups.php:62 lib/profileaction.php:210 lib/profileaction.php:230 +#: lib/publicgroupnav.php:81 lib/searchgroupnav.php:84 lib/subgroupnav.php:98 +msgid "Groups" +msgstr "Gruppos" + +#: actions/groups.php:64 +#, php-format +msgid "Groups, page %d" +msgstr "Gruppos, pagina %d" + +#: actions/groups.php:90 +#, php-format +msgid "" +"%%%%site.name%%%% groups let you find and talk with people of similar " +"interests. After you join a group you can send messages to all other members " +"using the syntax \"!groupname\". Don't see a group you like? Try [searching " +"for one](%%%%action.groupsearch%%%%) or [start your own!](%%%%action.newgroup" +"%%%%)" +msgstr "" +"Le gruppos de %%%%site.name%%%% permitte trovar e parlar con personas que ha " +"interesses similar al tues. Post haber unite se a un gruppo, tu pote inviar " +"messages a tote le altere membros usante le syntaxe \"!groupname\". Tu non " +"vide un gruppo que te place? Tenta [cercar un](%%%%action.groupsearch%%%%) o " +"[crear le tue!](%%%%action.newgroup%%%%)" + +#: actions/groups.php:107 actions/usergroups.php:124 lib/groupeditform.php:122 +msgid "Create a new group" +msgstr "Crear un nove gruppo" + +#: actions/groupsearch.php:52 +#, php-format +msgid "" +"Search for groups on %%site.name%% by their name, location, or description. " +"Separate the terms by spaces; they must be 3 characters or more." +msgstr "" +"Cercar gruppos in %%site.name%% per nomine, loco o description. Separa le " +"terminos con spatios; illos debe haber al minus 3 characteres." + +#: actions/groupsearch.php:58 +msgid "Group search" +msgstr "Recerca de gruppos" + +#: actions/groupsearch.php:79 actions/noticesearch.php:117 +#: actions/peoplesearch.php:83 +msgid "No results." +msgstr "Nulle resultato." + +#: actions/groupsearch.php:82 +#, php-format +msgid "" +"If you can't find the group you're looking for, you can [create it](%%action." +"newgroup%%) yourself." +msgstr "" +"Si tu non trova le gruppo que tu cerca, tu pote [crear lo](%%action.newgroup%" +"%) tu mesme." + +#: actions/groupsearch.php:85 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and [create the group](%%" +"action.newgroup%%) yourself!" +msgstr "" +"Proque non [registrar un conto](%%action.register%%) e [crear le gruppo](%%" +"action.newgroup%%) tu mesme?" + +#: actions/groupunblock.php:91 +msgid "Only an admin can unblock group members." +msgstr "Solmente un administrator pote disblocar membros de un gruppo." + +#: actions/groupunblock.php:95 +msgid "User is not blocked from group." +msgstr "Le usator non es blocate del gruppo." + +#: actions/groupunblock.php:128 actions/unblock.php:77 +msgid "Error removing the block." +msgstr "Error de remover le blocada." + +#: actions/imsettings.php:59 +msgid "IM Settings" +msgstr "Configuration de messageria instantanee" + +#: actions/imsettings.php:70 +#, php-format +msgid "" +"You can send and receive notices through Jabber/GTalk [instant messages](%%" +"doc.im%%). Configure your address and settings below." +msgstr "" +"Tu pote inviar e reciper notas per [messages instantanee](%%doc.im%%) de " +"Jabber/GTalk. Configura tu adresse e parametros hic infra." + +#: actions/imsettings.php:89 +msgid "IM is not available." +msgstr "Messageria instantanee non disponibile." + +#: actions/imsettings.php:106 +msgid "Current confirmed Jabber/GTalk address." +msgstr "Adresse Jabber/GTalk actualmente confirmate." + +#: actions/imsettings.php:114 +#, php-format +msgid "" +"Awaiting confirmation on this address. Check your Jabber/GTalk account for a " +"message with further instructions. (Did you add %s to your buddy list?)" +msgstr "" +"Attende confirmation de iste adresse. Verifica tu conto Jabber/GTalk pro un " +"message con ulterior instructiones. (Ha tu addite %s a tu lista de amicos?)" + +#: actions/imsettings.php:124 +msgid "IM Address" +msgstr "Adresse de messageria instantanee" + +#: actions/imsettings.php:126 +#, php-format +msgid "" +"Jabber or GTalk address, like \"UserName@example.org\". First, make sure to " +"add %s to your buddy list in your IM client or on GTalk." +msgstr "" +"Un adresse Jabber o GTalk, como \"nomine@example.org\". Primo, assecura te " +"de adder %s a tu lista de amicos in tu cliente de messageria instantanee o " +"in GTalk." + +#: actions/imsettings.php:143 +msgid "Send me notices through Jabber/GTalk." +msgstr "Inviar me notas per Jabber/GTalk." + +#: actions/imsettings.php:148 +msgid "Post a notice when my Jabber/GTalk status changes." +msgstr "Publicar un nota quando mi stato de Jabber/GTalk cambia." + +#: actions/imsettings.php:153 +msgid "Send me replies through Jabber/GTalk from people I'm not subscribed to." +msgstr "" +"Inviar me responsas per Jabber/GTalk de personas al quales io non es " +"subscribite." + +#: actions/imsettings.php:159 +msgid "Publish a MicroID for my Jabber/GTalk address." +msgstr "Publicar un MicroID pro mi adresse Jabber/GTalk." + +#: actions/imsettings.php:285 +msgid "No Jabber ID." +msgstr "Nulle ID de Jabber." + +#: actions/imsettings.php:292 +msgid "Cannot normalize that Jabber ID" +msgstr "Non pote normalisar iste ID de Jabber" + +#: actions/imsettings.php:296 +msgid "Not a valid Jabber ID" +msgstr "ID de Jabber non valide" + +#: actions/imsettings.php:299 +msgid "That is already your Jabber ID." +msgstr "Isto es ja tu ID de Jabber." + +#: actions/imsettings.php:302 +msgid "Jabber ID already belongs to another user." +msgstr "Le ID de Jabber pertine ja a un altere usator." + +#: actions/imsettings.php:327 +#, php-format +msgid "" +"A confirmation code was sent to the IM address you added. You must approve %" +"s for sending messages to you." +msgstr "" +"Un codice de confirmation ha essite inviate al adresse de messageria " +"instantanee specificate. Tu debe approbar que %s invia messages a te." + +#: actions/imsettings.php:387 +msgid "That is not your Jabber ID." +msgstr "Isto non es tu ID de Jabber." + +#: actions/inbox.php:59 +#, php-format +msgid "Inbox for %s - page %d" +msgstr "Cassa de entrata de %s - pagina %d" + +#: actions/inbox.php:62 +#, php-format +msgid "Inbox for %s" +msgstr "Cassa de entrata de %s" + +#: actions/inbox.php:115 +msgid "This is your inbox, which lists your incoming private messages." +msgstr "" +"Isto es tu cassa de entrata, que lista le messages private que tu ha " +"recipite." + +#: actions/invite.php:39 +msgid "Invites have been disabled." +msgstr "Le invitationes ha essite disactivate." + +#: actions/invite.php:41 +#, php-format +msgid "You must be logged in to invite other users to use %s" +msgstr "Tu debe aperir un session pro invitar altere usatores a usar %s" + +#: actions/invite.php:72 +#, php-format +msgid "Invalid email address: %s" +msgstr "Adresse de e-mail invalide: %s" + +#: actions/invite.php:110 +msgid "Invitation(s) sent" +msgstr "Invitation(es) inviate" + +#: actions/invite.php:112 +msgid "Invite new users" +msgstr "Invitar nove usatores" + +#: actions/invite.php:128 +msgid "You are already subscribed to these users:" +msgstr "Tu es a subscribite a iste usatores:" + +#: actions/invite.php:131 actions/invite.php:139 +#, php-format +msgid "%s (%s)" +msgstr "%s (%s)" + +#: actions/invite.php:136 +msgid "" +"These people are already users and you were automatically subscribed to them:" +msgstr "" +"Iste personas es ja usatores e tu ha essite automaticamente subscribite a " +"illes:" + +#: actions/invite.php:144 +msgid "Invitation(s) sent to the following people:" +msgstr "Invitation(es) inviate al sequente personas:" + +#: actions/invite.php:150 +msgid "" +"You will be notified when your invitees accept the invitation and register " +"on the site. Thanks for growing the community!" +msgstr "" +"Tu recipera notification quando tu invitatos accepta le invitation e se " +"registra in le sito. Gratias pro facer crescer le communitate!" + +#: actions/invite.php:162 +msgid "" +"Use this form to invite your friends and colleagues to use this service." +msgstr "" +"Usa iste formulario pro invitar tu amicos e collegas a usar iste servicio." + +#: actions/invite.php:187 +msgid "Email addresses" +msgstr "Adresses de e-mail" + +#: actions/invite.php:189 +msgid "Addresses of friends to invite (one per line)" +msgstr "Adresses de amicos a invitar (un per linea)" + +#: actions/invite.php:192 +msgid "Personal message" +msgstr "Message personal" + +#: actions/invite.php:194 +msgid "Optionally add a personal message to the invitation." +msgstr "Si tu vole, adde un message personal al invitation." + +#: actions/invite.php:197 lib/messageform.php:178 lib/noticeform.php:222 +msgid "Send" +msgstr "Inviar" + +#: actions/invite.php:226 +#, php-format +msgid "%1$s has invited you to join them on %2$s" +msgstr "%1$s te ha invitate a accompaniar le/la in %2$s" + +#: actions/invite.php:228 +#, php-format +msgid "" +"%1$s has invited you to join them on %2$s (%3$s).\n" +"\n" +"%2$s is a micro-blogging service that lets you keep up-to-date with people " +"you know and people who interest you.\n" +"\n" +"You can also share news about yourself, your thoughts, or your life online " +"with people who know about you. It's also great for meeting new people who " +"share your interests.\n" +"\n" +"%1$s said:\n" +"\n" +"%4$s\n" +"\n" +"You can see %1$s's profile page on %2$s here:\n" +"\n" +"%5$s\n" +"\n" +"If you'd like to try the service, click on the link below to accept the " +"invitation.\n" +"\n" +"%6$s\n" +"\n" +"If not, you can ignore this message. Thanks for your patience and your " +"time.\n" +"\n" +"Sincerely, %2$s\n" +msgstr "" +"%1$s te ha invitate a accompaniar le/la in %2$s (%3$s).\n" +"\n" +"%2$s es un servicio de micro-blogging que te permitte tener te al currente " +"con personas que tu cognosce o que te interessa.\n" +"\n" +"Tu pote condivider novas super te, tu pensamentos o tu vita con personas que " +"sape de te. Es anque optime pro cognoscer nove personas con interesses " +"commun al tues.\n" +"\n" +"%1$s diceva:\n" +"\n" +"%4$s\n" +"\n" +"Tu pote vider le profilo de %1$s's in %2$s hic:\n" +"\n" +"%5$s\n" +"\n" +"Si tu vole probar le servicio, clicca super le ligamine sequente pro " +"acceptar le invitation.\n" +"\n" +"%6$s\n" +"\n" +"Si non, tu pote ignorar iste message. Gratias pro tu patientia e tu " +"tempore.\n" +"\n" +"Sincermente, %2$s\n" + +#: actions/joingroup.php:60 +msgid "You must be logged in to join a group." +msgstr "Tu debe aperir un session pro facer te membro de un gruppo." + +#: actions/joingroup.php:90 lib/command.php:217 +msgid "You are already a member of that group" +msgstr "Tu es ja membro de iste gruppo" + +#: actions/joingroup.php:128 lib/command.php:234 +#, php-format +msgid "Could not join user %s to group %s" +msgstr "Non poteva facer le usator %s membro del gruppo %s" + +#: actions/joingroup.php:135 lib/command.php:239 +#, php-format +msgid "%s joined group %s" +msgstr "%s se faceva membro del gruppo %s" + +#: actions/leavegroup.php:60 +msgid "You must be logged in to leave a group." +msgstr "Tu debe aperir un session pro quitar un gruppo." + +#: actions/leavegroup.php:90 lib/command.php:268 +msgid "You are not a member of that group." +msgstr "" + +#: actions/leavegroup.php:119 lib/command.php:278 +msgid "Could not find membership record." +msgstr "" + +#: actions/leavegroup.php:127 lib/command.php:284 +#, php-format +msgid "Could not remove user %s to group %s" +msgstr "" + +#: actions/leavegroup.php:134 lib/command.php:289 +#, php-format +msgid "%s left group %s" +msgstr "" + +#: actions/login.php:83 actions/register.php:137 +msgid "Already logged in." +msgstr "" + +#: actions/login.php:114 actions/login.php:124 +msgid "Invalid or expired token." +msgstr "" + +#: actions/login.php:147 +msgid "Incorrect username or password." +msgstr "" + +#: actions/login.php:153 +msgid "Error setting user. You are probably not authorized." +msgstr "" + +#: actions/login.php:208 actions/login.php:261 lib/action.php:458 +#: lib/logingroupnav.php:79 +msgid "Login" +msgstr "" + +#: actions/login.php:247 +msgid "Login to site" +msgstr "" + +#: actions/login.php:250 actions/profilesettings.php:106 +#: actions/register.php:423 actions/showgroup.php:236 actions/tagother.php:94 +#: lib/groupeditform.php:152 lib/userprofile.php:131 +msgid "Nickname" +msgstr "" + +#: actions/login.php:253 actions/register.php:428 +#: lib/accountsettingsaction.php:116 +msgid "Password" +msgstr "" + +#: actions/login.php:256 actions/register.php:477 +msgid "Remember me" +msgstr "" + +#: actions/login.php:257 actions/register.php:479 +msgid "Automatically login in the future; not for shared computers!" +msgstr "" + +#: actions/login.php:267 +msgid "Lost or forgotten password?" +msgstr "" + +#: actions/login.php:286 +msgid "" +"For security reasons, please re-enter your user name and password before " +"changing your settings." +msgstr "" + +#: actions/login.php:290 +#, php-format +msgid "" +"Login with your username and password. Don't have a username yet? [Register]" +"(%%action.register%%) a new account." +msgstr "" + +#: actions/makeadmin.php:91 +msgid "Only an admin can make another user an admin." +msgstr "" + +#: actions/makeadmin.php:95 +#, php-format +msgid "%s is already an admin for group \"%s\"." +msgstr "" + +#: actions/makeadmin.php:132 +#, php-format +msgid "Can't get membership record for %s in group %s" +msgstr "" + +#: actions/makeadmin.php:145 +#, php-format +msgid "Can't make %s an admin for group %s" +msgstr "" + +#: actions/microsummary.php:69 +msgid "No current status" +msgstr "" + +#: actions/newgroup.php:53 +msgid "New group" +msgstr "" + +#: actions/newgroup.php:110 +msgid "Use this form to create a new group." +msgstr "" + +#: actions/newmessage.php:71 actions/newmessage.php:231 +msgid "New message" +msgstr "" + +#: actions/newmessage.php:121 actions/newmessage.php:161 lib/command.php:367 +msgid "You can't send a message to this user." +msgstr "" + +#: actions/newmessage.php:144 actions/newnotice.php:136 lib/command.php:351 +#: lib/command.php:483 +msgid "No content!" +msgstr "" + +#: actions/newmessage.php:158 +msgid "No recipient specified." +msgstr "" + +#: actions/newmessage.php:164 lib/command.php:370 +msgid "" +"Don't send a message to yourself; just say it to yourself quietly instead." +msgstr "" + +#: actions/newmessage.php:181 +msgid "Message sent" +msgstr "" + +#: actions/newmessage.php:185 lib/command.php:375 +#, php-format +msgid "Direct message to %s sent" +msgstr "" + +#: actions/newmessage.php:210 actions/newnotice.php:242 lib/channel.php:170 +msgid "Ajax Error" +msgstr "" + +#: actions/newnotice.php:69 +msgid "New notice" +msgstr "" + +#: actions/newnotice.php:208 +msgid "Notice posted" +msgstr "" + +#: actions/noticesearch.php:68 +#, php-format +msgid "" +"Search for notices on %%site.name%% by their contents. Separate search terms " +"by spaces; they must be 3 characters or more." +msgstr "" + +#: actions/noticesearch.php:78 +msgid "Text search" +msgstr "" + +#: actions/noticesearch.php:91 +#, php-format +msgid "Search results for \"%s\" on %s" +msgstr "" + +#: actions/noticesearch.php:121 +#, php-format +msgid "" +"Be the first to [post on this topic](%%%%action.newnotice%%%%?" +"status_textarea=%s)!" +msgstr "" + +#: actions/noticesearch.php:124 +#, php-format +msgid "" +"Why not [register an account](%%%%action.register%%%%) and be the first to " +"[post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!" +msgstr "" + +#: actions/noticesearchrss.php:96 +#, php-format +msgid "Updates with \"%s\"" +msgstr "" + +#: actions/noticesearchrss.php:98 +#, php-format +msgid "Updates matching search term \"%1$s\" on %2$s!" +msgstr "" + +#: actions/nudge.php:85 +msgid "" +"This user doesn't allow nudges or hasn't confirmed or set his email yet." +msgstr "" + +#: actions/nudge.php:94 +msgid "Nudge sent" +msgstr "" + +#: actions/nudge.php:97 +msgid "Nudge sent!" +msgstr "" + +#: actions/oembed.php:79 actions/shownotice.php:100 +msgid "Notice has no profile" +msgstr "" + +#: actions/oembed.php:86 actions/shownotice.php:180 +#, php-format +msgid "%1$s's status on %2$s" +msgstr "" + +#: actions/oembed.php:157 +msgid "content type " +msgstr "" + +#: actions/oembed.php:160 +msgid "Only " +msgstr "" + +#: actions/oembed.php:181 actions/oembed.php:200 lib/api.php:1028 +#: lib/api.php:1056 lib/api.php:1166 +msgid "Not a supported data format." +msgstr "" + +#: actions/opensearch.php:64 +msgid "People Search" +msgstr "" + +#: actions/opensearch.php:67 +msgid "Notice Search" +msgstr "" + +#: actions/othersettings.php:60 +msgid "Other Settings" +msgstr "" + +#: actions/othersettings.php:71 +msgid "Manage various other options." +msgstr "" + +#: actions/othersettings.php:108 +msgid " (free service)" +msgstr "" + +#: actions/othersettings.php:116 +msgid "Shorten URLs with" +msgstr "" + +#: actions/othersettings.php:117 +msgid "Automatic shortening service to use." +msgstr "" + +#: actions/othersettings.php:122 +msgid "View profile designs" +msgstr "" + +#: actions/othersettings.php:123 +msgid "Show or hide profile designs." +msgstr "" + +#: actions/othersettings.php:153 +msgid "URL shortening service is too long (max 50 chars)." +msgstr "" + +#: actions/outbox.php:58 +#, php-format +msgid "Outbox for %s - page %d" +msgstr "" + +#: actions/outbox.php:61 +#, php-format +msgid "Outbox for %s" +msgstr "" + +#: actions/outbox.php:116 +msgid "This is your outbox, which lists private messages you have sent." +msgstr "" + +#: actions/passwordsettings.php:58 +msgid "Change password" +msgstr "" + +#: actions/passwordsettings.php:69 +msgid "Change your password." +msgstr "" + +#: actions/passwordsettings.php:96 actions/recoverpassword.php:231 +msgid "Password change" +msgstr "" + +#: actions/passwordsettings.php:104 +msgid "Old password" +msgstr "" + +#: actions/passwordsettings.php:108 actions/recoverpassword.php:235 +msgid "New password" +msgstr "" + +#: actions/passwordsettings.php:109 +msgid "6 or more characters" +msgstr "" + +#: actions/passwordsettings.php:112 actions/recoverpassword.php:239 +#: actions/register.php:432 actions/smssettings.php:134 +msgid "Confirm" +msgstr "" + +#: actions/passwordsettings.php:113 actions/recoverpassword.php:240 +msgid "Same as password above" +msgstr "" + +#: actions/passwordsettings.php:117 +msgid "Change" +msgstr "" + +#: actions/passwordsettings.php:154 actions/register.php:230 +msgid "Password must be 6 or more characters." +msgstr "" + +#: actions/passwordsettings.php:157 actions/register.php:233 +msgid "Passwords don't match." +msgstr "" + +#: actions/passwordsettings.php:165 +msgid "Incorrect old password" +msgstr "" + +#: actions/passwordsettings.php:181 +msgid "Error saving user; invalid." +msgstr "" + +#: actions/passwordsettings.php:186 actions/recoverpassword.php:368 +msgid "Can't save new password." +msgstr "" + +#: actions/passwordsettings.php:192 actions/recoverpassword.php:211 +msgid "Password saved." +msgstr "" + +#: actions/pathsadminpanel.php:59 lib/adminpanelaction.php:308 +msgid "Paths" +msgstr "" + +#: actions/pathsadminpanel.php:70 +msgid "Path and server settings for this StatusNet site." +msgstr "" + +#: actions/pathsadminpanel.php:140 +#, php-format +msgid "Theme directory not readable: %s" +msgstr "" + +#: actions/pathsadminpanel.php:146 +#, php-format +msgid "Avatar directory not writable: %s" +msgstr "" + +#: actions/pathsadminpanel.php:152 +#, php-format +msgid "Background directory not writable: %s" +msgstr "" + +#: actions/pathsadminpanel.php:160 +#, php-format +msgid "Locales directory not readable: %s" +msgstr "" + +#: actions/pathsadminpanel.php:212 actions/siteadminpanel.php:58 +#: lib/adminpanelaction.php:299 +msgid "Site" +msgstr "" + +#: actions/pathsadminpanel.php:216 +msgid "Path" +msgstr "" + +#: actions/pathsadminpanel.php:216 +msgid "Site path" +msgstr "" + +#: actions/pathsadminpanel.php:220 +msgid "Path to locales" +msgstr "" + +#: actions/pathsadminpanel.php:220 +msgid "Directory path to locales" +msgstr "" + +#: actions/pathsadminpanel.php:227 +msgid "Theme" +msgstr "" + +#: actions/pathsadminpanel.php:232 +msgid "Theme server" +msgstr "" + +#: actions/pathsadminpanel.php:236 +msgid "Theme path" +msgstr "" + +#: actions/pathsadminpanel.php:240 +msgid "Theme directory" +msgstr "" + +#: actions/pathsadminpanel.php:247 +msgid "Avatars" +msgstr "" + +#: actions/pathsadminpanel.php:252 +msgid "Avatar server" +msgstr "" + +#: actions/pathsadminpanel.php:256 +msgid "Avatar path" +msgstr "" + +#: actions/pathsadminpanel.php:260 +msgid "Avatar directory" +msgstr "" + +#: actions/pathsadminpanel.php:269 +msgid "Backgrounds" +msgstr "" + +#: actions/pathsadminpanel.php:273 +msgid "Background server" +msgstr "" + +#: actions/pathsadminpanel.php:277 +msgid "Background path" +msgstr "" + +#: actions/pathsadminpanel.php:281 +msgid "Background directory" +msgstr "" + +#: actions/pathsadminpanel.php:297 +msgid "Save paths" +msgstr "" + +#: actions/peoplesearch.php:52 +#, php-format +msgid "" +"Search for people on %%site.name%% by their name, location, or interests. " +"Separate the terms by spaces; they must be 3 characters or more." +msgstr "" + +#: actions/peoplesearch.php:58 +msgid "People search" +msgstr "" + +#: actions/peopletag.php:70 +#, php-format +msgid "Not a valid people tag: %s" +msgstr "" + +#: actions/peopletag.php:144 +#, php-format +msgid "Users self-tagged with %s - page %d" +msgstr "" + +#: actions/postnotice.php:84 +msgid "Invalid notice content" +msgstr "" + +#: actions/postnotice.php:90 +#, php-format +msgid "Notice license ‘%s’ is not compatible with site license ‘%s’." +msgstr "" + +#: actions/profilesettings.php:60 +msgid "Profile settings" +msgstr "" + +#: actions/profilesettings.php:71 +msgid "" +"You can update your personal profile info here so people know more about you." +msgstr "" + +#: actions/profilesettings.php:99 +msgid "Profile information" +msgstr "" + +#: actions/profilesettings.php:108 lib/groupeditform.php:154 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces" +msgstr "" + +#: actions/profilesettings.php:111 actions/register.php:447 +#: actions/showgroup.php:247 actions/tagother.php:104 +#: lib/groupeditform.php:157 lib/userprofile.php:149 +msgid "Full name" +msgstr "" + +#: actions/profilesettings.php:115 actions/register.php:452 +#: lib/groupeditform.php:161 +msgid "Homepage" +msgstr "" + +#: actions/profilesettings.php:117 actions/register.php:454 +msgid "URL of your homepage, blog, or profile on another site" +msgstr "" + +#: actions/profilesettings.php:122 actions/register.php:460 +#, php-format +msgid "Describe yourself and your interests in %d chars" +msgstr "" + +#: actions/profilesettings.php:125 actions/register.php:463 +msgid "Describe yourself and your interests" +msgstr "" + +#: actions/profilesettings.php:127 actions/register.php:465 +msgid "Bio" +msgstr "" + +#: actions/profilesettings.php:132 actions/register.php:470 +#: actions/showgroup.php:256 actions/tagother.php:112 +#: actions/userauthorization.php:158 lib/groupeditform.php:177 +#: lib/userprofile.php:164 +msgid "Location" +msgstr "" + +#: actions/profilesettings.php:134 actions/register.php:472 +msgid "Where you are, like \"City, State (or Region), Country\"" +msgstr "" + +#: actions/profilesettings.php:138 actions/tagother.php:149 +#: actions/tagother.php:209 lib/subscriptionlist.php:106 +#: lib/subscriptionlist.php:108 lib/userprofile.php:209 +msgid "Tags" +msgstr "" + +#: actions/profilesettings.php:140 +msgid "" +"Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated" +msgstr "" + +#: actions/profilesettings.php:144 actions/siteadminpanel.php:307 +msgid "Language" +msgstr "" + +#: actions/profilesettings.php:145 +msgid "Preferred language" +msgstr "" + +#: actions/profilesettings.php:154 +msgid "Timezone" +msgstr "" + +#: actions/profilesettings.php:155 +msgid "What timezone are you normally in?" +msgstr "" + +#: actions/profilesettings.php:160 +msgid "" +"Automatically subscribe to whoever subscribes to me (best for non-humans)" +msgstr "" + +#: actions/profilesettings.php:221 actions/register.php:223 +#, php-format +msgid "Bio is too long (max %d chars)." +msgstr "" + +#: actions/profilesettings.php:228 actions/siteadminpanel.php:165 +msgid "Timezone not selected." +msgstr "" + +#: actions/profilesettings.php:234 +msgid "Language is too long (max 50 chars)." +msgstr "" + +#: actions/profilesettings.php:246 actions/tagother.php:178 +#, php-format +msgid "Invalid tag: \"%s\"" +msgstr "" + +#: actions/profilesettings.php:295 +msgid "Couldn't update user for autosubscribe." +msgstr "" + +#: actions/profilesettings.php:328 +msgid "Couldn't save profile." +msgstr "" + +#: actions/profilesettings.php:336 +msgid "Couldn't save tags." +msgstr "" + +#: actions/profilesettings.php:344 lib/adminpanelaction.php:126 +msgid "Settings saved." +msgstr "" + +#: actions/public.php:83 +#, php-format +msgid "Beyond the page limit (%s)" +msgstr "" + +#: actions/public.php:92 +msgid "Could not retrieve public stream." +msgstr "" + +#: actions/public.php:129 +#, php-format +msgid "Public timeline, page %d" +msgstr "" + +#: actions/public.php:131 lib/publicgroupnav.php:79 +msgid "Public timeline" +msgstr "" + +#: actions/public.php:151 +msgid "Public Stream Feed (RSS 1.0)" +msgstr "" + +#: actions/public.php:155 +msgid "Public Stream Feed (RSS 2.0)" +msgstr "" + +#: actions/public.php:159 +msgid "Public Stream Feed (Atom)" +msgstr "" + +#: actions/public.php:179 +#, php-format +msgid "" +"This is the public timeline for %%site.name%% but no one has posted anything " +"yet." +msgstr "" + +#: actions/public.php:182 +msgid "Be the first to post!" +msgstr "" + +#: actions/public.php:186 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to post!" +msgstr "" + +#: actions/public.php:233 +#, php-format +msgid "" +"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" +"blogging) service based on the Free Software [StatusNet](http://status.net/) " +"tool. [Join now](%%action.register%%) to share notices about yourself with " +"friends, family, and colleagues! ([Read more](%%doc.help%%))" +msgstr "" + +#: actions/public.php:238 +#, php-format +msgid "" +"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" +"blogging) service based on the Free Software [StatusNet](http://status.net/) " +"tool." +msgstr "" + +#: actions/publictagcloud.php:57 +msgid "Public tag cloud" +msgstr "" + +#: actions/publictagcloud.php:63 +#, php-format +msgid "These are most popular recent tags on %s " +msgstr "" + +#: actions/publictagcloud.php:69 +#, php-format +msgid "No one has posted a notice with a [hashtag](%%doc.tags%%) yet." +msgstr "" + +#: actions/publictagcloud.php:72 +msgid "Be the first to post one!" +msgstr "" + +#: actions/publictagcloud.php:75 +#, php-format +msgid "" +"Why not [register an account](%%action.register%%) and be the first to post " +"one!" +msgstr "" + +#: actions/publictagcloud.php:135 +msgid "Tag cloud" +msgstr "" + +#: actions/recoverpassword.php:36 +msgid "You are already logged in!" +msgstr "" + +#: actions/recoverpassword.php:62 +msgid "No such recovery code." +msgstr "" + +#: actions/recoverpassword.php:66 +msgid "Not a recovery code." +msgstr "" + +#: actions/recoverpassword.php:73 +msgid "Recovery code for unknown user." +msgstr "" + +#: actions/recoverpassword.php:86 +msgid "Error with confirmation code." +msgstr "" + +#: actions/recoverpassword.php:97 +msgid "This confirmation code is too old. Please start again." +msgstr "" + +#: actions/recoverpassword.php:111 +msgid "Could not update user with confirmed email address." +msgstr "" + +#: actions/recoverpassword.php:152 +msgid "" +"If you have forgotten or lost your password, you can get a new one sent to " +"the email address you have stored in your account." +msgstr "" + +#: actions/recoverpassword.php:158 +msgid "You have been identified. Enter a new password below. " +msgstr "" + +#: actions/recoverpassword.php:188 +msgid "Password recovery" +msgstr "" + +#: actions/recoverpassword.php:191 +msgid "Nickname or email address" +msgstr "" + +#: actions/recoverpassword.php:193 +msgid "Your nickname on this server, or your registered email address." +msgstr "" + +#: actions/recoverpassword.php:199 actions/recoverpassword.php:200 +msgid "Recover" +msgstr "" + +#: actions/recoverpassword.php:208 +msgid "Reset password" +msgstr "" + +#: actions/recoverpassword.php:209 +msgid "Recover password" +msgstr "" + +#: actions/recoverpassword.php:210 actions/recoverpassword.php:322 +msgid "Password recovery requested" +msgstr "" + +#: actions/recoverpassword.php:213 +msgid "Unknown action" +msgstr "" + +#: actions/recoverpassword.php:236 +msgid "6 or more characters, and don't forget it!" +msgstr "" + +#: actions/recoverpassword.php:243 +msgid "Reset" +msgstr "" + +#: actions/recoverpassword.php:252 +msgid "Enter a nickname or email address." +msgstr "" + +#: actions/recoverpassword.php:272 +msgid "No user with that email address or username." +msgstr "" + +#: actions/recoverpassword.php:287 +msgid "No registered email address for that user." +msgstr "" + +#: actions/recoverpassword.php:301 +msgid "Error saving address confirmation." +msgstr "" + +#: actions/recoverpassword.php:325 +msgid "" +"Instructions for recovering your password have been sent to the email " +"address registered to your account." +msgstr "" + +#: actions/recoverpassword.php:344 +msgid "Unexpected password reset." +msgstr "" + +#: actions/recoverpassword.php:352 +msgid "Password must be 6 chars or more." +msgstr "" + +#: actions/recoverpassword.php:356 +msgid "Password and confirmation do not match." +msgstr "" + +#: actions/recoverpassword.php:375 actions/register.php:248 +msgid "Error setting user." +msgstr "" + +#: actions/recoverpassword.php:382 +msgid "New password successfully saved. You are now logged in." +msgstr "" + +#: actions/register.php:85 actions/register.php:189 actions/register.php:404 +msgid "Sorry, only invited people can register." +msgstr "" + +#: actions/register.php:92 +msgid "Sorry, invalid invitation code." +msgstr "" + +#: actions/register.php:112 +msgid "Registration successful" +msgstr "" + +#: actions/register.php:114 actions/register.php:502 lib/action.php:455 +#: lib/logingroupnav.php:85 +msgid "Register" +msgstr "" + +#: actions/register.php:135 +msgid "Registration not allowed." +msgstr "" + +#: actions/register.php:198 +msgid "You can't register if you don't agree to the license." +msgstr "" + +#: actions/register.php:201 +msgid "Not a valid email address." +msgstr "" + +#: actions/register.php:212 +msgid "Email address already exists." +msgstr "" + +#: actions/register.php:243 actions/register.php:264 +msgid "Invalid username or password." +msgstr "" + +#: actions/register.php:342 +msgid "" +"With this form you can create a new account. You can then post notices and " +"link up to friends and colleagues. " +msgstr "" + +#: actions/register.php:424 +msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required." +msgstr "" + +#: actions/register.php:429 +msgid "6 or more characters. Required." +msgstr "" + +#: actions/register.php:433 +msgid "Same as password above. Required." +msgstr "" + +#: actions/register.php:437 actions/register.php:441 +#: actions/siteadminpanel.php:283 lib/accountsettingsaction.php:120 +msgid "Email" +msgstr "" + +#: actions/register.php:438 actions/register.php:442 +msgid "Used only for updates, announcements, and password recovery" +msgstr "" + +#: actions/register.php:449 +msgid "Longer name, preferably your \"real\" name" +msgstr "" + +#: actions/register.php:493 +msgid "My text and files are available under " +msgstr "" + +#: actions/register.php:495 +msgid "Creative Commons Attribution 3.0" +msgstr "" + +#: actions/register.php:496 +msgid "" +" except this private data: password, email address, IM address, and phone " +"number." +msgstr "" + +#: actions/register.php:537 +#, php-format +msgid "" +"Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may " +"want to...\n" +"\n" +"* Go to [your profile](%s) and post your first message.\n" +"* Add a [Jabber/GTalk address](%%%%action.imsettings%%%%) so you can send " +"notices through instant messages.\n" +"* [Search for people](%%%%action.peoplesearch%%%%) that you may know or that " +"share your interests. \n" +"* Update your [profile settings](%%%%action.profilesettings%%%%) to tell " +"others more about you. \n" +"* Read over the [online docs](%%%%doc.help%%%%) for features you may have " +"missed. \n" +"\n" +"Thanks for signing up and we hope you enjoy using this service." +msgstr "" + +#: actions/register.php:561 +msgid "" +"(You should receive a message by email momentarily, with instructions on how " +"to confirm your email address.)" +msgstr "" + +#: actions/remotesubscribe.php:98 +#, php-format +msgid "" +"To subscribe, you can [login](%%action.login%%), or [register](%%action." +"register%%) a new account. If you already have an account on a [compatible " +"microblogging site](%%doc.openmublog%%), enter your profile URL below." +msgstr "" + +#: actions/remotesubscribe.php:112 +msgid "Remote subscribe" +msgstr "" + +#: actions/remotesubscribe.php:124 +msgid "Subscribe to a remote user" +msgstr "" + +#: actions/remotesubscribe.php:129 +msgid "User nickname" +msgstr "" + +#: actions/remotesubscribe.php:130 +msgid "Nickname of the user you want to follow" +msgstr "" + +#: actions/remotesubscribe.php:133 +msgid "Profile URL" +msgstr "" + +#: actions/remotesubscribe.php:134 +msgid "URL of your profile on another compatible microblogging service" +msgstr "" + +#: actions/remotesubscribe.php:137 lib/subscribeform.php:139 +#: lib/userprofile.php:365 +msgid "Subscribe" +msgstr "" + +#: actions/remotesubscribe.php:159 +msgid "Invalid profile URL (bad format)" +msgstr "" + +#: actions/remotesubscribe.php:168 +msgid "Not a valid profile URL (no YADIS document or invalid XRDS defined)." +msgstr "" + +#: actions/remotesubscribe.php:176 +msgid "That’s a local profile! Login to subscribe." +msgstr "" + +#: actions/remotesubscribe.php:183 +msgid "Couldn’t get a request token." +msgstr "" + +#: actions/repeat.php:57 +msgid "Only logged-in users can repeat notices." +msgstr "" + +#: actions/repeat.php:64 actions/repeat.php:71 +#, fuzzy +msgid "No notice specified." +msgstr "Nulle profilo specificate." + +#: actions/repeat.php:76 +msgid "You can't repeat your own notice." +msgstr "" + +#: actions/repeat.php:90 +#, fuzzy +msgid "You already repeated that notice." +msgstr "Tu ha ja blocate iste usator." + +#: actions/repeat.php:112 lib/noticelist.php:628 +msgid "Repeated" +msgstr "" + +#: actions/repeat.php:115 +msgid "Repeated!" +msgstr "" + +#: actions/replies.php:125 actions/repliesrss.php:68 +#: lib/personalgroupnav.php:105 +#, php-format +msgid "Replies to %s" +msgstr "" + +#: actions/replies.php:127 +#, php-format +msgid "Replies to %s, page %d" +msgstr "" + +#: actions/replies.php:144 +#, php-format +msgid "Replies feed for %s (RSS 1.0)" +msgstr "" + +#: actions/replies.php:151 +#, php-format +msgid "Replies feed for %s (RSS 2.0)" +msgstr "" + +#: actions/replies.php:158 +#, php-format +msgid "Replies feed for %s (Atom)" +msgstr "" + +#: actions/replies.php:198 +#, php-format +msgid "" +"This is the timeline showing replies to %s but %s hasn't received a notice " +"to his attention yet." +msgstr "" + +#: actions/replies.php:203 +#, php-format +msgid "" +"You can engage other users in a conversation, subscribe to more people or " +"[join groups](%%action.groups%%)." +msgstr "" + +#: actions/replies.php:205 +#, php-format +msgid "" +"You can try to [nudge %s](../%s) or [post something to his or her attention]" +"(%%%%action.newnotice%%%%?status_textarea=%s)." +msgstr "" + +#: actions/repliesrss.php:72 +#, php-format +msgid "Replies to %1$s on %2$s!" +msgstr "" + +#: actions/sandbox.php:65 actions/unsandbox.php:65 +msgid "You cannot sandbox users on this site." +msgstr "" + +#: actions/sandbox.php:72 +msgid "User is already sandboxed." +msgstr "" + +#: actions/showfavorites.php:79 +#, php-format +msgid "%s's favorite notices, page %d" +msgstr "" + +#: actions/showfavorites.php:132 +msgid "Could not retrieve favorite notices." +msgstr "" + +#: actions/showfavorites.php:170 +#, php-format +msgid "Feed for favorites of %s (RSS 1.0)" +msgstr "" + +#: actions/showfavorites.php:177 +#, php-format +msgid "Feed for favorites of %s (RSS 2.0)" +msgstr "" + +#: actions/showfavorites.php:184 +#, php-format +msgid "Feed for favorites of %s (Atom)" +msgstr "" + +#: actions/showfavorites.php:205 +msgid "" +"You haven't chosen any favorite notices yet. Click the fave button on " +"notices you like to bookmark them for later or shed a spotlight on them." +msgstr "" + +#: actions/showfavorites.php:207 +#, php-format +msgid "" +"%s hasn't added any notices to his favorites yet. Post something interesting " +"they would add to their favorites :)" +msgstr "" + +#: actions/showfavorites.php:211 +#, php-format +msgid "" +"%s hasn't added any notices to his favorites yet. Why not [register an " +"account](%%%%action.register%%%%) and then post something interesting they " +"would add to their favorites :)" +msgstr "" + +#: actions/showfavorites.php:242 +msgid "This is a way to share what you like." +msgstr "" + +#: actions/showgroup.php:82 lib/groupnav.php:86 +#, php-format +msgid "%s group" +msgstr "" + +#: actions/showgroup.php:84 +#, php-format +msgid "%s group, page %d" +msgstr "" + +#: actions/showgroup.php:218 +msgid "Group profile" +msgstr "" + +#: actions/showgroup.php:263 actions/tagother.php:118 +#: actions/userauthorization.php:167 lib/userprofile.php:177 +msgid "URL" +msgstr "" + +#: actions/showgroup.php:274 actions/tagother.php:128 +#: actions/userauthorization.php:179 lib/userprofile.php:194 +msgid "Note" +msgstr "" + +#: actions/showgroup.php:284 lib/groupeditform.php:184 +msgid "Aliases" +msgstr "" + +#: actions/showgroup.php:293 +msgid "Group actions" +msgstr "" + +#: actions/showgroup.php:328 +#, php-format +msgid "Notice feed for %s group (RSS 1.0)" +msgstr "" + +#: actions/showgroup.php:334 +#, php-format +msgid "Notice feed for %s group (RSS 2.0)" +msgstr "" + +#: actions/showgroup.php:340 +#, php-format +msgid "Notice feed for %s group (Atom)" +msgstr "" + +#: actions/showgroup.php:345 +#, php-format +msgid "FOAF for %s group" +msgstr "" + +#: actions/showgroup.php:381 actions/showgroup.php:438 lib/groupnav.php:91 +msgid "Members" +msgstr "" + +#: actions/showgroup.php:386 lib/profileaction.php:117 +#: lib/profileaction.php:148 lib/profileaction.php:236 lib/section.php:95 +#: lib/tagcloudsection.php:71 +msgid "(None)" +msgstr "" + +#: actions/showgroup.php:392 +msgid "All members" +msgstr "" + +#: actions/showgroup.php:429 lib/profileaction.php:174 +msgid "Statistics" +msgstr "" + +#: actions/showgroup.php:432 +msgid "Created" +msgstr "" + +#: actions/showgroup.php:448 +#, php-format +msgid "" +"**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. Its members share short messages about " +"their life and interests. [Join now](%%%%action.register%%%%) to become part " +"of this group and many more! ([Read more](%%%%doc.help%%%%))" +msgstr "" + +#: actions/showgroup.php:454 +#, php-format +msgid "" +"**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. Its members share short messages about " +"their life and interests. " +msgstr "" + +#: actions/showgroup.php:482 +msgid "Admins" +msgstr "" + +#: actions/showmessage.php:81 +msgid "No such message." +msgstr "" + +#: actions/showmessage.php:98 +msgid "Only the sender and recipient may read this message." +msgstr "" + +#: actions/showmessage.php:108 +#, php-format +msgid "Message to %1$s on %2$s" +msgstr "" + +#: actions/showmessage.php:113 +#, php-format +msgid "Message from %1$s on %2$s" +msgstr "" + +#: actions/shownotice.php:90 +msgid "Notice deleted." +msgstr "" + +#: actions/showstream.php:73 +#, php-format +msgid " tagged %s" +msgstr "" + +#: actions/showstream.php:79 +#, php-format +msgid "%s, page %d" +msgstr "" + +#: actions/showstream.php:122 +#, php-format +msgid "Notice feed for %s tagged %s (RSS 1.0)" +msgstr "" + +#: actions/showstream.php:129 +#, php-format +msgid "Notice feed for %s (RSS 1.0)" +msgstr "" + +#: actions/showstream.php:136 +#, php-format +msgid "Notice feed for %s (RSS 2.0)" +msgstr "" + +#: actions/showstream.php:143 +#, php-format +msgid "Notice feed for %s (Atom)" +msgstr "" + +#: actions/showstream.php:148 +#, php-format +msgid "FOAF for %s" +msgstr "" + +#: actions/showstream.php:191 +#, php-format +msgid "This is the timeline for %s but %s hasn't posted anything yet." +msgstr "" + +#: actions/showstream.php:196 +msgid "" +"Seen anything interesting recently? You haven't posted any notices yet, now " +"would be a good time to start :)" +msgstr "" + +#: actions/showstream.php:198 +#, php-format +msgid "" +"You can try to nudge %s or [post something to his or her attention](%%%%" +"action.newnotice%%%%?status_textarea=%s)." +msgstr "" + +#: actions/showstream.php:234 +#, php-format +msgid "" +"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. [Join now](%%%%action.register%%%%) to " +"follow **%s**'s notices and many more! ([Read more](%%%%doc.help%%%%))" +msgstr "" + +#: actions/showstream.php:239 +#, php-format +msgid "" +"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en." +"wikipedia.org/wiki/Micro-blogging) service based on the Free Software " +"[StatusNet](http://status.net/) tool. " +msgstr "" + +#: actions/showstream.php:313 +#, php-format +msgid "Repeat of %s" +msgstr "" + +#: actions/silence.php:65 actions/unsilence.php:65 +msgid "You cannot silence users on this site." +msgstr "" + +#: actions/silence.php:72 +msgid "User is already silenced." +msgstr "" + +#: actions/siteadminpanel.php:69 +msgid "Basic settings for this StatusNet site." +msgstr "" + +#: actions/siteadminpanel.php:147 +msgid "Site name must have non-zero length." +msgstr "" + +#: actions/siteadminpanel.php:155 +msgid "You must have a valid contact email address" +msgstr "" + +#: actions/siteadminpanel.php:173 +#, php-format +msgid "Unknown language \"%s\"" +msgstr "" + +#: actions/siteadminpanel.php:180 +msgid "Invalid snapshot report URL." +msgstr "" + +#: actions/siteadminpanel.php:186 +msgid "Invalid snapshot run value." +msgstr "" + +#: actions/siteadminpanel.php:192 +msgid "Snapshot frequency must be a number." +msgstr "" + +#: actions/siteadminpanel.php:199 +msgid "You must set an SSL server when enabling SSL." +msgstr "" + +#: actions/siteadminpanel.php:204 +msgid "Invalid SSL server. The maximum length is 255 characters." +msgstr "" + +#: actions/siteadminpanel.php:210 +msgid "Minimum text limit is 140 characters." +msgstr "" + +#: actions/siteadminpanel.php:216 +msgid "Dupe limit must 1 or more seconds." +msgstr "" + +#: actions/siteadminpanel.php:266 +msgid "General" +msgstr "" + +#: actions/siteadminpanel.php:269 +msgid "Site name" +msgstr "" + +#: actions/siteadminpanel.php:270 +msgid "The name of your site, like \"Yourcompany Microblog\"" +msgstr "" + +#: actions/siteadminpanel.php:274 +msgid "Brought by" +msgstr "" + +#: actions/siteadminpanel.php:275 +msgid "Text used for credits link in footer of each page" +msgstr "" + +#: actions/siteadminpanel.php:279 +msgid "Brought by URL" +msgstr "" + +#: actions/siteadminpanel.php:280 +msgid "URL used for credits link in footer of each page" +msgstr "" + +#: actions/siteadminpanel.php:284 +msgid "Contact email address for your site" +msgstr "" + +#: actions/siteadminpanel.php:290 +msgid "Local" +msgstr "" + +#: actions/siteadminpanel.php:301 +msgid "Default timezone" +msgstr "" + +#: actions/siteadminpanel.php:302 +msgid "Default timezone for the site; usually UTC." +msgstr "" + +#: actions/siteadminpanel.php:308 +msgid "Default site language" +msgstr "" + +#: actions/siteadminpanel.php:316 +msgid "URLs" +msgstr "" + +#: actions/siteadminpanel.php:319 +msgid "Server" +msgstr "" + +#: actions/siteadminpanel.php:319 +msgid "Site's server hostname." +msgstr "" + +#: actions/siteadminpanel.php:323 +msgid "Fancy URLs" +msgstr "" + +#: actions/siteadminpanel.php:325 +msgid "Use fancy (more readable and memorable) URLs?" +msgstr "" + +#: actions/siteadminpanel.php:331 +msgid "Access" +msgstr "" + +#: actions/siteadminpanel.php:334 +msgid "Private" +msgstr "" + +#: actions/siteadminpanel.php:336 +msgid "Prohibit anonymous users (not logged in) from viewing site?" +msgstr "" + +#: actions/siteadminpanel.php:340 +msgid "Invite only" +msgstr "" + +#: actions/siteadminpanel.php:342 +msgid "Make registration invitation only." +msgstr "" + +#: actions/siteadminpanel.php:346 +msgid "Closed" +msgstr "" + +#: actions/siteadminpanel.php:348 +msgid "Disable new registrations." +msgstr "" + +#: actions/siteadminpanel.php:354 +msgid "Snapshots" +msgstr "" + +#: actions/siteadminpanel.php:357 +msgid "Randomly during Web hit" +msgstr "" + +#: actions/siteadminpanel.php:358 +msgid "In a scheduled job" +msgstr "" + +#: actions/siteadminpanel.php:359 actions/siteadminpanel.php:383 +msgid "Never" +msgstr "" + +#: actions/siteadminpanel.php:360 +msgid "Data snapshots" +msgstr "" + +#: actions/siteadminpanel.php:361 +msgid "When to send statistical data to status.net servers" +msgstr "" + +#: actions/siteadminpanel.php:366 +msgid "Frequency" +msgstr "" + +#: actions/siteadminpanel.php:367 +msgid "Snapshots will be sent once every N web hits" +msgstr "" + +#: actions/siteadminpanel.php:372 +msgid "Report URL" +msgstr "" + +#: actions/siteadminpanel.php:373 +msgid "Snapshots will be sent to this URL" +msgstr "" + +#: actions/siteadminpanel.php:380 +msgid "SSL" +msgstr "" + +#: actions/siteadminpanel.php:384 +msgid "Sometimes" +msgstr "" + +#: actions/siteadminpanel.php:385 +msgid "Always" +msgstr "" + +#: actions/siteadminpanel.php:387 +msgid "Use SSL" +msgstr "" + +#: actions/siteadminpanel.php:388 +msgid "When to use SSL" +msgstr "" + +#: actions/siteadminpanel.php:393 +msgid "SSL Server" +msgstr "" + +#: actions/siteadminpanel.php:394 +msgid "Server to direct SSL requests to" +msgstr "" + +#: actions/siteadminpanel.php:400 +msgid "Limits" +msgstr "" + +#: actions/siteadminpanel.php:403 +msgid "Text limit" +msgstr "" + +#: actions/siteadminpanel.php:403 +msgid "Maximum number of characters for notices." +msgstr "" + +#: actions/siteadminpanel.php:407 +msgid "Dupe limit" +msgstr "" + +#: actions/siteadminpanel.php:407 +msgid "How long users must wait (in seconds) to post the same thing again." +msgstr "" + +#: actions/siteadminpanel.php:421 actions/useradminpanel.php:313 +msgid "Save site settings" +msgstr "" + +#: actions/smssettings.php:58 +msgid "SMS Settings" +msgstr "" + +#: actions/smssettings.php:69 +#, php-format +msgid "You can receive SMS messages through email from %%site.name%%." +msgstr "" + +#: actions/smssettings.php:91 +msgid "SMS is not available." +msgstr "" + +#: actions/smssettings.php:112 +msgid "Current confirmed SMS-enabled phone number." +msgstr "" + +#: actions/smssettings.php:123 +msgid "Awaiting confirmation on this phone number." +msgstr "" + +#: actions/smssettings.php:130 +msgid "Confirmation code" +msgstr "" + +#: actions/smssettings.php:131 +msgid "Enter the code you received on your phone." +msgstr "" + +#: actions/smssettings.php:138 +msgid "SMS Phone number" +msgstr "" + +#: actions/smssettings.php:140 +msgid "Phone number, no punctuation or spaces, with area code" +msgstr "" + +#: actions/smssettings.php:174 +msgid "" +"Send me notices through SMS; I understand I may incur exorbitant charges " +"from my carrier." +msgstr "" + +#: actions/smssettings.php:306 +msgid "No phone number." +msgstr "" + +#: actions/smssettings.php:311 +msgid "No carrier selected." +msgstr "" + +#: actions/smssettings.php:318 +msgid "That is already your phone number." +msgstr "" + +#: actions/smssettings.php:321 +msgid "That phone number already belongs to another user." +msgstr "" + +#: actions/smssettings.php:347 +msgid "" +"A confirmation code was sent to the phone number you added. Check your phone " +"for the code and instructions on how to use it." +msgstr "" + +#: actions/smssettings.php:374 +msgid "That is the wrong confirmation number." +msgstr "" + +#: actions/smssettings.php:405 +msgid "That is not your phone number." +msgstr "" + +#: actions/smssettings.php:465 +msgid "Mobile carrier" +msgstr "" + +#: actions/smssettings.php:469 +msgid "Select a carrier" +msgstr "" + +#: actions/smssettings.php:476 +#, php-format +msgid "" +"Mobile carrier for your phone. If you know a carrier that accepts SMS over " +"email but isn't listed here, send email to let us know at %s." +msgstr "" + +#: actions/smssettings.php:498 +msgid "No code entered" +msgstr "" + +#: actions/subedit.php:70 +msgid "You are not subscribed to that profile." +msgstr "" + +#: actions/subedit.php:83 +msgid "Could not save subscription." +msgstr "" + +#: actions/subscribe.php:55 +msgid "Not a local user." +msgstr "" + +#: actions/subscribe.php:69 +msgid "Subscribed" +msgstr "" + +#: actions/subscribers.php:50 +#, php-format +msgid "%s subscribers" +msgstr "" + +#: actions/subscribers.php:52 +#, php-format +msgid "%s subscribers, page %d" +msgstr "" + +#: actions/subscribers.php:63 +msgid "These are the people who listen to your notices." +msgstr "" + +#: actions/subscribers.php:67 +#, php-format +msgid "These are the people who listen to %s's notices." +msgstr "" + +#: actions/subscribers.php:108 +msgid "" +"You have no subscribers. Try subscribing to people you know and they might " +"return the favor" +msgstr "" + +#: actions/subscribers.php:110 +#, php-format +msgid "%s has no subscribers. Want to be the first?" +msgstr "" + +#: actions/subscribers.php:114 +#, php-format +msgid "" +"%s has no subscribers. Why not [register an account](%%%%action.register%%%" +"%) and be the first?" +msgstr "" + +#: actions/subscriptions.php:52 +#, php-format +msgid "%s subscriptions" +msgstr "" + +#: actions/subscriptions.php:54 +#, php-format +msgid "%s subscriptions, page %d" +msgstr "" + +#: actions/subscriptions.php:65 +msgid "These are the people whose notices you listen to." +msgstr "" + +#: actions/subscriptions.php:69 +#, php-format +msgid "These are the people whose notices %s listens to." +msgstr "" + +#: actions/subscriptions.php:121 +#, php-format +msgid "" +"You're not listening to anyone's notices right now, try subscribing to " +"people you know. Try [people search](%%action.peoplesearch%%), look for " +"members in groups you're interested in and in our [featured users](%%action." +"featured%%). If you're a [Twitter user](%%action.twittersettings%%), you can " +"automatically subscribe to people you already follow there." +msgstr "" + +#: actions/subscriptions.php:123 actions/subscriptions.php:127 +#, php-format +msgid "%s is not listening to anyone." +msgstr "" + +#: actions/subscriptions.php:194 +msgid "Jabber" +msgstr "" + +#: actions/subscriptions.php:199 lib/connectsettingsaction.php:115 +msgid "SMS" +msgstr "" + +#: actions/tag.php:68 +#, php-format +msgid "Notices tagged with %s, page %d" +msgstr "" + +#: actions/tag.php:86 +#, php-format +msgid "Notice feed for tag %s (RSS 1.0)" +msgstr "" + +#: actions/tag.php:92 +#, php-format +msgid "Notice feed for tag %s (RSS 2.0)" +msgstr "" + +#: actions/tag.php:98 +#, php-format +msgid "Notice feed for tag %s (Atom)" +msgstr "" + +#: actions/tagother.php:33 +msgid "Not logged in" +msgstr "" + +#: actions/tagother.php:39 +msgid "No id argument." +msgstr "" + +#: actions/tagother.php:65 +#, php-format +msgid "Tag %s" +msgstr "" + +#: actions/tagother.php:77 lib/userprofile.php:75 +msgid "User profile" +msgstr "" + +#: actions/tagother.php:81 lib/userprofile.php:102 +msgid "Photo" +msgstr "" + +#: actions/tagother.php:141 +msgid "Tag user" +msgstr "" + +#: actions/tagother.php:151 +msgid "" +"Tags for this user (letters, numbers, -, ., and _), comma- or space- " +"separated" +msgstr "" + +#: actions/tagother.php:193 +msgid "" +"You can only tag people you are subscribed to or who are subscribed to you." +msgstr "" + +#: actions/tagother.php:200 +msgid "Could not save tags." +msgstr "" + +#: actions/tagother.php:236 +msgid "Use this form to add tags to your subscribers or subscriptions." +msgstr "" + +#: actions/tagrss.php:35 +msgid "No such tag." +msgstr "" + +#: actions/twitapitrends.php:87 +msgid "API method under construction." +msgstr "" + +#: actions/unblock.php:59 +msgid "You haven't blocked that user." +msgstr "" + +#: actions/unsandbox.php:72 +msgid "User is not sandboxed." +msgstr "" + +#: actions/unsilence.php:72 +msgid "User is not silenced." +msgstr "" + +#: actions/unsubscribe.php:77 +msgid "No profile id in request." +msgstr "" + +#: actions/unsubscribe.php:84 +msgid "No profile with that id." +msgstr "" + +#: actions/unsubscribe.php:98 +msgid "Unsubscribed" +msgstr "" + +#: actions/updateprofile.php:62 actions/userauthorization.php:330 +#, php-format +msgid "Listenee stream license ‘%s’ is not compatible with site license ‘%s’." +msgstr "" + +#: actions/useradminpanel.php:58 lib/adminpanelaction.php:305 +#: lib/personalgroupnav.php:115 +msgid "User" +msgstr "" + +#: actions/useradminpanel.php:69 +msgid "User settings for this StatusNet site." +msgstr "" + +#: actions/useradminpanel.php:149 +msgid "Invalid bio limit. Must be numeric." +msgstr "" + +#: actions/useradminpanel.php:155 +msgid "Invalid welcome text. Max length is 255 characters." +msgstr "" + +#: actions/useradminpanel.php:165 +#, php-format +msgid "Invalid default subscripton: '%1$s' is not user." +msgstr "" + +#: actions/useradminpanel.php:218 lib/accountsettingsaction.php:108 +#: lib/personalgroupnav.php:109 +msgid "Profile" +msgstr "" + +#: actions/useradminpanel.php:222 +msgid "Bio Limit" +msgstr "" + +#: actions/useradminpanel.php:223 +msgid "Maximum length of a profile bio in characters." +msgstr "" + +#: actions/useradminpanel.php:231 +msgid "New users" +msgstr "" + +#: actions/useradminpanel.php:235 +msgid "New user welcome" +msgstr "" + +#: actions/useradminpanel.php:236 +msgid "Welcome text for new users (Max 255 chars)." +msgstr "" + +#: actions/useradminpanel.php:241 +msgid "Default subscription" +msgstr "" + +#: actions/useradminpanel.php:242 +msgid "Automatically subscribe new users to this user." +msgstr "" + +#: actions/useradminpanel.php:251 +msgid "Invitations" +msgstr "" + +#: actions/useradminpanel.php:256 +msgid "Invitations enabled" +msgstr "" + +#: actions/useradminpanel.php:258 +msgid "Whether to allow users to invite new users." +msgstr "" + +#: actions/useradminpanel.php:265 +msgid "Sessions" +msgstr "" + +#: actions/useradminpanel.php:270 +msgid "Handle sessions" +msgstr "" + +#: actions/useradminpanel.php:272 +msgid "Whether to handle sessions ourselves." +msgstr "" + +#: actions/useradminpanel.php:276 +msgid "Session debugging" +msgstr "" + +#: actions/useradminpanel.php:278 +msgid "Turn on debugging output for sessions." +msgstr "" + +#: actions/userauthorization.php:105 +msgid "Authorize subscription" +msgstr "" + +#: actions/userauthorization.php:110 +msgid "" +"Please check these details to make sure that you want to subscribe to this " +"user’s notices. If you didn’t just ask to subscribe to someone’s notices, " +"click “Reject”." +msgstr "" + +#: actions/userauthorization.php:188 +msgid "License" +msgstr "" + +#: actions/userauthorization.php:209 +msgid "Accept" +msgstr "" + +#: actions/userauthorization.php:210 lib/subscribeform.php:115 +#: lib/subscribeform.php:139 +msgid "Subscribe to this user" +msgstr "" + +#: actions/userauthorization.php:211 +msgid "Reject" +msgstr "" + +#: actions/userauthorization.php:212 +msgid "Reject this subscription" +msgstr "" + +#: actions/userauthorization.php:225 +msgid "No authorization request!" +msgstr "" + +#: actions/userauthorization.php:247 +msgid "Subscription authorized" +msgstr "" + +#: actions/userauthorization.php:249 +msgid "" +"The subscription has been authorized, but no callback URL was passed. Check " +"with the site’s instructions for details on how to authorize the " +"subscription. Your subscription token is:" +msgstr "" + +#: actions/userauthorization.php:259 +msgid "Subscription rejected" +msgstr "" + +#: actions/userauthorization.php:261 +msgid "" +"The subscription has been rejected, but no callback URL was passed. Check " +"with the site’s instructions for details on how to fully reject the " +"subscription." +msgstr "" + +#: actions/userauthorization.php:296 +#, php-format +msgid "Listener URI ‘%s’ not found here" +msgstr "" + +#: actions/userauthorization.php:301 +#, php-format +msgid "Listenee URI ‘%s’ is too long." +msgstr "" + +#: actions/userauthorization.php:307 +#, php-format +msgid "Listenee URI ‘%s’ is a local user." +msgstr "" + +#: actions/userauthorization.php:322 +#, php-format +msgid "Profile URL ‘%s’ is for a local user." +msgstr "" + +#: actions/userauthorization.php:338 +#, php-format +msgid "Avatar URL ‘%s’ is not valid." +msgstr "" + +#: actions/userauthorization.php:343 +#, php-format +msgid "Can’t read avatar URL ‘%s’." +msgstr "" + +#: actions/userauthorization.php:348 +#, php-format +msgid "Wrong image type for avatar URL ‘%s’." +msgstr "" + +#: actions/userbyid.php:70 +msgid "No id." +msgstr "" + +#: actions/userdesignsettings.php:76 lib/designsettings.php:65 +msgid "Profile design" +msgstr "" + +#: actions/userdesignsettings.php:87 lib/designsettings.php:76 +msgid "" +"Customize the way your profile looks with a background image and a colour " +"palette of your choice." +msgstr "" + +#: actions/userdesignsettings.php:282 +msgid "Enjoy your hotdog!" +msgstr "" + +#: actions/usergroups.php:64 +#, php-format +msgid "%s groups, page %d" +msgstr "" + +#: actions/usergroups.php:130 +msgid "Search for more groups" +msgstr "" + +#: actions/usergroups.php:153 +#, php-format +msgid "%s is not a member of any group." +msgstr "" + +#: actions/usergroups.php:158 +#, php-format +msgid "Try [searching for groups](%%action.groupsearch%%) and joining them." +msgstr "" + +#: classes/File.php:137 +#, php-format +msgid "" +"No file may be larger than %d bytes and the file you sent was %d bytes. Try " +"to upload a smaller version." +msgstr "" + +#: classes/File.php:147 +#, php-format +msgid "A file this large would exceed your user quota of %d bytes." +msgstr "" + +#: classes/File.php:154 +#, php-format +msgid "A file this large would exceed your monthly quota of %d bytes." +msgstr "" + +#: classes/Message.php:45 +msgid "You are banned from sending direct messages." +msgstr "" + +#: classes/Message.php:61 +msgid "Could not insert message." +msgstr "" + +#: classes/Message.php:71 +msgid "Could not update message with new URI." +msgstr "" + +#: classes/Notice.php:172 +#, php-format +msgid "DB error inserting hashtag: %s" +msgstr "" + +#: classes/Notice.php:196 +msgid "Problem saving notice. Too long." +msgstr "" + +#: classes/Notice.php:200 +msgid "Problem saving notice. Unknown user." +msgstr "" + +#: classes/Notice.php:205 +msgid "" +"Too many notices too fast; take a breather and post again in a few minutes." +msgstr "" + +#: classes/Notice.php:211 +msgid "" +"Too many duplicate messages too quickly; take a breather and post again in a " +"few minutes." +msgstr "" + +#: classes/Notice.php:217 +msgid "You are banned from posting notices on this site." +msgstr "" + +#: classes/Notice.php:289 classes/Notice.php:314 +msgid "Problem saving notice." +msgstr "" + +#: classes/Notice.php:993 +#, php-format +msgid "DB error inserting reply: %s" +msgstr "" + +#: classes/Notice.php:1320 +#, php-format +msgid "RT @%1$s %2$s" +msgstr "" + +#: classes/User.php:347 +#, php-format +msgid "Welcome to %1$s, @%2$s!" +msgstr "" + +#: classes/User_group.php:380 +msgid "Could not create group." +msgstr "" + +#: classes/User_group.php:409 +msgid "Could not set group membership." +msgstr "" + +#: lib/accountsettingsaction.php:108 +msgid "Change your profile settings" +msgstr "" + +#: lib/accountsettingsaction.php:112 +msgid "Upload an avatar" +msgstr "" + +#: lib/accountsettingsaction.php:116 +msgid "Change your password" +msgstr "" + +#: lib/accountsettingsaction.php:120 +msgid "Change email handling" +msgstr "" + +#: lib/accountsettingsaction.php:124 +msgid "Design your profile" +msgstr "" + +#: lib/accountsettingsaction.php:128 +msgid "Other" +msgstr "" + +#: lib/accountsettingsaction.php:128 +msgid "Other options" +msgstr "" + +#: lib/action.php:144 +#, php-format +msgid "%s - %s" +msgstr "" + +#: lib/action.php:159 +msgid "Untitled page" +msgstr "" + +#: lib/action.php:425 +msgid "Primary site navigation" +msgstr "" + +#: lib/action.php:431 +msgid "Home" +msgstr "" + +#: lib/action.php:431 +msgid "Personal profile and friends timeline" +msgstr "" + +#: lib/action.php:433 +msgid "Account" +msgstr "" + +#: lib/action.php:433 +msgid "Change your email, avatar, password, profile" +msgstr "" + +#: lib/action.php:436 +msgid "Connect" +msgstr "" + +#: lib/action.php:436 +msgid "Connect to services" +msgstr "" + +#: lib/action.php:440 +msgid "Change site configuration" +msgstr "" + +#: lib/action.php:444 lib/subgroupnav.php:105 +msgid "Invite" +msgstr "" + +#: lib/action.php:445 lib/subgroupnav.php:106 +#, php-format +msgid "Invite friends and colleagues to join you on %s" +msgstr "" + +#: lib/action.php:450 +msgid "Logout" +msgstr "" + +#: lib/action.php:450 +msgid "Logout from the site" +msgstr "" + +#: lib/action.php:455 +msgid "Create an account" +msgstr "" + +#: lib/action.php:458 +msgid "Login to the site" +msgstr "" + +#: lib/action.php:461 lib/action.php:724 +msgid "Help" +msgstr "" + +#: lib/action.php:461 +msgid "Help me!" +msgstr "" + +#: lib/action.php:464 lib/searchaction.php:127 +msgid "Search" +msgstr "" + +#: lib/action.php:464 +msgid "Search for people or text" +msgstr "" + +#: lib/action.php:485 +msgid "Site notice" +msgstr "" + +#: lib/action.php:551 +msgid "Local views" +msgstr "" + +#: lib/action.php:617 +msgid "Page notice" +msgstr "" + +#: lib/action.php:719 +msgid "Secondary site navigation" +msgstr "" + +#: lib/action.php:726 +msgid "About" +msgstr "" + +#: lib/action.php:728 +msgid "FAQ" +msgstr "" + +#: lib/action.php:732 +msgid "TOS" +msgstr "" + +#: lib/action.php:735 +msgid "Privacy" +msgstr "" + +#: lib/action.php:737 +msgid "Source" +msgstr "" + +#: lib/action.php:739 +msgid "Contact" +msgstr "" + +#: lib/action.php:741 +msgid "Badge" +msgstr "" + +#: lib/action.php:769 +msgid "StatusNet software license" +msgstr "" + +#: lib/action.php:772 +#, php-format +msgid "" +"**%%site.name%%** is a microblogging service brought to you by [%%site." +"broughtby%%](%%site.broughtbyurl%%). " +msgstr "" + +#: lib/action.php:774 +#, php-format +msgid "**%%site.name%%** is a microblogging service. " +msgstr "" + +#: lib/action.php:776 +#, php-format +msgid "" +"It runs the [StatusNet](http://status.net/) microblogging software, version %" +"s, available under the [GNU Affero General Public License](http://www.fsf." +"org/licensing/licenses/agpl-3.0.html)." +msgstr "" + +#: lib/action.php:790 +msgid "Site content license" +msgstr "" + +#: lib/action.php:799 +msgid "All " +msgstr "" + +#: lib/action.php:804 +msgid "license." +msgstr "" + +#: lib/action.php:1098 +msgid "Pagination" +msgstr "" + +#: lib/action.php:1107 +msgid "After" +msgstr "" + +#: lib/action.php:1115 +msgid "Before" +msgstr "" + +#: lib/action.php:1163 +msgid "There was a problem with your session token." +msgstr "" + +#: lib/adminpanelaction.php:96 +msgid "You cannot make changes to this site." +msgstr "" + +#: lib/adminpanelaction.php:195 +msgid "showForm() not implemented." +msgstr "" + +#: lib/adminpanelaction.php:224 +msgid "saveSettings() not implemented." +msgstr "" + +#: lib/adminpanelaction.php:247 +msgid "Unable to delete design setting." +msgstr "" + +#: lib/adminpanelaction.php:300 +msgid "Basic site configuration" +msgstr "" + +#: lib/adminpanelaction.php:303 +msgid "Design configuration" +msgstr "" + +#: lib/adminpanelaction.php:306 lib/adminpanelaction.php:309 +msgid "Paths configuration" +msgstr "" + +#: lib/attachmentlist.php:87 +msgid "Attachments" +msgstr "" + +#: lib/attachmentlist.php:265 +msgid "Author" +msgstr "" + +#: lib/attachmentlist.php:278 +msgid "Provider" +msgstr "" + +#: lib/attachmentnoticesection.php:67 +msgid "Notices where this attachment appears" +msgstr "" + +#: lib/attachmenttagcloudsection.php:48 +msgid "Tags for this attachment" +msgstr "" + +#: lib/channel.php:138 lib/channel.php:158 +msgid "Command results" +msgstr "" + +#: lib/channel.php:210 +msgid "Command complete" +msgstr "" + +#: lib/channel.php:221 +msgid "Command failed" +msgstr "" + +#: lib/command.php:44 +msgid "Sorry, this command is not yet implemented." +msgstr "" + +#: lib/command.php:88 +#, php-format +msgid "Could not find a user with nickname %s" +msgstr "" + +#: lib/command.php:92 +msgid "It does not make a lot of sense to nudge yourself!" +msgstr "" + +#: lib/command.php:99 +#, php-format +msgid "Nudge sent to %s" +msgstr "" + +#: lib/command.php:126 +#, php-format +msgid "" +"Subscriptions: %1$s\n" +"Subscribers: %2$s\n" +"Notices: %3$s" +msgstr "" + +#: lib/command.php:152 lib/command.php:398 lib/command.php:459 +msgid "Notice with that id does not exist" +msgstr "" + +#: lib/command.php:168 lib/command.php:414 lib/command.php:475 +#: lib/command.php:531 +msgid "User has no last notice" +msgstr "" + +#: lib/command.php:190 +msgid "Notice marked as fave." +msgstr "" + +#: lib/command.php:315 +#, php-format +msgid "%1$s (%2$s)" +msgstr "" + +#: lib/command.php:318 +#, php-format +msgid "Fullname: %s" +msgstr "" + +#: lib/command.php:321 +#, php-format +msgid "Location: %s" +msgstr "" + +#: lib/command.php:324 +#, php-format +msgid "Homepage: %s" +msgstr "" + +#: lib/command.php:327 +#, php-format +msgid "About: %s" +msgstr "" + +#: lib/command.php:358 scripts/xmppdaemon.php:321 +#, php-format +msgid "Message too long - maximum is %d characters, you sent %d" +msgstr "" + +#: lib/command.php:377 +msgid "Error sending direct message." +msgstr "" + +#: lib/command.php:434 +#, php-format +msgid "Notice from %s repeated" +msgstr "" + +#: lib/command.php:436 +#, fuzzy +msgid "Error repeating notice." +msgstr "Error in actualisar le profilo remote" + +#: lib/command.php:490 +#, php-format +msgid "Notice too long - maximum is %d characters, you sent %d" +msgstr "" + +#: lib/command.php:499 +#, php-format +msgid "Reply to %s sent" +msgstr "" + +#: lib/command.php:501 +msgid "Error saving notice." +msgstr "" + +#: lib/command.php:555 +msgid "Specify the name of the user to subscribe to" +msgstr "" + +#: lib/command.php:562 +#, php-format +msgid "Subscribed to %s" +msgstr "" + +#: lib/command.php:583 +msgid "Specify the name of the user to unsubscribe from" +msgstr "" + +#: lib/command.php:590 +#, php-format +msgid "Unsubscribed from %s" +msgstr "" + +#: lib/command.php:608 lib/command.php:631 +msgid "Command not yet implemented." +msgstr "" + +#: lib/command.php:611 +msgid "Notification off." +msgstr "" + +#: lib/command.php:613 +msgid "Can't turn off notification." +msgstr "" + +#: lib/command.php:634 +msgid "Notification on." +msgstr "" + +#: lib/command.php:636 +msgid "Can't turn on notification." +msgstr "" + +#: lib/command.php:649 +msgid "Login command is disabled" +msgstr "" + +#: lib/command.php:663 +#, php-format +msgid "Could not create login token for %s" +msgstr "" + +#: lib/command.php:668 +#, php-format +msgid "This link is useable only once, and is good for only 2 minutes: %s" +msgstr "" + +#: lib/command.php:684 +msgid "You are not subscribed to anyone." +msgstr "" + +#: lib/command.php:686 +msgid "You are subscribed to this person:" +msgid_plural "You are subscribed to these people:" +msgstr[0] "" +msgstr[1] "" + +#: lib/command.php:706 +msgid "No one is subscribed to you." +msgstr "" + +#: lib/command.php:708 +msgid "This person is subscribed to you:" +msgid_plural "These people are subscribed to you:" +msgstr[0] "" +msgstr[1] "" + +#: lib/command.php:728 +msgid "You are not a member of any groups." +msgstr "" + +#: lib/command.php:730 +msgid "You are a member of this group:" +msgid_plural "You are a member of these groups:" +msgstr[0] "" +msgstr[1] "" + +#: lib/command.php:744 +msgid "" +"Commands:\n" +"on - turn on notifications\n" +"off - turn off notifications\n" +"help - show this help\n" +"follow - subscribe to user\n" +"groups - lists the groups you have joined\n" +"subscriptions - list the people you follow\n" +"subscribers - list the people that follow you\n" +"leave - unsubscribe from user\n" +"d - direct message to user\n" +"get - get last notice from user\n" +"whois - get profile info on user\n" +"fav - add user's last notice as a 'fave'\n" +"fav # - add notice with the given id as a 'fave'\n" +"repeat # - repeat a notice with a given id\n" +"repeat - repeat the last notice from user\n" +"reply # - reply to notice with a given id\n" +"reply - reply to the last notice from user\n" +"join - join group\n" +"login - Get a link to login to the web interface\n" +"drop - leave group\n" +"stats - get your stats\n" +"stop - same as 'off'\n" +"quit - same as 'off'\n" +"sub - same as 'follow'\n" +"unsub - same as 'leave'\n" +"last - same as 'get'\n" +"on - not yet implemented.\n" +"off - not yet implemented.\n" +"nudge - remind a user to update.\n" +"invite - not yet implemented.\n" +"track - not yet implemented.\n" +"untrack - not yet implemented.\n" +"track off - not yet implemented.\n" +"untrack all - not yet implemented.\n" +"tracks - not yet implemented.\n" +"tracking - not yet implemented.\n" +msgstr "" + +#: lib/common.php:199 +msgid "No configuration file found. " +msgstr "" + +#: lib/common.php:200 +msgid "I looked for configuration files in the following places: " +msgstr "" + +#: lib/common.php:201 +msgid "You may wish to run the installer to fix this." +msgstr "" + +#: lib/common.php:202 +msgid "Go to the installer." +msgstr "" + +#: lib/connectsettingsaction.php:110 +msgid "IM" +msgstr "" + +#: lib/connectsettingsaction.php:111 +msgid "Updates by instant messenger (IM)" +msgstr "" + +#: lib/connectsettingsaction.php:116 +msgid "Updates by SMS" +msgstr "" + +#: lib/dberroraction.php:60 +msgid "Database error" +msgstr "" + +#: lib/designsettings.php:105 +msgid "Upload file" +msgstr "" + +#: lib/designsettings.php:109 +msgid "" +"You can upload your personal background image. The maximum file size is 2MB." +msgstr "" + +#: lib/designsettings.php:418 +msgid "Design defaults restored." +msgstr "" + +#: lib/disfavorform.php:114 lib/disfavorform.php:140 +msgid "Disfavor this notice" +msgstr "" + +#: lib/favorform.php:114 lib/favorform.php:140 +msgid "Favor this notice" +msgstr "" + +#: lib/favorform.php:140 +msgid "Favor" +msgstr "" + +#: lib/feed.php:85 +msgid "RSS 1.0" +msgstr "" + +#: lib/feed.php:87 +msgid "RSS 2.0" +msgstr "" + +#: lib/feed.php:89 +msgid "Atom" +msgstr "" + +#: lib/feed.php:91 +msgid "FOAF" +msgstr "" + +#: lib/feedlist.php:64 +msgid "Export data" +msgstr "" + +#: lib/galleryaction.php:121 +msgid "Filter tags" +msgstr "" + +#: lib/galleryaction.php:131 +msgid "All" +msgstr "" + +#: lib/galleryaction.php:139 +msgid "Select tag to filter" +msgstr "" + +#: lib/galleryaction.php:140 +msgid "Tag" +msgstr "" + +#: lib/galleryaction.php:141 +msgid "Choose a tag to narrow list" +msgstr "" + +#: lib/galleryaction.php:143 +msgid "Go" +msgstr "" + +#: lib/groupeditform.php:163 +msgid "URL of the homepage or blog of the group or topic" +msgstr "" + +#: lib/groupeditform.php:168 +msgid "Describe the group or topic" +msgstr "" + +#: lib/groupeditform.php:170 +#, php-format +msgid "Describe the group or topic in %d characters" +msgstr "" + +#: lib/groupeditform.php:172 +msgid "Description" +msgstr "" + +#: lib/groupeditform.php:179 +msgid "" +"Location for the group, if any, like \"City, State (or Region), Country\"" +msgstr "" + +#: lib/groupeditform.php:187 +#, php-format +msgid "Extra nicknames for the group, comma- or space- separated, max %d" +msgstr "" + +#: lib/groupnav.php:85 +msgid "Group" +msgstr "" + +#: lib/groupnav.php:101 +msgid "Blocked" +msgstr "" + +#: lib/groupnav.php:102 +#, php-format +msgid "%s blocked users" +msgstr "" + +#: lib/groupnav.php:108 +#, php-format +msgid "Edit %s group properties" +msgstr "" + +#: lib/groupnav.php:113 +msgid "Logo" +msgstr "" + +#: lib/groupnav.php:114 +#, php-format +msgid "Add or edit %s logo" +msgstr "" + +#: lib/groupnav.php:120 +#, php-format +msgid "Add or edit %s design" +msgstr "" + +#: lib/groupsbymemberssection.php:71 +msgid "Groups with most members" +msgstr "" + +#: lib/groupsbypostssection.php:71 +msgid "Groups with most posts" +msgstr "" + +#: lib/grouptagcloudsection.php:56 +#, php-format +msgid "Tags in %s group's notices" +msgstr "" + +#: lib/htmloutputter.php:103 +msgid "This page is not available in a media type you accept" +msgstr "" + +#: lib/imagefile.php:75 +#, php-format +msgid "That file is too big. The maximum file size is %s." +msgstr "" + +#: lib/imagefile.php:80 +msgid "Partial upload." +msgstr "" + +#: lib/imagefile.php:88 lib/mediafile.php:170 +msgid "System error uploading file." +msgstr "" + +#: lib/imagefile.php:96 +msgid "Not an image or corrupt file." +msgstr "" + +#: lib/imagefile.php:105 +msgid "Unsupported image file format." +msgstr "" + +#: lib/imagefile.php:118 +msgid "Lost our file." +msgstr "" + +#: lib/imagefile.php:150 lib/imagefile.php:197 +msgid "Unknown file type" +msgstr "" + +#: lib/imagefile.php:217 +msgid "MB" +msgstr "" + +#: lib/imagefile.php:219 +msgid "kB" +msgstr "" + +#: lib/jabber.php:191 +#, php-format +msgid "[%s]" +msgstr "" + +#: lib/joinform.php:114 +msgid "Join" +msgstr "" + +#: lib/leaveform.php:114 +msgid "Leave" +msgstr "" + +#: lib/logingroupnav.php:80 +msgid "Login with a username and password" +msgstr "" + +#: lib/logingroupnav.php:86 +msgid "Sign up for a new account" +msgstr "" + +#: lib/mail.php:172 +msgid "Email address confirmation" +msgstr "" + +#: lib/mail.php:174 +#, php-format +msgid "" +"Hey, %s.\n" +"\n" +"Someone just entered this email address on %s.\n" +"\n" +"If it was you, and you want to confirm your entry, use the URL below:\n" +"\n" +"\t%s\n" +"\n" +"If not, just ignore this message.\n" +"\n" +"Thanks for your time, \n" +"%s\n" +msgstr "" + +#: lib/mail.php:236 +#, php-format +msgid "%1$s is now listening to your notices on %2$s." +msgstr "" + +#: lib/mail.php:241 +#, php-format +msgid "" +"%1$s is now listening to your notices on %2$s.\n" +"\n" +"\t%3$s\n" +"\n" +"%4$s%5$s%6$s\n" +"Faithfully yours,\n" +"%7$s.\n" +"\n" +"----\n" +"Change your email address or notification options at %8$s\n" +msgstr "" + +#: lib/mail.php:254 +#, php-format +msgid "Location: %s\n" +msgstr "" + +#: lib/mail.php:256 +#, php-format +msgid "Homepage: %s\n" +msgstr "" + +#: lib/mail.php:258 +#, php-format +msgid "" +"Bio: %s\n" +"\n" +msgstr "" + +#: lib/mail.php:286 +#, php-format +msgid "New email address for posting to %s" +msgstr "" + +#: lib/mail.php:289 +#, php-format +msgid "" +"You have a new posting address on %1$s.\n" +"\n" +"Send email to %2$s to post new messages.\n" +"\n" +"More email instructions at %3$s.\n" +"\n" +"Faithfully yours,\n" +"%4$s" +msgstr "" + +#: lib/mail.php:413 +#, php-format +msgid "%s status" +msgstr "" + +#: lib/mail.php:439 +msgid "SMS confirmation" +msgstr "" + +#: lib/mail.php:463 +#, php-format +msgid "You've been nudged by %s" +msgstr "" + +#: lib/mail.php:467 +#, php-format +msgid "" +"%1$s (%2$s) is wondering what you are up to these days and is inviting you " +"to post some news.\n" +"\n" +"So let's hear from you :)\n" +"\n" +"%3$s\n" +"\n" +"Don't reply to this email; it won't get to them.\n" +"\n" +"With kind regards,\n" +"%4$s\n" +msgstr "" + +#: lib/mail.php:510 +#, php-format +msgid "New private message from %s" +msgstr "" + +#: lib/mail.php:514 +#, php-format +msgid "" +"%1$s (%2$s) sent you a private message:\n" +"\n" +"------------------------------------------------------\n" +"%3$s\n" +"------------------------------------------------------\n" +"\n" +"You can reply to their message here:\n" +"\n" +"%4$s\n" +"\n" +"Don't reply to this email; it won't get to them.\n" +"\n" +"With kind regards,\n" +"%5$s\n" +msgstr "" + +#: lib/mail.php:559 +#, php-format +msgid "%s (@%s) added your notice as a favorite" +msgstr "" + +#: lib/mail.php:561 +#, php-format +msgid "" +"%1$s (@%7$s) just added your notice from %2$s as one of their favorites.\n" +"\n" +"The URL of your notice is:\n" +"\n" +"%3$s\n" +"\n" +"The text of your notice is:\n" +"\n" +"%4$s\n" +"\n" +"You can see the list of %1$s's favorites here:\n" +"\n" +"%5$s\n" +"\n" +"Faithfully yours,\n" +"%6$s\n" +msgstr "" + +#: lib/mail.php:620 +#, php-format +msgid "%s (@%s) sent a notice to your attention" +msgstr "" + +#: lib/mail.php:622 +#, php-format +msgid "" +"%1$s (@%9$s) just sent a notice to your attention (an '@-reply') on %2$s.\n" +"\n" +"The notice is here:\n" +"\n" +"\t%3$s\n" +"\n" +"It reads:\n" +"\n" +"\t%4$s\n" +"\n" +msgstr "" + +#: lib/mailbox.php:89 +msgid "Only the user can read their own mailboxes." +msgstr "" + +#: lib/mailbox.php:139 +msgid "" +"You have no private messages. You can send private message to engage other " +"users in conversation. People can send you messages for your eyes only." +msgstr "" + +#: lib/mailbox.php:227 lib/noticelist.php:468 +msgid "from" +msgstr "" + +#: lib/mediafile.php:98 lib/mediafile.php:123 +msgid "There was a database error while saving your file. Please try again." +msgstr "" + +#: lib/mediafile.php:142 +msgid "The uploaded file exceeds the upload_max_filesize directive in php.ini." +msgstr "" + +#: lib/mediafile.php:147 +msgid "" +"The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in " +"the HTML form." +msgstr "" + +#: lib/mediafile.php:152 +msgid "The uploaded file was only partially uploaded." +msgstr "" + +#: lib/mediafile.php:159 +msgid "Missing a temporary folder." +msgstr "" + +#: lib/mediafile.php:162 +msgid "Failed to write file to disk." +msgstr "" + +#: lib/mediafile.php:165 +msgid "File upload stopped by extension." +msgstr "" + +#: lib/mediafile.php:179 lib/mediafile.php:216 +msgid "File exceeds user's quota!" +msgstr "" + +#: lib/mediafile.php:196 lib/mediafile.php:233 +msgid "File could not be moved to destination directory." +msgstr "" + +#: lib/mediafile.php:201 lib/mediafile.php:237 +msgid "Could not determine file's mime-type!" +msgstr "" + +#: lib/mediafile.php:270 +#, php-format +msgid " Try using another %s format." +msgstr "" + +#: lib/mediafile.php:275 +#, php-format +msgid "%s is not a supported filetype on this server." +msgstr "" + +#: lib/messageform.php:120 +msgid "Send a direct notice" +msgstr "" + +#: lib/messageform.php:146 +msgid "To" +msgstr "" + +#: lib/messageform.php:159 lib/noticeform.php:183 +msgid "Available characters" +msgstr "" + +#: lib/noticeform.php:158 +msgid "Send a notice" +msgstr "" + +#: lib/noticeform.php:171 +#, php-format +msgid "What's up, %s?" +msgstr "" + +#: lib/noticeform.php:190 +msgid "Attach" +msgstr "" + +#: lib/noticeform.php:194 +msgid "Attach a file" +msgstr "" + +#: lib/noticelist.php:419 +#, php-format +msgid "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s" +msgstr "" + +#: lib/noticelist.php:420 +msgid "N" +msgstr "" + +#: lib/noticelist.php:420 +msgid "S" +msgstr "" + +#: lib/noticelist.php:421 +msgid "E" +msgstr "" + +#: lib/noticelist.php:421 +msgid "W" +msgstr "" + +#: lib/noticelist.php:427 +msgid "at" +msgstr "" + +#: lib/noticelist.php:522 +msgid "in context" +msgstr "" + +#: lib/noticelist.php:588 +msgid "Reply to this notice" +msgstr "" + +#: lib/noticelist.php:589 +msgid "Reply" +msgstr "" + +#: lib/nudgeform.php:116 +msgid "Nudge this user" +msgstr "" + +#: lib/nudgeform.php:128 +msgid "Nudge" +msgstr "" + +#: lib/nudgeform.php:128 +msgid "Send a nudge to this user" +msgstr "" + +#: lib/oauthstore.php:283 +msgid "Error inserting new profile" +msgstr "" + +#: lib/oauthstore.php:291 +msgid "Error inserting avatar" +msgstr "" + +#: lib/oauthstore.php:311 +msgid "Error inserting remote profile" +msgstr "" + +#: lib/oauthstore.php:345 +msgid "Duplicate notice" +msgstr "" + +#: lib/oauthstore.php:466 lib/subs.php:48 +msgid "You have been banned from subscribing." +msgstr "" + +#: lib/oauthstore.php:491 +msgid "Couldn't insert new subscription." +msgstr "" + +#: lib/personalgroupnav.php:99 +msgid "Personal" +msgstr "" + +#: lib/personalgroupnav.php:104 +msgid "Replies" +msgstr "" + +#: lib/personalgroupnav.php:114 +msgid "Favorites" +msgstr "" + +#: lib/personalgroupnav.php:124 +msgid "Inbox" +msgstr "" + +#: lib/personalgroupnav.php:125 +msgid "Your incoming messages" +msgstr "" + +#: lib/personalgroupnav.php:129 +msgid "Outbox" +msgstr "" + +#: lib/personalgroupnav.php:130 +msgid "Your sent messages" +msgstr "" + +#: lib/personaltagcloudsection.php:56 +#, php-format +msgid "Tags in %s's notices" +msgstr "" + +#: lib/profileaction.php:109 lib/profileaction.php:192 lib/subgroupnav.php:82 +msgid "Subscriptions" +msgstr "" + +#: lib/profileaction.php:126 +msgid "All subscriptions" +msgstr "" + +#: lib/profileaction.php:140 lib/profileaction.php:201 lib/subgroupnav.php:90 +msgid "Subscribers" +msgstr "" + +#: lib/profileaction.php:157 +msgid "All subscribers" +msgstr "" + +#: lib/profileaction.php:178 +msgid "User ID" +msgstr "" + +#: lib/profileaction.php:183 +msgid "Member since" +msgstr "" + +#: lib/profileaction.php:245 +msgid "All groups" +msgstr "" + +#: lib/profileformaction.php:123 +msgid "No return-to arguments" +msgstr "" + +#: lib/profileformaction.php:137 +msgid "unimplemented method" +msgstr "" + +#: lib/publicgroupnav.php:78 +msgid "Public" +msgstr "" + +#: lib/publicgroupnav.php:82 +msgid "User groups" +msgstr "" + +#: lib/publicgroupnav.php:84 lib/publicgroupnav.php:85 +msgid "Recent tags" +msgstr "" + +#: lib/publicgroupnav.php:88 +msgid "Featured" +msgstr "" + +#: lib/publicgroupnav.php:92 +msgid "Popular" +msgstr "" + +#: lib/repeatform.php:107 lib/repeatform.php:132 +#, fuzzy +msgid "Repeat this notice" +msgstr "Deler iste nota" + +#: lib/repeatform.php:132 +msgid "Repeat" +msgstr "" + +#: lib/sandboxform.php:67 +msgid "Sandbox" +msgstr "" + +#: lib/sandboxform.php:78 +msgid "Sandbox this user" +msgstr "" + +#: lib/searchaction.php:120 +msgid "Search site" +msgstr "" + +#: lib/searchaction.php:126 +msgid "Keyword(s)" +msgstr "" + +#: lib/searchaction.php:162 +msgid "Search help" +msgstr "" + +#: lib/searchgroupnav.php:80 +msgid "People" +msgstr "" + +#: lib/searchgroupnav.php:81 +msgid "Find people on this site" +msgstr "" + +#: lib/searchgroupnav.php:83 +msgid "Find content of notices" +msgstr "" + +#: lib/searchgroupnav.php:85 +msgid "Find groups on this site" +msgstr "" + +#: lib/section.php:89 +msgid "Untitled section" +msgstr "" + +#: lib/section.php:106 +msgid "More..." +msgstr "" + +#: lib/silenceform.php:67 +msgid "Silence" +msgstr "" + +#: lib/silenceform.php:78 +msgid "Silence this user" +msgstr "" + +#: lib/subgroupnav.php:83 +#, php-format +msgid "People %s subscribes to" +msgstr "" + +#: lib/subgroupnav.php:91 +#, php-format +msgid "People subscribed to %s" +msgstr "" + +#: lib/subgroupnav.php:99 +#, php-format +msgid "Groups %s is a member of" +msgstr "" + +#: lib/subs.php:52 +msgid "Already subscribed!" +msgstr "" + +#: lib/subs.php:56 +msgid "User has blocked you." +msgstr "" + +#: lib/subs.php:60 +msgid "Could not subscribe." +msgstr "" + +#: lib/subs.php:79 +msgid "Could not subscribe other to you." +msgstr "" + +#: lib/subs.php:128 +msgid "Not subscribed!" +msgstr "" + +#: lib/subs.php:133 +msgid "Couldn't delete self-subscription." +msgstr "" + +#: lib/subs.php:146 +msgid "Couldn't delete subscription." +msgstr "" + +#: lib/subscriberspeopleselftagcloudsection.php:48 +#: lib/subscriptionspeopleselftagcloudsection.php:48 +msgid "People Tagcloud as self-tagged" +msgstr "" + +#: lib/subscriberspeopletagcloudsection.php:48 +#: lib/subscriptionspeopletagcloudsection.php:48 +msgid "People Tagcloud as tagged" +msgstr "" + +#: lib/subscriptionlist.php:126 +msgid "(none)" +msgstr "" + +#: lib/tagcloudsection.php:56 +msgid "None" +msgstr "" + +#: lib/topposterssection.php:74 +msgid "Top posters" +msgstr "" + +#: lib/unsandboxform.php:69 +msgid "Unsandbox" +msgstr "" + +#: lib/unsandboxform.php:80 +msgid "Unsandbox this user" +msgstr "" + +#: lib/unsilenceform.php:67 +msgid "Unsilence" +msgstr "" + +#: lib/unsilenceform.php:78 +msgid "Unsilence this user" +msgstr "" + +#: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137 +msgid "Unsubscribe from this user" +msgstr "" + +#: lib/unsubscribeform.php:137 +msgid "Unsubscribe" +msgstr "" + +#: lib/userprofile.php:116 +msgid "Edit Avatar" +msgstr "" + +#: lib/userprofile.php:236 +msgid "User actions" +msgstr "" + +#: lib/userprofile.php:248 +msgid "Edit profile settings" +msgstr "" + +#: lib/userprofile.php:249 +msgid "Edit" +msgstr "" + +#: lib/userprofile.php:272 +msgid "Send a direct message to this user" +msgstr "" + +#: lib/userprofile.php:273 +msgid "Message" +msgstr "" + +#: lib/userprofile.php:311 +msgid "Moderate" +msgstr "" + +#: lib/util.php:825 +msgid "a few seconds ago" +msgstr "" + +#: lib/util.php:827 +msgid "about a minute ago" +msgstr "" + +#: lib/util.php:829 +#, php-format +msgid "about %d minutes ago" +msgstr "" + +#: lib/util.php:831 +msgid "about an hour ago" +msgstr "" + +#: lib/util.php:833 +#, php-format +msgid "about %d hours ago" +msgstr "" + +#: lib/util.php:835 +msgid "about a day ago" +msgstr "" + +#: lib/util.php:837 +#, php-format +msgid "about %d days ago" +msgstr "" + +#: lib/util.php:839 +msgid "about a month ago" +msgstr "" + +#: lib/util.php:841 +#, php-format +msgid "about %d months ago" +msgstr "" + +#: lib/util.php:843 +msgid "about a year ago" +msgstr "" + +#: lib/webcolor.php:82 +#, php-format +msgid "%s is not a valid color!" +msgstr "" + +#: lib/webcolor.php:123 +#, php-format +msgid "%s is not a valid color! Use 3 or 6 hex chars." +msgstr "" + +#: scripts/maildaemon.php:48 +msgid "Could not parse message." +msgstr "" + +#: scripts/maildaemon.php:53 +msgid "Not a registered user." +msgstr "" + +#: scripts/maildaemon.php:57 +msgid "Sorry, that is not your incoming email address." +msgstr "" + +#: scripts/maildaemon.php:61 +msgid "Sorry, no incoming email allowed." +msgstr "" -- cgit v1.2.3-54-g00ecf From 745e35ac1fcee01298db09a8649f79f410138652 Mon Sep 17 00:00:00 2001 From: Siebrand Mazeland Date: Sun, 13 Dec 2009 18:55:17 +0100 Subject: (Puctuation) consistency in clientError() calls. --- actions/apistatusesretweet.php | 6 +++--- actions/apistatusesretweets.php | 2 +- actions/file.php | 8 ++++---- actions/grouprss.php | 4 ++-- actions/tagother.php | 4 ++-- actions/userbyid.php | 9 ++++----- lib/profileformaction.php | 4 ++-- plugins/OpenID/openidserver.php | 2 +- plugins/TemplatePlugin.php | 2 +- 9 files changed, 20 insertions(+), 21 deletions(-) (limited to 'lib') diff --git a/actions/apistatusesretweet.php b/actions/apistatusesretweet.php index fc71d2274..85de79d5c 100644 --- a/actions/apistatusesretweet.php +++ b/actions/apistatusesretweet.php @@ -72,7 +72,7 @@ class ApiStatusesRetweetAction extends ApiAuthAction $this->original = Notice::staticGet('id', $id); if (empty($this->original)) { - $this->clientError(_('No such notice'), + $this->clientError(_('No such notice.'), 400, $this->format); return false; } @@ -80,7 +80,7 @@ class ApiStatusesRetweetAction extends ApiAuthAction $this->user = $this->auth_user; if ($this->user->id == $notice->profile_id) { - $this->clientError(_('Cannot repeat your own notice')); + $this->clientError(_('Cannot repeat your own notice.')); 400, $this->format); return false; } @@ -88,7 +88,7 @@ class ApiStatusesRetweetAction extends ApiAuthAction $profile = $this->user->getProfile(); if ($profile->hasRepeated($id)) { - $this->clientError(_('Already repeated that notice'), + $this->clientError(_('Already repeated that notice.'), 400, $this->format); return false; } diff --git a/actions/apistatusesretweets.php b/actions/apistatusesretweets.php index c54a374e2..2efd59b37 100644 --- a/actions/apistatusesretweets.php +++ b/actions/apistatusesretweets.php @@ -69,7 +69,7 @@ class ApiStatusesRetweetsAction extends ApiAuthAction $this->original = Notice::staticGet('id', $id); if (empty($this->original)) { - $this->clientError(_('No such notice'), + $this->clientError(_('No such notice.'), 400, $this->format); return false; } diff --git a/actions/file.php b/actions/file.php index 10c59a961..c6f7b998a 100644 --- a/actions/file.php +++ b/actions/file.php @@ -31,15 +31,15 @@ class FileAction extends Action parent::prepare($args); $this->id = $this->trimmed('notice'); if (empty($this->id)) { - $this->clientError(_('No notice id')); + $this->clientError(_('No notice ID.')); } $notice = Notice::staticGet('id', $this->id); if (empty($notice)) { - $this->clientError(_('No notice')); + $this->clientError(_('No notice.')); } $atts = $notice->attachments(); if (empty($atts)) { - $this->clientError(_('No attachments')); + $this->clientError(_('No attachments.')); } foreach ($atts as $att) { if (!empty($att->filename)) { @@ -48,7 +48,7 @@ class FileAction extends Action } } if (empty($this->filerec)) { - $this->clientError(_('No uploaded attachments')); + $this->clientError(_('No uploaded attachments.')); } return true; } diff --git a/actions/grouprss.php b/actions/grouprss.php index 50e48a67e..866fc66eb 100644 --- a/actions/grouprss.php +++ b/actions/grouprss.php @@ -88,14 +88,14 @@ class groupRssAction extends Rss10Action } if (!$nickname) { - $this->clientError(_('No nickname'), 404); + $this->clientError(_('No nickname.'), 404); return false; } $this->group = User_group::staticGet('nickname', $nickname); if (!$this->group) { - $this->clientError(_('No such group'), 404); + $this->clientError(_('No such group.'), 404); return false; } diff --git a/actions/tagother.php b/actions/tagother.php index c3f43be8b..e9e13b939 100644 --- a/actions/tagother.php +++ b/actions/tagother.php @@ -30,13 +30,13 @@ class TagotherAction extends Action { parent::prepare($args); if (!common_logged_in()) { - $this->clientError(_('Not logged in'), 403); + $this->clientError(_('Not logged in.'), 403); return false; } $id = $this->trimmed('id'); if (!$id) { - $this->clientError(_('No id argument.')); + $this->clientError(_('No ID argument.')); return false; } diff --git a/actions/userbyid.php b/actions/userbyid.php index ebff7e4a7..f3e1556f3 100644 --- a/actions/userbyid.php +++ b/actions/userbyid.php @@ -47,17 +47,17 @@ class UserbyidAction extends Action { /** * Is read only? - * + * * @return boolean true */ function isReadOnly($args) - { + { return true; } /** * Class handler. - * + * * @param array $args array of arguments * * @return nothing @@ -67,7 +67,7 @@ class UserbyidAction extends Action parent::handle($args); $id = $this->trimmed('id'); if (!$id) { - $this->clientError(_('No id.')); + $this->clientError(_('No ID.')); } $user = User::staticGet($id); if (!$user) { @@ -88,4 +88,3 @@ class UserbyidAction extends Action common_redirect($url, 303); } } - diff --git a/lib/profileformaction.php b/lib/profileformaction.php index 8cb5f6a93..8a934666e 100644 --- a/lib/profileformaction.php +++ b/lib/profileformaction.php @@ -120,7 +120,7 @@ class ProfileFormAction extends Action if ($action) { common_redirect(common_local_url($action, $args), 303); } else { - $this->clientError(_("No return-to arguments")); + $this->clientError(_("No return-to arguments.")); } } @@ -134,6 +134,6 @@ class ProfileFormAction extends Action function handlePost() { - $this->serverError(_("unimplemented method")); + $this->serverError(_("Unimplemented method.")); } } diff --git a/plugins/OpenID/openidserver.php b/plugins/OpenID/openidserver.php index 181cbdf45..afbca553f 100644 --- a/plugins/OpenID/openidserver.php +++ b/plugins/OpenID/openidserver.php @@ -103,7 +103,7 @@ class OpenidserverAction extends Action $response = $this->generateDenyResponse($request); } else { //invalid - $this->clientError(sprintf(_m('You are not authorized to use the identity %s'),$request->identity),$code=403); + $this->clientError(sprintf(_m('You are not authorized to use the identity %s.'),$request->identity),$code=403); } } else { $response = $this->oserver->handleRequest($request); diff --git a/plugins/TemplatePlugin.php b/plugins/TemplatePlugin.php index 5f3ad81f5..18aa8034c 100644 --- a/plugins/TemplatePlugin.php +++ b/plugins/TemplatePlugin.php @@ -300,7 +300,7 @@ class TemplateAction extends Action // verify that user is admin if (!($user->id == 1)) - $this->clientError(_('only User #1 can update the template'), $code = 401); + $this->clientError(_('Only User #1 can update the template.'), $code = 401); // open the old template $tpl_file = $this->templateFolder() . '/index.html'; -- cgit v1.2.3-54-g00ecf From 7dc9f7ad069164674abb4b761bc7faf9eca4c61f Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Sun, 13 Dec 2009 20:00:09 -0500 Subject: Init UI for Repeated by --- lib/noticelist.php | 11 +++++------ theme/base/css/display.css | 11 +++++++++++ 2 files changed, 16 insertions(+), 6 deletions(-) (limited to 'lib') diff --git a/lib/noticelist.php b/lib/noticelist.php index aa6ea278c..a106478ed 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -535,17 +535,19 @@ class NoticeListItem extends Widget $repeater = Profile::staticGet('id', $this->repeat->profile_id); - $attrs = array('href' => $repeater->profileurl, + $attrs = array('href' => $this->profile->profileurl, 'class' => 'url'); if (!empty($repeater->fullname)) { $attrs['title'] = $repeater->fullname . ' (' . $repeater->nickname . ')'; } - $this->out->elementStart('span', 'repeat'); + $this->out->elementStart('span', 'repeat vcard'); $this->out->elementStart('a', $attrs); + $this->out->raw(_('Repeated by')); + $avatar = $repeater->getAvatar(AVATAR_MINI_SIZE); $this->out->element('img', array('src' => ($avatar) ? @@ -559,12 +561,9 @@ class NoticeListItem extends Widget $repeater->fullname : $repeater->nickname)); + $this->out->element('span', 'nickname', $repeater->nickname); $this->out->elementEnd('a'); - $text_link = XMLStringer::estring('a', $attrs, $repeater->nickname); - - $this->out->raw(sprintf(_('Repeated by %s'), $text_link)); - $this->out->elementEnd('span'); } } diff --git a/theme/base/css/display.css b/theme/base/css/display.css index bab6431b9..0173d2fbb 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -982,6 +982,17 @@ font-size:1.025em; display:inline-block; } +.entry-content .repeat { +display:block; +} +.entry-content .repeat .photo { +float:none; +margin-right:1px; +position:relative; +top:4px; +left:0; +} + .notice-options { position:relative; font-size:0.95em; -- cgit v1.2.3-54-g00ecf From a199bd808a9dce64dd1d9a137b853b6ba0f6811b Mon Sep 17 00:00:00 2001 From: Zach Copley Date: Mon, 14 Dec 2009 18:16:45 +0000 Subject: Fix issue with favorited/following always being set to false --- lib/api.php | 22 ++++++++++++---------- lib/apiauth.php | 2 -- 2 files changed, 12 insertions(+), 12 deletions(-) (limited to 'lib') diff --git a/lib/api.php b/lib/api.php index b7ab407a1..0c6650111 100644 --- a/lib/api.php +++ b/lib/api.php @@ -53,13 +53,14 @@ if (!defined('STATUSNET')) { class ApiAction extends Action { - var $format = null; - var $user = null; - var $page = null; - var $count = null; - var $max_id = null; - var $since_id = null; - var $since = null; + var $format = null; + var $user = null; + var $auth_user = null; + var $page = null; + var $count = null; + var $max_id = null; + var $since_id = null; + var $since = null; /** * Initialization. @@ -190,13 +191,14 @@ class ApiAction extends Action $twitter_user['following'] = false; $twitter_user['notifications'] = false; - if (isset($apidata['user'])) { + if (isset($this->auth_user)) { - $twitter_user['following'] = $apidata['user']->isSubscribed($profile); + $twitter_user['following'] = $this->auth_user->isSubscribed($profile); // Notifications on? $sub = Subscription::pkeyGet(array('subscriber' => - $apidata['user']->id, 'subscribed' => $profile->id)); + $this->auth_user->id, + 'subscribed' => $profile->id)); if ($sub) { $twitter_user['notifications'] = ($sub->jabber || $sub->sms); diff --git a/lib/apiauth.php b/lib/apiauth.php index 0d1613d38..7102764cb 100644 --- a/lib/apiauth.php +++ b/lib/apiauth.php @@ -53,8 +53,6 @@ require_once INSTALLDIR . '/lib/api.php'; class ApiAuthAction extends ApiAction { - var $auth_user = null; - /** * Take arguments for running, and output basic auth header if needed * -- cgit v1.2.3-54-g00ecf From 9d2a605d0e02a4e7d61b62420d7847ee1e6fcbe1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 14 Dec 2009 15:42:53 -0500 Subject: correct link for repeat attribution in noticelist --- lib/noticelist.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/noticelist.php b/lib/noticelist.php index a106478ed..85e1befcc 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -535,7 +535,7 @@ class NoticeListItem extends Widget $repeater = Profile::staticGet('id', $this->repeat->profile_id); - $attrs = array('href' => $this->profile->profileurl, + $attrs = array('href' => $repeater->profileurl, 'class' => 'url'); if (!empty($repeater->fullname)) { @@ -544,12 +544,12 @@ class NoticeListItem extends Widget $this->out->elementStart('span', 'repeat vcard'); - $this->out->elementStart('a', $attrs); - $this->out->raw(_('Repeated by')); $avatar = $repeater->getAvatar(AVATAR_MINI_SIZE); + $this->out->elementStart('a', $attrs); + $this->out->element('img', array('src' => ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_MINI_SIZE), -- cgit v1.2.3-54-g00ecf From 6ff13d6828d01a142b60b4254c07f6f9ad3f16ba Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 14 Dec 2009 16:10:16 -0500 Subject: move full-featured timeline to apitimelinehome.php --- actions/apitimelinefriends.php | 249 ----------------------------------------- actions/apitimelinehome.php | 249 +++++++++++++++++++++++++++++++++++++++++ lib/router.php | 5 +- 3 files changed, 252 insertions(+), 251 deletions(-) delete mode 100644 actions/apitimelinefriends.php create mode 100644 actions/apitimelinehome.php (limited to 'lib') diff --git a/actions/apitimelinefriends.php b/actions/apitimelinefriends.php deleted file mode 100644 index 09ba7a969..000000000 --- a/actions/apitimelinefriends.php +++ /dev/null @@ -1,249 +0,0 @@ -. - * - * @category API - * @package StatusNet - * @author Craig Andrews - * @author Evan Prodromou - * @author Jeffery To - * @author mac65 - * @author Mike Cochrane - * @author Robin Millette - * @author Zach Copley - * @copyright 2009 StatusNet, Inc. - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -if (!defined('STATUSNET')) { - exit(1); -} - -require_once INSTALLDIR . '/lib/apibareauth.php'; - -/** - * Returns the most recent notices (default 20) posted by the target user. - * This is the equivalent of 'You and friends' page accessed via Web. - * - * @category API - * @package StatusNet - * @author Craig Andrews - * @author Evan Prodromou - * @author Jeffery To - * @author mac65 - * @author Mike Cochrane - * @author Robin Millette - * @author Zach Copley - * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 - * @link http://status.net/ - */ - -class ApiTimelineFriendsAction extends ApiBareAuthAction -{ - var $notices = null; - - /** - * Take arguments for running - * - * @param array $args $_REQUEST args - * - * @return boolean success flag - * - */ - - function prepare($args) - { - parent::prepare($args); - common_debug("api friends_timeline"); - $this->user = $this->getTargetUser($this->arg('id')); - - if (empty($this->user)) { - $this->clientError(_('No such user.'), 404, $this->format); - return; - } - - $this->notices = $this->getNotices(); - - return true; - } - - /** - * Handle the request - * - * Just show the notices - * - * @param array $args $_REQUEST data (unused) - * - * @return void - */ - - function handle($args) - { - parent::handle($args); - $this->showTimeline(); - } - - /** - * Show the timeline of notices - * - * @return void - */ - - function showTimeline() - { - $profile = $this->user->getProfile(); - $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); - $sitename = common_config('site', 'name'); - $title = sprintf(_("%s and friends"), $this->user->nickname); - $taguribase = common_config('integration', 'taguri'); - $id = "tag:$taguribase:FriendsTimeline:" . $this->user->id; - $link = common_local_url( - 'all', array('nickname' => $this->user->nickname) - ); - $subtitle = sprintf( - _('Updates from %1$s and friends on %2$s!'), - $this->user->nickname, $sitename - ); - $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); - - switch($this->format) { - case 'xml': - $this->showXmlTimeline($this->notices); - break; - case 'rss': - $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo); - break; - case 'atom': - - $target_id = $this->arg('id'); - - if (isset($target_id)) { - $selfuri = common_root_url() . - 'api/statuses/friends_timeline/' . - $target_id . '.atom'; - } else { - $selfuri = common_root_url() . - 'api/statuses/friends_timeline.atom'; - } - - $this->showAtomTimeline( - $this->notices, $title, $id, $link, - $subtitle, null, $selfuri, $logo - ); - break; - case 'json': - $this->showJsonTimeline($this->notices); - break; - default: - $this->clientError(_('API method not found!'), $code = 404); - break; - } - } - - /** - * Get notices - * - * @return array notices - */ - - function getNotices() - { - $notices = array(); - - if (!empty($this->auth_user) && $this->auth_user->id == $this->user->id) { - $notice = $this->user->noticeInbox( - ($this->page-1) * $this->count, - $this->count, $this->since_id, - $this->max_id, $this->since - ); - } else { - $notice = $this->user->noticesWithFriends( - ($this->page-1) * $this->count, - $this->count, $this->since_id, - $this->max_id, $this->since - ); - } - - while ($notice->fetch()) { - $notices[] = clone($notice); - } - - return $notices; - } - - /** - * Is this action read only? - * - * @param array $args other arguments - * - * @return boolean true - */ - - function isReadOnly($args) - { - return true; - } - - /** - * When was this feed last modified? - * - * @return string datestamp of the latest notice in the stream - */ - - function lastModified() - { - if (!empty($this->notices) && (count($this->notices) > 0)) { - return strtotime($this->notices[0]->created); - } - - return null; - } - - /** - * An entity tag for this stream - * - * Returns an Etag based on the action name, language, user ID, and - * timestamps of the first and last notice in the timeline - * - * @return string etag - */ - - function etag() - { - if (!empty($this->notices) && (count($this->notices) > 0)) { - - $last = count($this->notices) - 1; - - return '"' . implode( - ':', - array($this->arg('action'), - common_language(), - $this->user->id, - strtotime($this->notices[0]->created), - strtotime($this->notices[$last]->created)) - ) - . '"'; - } - - return null; - } - -} diff --git a/actions/apitimelinehome.php b/actions/apitimelinehome.php new file mode 100644 index 000000000..5f5ea37b1 --- /dev/null +++ b/actions/apitimelinehome.php @@ -0,0 +1,249 @@ +. + * + * @category API + * @package StatusNet + * @author Craig Andrews + * @author Evan Prodromou + * @author Jeffery To + * @author mac65 + * @author Mike Cochrane + * @author Robin Millette + * @author Zach Copley + * @copyright 2009 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + exit(1); +} + +require_once INSTALLDIR . '/lib/apibareauth.php'; + +/** + * Returns the most recent notices (default 20) posted by the target user. + * This is the equivalent of 'You and friends' page accessed via Web. + * + * @category API + * @package StatusNet + * @author Craig Andrews + * @author Evan Prodromou + * @author Jeffery To + * @author mac65 + * @author Mike Cochrane + * @author Robin Millette + * @author Zach Copley + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://status.net/ + */ + +class ApiTimelineHomeAction extends ApiBareAuthAction +{ + var $notices = null; + + /** + * Take arguments for running + * + * @param array $args $_REQUEST args + * + * @return boolean success flag + * + */ + + function prepare($args) + { + parent::prepare($args); + common_debug("api home_timeline"); + $this->user = $this->getTargetUser($this->arg('id')); + + if (empty($this->user)) { + $this->clientError(_('No such user.'), 404, $this->format); + return; + } + + $this->notices = $this->getNotices(); + + return true; + } + + /** + * Handle the request + * + * Just show the notices + * + * @param array $args $_REQUEST data (unused) + * + * @return void + */ + + function handle($args) + { + parent::handle($args); + $this->showTimeline(); + } + + /** + * Show the timeline of notices + * + * @return void + */ + + function showTimeline() + { + $profile = $this->user->getProfile(); + $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); + $sitename = common_config('site', 'name'); + $title = sprintf(_("%s and friends"), $this->user->nickname); + $taguribase = common_config('integration', 'taguri'); + $id = "tag:$taguribase:HomeTimeline:" . $this->user->id; + $link = common_local_url( + 'all', array('nickname' => $this->user->nickname) + ); + $subtitle = sprintf( + _('Updates from %1$s and friends on %2$s!'), + $this->user->nickname, $sitename + ); + $logo = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_PROFILE_SIZE); + + switch($this->format) { + case 'xml': + $this->showXmlTimeline($this->notices); + break; + case 'rss': + $this->showRssTimeline($this->notices, $title, $link, $subtitle, null, $logo); + break; + case 'atom': + + $target_id = $this->arg('id'); + + if (isset($target_id)) { + $selfuri = common_root_url() . + 'api/statuses/home_timeline/' . + $target_id . '.atom'; + } else { + $selfuri = common_root_url() . + 'api/statuses/home_timeline.atom'; + } + + $this->showAtomTimeline( + $this->notices, $title, $id, $link, + $subtitle, null, $selfuri, $logo + ); + break; + case 'json': + $this->showJsonTimeline($this->notices); + break; + default: + $this->clientError(_('API method not found!'), $code = 404); + break; + } + } + + /** + * Get notices + * + * @return array notices + */ + + function getNotices() + { + $notices = array(); + + if (!empty($this->auth_user) && $this->auth_user->id == $this->user->id) { + $notice = $this->user->noticeInbox( + ($this->page-1) * $this->count, + $this->count, $this->since_id, + $this->max_id, $this->since + ); + } else { + $notice = $this->user->noticesWithFriends( + ($this->page-1) * $this->count, + $this->count, $this->since_id, + $this->max_id, $this->since + ); + } + + while ($notice->fetch()) { + $notices[] = clone($notice); + } + + return $notices; + } + + /** + * Is this action read only? + * + * @param array $args other arguments + * + * @return boolean true + */ + + function isReadOnly($args) + { + return true; + } + + /** + * When was this feed last modified? + * + * @return string datestamp of the latest notice in the stream + */ + + function lastModified() + { + if (!empty($this->notices) && (count($this->notices) > 0)) { + return strtotime($this->notices[0]->created); + } + + return null; + } + + /** + * An entity tag for this stream + * + * Returns an Etag based on the action name, language, user ID, and + * timestamps of the first and last notice in the timeline + * + * @return string etag + */ + + function etag() + { + if (!empty($this->notices) && (count($this->notices) > 0)) { + + $last = count($this->notices) - 1; + + return '"' . implode( + ':', + array($this->arg('action'), + common_language(), + $this->user->id, + strtotime($this->notices[0]->created), + strtotime($this->notices[$last]->created)) + ) + . '"'; + } + + return null; + } + +} diff --git a/lib/router.php b/lib/router.php index 8f68f86ac..474e05996 100644 --- a/lib/router.php +++ b/lib/router.php @@ -283,12 +283,13 @@ class Router array('action' => 'ApiTimelineFriends', 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json|rss|atom)')); + $m->connect('api/statuses/home_timeline.:format', - array('action' => 'ApiTimelineFriends', + array('action' => 'ApiTimelineHome', 'format' => '(xml|json|rss|atom)')); $m->connect('api/statuses/home_timeline/:id.:format', - array('action' => 'ApiTimelineFriends', + array('action' => 'ApiTimelineHome', 'id' => '[a-zA-Z0-9]+', 'format' => '(xml|json|rss|atom)')); -- cgit v1.2.3-54-g00ecf From 9384a6e2429d8ef9a68185c869758b1e258092c1 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 14 Dec 2009 16:40:56 -0500 Subject: fix error with cached repeat of deleted original in api output --- lib/api.php | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/api.php b/lib/api.php index 0c6650111..833bc1c5f 100644 --- a/lib/api.php +++ b/lib/api.php @@ -224,9 +224,13 @@ class ApiAction extends Action return $base; } else { $original = Notice::staticGet('id', $notice->repeat_of); - $original_array = $this->twitterSimpleStatusArray($original, $include_user); - $original_array['retweeted_status'] = $base; - return $original_array; + if (empty($original)) { + return $base; + } else { + $original_array = $this->twitterSimpleStatusArray($original, $include_user); + $original_array['retweeted_status'] = $base; + return $original_array; + } } } -- cgit v1.2.3-54-g00ecf From d22364b35e33982b2f95146f9ac290a3606da28b Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 14 Dec 2009 17:11:34 -0500 Subject: had the order of and wrong in api output --- lib/api.php | 13 +++++-------- lib/noticelist.php | 6 ++++-- 2 files changed, 9 insertions(+), 10 deletions(-) (limited to 'lib') diff --git a/lib/api.php b/lib/api.php index 833bc1c5f..4ed49e452 100644 --- a/lib/api.php +++ b/lib/api.php @@ -220,18 +220,15 @@ class ApiAction extends Action { $base = $this->twitterSimpleStatusArray($notice, $include_user); - if (empty($notice->repeat_of)) { - return $base; - } else { + if (!empty($notice->repeat_of)) { $original = Notice::staticGet('id', $notice->repeat_of); - if (empty($original)) { - return $base; - } else { + if (!empty($original)) { $original_array = $this->twitterSimpleStatusArray($original, $include_user); - $original_array['retweeted_status'] = $base; - return $original_array; + $base['retweeted_status'] = $original_array; } } + + return $base; } function twitterSimpleStatusArray($notice, $include_user=true) diff --git a/lib/noticelist.php b/lib/noticelist.php index 85e1befcc..3ccb50230 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -601,11 +601,13 @@ class NoticeListItem extends Widget { $user = common_current_user(); + $todel = (empty($this->repeat)) ? $this->notice : $this->repeat; + if (!empty($user) && - ($this->notice->profile_id == $user->id || $user->hasRight(Right::DELETEOTHERSNOTICE))) { + ($todel->profile_id == $user->id || $user->hasRight(Right::DELETEOTHERSNOTICE))) { $deleteurl = common_local_url('deletenotice', - array('notice' => $this->notice->id)); + array('notice' => $todel->id)); $this->out->element('a', array('href' => $deleteurl, 'class' => 'notice_delete', 'title' => _('Delete this notice')), _('Delete')); -- cgit v1.2.3-54-g00ecf From 607e98ee11f01a72a6ea7d755ce0f2dee68ff74a Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 14 Dec 2009 17:48:14 -0500 Subject: make sure id of
  • in notice list is unique --- lib/noticelist.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'lib') diff --git a/lib/noticelist.php b/lib/noticelist.php index 3ccb50230..dd0a361c0 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -243,8 +243,9 @@ class NoticeListItem extends Widget { // XXX: RDFa // TODO: add notice_type class e.g., notice_video, notice_image + $id = (empty($this->repeat)) ? $this->notice->id : $this->repeat->id; $this->out->elementStart('li', array('class' => 'hentry notice', - 'id' => 'notice-' . $this->notice->id)); + 'id' => 'notice-' . $id)); } /** -- cgit v1.2.3-54-g00ecf From f8b187d5a4ac5eab1f025d61e30d5244cef6123d Mon Sep 17 00:00:00 2001 From: Sarven Capadisli Date: Mon, 14 Dec 2009 18:09:08 -0500 Subject: Initial representation for repeated notice --- actions/repeat.php | 4 +++- lib/noticelist.php | 4 +++- theme/base/css/display.css | 15 +++++++++------ theme/base/images/icons/icons-01.gif | Bin 3154 -> 3201 bytes theme/base/images/icons/twotone/green/recycle-02.gif | Bin 0 -> 77 bytes theme/default/css/display.css | 6 +++++- theme/identica/css/display.css | 6 +++++- 7 files changed, 25 insertions(+), 10 deletions(-) create mode 100644 theme/base/images/icons/twotone/green/recycle-02.gif (limited to 'lib') diff --git a/actions/repeat.php b/actions/repeat.php index a1c5f443f..38d6efa6c 100644 --- a/actions/repeat.php +++ b/actions/repeat.php @@ -112,7 +112,9 @@ class RepeatAction extends Action $this->element('title', null, _('Repeated')); $this->elementEnd('head'); $this->elementStart('body'); - $this->element('p', array('id' => 'repeat_response'), _('Repeated!')); + $this->element('p', array('id' => 'repeat_response', + 'class' => 'repeated'), + _('Repeated!')); $this->elementEnd('body'); $this->elementEnd('html'); } else { diff --git a/lib/noticelist.php b/lib/noticelist.php index dd0a361c0..2165222ee 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -627,7 +627,9 @@ class NoticeListItem extends Widget if ($user && $user->id != $this->notice->profile_id) { $profile = $user->getProfile(); if ($profile->hasRepeated($this->notice->id)) { - $this->out->text(_('Repeated')); + $this->out->element('span', array('class' => 'repeated', + 'title' => _('Notice repeated')), + _('Repeated')); } else { $rf = new RepeatForm($this->out, $this->notice); $rf->show(); diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 0173d2fbb..2f4636391 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -964,7 +964,7 @@ float:left; font-size:0.95em; margin-left:59px; min-width:60%; -max-width:74%; +max-width:70%; } #showstream .notice div.entry-content, #shownotice .notice div.entry-content { @@ -996,7 +996,7 @@ left:0; .notice-options { position:relative; font-size:0.95em; -width:90px; +width:125px; float:right; } @@ -1007,16 +1007,18 @@ float:left; .notice-options .notice_reply, .notice-options .form_repeat, .notice-options .form_favor, -.notice-options .form_disfavor { +.notice-options .form_disfavor, +.notice-options .repeated { float:left; -margin-left:20%; +margin-left:14%; } .notice-options .form_favor, .notice-options .form_disfavor { margin-left:0; } .notice-options input, -.notice-options a { +.notice-options a, +.notice-options .repeated { text-indent:-9999px; outline:none; } @@ -1047,7 +1049,8 @@ display:none; border:0; padding:0; } -.notice-options a { +.notice-options a, +.notice-options .repeated { width:16px; height:16px; } diff --git a/theme/base/images/icons/icons-01.gif b/theme/base/images/icons/icons-01.gif index 5909d7b19..417327881 100644 Binary files a/theme/base/images/icons/icons-01.gif and b/theme/base/images/icons/icons-01.gif differ diff --git a/theme/base/images/icons/twotone/green/recycle-02.gif b/theme/base/images/icons/twotone/green/recycle-02.gif new file mode 100644 index 000000000..060a8c72f Binary files /dev/null and b/theme/base/images/icons/twotone/green/recycle-02.gif differ diff --git a/theme/default/css/display.css b/theme/default/css/display.css index e0dda3de2..f1d9a9d0b 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -173,7 +173,8 @@ button.close, .entity_moderation p, .entity_sandbox input.submit, .entity_silence input.submit, -.entity_delete input.submit { +.entity_delete input.submit, +.notice-options .repeated { background-image:url(../../base/images/icons/icons-01.gif); background-repeat:no-repeat; background-color:transparent; @@ -338,6 +339,9 @@ background-position:0 -658px; .notice-options form.form_repeat input.submit { background-position:0 -1582px; } +.notice-options .repeated { +background-position:0 -1648px; +} .notices div.entry-content, .notices div.notice-options { diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index 999af973c..aa02070ac 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -173,7 +173,8 @@ button.close, .entity_moderation p, .entity_sandbox input.submit, .entity_silence input.submit, -.entity_delete input.submit { +.entity_delete input.submit, +.notice-options .repeated { background-image:url(../../base/images/icons/icons-01.gif); background-repeat:no-repeat; background-color:transparent; @@ -337,6 +338,9 @@ background-position:0 -658px; .notice-options form.form_repeat input.submit { background-position:0 -1582px; } +.notice-options .repeated { +background-position:0 -1648px; +} .notices div.entry-content, .notices div.notice-options { -- cgit v1.2.3-54-g00ecf From 43ee2ec42f09da0748a1835c6d6d06e04e178de8 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Mon, 14 Dec 2009 18:09:30 -0500 Subject: default for login command is disabled --- lib/default.php | 2 ++ 1 file changed, 2 insertions(+) (limited to 'lib') diff --git a/lib/default.php b/lib/default.php index ebb6f8d01..42d4623b1 100644 --- a/lib/default.php +++ b/lib/default.php @@ -229,4 +229,6 @@ $default = array('namespace' => 1), // 1 = geonames, 2 = Yahoo Where on Earth 'omb' => array('timeout' => 5), // HTTP request timeout in seconds when contacting remote hosts for OMB updates + 'logincommand' => + array('disabled' => true), ); -- cgit v1.2.3-54-g00ecf From 19bb9a04d171fe2a8d87a51c0267c5670cb0f5bf Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 15 Dec 2009 10:18:27 -0500 Subject: add mail notification for dm command results --- lib/command.php | 1 + 1 file changed, 1 insertion(+) (limited to 'lib') diff --git a/lib/command.php b/lib/command.php index 222bd7683..b30780bfb 100644 --- a/lib/command.php +++ b/lib/command.php @@ -372,6 +372,7 @@ class MessageCommand extends Command } $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source()); if ($message) { + mail_notify_message($message, $this->user, $other); $channel->output($this->user, sprintf(_('Direct message to %s sent'), $this->other)); } else { $channel->error($this->user, _('Error sending direct message.')); -- cgit v1.2.3-54-g00ecf From 797a0d79fbf4e105ee4ccdce093c1595c1f08a4a Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 15 Dec 2009 10:31:25 -0500 Subject: create a method for notification for new messages, and use it --- actions/apidirectmessagenew.php | 2 +- actions/newmessage.php | 8 +------- classes/Message.php | 8 ++++++++ lib/command.php | 2 +- 4 files changed, 11 insertions(+), 9 deletions(-) (limited to 'lib') diff --git a/actions/apidirectmessagenew.php b/actions/apidirectmessagenew.php index e6c39ce4a..b9ac92d77 100644 --- a/actions/apidirectmessagenew.php +++ b/actions/apidirectmessagenew.php @@ -175,7 +175,7 @@ class ApiDirectMessageNewAction extends ApiAuthAction return; } - mail_notify_message($message, $this->user, $this->other); + $message->notify(); if ($this->format == 'xml') { $this->showSingleXmlDirectMessage($message); diff --git a/actions/newmessage.php b/actions/newmessage.php index 0db2e7181..350452091 100644 --- a/actions/newmessage.php +++ b/actions/newmessage.php @@ -173,7 +173,7 @@ class NewmessageAction extends Action return; } - $this->notify($user, $this->other, $message); + $message->notify(); if ($this->boolean('ajax')) { $this->startHTML('text/xml;charset=utf-8'); @@ -247,12 +247,6 @@ class NewmessageAction extends Action } } - function notify($from, $to, $message) - { - mail_notify_message($message, $from, $to); - // XXX: Jabber, SMS notifications... probably queued - } - // Do nothing (override) function showNoticeForm() diff --git a/classes/Message.php b/classes/Message.php index 718a9d922..16d0c60b3 100644 --- a/classes/Message.php +++ b/classes/Message.php @@ -89,4 +89,12 @@ class Message extends Memcached_DataObject $contentlimit = self::maxContent(); return ($contentlimit > 0 && !empty($content) && (mb_strlen($content) > $contentlimit)); } + + function notify() + { + $from = User::staticGet('id', $this->from_profile); + $to = User::staticGet('id', $this->to_profile); + + mail_notify_message($this, $from, $to); + } } diff --git a/lib/command.php b/lib/command.php index b30780bfb..67140c348 100644 --- a/lib/command.php +++ b/lib/command.php @@ -372,7 +372,7 @@ class MessageCommand extends Command } $message = Message::saveNew($this->user->id, $other->id, $this->text, $channel->source()); if ($message) { - mail_notify_message($message, $this->user, $other); + $message->notify(); $channel->output($this->user, sprintf(_('Direct message to %s sent'), $this->other)); } else { $channel->error($this->user, _('Error sending direct message.')); -- cgit v1.2.3-54-g00ecf From 608d1b206a01e1bd97e286a1003030ce89370913 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 15 Dec 2009 16:08:44 -0500 Subject: Don't show repeater avatar in notice lists --- lib/noticelist.php | 11 ----------- plugins/Realtime/realtimeupdate.js | 1 - 2 files changed, 12 deletions(-) (limited to 'lib') diff --git a/lib/noticelist.php b/lib/noticelist.php index 2165222ee..4c11ceed6 100644 --- a/lib/noticelist.php +++ b/lib/noticelist.php @@ -551,17 +551,6 @@ class NoticeListItem extends Widget $this->out->elementStart('a', $attrs); - $this->out->element('img', array('src' => ($avatar) ? - $avatar->displayUrl() : - Avatar::defaultImage(AVATAR_MINI_SIZE), - 'class' => 'avatar photo', - 'width' => AVATAR_MINI_SIZE, - 'height' => AVATAR_MINI_SIZE, - 'alt' => - ($repeater->fullname) ? - $repeater->fullname : - $repeater->nickname)); - $this->out->element('span', 'nickname', $repeater->nickname); $this->out->elementEnd('a'); diff --git a/plugins/Realtime/realtimeupdate.js b/plugins/Realtime/realtimeupdate.js index 18f00f22a..b57451e20 100644 --- a/plugins/Realtime/realtimeupdate.js +++ b/plugins/Realtime/realtimeupdate.js @@ -159,7 +159,6 @@ RealtimeUpdate = { ru = repeat['user']; ni = ni + "Repeated by " + "" + - "\""" + ""+ ru['screen_name'] + ""; } -- cgit v1.2.3-54-g00ecf From 0158f4f73db1c6090c09da8cc3cdcfb97af3883b Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 15 Dec 2009 13:53:19 -0800 Subject: PHP 5.3 closure-based implementation of curry(); old implementation used as fallback for older PHP versions. Added unit tests to confirm they both work! --- lib/curry.php | 36 +++++++++++++++++++++++++++ lib/util.php | 30 ++++++++++++---------- tests/CurryTest.php | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 125 insertions(+), 13 deletions(-) create mode 100644 lib/curry.php create mode 100644 tests/CurryTest.php (limited to 'lib') diff --git a/lib/curry.php b/lib/curry.php new file mode 100644 index 000000000..6136dcdc3 --- /dev/null +++ b/lib/curry.php @@ -0,0 +1,36 @@ +. + */ + +/** + * PHP 5.3 implementation of function currying, using native closures. + * On 5.2 and lower we use the fallback implementation in util.php + * + * @param callback $fn + * @param ... any remaining arguments will be appended to call-time params + * @return callback + */ +function curry($fn) { + $extra_args = func_get_args(); + array_shift($extra_args); + return function() use ($fn, $extra_args) { + $args = func_get_args(); + return call_user_func_array($fn, + array_merge($args, $extra_args)); + }; +} diff --git a/lib/util.php b/lib/util.php index 14d666503..d4afafb4c 100644 --- a/lib/util.php +++ b/lib/util.php @@ -523,19 +523,23 @@ function callback_helper($matches, $callback, $notice_id) { return substr($matches[0],0,$left) . $result . substr($matches[0],$right); } -function curry($fn) { - //TODO switch to a PHP 5.3 function closure based approach if PHP 5.3 is used - $args = func_get_args(); - array_shift($args); - $id = uniqid('_partial'); - $GLOBALS[$id] = array($fn, $args); - return create_function('', - '$args = func_get_args(); '. - 'return call_user_func_array('. - '$GLOBALS["'.$id.'"][0],'. - 'array_merge('. - '$args,'. - '$GLOBALS["'.$id.'"][1]));'); +if (version_compare(PHP_VERSION, '5.3.0', 'ge')) { + // lambda implementation in a separate file; PHP 5.2 won't parse it. + require_once INSTALLDIR . "/lib/curry.php"; +} else { + function curry($fn) { + $args = func_get_args(); + array_shift($args); + $id = uniqid('_partial'); + $GLOBALS[$id] = array($fn, $args); + return create_function('', + '$args = func_get_args(); '. + 'return call_user_func_array('. + '$GLOBALS["'.$id.'"][0],'. + 'array_merge('. + '$args,'. + '$GLOBALS["'.$id.'"][1]));'); + } } function common_linkify($url) { diff --git a/tests/CurryTest.php b/tests/CurryTest.php new file mode 100644 index 000000000..37b66cc74 --- /dev/null +++ b/tests/CurryTest.php @@ -0,0 +1,72 @@ +assertEquals($expected, $result); + } + + static public function provider() + { + $obj = new CurryTestHelperObj('oldval'); + return array(array(array('CurryTest', 'callback'), + array('curried'), + array('called'), + 'called|curried'), + array(array('CurryTest', 'callback'), + array('curried1', 'curried2'), + array('called1', 'called2'), + 'called1|called2|curried1|curried2'), + array(array('CurryTest', 'callbackObj'), + array($obj), + array('newval1'), + 'oldval|newval1'), + // Confirm object identity is retained... + array(array('CurryTest', 'callbackObj'), + array($obj), + array('newval2'), + 'newval1|newval2')); + } + + static function callback() + { + $args = func_get_args(); + return implode("|", $args); + } + + static function callbackObj($val, $obj) + { + $old = $obj->val; + $obj->val = $val; + return "$old|$val"; + } +} + +class CurryTestHelperObj +{ + public $val=''; + + function __construct($val) + { + $this->val = $val; + } +} -- cgit v1.2.3-54-g00ecf From dc4bedd25aa75e5f4b5f5a7f7a5d93cd19dcd756 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 15 Dec 2009 18:55:18 -0500 Subject: Add some doc comments and fixmes in util.php --- lib/util.php | 29 +++++++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/util.php b/lib/util.php index d4afafb4c..af4885f40 100644 --- a/lib/util.php +++ b/lib/util.php @@ -1244,8 +1244,12 @@ function common_copy_args($from) return $to; } -// Neutralise the evil effects of magic_quotes_gpc in the current request. -// This is used before handing a request off to OAuthRequest::from_request. +/** + * Neutralise the evil effects of magic_quotes_gpc in the current request. + * This is used before handing a request off to OAuthRequest::from_request. + * @fixme Doesn't consider vars other than _POST and _GET? + * @fixme Can't be undone and could corrupt data if run twice. + */ function common_remove_magic_from_request() { if(get_magic_quotes_gpc()) { @@ -1447,6 +1451,17 @@ function common_database_tablename($tablename) return $tablename; } +/** + * Shorten a URL with the current user's configured shortening service, + * or ur1.ca if configured, or not at all if no shortening is set up. + * Length is not considered. + * + * @param string $long_url + * @return string may return the original URL if shortening failed + * + * @fixme provide a way to specify a particular shortener + * @fixme provide a way to specify to use a given user's shortening preferences + */ function common_shorten_url($long_url) { $user = common_current_user(); @@ -1467,6 +1482,16 @@ function common_shorten_url($long_url) } } +/** + * @return mixed array($proxy, $ip) for web requests; proxy may be null + * null if not a web request + * + * @fixme X-Forwarded-For can be chained by multiple proxies; + we should parse the list and provide a cleaner array + * @fixme X-Forwarded-For can be forged by clients; only use them if trusted + * @fixme X_Forwarded_For headers will override X-Forwarded-For read through $_SERVER; + * use function to get exact request headers from Apache if possible. + */ function common_client_ip() { if (!isset($_SERVER) || !array_key_exists('REQUEST_METHOD', $_SERVER)) { -- cgit v1.2.3-54-g00ecf From 30c2e2ce83282f0bc268153d7ec465fbb5cf00ca Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Tue, 22 Dec 2009 16:41:39 -0800 Subject: update to rc2 --- lib/common.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'lib') diff --git a/lib/common.php b/lib/common.php index 9b3ded037..7fa1910af 100644 --- a/lib/common.php +++ b/lib/common.php @@ -20,9 +20,9 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } //exit with 200 response, if this is checking fancy from the installer -if (isset($_REQUEST['p']) && $_REQUEST['p'] == 'check-fancy') { exit; } +if (isset($_REQUEST['p']) && $_REQUEST['p'] == 'check-fancy') { exit; } -define('STATUSNET_VERSION', '0.9.0rc1'); +define('STATUSNET_VERSION', '0.9.0rc2'); define('LACONICA_VERSION', STATUSNET_VERSION); // compatibility define('STATUSNET_CODENAME', 'Stand'); -- cgit v1.2.3-54-g00ecf