diff options
author | Evan Prodromou <evan@controlyourself.ca> | 2009-05-27 14:52:35 -0400 |
---|---|---|
committer | Evan Prodromou <evan@controlyourself.ca> | 2009-05-27 14:52:35 -0400 |
commit | b3bb8943f592de9f6936f35be49a88c641bf6da1 (patch) | |
tree | befbe8ff6d3c7d1268ecce3696bee5caaa799db7 | |
parent | 698228acb9a6262f2fb4e0c82118249aa94cc0f8 (diff) | |
parent | f59ab5dc40862b141ee5463fd4d24b0d213a96f2 (diff) |
Merge branch '0.7.x' into utf8
94 files changed, 6484 insertions, 1697 deletions
diff --git a/.gitignore b/.gitignore index 83a53dfa3..da6947bfd 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,6 @@ dataobject.ini *.rej .#* *.swp +.buildpath +.project +.settings diff --git a/EVENTS.txt b/EVENTS.txt index 5edf59245..e0ce11666 100644 --- a/EVENTS.txt +++ b/EVENTS.txt @@ -100,6 +100,14 @@ StartPublicGroupNav: Showing the public group nav menu EndPublicGroupNav: At the end of the public group nav menu - $action: the current action +StartSubGroupNav: Showing the subscriptions group nav menu +- $action: the current action + +EndSubGroupNav: At the end of the subscriptions group nav menu +- $action: the current action + RouterInitialized: After the router instance has been initialized - $m: the Net_URL_Mapper that has just been set up +ArgsInitialized: After the argument array has been initialized +- $args: associative array of arguments, can be modified @@ -1129,6 +1129,9 @@ welcome: nickname of a user account that sends welcome messages to new busy servers it may be a good idea to keep that one just for 'urgent' messages. Default is null; no message. +If either of these special user accounts are specified, the users should +be created before the configuration is updated. + Troubleshooting =============== diff --git a/actions/accesstoken.php b/actions/accesstoken.php index 77fdf6aef..46b43c702 100644 --- a/actions/accesstoken.php +++ b/actions/accesstoken.php @@ -59,7 +59,7 @@ class AccesstokenAction extends Action try { common_debug('getting request from env variables', __FILE__); common_remove_magic_from_request(); - $req = OAuthRequest::from_request(); + $req = OAuthRequest::from_request('POST', common_local_url('accesstoken')); common_debug('getting a server', __FILE__); $server = omb_oauth_server(); common_debug('fetching the access token', __FILE__); diff --git a/actions/all.php b/actions/all.php index 69890a70c..a53bbea07 100644 --- a/actions/all.php +++ b/actions/all.php @@ -69,6 +69,17 @@ class AllAction extends ProfileAction sprintf(_('Feed for friends of %s (Atom)'), $this->user->nickname))); } + /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'all', array('nickname' => $this->user->nickname)); + } + function showLocalNav() { $nav = new PersonalGroupNav($this); @@ -82,7 +93,7 @@ class AllAction extends ProfileAction if (common_logged_in()) { $current_user = common_current_user(); if ($this->user->id === $current_user->id) { - $message .= _('Try subscribing to more people, [join a group](%%action.groups) or post something yourself.'); + $message .= _('Try subscribing to more people, [join a group](%%action.groups%%) or post something yourself.'); } else { $message .= sprintf(_('You can try to [nudge %s](../%s) from his profile or [post something to his or her attention](%%%%action.newnotice%%%%?status_textarea=%s).'), $this->user->nickname, $this->user->nickname, '@' . $this->user->nickname); } diff --git a/actions/api.php b/actions/api.php index d2f0a2eff..8762b4bcd 100644 --- a/actions/api.php +++ b/actions/api.php @@ -130,6 +130,7 @@ class ApiAction extends Action 'statuses/friends_timeline', 'statuses/friends', 'statuses/replies', + 'statuses/mentions', 'statuses/followers', 'favorites/favorites'); diff --git a/actions/facebookhome.php b/actions/facebookhome.php index 5946e6c98..4c2b26355 100644 --- a/actions/facebookhome.php +++ b/actions/facebookhome.php @@ -138,9 +138,6 @@ class FacebookhomeAction extends FacebookAction function setDefaults() { - // A default prefix string for notices - $this->facebook->api_client->data_setUserPreference( - FACEBOOK_NOTICE_PREFIX, 'dented: '); $this->facebook->api_client->data_setUserPreference( FACEBOOK_PROMPTED_UPDATE_PREF, 'false'); } diff --git a/actions/facebookinvite.php b/actions/facebookinvite.php index 1302064ad..2207580f7 100644 --- a/actions/facebookinvite.php +++ b/actions/facebookinvite.php @@ -17,7 +17,9 @@ * along with this program. If not, see <http://www.gnu.org/licenses/>. */ -if (!defined('LACONICA')) { exit(1); } +if (!defined('LACONICA')) { + exit(1); +} require_once(INSTALLDIR.'/lib/facebookaction.php'); @@ -67,7 +69,7 @@ class FacebookinviteAction extends FacebookAction function showSuccessContent() { - $this->element('h2', null, sprintf(_('Thanks for inviting your friends to use %s'), + $this->element('h2', null, sprintf(_('Thanks for inviting your friends to use %s'), common_config('site', 'name'))); $this->element('p', null, _('Invitations have been sent to the following users:')); @@ -89,16 +91,6 @@ class FacebookinviteAction extends FacebookAction function showFormContent() { - - // Get a list of users who are already using the app for exclusion - $exclude_ids = $this->facebook->api_client->friends_getAppUsers(); - $exclude_ids_csv = null; - - // fbml needs these as a csv string, not an array - if ($exclude_ids) { - $exclude_ids_csv = implode(',', $exclude_ids); - } - $content = sprintf(_('You have been invited to %s'), common_config('site', 'name')) . htmlentities('<fb:req-choice url="' . $this->app_uri . '" label="Add"/>'); @@ -109,36 +101,43 @@ class FacebookinviteAction extends FacebookAction 'content' => $content)); $this->hidden('invite', 'true'); $actiontext = sprintf(_('Invite your friends to use %s'), common_config('site', 'name')); - - $multi_params = array('showborder' => 'false'); + + $multi_params = array('showborder' => 'false'); $multi_params['actiontext'] = $actiontext; - - if ($exclude_ids_csv) { + $multi_params['bypass'] = 'cancel'; + + // Get a list of users who are already using the app for exclusion + $exclude_ids = $this->facebook->api_client->friends_getAppUsers(); + $exclude_ids_csv = null; + + // fbml needs these as a csv string, not an array + if ($exclude_ids) { + $exclude_ids_csv = implode(',', $exclude_ids); $multi_params['exclude_ids'] = $exclude_ids_csv; } - $multi_params['bypass'] = 'cancel'; - $this->element('fb:multi-friend-selector', $multi_params); - $this->elementEnd('fb:request-form'); - $this->element('h2', null, sprintf(_('Friends already using %s:'), - common_config('site', 'name'))); - $this->elementStart('ul', array('id' => 'facebook-friends')); - - foreach ($exclude_ids as $friend) { - $this->elementStart('li'); - $this->element('fb:profile-pic', array('uid' => $friend, 'size' => 'square')); - $this->element('fb:name', array('uid' => $friend, - 'capitalize' => 'true')); - $this->elementEnd('li'); - } + if ($exclude_ids) { - $this->elementEnd("ul"); + $this->element('h2', null, sprintf(_('Friends already using %s:'), + common_config('site', 'name'))); + $this->elementStart('ul', array('id' => 'facebook-friends')); + + foreach ($exclude_ids as $friend) { + $this->elementStart('li'); + $this->element('fb:profile-pic', array('uid' => $friend, 'size' => 'square')); + $this->element('fb:name', array('uid' => $friend, + 'capitalize' => 'true')); + $this->elementEnd('li'); + } + + $this->elementEnd("ul"); + } } - - function title() + + function title() { return sprintf(_('Send invitations')); } diff --git a/actions/favorited.php b/actions/favorited.php index c902d80f5..7e31303e3 100644 --- a/actions/favorited.php +++ b/actions/favorited.php @@ -221,4 +221,15 @@ class FavoritedAction extends Action $this->pagination($this->page > 1, $cnt > NOTICES_PER_PAGE, $this->page, 'favorited'); } + + /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'favorited'); + } } diff --git a/actions/favoritesrss.php b/actions/favoritesrss.php index f85bf1b19..6b46b8dec 100644 --- a/actions/favoritesrss.php +++ b/actions/favoritesrss.php @@ -107,7 +107,7 @@ class FavoritesrssAction extends Rss10Action $c = array('url' => common_local_url('favoritesrss', array('nickname' => $user->nickname)), - 'title' => sprintf(_("%s favorite notices"), $user->nickname), + 'title' => sprintf(_("%s's favorite notices"), $user->nickname), 'link' => common_local_url('showfavorites', array('nickname' => $user->nickname)), diff --git a/actions/finishremotesubscribe.php b/actions/finishremotesubscribe.php index d54c29a60..3e3a81715 100644 --- a/actions/finishremotesubscribe.php +++ b/actions/finishremotesubscribe.php @@ -44,7 +44,7 @@ class FinishremotesubscribeAction extends Action common_debug('stored request: '.print_r($omb,true), __FILE__); common_remove_magic_from_request(); - $req = OAuthRequest::from_request(); + $req = OAuthRequest::from_request('POST', common_local_url('finishuserauthorization')); $token = $req->get_parameter('oauth_token'); diff --git a/actions/groupmembers.php b/actions/groupmembers.php index a90108e4d..909935bec 100644 --- a/actions/groupmembers.php +++ b/actions/groupmembers.php @@ -137,4 +137,15 @@ class GroupmembersAction extends Action $this->page, 'groupmembers', array('nickname' => $this->group->nickname)); } -}
\ No newline at end of file + + /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'groupmembers', array('nickname' => $this->group->nickname)); + } +} diff --git a/actions/grouprss.php b/actions/grouprss.php index a9a2eef87..0b7280a11 100644 --- a/actions/grouprss.php +++ b/actions/grouprss.php @@ -34,7 +34,7 @@ if (!defined('LACONICA')) { require_once INSTALLDIR.'/lib/rssaction.php'; -define('MEMBERS_PER_SECTION', 81); +define('MEMBERS_PER_SECTION', 27); /** * Group RSS feed diff --git a/actions/groups.php b/actions/groups.php index 26b52a5fc..e20acce70 100644 --- a/actions/groups.php +++ b/actions/groups.php @@ -129,4 +129,15 @@ class GroupsAction extends Action $gbm = new GroupsByMembersSection($this); $gbm->show(); } + + /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'groups', array('nickname' => $this->group->nickname)); + } } diff --git a/actions/inbox.php b/actions/inbox.php index b553ab26c..7b5cf2d20 100644 --- a/actions/inbox.php +++ b/actions/inbox.php @@ -64,6 +64,17 @@ class InboxAction extends MailboxAction } /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'inbox', array('nickname' => $this->user->nickname)); + } + + /** * Retrieve the messages for this user and this page * * Does a query for the right messages diff --git a/actions/newmessage.php b/actions/newmessage.php index 82276ff34..52d4899ba 100644 --- a/actions/newmessage.php +++ b/actions/newmessage.php @@ -172,15 +172,54 @@ class NewmessageAction extends Action $this->notify($user, $this->other, $message); - $url = common_local_url('outbox', array('nickname' => $user->nickname)); + if ($this->boolean('ajax')) { + $this->startHTML('text/xml;charset=utf-8'); + $this->elementStart('head'); + $this->element('title', null, _('Message sent')); + $this->elementEnd('head'); + $this->elementStart('body'); + $this->element('p', array('id' => 'command_result'), + sprintf(_('Direct message to %s sent'), + $this->other->nickname)); + $this->elementEnd('body'); + $this->elementEnd('html'); + } else { + $url = common_local_url('outbox', + array('nickname' => $user->nickname)); + common_redirect($url, 303); + } + } - common_redirect($url, 303); + /** + * Show an Ajax-y error message + * + * Goes back to the browser, where it's shown in a popup. + * + * @param string $msg Message to show + * + * @return void + */ + + function ajaxErrorMsg($msg) + { + $this->startHTML('text/xml;charset=utf-8', true); + $this->elementStart('head'); + $this->element('title', null, _('Ajax Error')); + $this->elementEnd('head'); + $this->elementStart('body'); + $this->element('p', array('id' => 'error'), $msg); + $this->elementEnd('body'); + $this->elementEnd('html'); } function showForm($msg = null) { - $this->msg = $msg; + if ($msg && $this->boolean('ajax')) { + $this->ajaxErrorMsg($msg); + return; + } + $this->msg = $msg; $this->showPage(); } diff --git a/actions/noticesearch.php b/actions/noticesearch.php index 095d0a454..d996998fc 100644 --- a/actions/noticesearch.php +++ b/actions/noticesearch.php @@ -184,11 +184,13 @@ class SearchNoticeListItem extends NoticeListItem { function highlight($text, $terms) { /* Highligh search terms */ - $pattern = '/('.implode('|', array_map('htmlspecialchars', $terms)).')/i'; + $options = implode('|', array_map('preg_quote', array_map('htmlspecialchars', $terms), + array_fill(0, sizeof($terms), '/'))); + $pattern = "/($options)/i"; $result = preg_replace($pattern, '<strong>\\1</strong>', $text); /* Remove highlighting from inside links, loop incase multiple highlights in links */ - $pattern = '/(href="[^"]*)<strong>('.implode('|', array_map('htmlspecialchars', $terms)).')<\/strong>([^"]*")/iU'; + $pattern = '/(href="[^"]*)<strong>('.$options.')<\/strong>([^"]*")/iU'; do { $result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count); } while ($count); diff --git a/actions/openidsettings.php b/actions/openidsettings.php index 92469d20f..5f59ebc01 100644 --- a/actions/openidsettings.php +++ b/actions/openidsettings.php @@ -67,8 +67,8 @@ class OpenidsettingsAction extends AccountSettingsAction function getInstructions() { - return _('[OpenID](%%doc.openid%%) lets you log into many sites ' . - ' with the same user account. '. + return _('[OpenID](%%doc.openid%%) lets you log into many sites' . + ' with the same user account.'. ' Manage your associated OpenIDs from here.'); } diff --git a/actions/outbox.php b/actions/outbox.php index c8d7f2812..deef1cc87 100644 --- a/actions/outbox.php +++ b/actions/outbox.php @@ -63,6 +63,17 @@ class OutboxAction extends MailboxAction } /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'outbox', array('nickname' => $this->user->nickname)); + } + + /** * retrieve the messages for this user and this page * * Does a query for the right messages diff --git a/actions/postnotice.php b/actions/postnotice.php index c32d8ca94..3e98b3cd5 100644 --- a/actions/postnotice.php +++ b/actions/postnotice.php @@ -28,7 +28,7 @@ class PostnoticeAction extends Action parent::handle($args); try { common_remove_magic_from_request(); - $req = OAuthRequest::from_request(); + $req = OAuthRequest::from_request('POST', common_local_url('postnotice')); # Note: server-to-server function! $server = omb_oauth_server(); list($consumer, $token) = $server->verify_request($req); diff --git a/actions/public.php b/actions/public.php index 27153f131..d2f9da646 100644 --- a/actions/public.php +++ b/actions/public.php @@ -136,6 +136,17 @@ class PublicAction extends Action } /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'public'); + } + + /** * Extra head elements * * We include a <meta> element linking to the publicxrds page, for OpenID diff --git a/actions/recoverpassword.php b/actions/recoverpassword.php index 620fe7eb8..82263fcd5 100644 --- a/actions/recoverpassword.php +++ b/actions/recoverpassword.php @@ -151,11 +151,11 @@ class RecoverpasswordAction extends Action $this->element('p', null, _('If you\'ve forgotten or lost your' . ' password, you can get a new one sent to' . - ' the email address you have stored ' . + ' the email address you have stored' . ' in your account.')); } else if ($this->mode == 'reset') { $this->element('p', null, - _('You\'ve been identified. Enter a ' . + _('You\'ve been identified. Enter a' . ' new password below. ')); } $this->elementEnd('div'); diff --git a/actions/replies.php b/actions/replies.php index eac4d0a3a..dfb520d64 100644 --- a/actions/replies.php +++ b/actions/replies.php @@ -139,6 +139,17 @@ class RepliesAction extends Action } /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'replies', array('nickname' => $this->user->nickname)); + } + + /** * show the personal group nav * * @return void diff --git a/actions/requesttoken.php b/actions/requesttoken.php index fb577fdd5..9507e3d6c 100644 --- a/actions/requesttoken.php +++ b/actions/requesttoken.php @@ -69,7 +69,7 @@ class RequesttokenAction extends Action parent::handle($args); try { common_remove_magic_from_request(); - $req = OAuthRequest::from_request(); + $req = OAuthRequest::from_request('POST', common_local_url('requesttoken')); $server = omb_oauth_server(); $token = $server->fetch_request_token($req); print $token; diff --git a/actions/showfavorites.php b/actions/showfavorites.php index e8cf1cb01..eed62a2ab 100644 --- a/actions/showfavorites.php +++ b/actions/showfavorites.php @@ -74,9 +74,9 @@ class ShowfavoritesAction extends Action function title() { if ($this->page == 1) { - return sprintf(_("%s favorite notices"), $this->user->nickname); + return sprintf(_("%s's favorite notices"), $this->user->nickname); } else { - return sprintf(_("%s favorite notices, page %d"), + return sprintf(_("%s's favorite notices, page %d"), $this->user->nickname, $this->page); } @@ -151,6 +151,18 @@ class ShowfavoritesAction extends Action } /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'showfavorites', array('nickname' => $this->user->nickname)); + } + + + /** * show the personal group nav * * @return void diff --git a/actions/showgroup.php b/actions/showgroup.php index 7e86a79f1..a7df39727 100644 --- a/actions/showgroup.php +++ b/actions/showgroup.php @@ -35,7 +35,7 @@ if (!defined('LACONICA')) { require_once INSTALLDIR.'/lib/noticelist.php'; require_once INSTALLDIR.'/lib/feedlist.php'; -define('MEMBERS_PER_SECTION', 81); +define('MEMBERS_PER_SECTION', 27); /** * Group main page @@ -312,6 +312,17 @@ class ShowgroupAction extends Action } /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'showgroup', array('nickname' => $this->group->nickname)); + } + + /** * Fill in the sidebar. * * @return void @@ -350,7 +361,7 @@ class ShowgroupAction extends Action $this->element('p', null, _('(None)')); } - if ($cnt == MEMBERS_PER_SECTION) { + if ($cnt > MEMBERS_PER_SECTION) { $this->element('a', array('href' => common_local_url('groupmembers', array('nickname' => $this->group->nickname))), _('All members')); diff --git a/actions/showstream.php b/actions/showstream.php index c1a2c337a..82665e5b8 100644 --- a/actions/showstream.php +++ b/actions/showstream.php @@ -135,6 +135,17 @@ class ShowstreamAction extends ProfileAction sprintf(_('FOAF for %s'), $this->user->nickname))); } + /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'showstream', array('nickname' => $this->user->nickname)); + } + function extraHead() { // for remote subscriptions etc. diff --git a/actions/subscribers.php b/actions/subscribers.php index d91a7d4fd..4482de9a7 100644 --- a/actions/subscribers.php +++ b/actions/subscribers.php @@ -118,6 +118,16 @@ class SubscribersAction extends GalleryAction $this->raw(common_markup_to_html($message)); $this->elementEnd('div'); } + + function showSections() + { + parent::showSections(); + $cloud = new SubscribersPeopleTagCloudSection($this); + $cloud->show(); + + $cloud2 = new SubscribersPeopleSelfTagCloudSection($this); + $cloud2->show(); + } } class SubscribersList extends ProfileList diff --git a/actions/subscriptions.php b/actions/subscriptions.php index e6f3c54db..095b18ad8 100644 --- a/actions/subscriptions.php +++ b/actions/subscriptions.php @@ -125,6 +125,16 @@ class SubscriptionsAction extends GalleryAction $this->raw(common_markup_to_html($message)); $this->elementEnd('div'); } + + function showSections() + { + parent::showSections(); + $cloud = new SubscriptionsPeopleTagCloudSection($this); + $cloud->show(); + + $cloud2 = new SubscriptionsPeopleSelfTagCloudSection($this); + $cloud2->show(); + } } class SubscriptionsList extends ProfileList diff --git a/actions/tag.php b/actions/tag.php index 7f82c2a58..02f3e3522 100644 --- a/actions/tag.php +++ b/actions/tag.php @@ -45,6 +45,13 @@ class TagAction extends Action return true; } + function showSections() + { + $pop = new PopularNoticeSection($this); + $pop->show(); + } + + function title() { if ($this->page == 1) { @@ -70,6 +77,17 @@ class TagAction extends Action sprintf(_('Feed for tag %s'), $this->tag))); } + /** + * Output document relationship links + * + * @return void + */ + function showRelationshipLinks() + { + $this->sequenceRelationships($this->page > 1, $this->count > NOTICES_PER_PAGE, // FIXME + $this->page, 'tag', array('tag' => $this->tag)); + } + function showPageNotice() { return sprintf(_('Messages tagged "%s", most recent first'), $this->tag); diff --git a/actions/twitapifriendships.php b/actions/twitapifriendships.php index c50c5e84a..2f8250e0d 100644 --- a/actions/twitapifriendships.php +++ b/actions/twitapifriendships.php @@ -133,11 +133,7 @@ class TwitapifriendshipsAction extends TwitterapiAction return; } - if ($user_a->isSubscribed($user_b)) { - $result = 'true'; - } else { - $result = 'false'; - } + $result = $user_a->isSubscribed($user_b); switch ($apidata['content-type']) { case 'xml': diff --git a/actions/twitapistatuses.php b/actions/twitapistatuses.php index 323c4f1f8..3abeba367 100644 --- a/actions/twitapistatuses.php +++ b/actions/twitapistatuses.php @@ -144,10 +144,10 @@ class TwitapistatusesAction extends TwitterapiAction break; case 'atom': if (isset($apidata['api_arg'])) { - $selfuri = $selfuri = common_root_url() . + $selfuri = common_root_url() . 'api/statuses/friends_timeline/' . $apidata['api_arg'] . '.atom'; } else { - $selfuri = $selfuri = common_root_url() . + $selfuri = common_root_url() . 'api/statuses/friends_timeline.atom'; } $this->show_atom_timeline($notice, $title, $id, $link, $subtitle, null, $selfuri); @@ -231,10 +231,10 @@ class TwitapistatusesAction extends TwitterapiAction break; case 'atom': if (isset($apidata['api_arg'])) { - $selfuri = $selfuri = common_root_url() . + $selfuri = common_root_url() . 'api/statuses/user_timeline/' . $apidata['api_arg'] . '.atom'; } else { - $selfuri = $selfuri = common_root_url() . + $selfuri = common_root_url() . 'api/statuses/user_timeline.atom'; } $this->show_atom_timeline($notice, $title, $id, $link, $subtitle, $suplink, $selfuri); @@ -344,7 +344,7 @@ class TwitapistatusesAction extends TwitterapiAction $this->show($args, $apidata); } - function replies($args, $apidata) + function mentions($args, $apidata) { parent::handle($args); @@ -360,11 +360,13 @@ class TwitapistatusesAction extends TwitterapiAction $profile = $user->getProfile(); $sitename = common_config('site', 'name'); - $title = sprintf(_('%1$s / Updates replying to %2$s'), $sitename, $user->nickname); + $title = sprintf(_('%1$s / Updates mentioning %2$s'), + $sitename, $user->nickname); $taguribase = common_config('integration', 'taguri'); - $id = "tag:$taguribase:Replies:".$user->id; + $id = "tag:$taguribase:Mentions:".$user->id; $link = common_local_url('replies', array('nickname' => $user->nickname)); - $subtitle = sprintf(_('%1$s updates that reply to updates from %2$s / %3$s.'), $sitename, $user->nickname, $profile->getBestName()); + $subtitle = sprintf(_('%1$s updates that reply to updates from %2$s / %3$s.'), + $sitename, $user->nickname, $profile->getBestName()); if (!$page) { $page = 1; @@ -385,7 +387,8 @@ class TwitapistatusesAction extends TwitterapiAction $since = strtotime($this->arg('since')); - $notice = $user->getReplies((($page-1)*20), $count, $since_id, $before_id, $since); + $notice = $user->getReplies((($page-1)*20), + $count, $since_id, $before_id, $since); $notices = array(); while ($notice->fetch()) { @@ -400,14 +403,10 @@ class TwitapistatusesAction extends TwitterapiAction $this->show_rss_timeline($notices, $title, $link, $subtitle); break; case 'atom': - if (isset($apidata['api_arg'])) { - $selfuri = $selfuri = common_root_url() . - 'api/statuses/replies/' . $apidata['api_arg'] . '.atom'; - } else { - $selfuri = $selfuri = common_root_url() . - 'api/statuses/replies.atom'; - } - $this->show_atom_timeline($notices, $title, $id, $link, $subtitle, null, $selfuri); + $selfuri = common_root_url() . + ltrim($_SERVER['QUERY_STRING'], 'p='); + $this->show_atom_timeline($notices, $title, $id, $link, $subtitle, + null, $selfuri); break; case 'json': $this->show_json_timeline($notices); @@ -418,6 +417,11 @@ class TwitapistatusesAction extends TwitterapiAction } + function replies($args, $apidata) + { + call_user_func(array($this, 'mentions'), $args, $apidata); + } + function show($args, $apidata) { parent::handle($args); diff --git a/actions/twitapiusers.php b/actions/twitapiusers.php index 2894b7486..1542cfb33 100644 --- a/actions/twitapiusers.php +++ b/actions/twitapiusers.php @@ -82,8 +82,8 @@ class TwitapiusersAction extends TwitterapiAction $twitter_user['profile_text_color'] = ''; $twitter_user['profile_link_color'] = ''; $twitter_user['profile_sidebar_fill_color'] = ''; - $twitter_user['profile_sidebar_border_color'] = ''; - $twitter_user['profile_background_tile'] = 'false'; + $twitter_user['profile_sidebar_border_color'] = ''; + $twitter_user['profile_background_tile'] = false; $faves = DB_DataObject::factory('fave'); $faves->user_id = $user->id; @@ -103,24 +103,16 @@ class TwitapiusersAction extends TwitterapiAction if (isset($apidata['user'])) { - if ($apidata['user']->isSubscribed($profile)) { - $twitter_user['following'] = 'true'; - } else { - $twitter_user['following'] = 'false'; - } + $twitter_user['following'] = $apidata['user']->isSubscribed($profile); - // Notifications on? - $sub = Subscription::pkeyGet(array('subscriber' => - $apidata['user']->id, 'subscribed' => $profile->id)); + // Notifications on? + $sub = Subscription::pkeyGet(array('subscriber' => + $apidata['user']->id, 'subscribed' => $profile->id)); - if ($sub) { - if ($sub->jabber || $sub->sms) { - $twitter_user['notifications'] = 'true'; - } else { - $twitter_user['notifications'] = 'false'; - } - } - } + if ($sub) { + $twitter_user['notifications'] = ($sub->jabber || $sub->sms); + } + } if ($apidata['content-type'] == 'xml') { $this->init_document('xml'); diff --git a/actions/twittersettings.php b/actions/twittersettings.php index 45725d3ff..0b98eef59 100644 --- a/actions/twittersettings.php +++ b/actions/twittersettings.php @@ -261,7 +261,7 @@ class TwittersettingsAction extends ConnectSettingsAction 'alt' => ($other->fullname) ? $other->fullname : $other->nickname)); - + $this->element('span', 'fn nickname', $other->nickname); $this->elementEnd('a'); $this->elementEnd('li'); @@ -375,6 +375,8 @@ class TwittersettingsAction extends ConnectSettingsAction if ($friendsync) { save_twitter_friends($user, $twit_user->id, $screen_name, $password); + $flink->last_friendsync = common_sql_now(); + $flink->update(); } $this->showForm(_('Twitter settings saved.'), true); diff --git a/actions/updateprofile.php b/actions/updateprofile.php index 7dc52fda9..08cb31ae0 100644 --- a/actions/updateprofile.php +++ b/actions/updateprofile.php @@ -29,7 +29,7 @@ class UpdateprofileAction extends Action parent::handle($args); try { common_remove_magic_from_request(); - $req = OAuthRequest::from_request(); + $req = OAuthRequest::from_request('POST', common_local_url('updateprofile')); # Note: server-to-server function! $server = omb_oauth_server(); list($consumer, $token) = $server->verify_request($req); diff --git a/actions/userauthorization.php b/actions/userauthorization.php index 8723848c7..168019149 100644 --- a/actions/userauthorization.php +++ b/actions/userauthorization.php @@ -97,47 +97,91 @@ class UserauthorizationAction extends Action $location = $params['omb_listenee_location']; $avatar = $params['omb_listenee_avatar']; - $this->elementStart('div', 'profile'); + $this->elementStart('div', array('class' => 'profile')); + $this->elementStart('div', 'entity_profile vcard'); + $this->elementStart('a', array('href' => $profile, + 'class' => 'url')); if ($avatar) { $this->element('img', array('src' => $avatar, - 'class' => 'avatar', + 'class' => 'photo avatar', 'width' => AVATAR_PROFILE_SIZE, 'height' => AVATAR_PROFILE_SIZE, 'alt' => $nickname)); } - $this->element('a', array('href' => $profile, - 'class' => 'external profile nickname'), - $nickname); + $hasFN = ($fullname !== '') ? 'nickname' : 'fn nickname'; + $this->elementStart('span', $hasFN); + $this->raw($nickname); + $this->elementEnd('span'); + $this->elementEnd('a'); + if (!is_null($fullname)) { - $this->elementStart('div', 'fullname'); - if (!is_null($homepage)) { - $this->element('a', array('href' => $homepage), - $fullname); - } else { - $this->text($fullname); - } - $this->elementEnd('div'); + $this->elementStart('dl', 'entity_fn'); + $this->elementStart('dd'); + $this->elementStart('span', 'fn'); + $this->raw($fullname); + $this->elementEnd('span'); + $this->elementEnd('dd'); + $this->elementEnd('dl'); } if (!is_null($location)) { - $this->element('div', 'location', $location); + $this->elementStart('dl', 'entity_location'); + $this->element('dt', null, _('Location')); + $this->elementStart('dd', 'label'); + $this->raw($location); + $this->elementEnd('dd'); + $this->elementEnd('dl'); + } + + if (!is_null($homepage)) { + $this->elementStart('dl', 'entity_url'); + $this->element('dt', null, _('URL')); + $this->elementStart('dd'); + $this->elementStart('a', array('href' => $homepage, + 'class' => 'url')); + $this->raw($homepage); + $this->elementEnd('a'); + $this->elementEnd('dd'); + $this->elementEnd('dl'); } + if (!is_null($bio)) { - $this->element('div', 'bio', $bio); + $this->elementStart('dl', 'entity_note'); + $this->element('dt', null, _('Note')); + $this->elementStart('dd', 'note'); + $this->raw($bio); + $this->elementEnd('dd'); + $this->elementEnd('dl'); + } + + if (!is_null($license)) { + $this->elementStart('dl', 'entity_license'); + $this->element('dt', null, _('License')); + $this->elementStart('dd', 'license'); + $this->element('a', array('href' => $license, + 'class' => 'license'), + $license); + $this->elementEnd('dd'); + $this->elementEnd('dl'); } - $this->elementStart('div', 'license'); - $this->element('a', array('href' => $license, - 'class' => 'license'), - $license); - $this->elementEnd('div'); $this->elementEnd('div'); + + $this->elementStart('div', 'entity_actions'); + $this->elementStart('ul'); + $this->elementStart('li', 'entity_subscribe'); $this->elementStart('form', array('method' => 'post', 'id' => 'userauthorization', + 'class' => 'form_user_authorization', 'name' => 'userauthorization', 'action' => common_local_url('userauthorization'))); $this->hidden('token', common_session_token()); - $this->submit('accept', _('Accept')); - $this->submit('reject', _('Reject')); + + $this->submit('accept', _('Accept'), 'submit accept', null, _('Subscribe to this user')); + $this->submit('reject', _('Reject'), 'submit reject', null, _('Reject this subscription')); $this->elementEnd('form'); + $this->elementEnd('li'); + $this->elementEnd('ul'); + $this->elementEnd('div'); + $this->elementEnd('div'); } function sendAuthorization() diff --git a/classes/Fave.php b/classes/Fave.php index 24df5938c..915b4572f 100644 --- a/classes/Fave.php +++ b/classes/Fave.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Fave extends Memcached_DataObject +class Fave extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -31,9 +31,58 @@ class Fave extends Memcached_DataObject } return $fave; } - + function &pkeyGet($kv) { return Memcached_DataObject::pkeyGet('Fave', $kv); } + + function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE) + { + $ids = Notice::stream(array('Fave', '_streamDirect'), + array($user_id), + 'fave:ids_by_user:'.$user_id, + $offset, $limit); + return $ids; + } + + function _streamDirect($user_id, $offset, $limit, $since_id, $before_id, $since) + { + $fav = new Fave(); + + $fav->user_id = $user_id; + + $fav->selectAdd(); + $fav->selectAdd('notice_id'); + + if ($since_id != 0) { + $fav->whereAdd('notice_id > ' . $since_id); + } + + if ($before_id != 0) { + $fav->whereAdd('notice_id < ' . $before_id); + } + + if (!is_null($since)) { + $fav->whereAdd('modified > \'' . date('Y-m-d H:i:s', $since) . '\''); + } + + // NOTE: we sort by fave time, not by notice time! + + $fav->orderBy('modified DESC'); + + if (!is_null($offset)) { + $fav->limit($offset, $limit); + } + + $ids = array(); + + if ($fav->find()) { + while ($fav->fetch()) { + $ids[] = $fav->notice_id; + } + } + + return $ids; + } } diff --git a/classes/Foreign_link.php b/classes/Foreign_link.php index afc0e2180..af2b3f189 100644 --- a/classes/Foreign_link.php +++ b/classes/Foreign_link.php @@ -17,6 +17,8 @@ class Foreign_link extends Memcached_DataObject public $noticesync; // tinyint(1) not_null default_1 public $friendsync; // tinyint(1) not_null default_2 public $profilesync; // tinyint(1) not_null default_1 + public $last_noticesync; // datetime() + public $last_friendsync; // datetime() public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP diff --git a/classes/Notice.php b/classes/Notice.php index 5fa0d79a1..771a4e715 100644 --- a/classes/Notice.php +++ b/classes/Notice.php @@ -197,7 +197,12 @@ class Notice extends Memcached_DataObject $notice->saveTags(); $notice->saveGroups(); - $notice->addToInboxes(); + if (common_config('queue', 'enabled')) { + $notice->addToAuthorInbox(); + } else { + $notice->addToInboxes(); + } + $notice->query('COMMIT'); Event::handle('EndNoticeSave', array($notice)); @@ -207,7 +212,11 @@ class Notice extends Memcached_DataObject # XXX: someone clever could prepend instead of clearing the cache if (common_config('memcached', 'enabled')) { - $notice->blowCaches(); + if (common_config('queue', 'enabled')) { + $notice->blowAuthorCaches(); + } else { + $notice->blowCaches(); + } } return $notice; @@ -271,6 +280,17 @@ class Notice extends Memcached_DataObject $this->blowGroupCache($blowLast); } + function blowAuthorCaches($blowLast=false) + { + // Clear the user's cache + $cache = common_memcache(); + if (!empty($cache)) { + $cache->delete(common_cache_key('notice_inbox:by_user:'.$this->profile_id)); + } + $this->blowNoticeCache($blowLast); + $this->blowPublicCache($blowLast); + } + function blowGroupCache($blowLast=false) { $cache = common_memcache(); @@ -279,17 +299,17 @@ class Notice extends Memcached_DataObject $group_inbox->notice_id = $this->id; if ($group_inbox->find()) { while ($group_inbox->fetch()) { - $cache->delete(common_cache_key('group:notices:'.$group_inbox->group_id)); + $cache->delete(common_cache_key('user_group:notice_ids:' . $group_inbox->group_id)); if ($blowLast) { - $cache->delete(common_cache_key('group:notices:'.$group_inbox->group_id.';last')); + $cache->delete(common_cache_key('user_group:notice_ids:' . $group_inbox->group_id.';last')); } $member = new Group_member(); $member->group_id = $group_inbox->group_id; if ($member->find()) { while ($member->fetch()) { - $cache->delete(common_cache_key('user:notices_with_friends:' . $member->profile_id)); + $cache->delete(common_cache_key('notice_inbox:by_user:' . $member->profile_id)); if ($blowLast) { - $cache->delete(common_cache_key('user:notices_with_friends:' . $member->profile_id . ';last')); + $cache->delete(common_cache_key('notice_inbox:by_user:' . $member->profile_id . ';last')); } } } @@ -308,10 +328,7 @@ class Notice extends Memcached_DataObject $tag->notice_id = $this->id; if ($tag->find()) { while ($tag->fetch()) { - $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag)); - if ($blowLast) { - $cache->delete(common_cache_key('notice_tag:notice_stream:' . $tag->tag . ';last')); - } + $tag->blowCache($blowLast); } } $tag->free(); @@ -332,9 +349,9 @@ class Notice extends Memcached_DataObject 'WHERE subscription.subscribed = ' . $this->profile_id); while ($user->fetch()) { - $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id)); + $cache->delete(common_cache_key('notice_inbox:by_user:'.$user->id)); if ($blowLast) { - $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id . ';last')); + $cache->delete(common_cache_key('notice_inbox:by_user:'.$user->id.';last')); } } $user->free(); @@ -346,10 +363,10 @@ class Notice extends Memcached_DataObject { if ($this->is_local) { $cache = common_memcache(); - if ($cache) { - $cache->delete(common_cache_key('profile:notices:'.$this->profile_id)); + if (!empty($cache)) { + $cache->delete(common_cache_key('profile:notice_ids:'.$this->profile_id)); if ($blowLast) { - $cache->delete(common_cache_key('profile:notices:'.$this->profile_id.';last')); + $cache->delete(common_cache_key('profile:notice_ids:'.$this->profile_id.';last')); } } } @@ -363,9 +380,9 @@ class Notice extends Memcached_DataObject $reply->notice_id = $this->id; if ($reply->find()) { while ($reply->fetch()) { - $cache->delete(common_cache_key('user:replies:'.$reply->profile_id)); + $cache->delete(common_cache_key('reply:stream:'.$reply->profile_id)); if ($blowLast) { - $cache->delete(common_cache_key('user:replies:'.$reply->profile_id.';last')); + $cache->delete(common_cache_key('reply:stream:'.$reply->profile_id.';last')); } } } @@ -395,9 +412,9 @@ class Notice extends Memcached_DataObject $fave->notice_id = $this->id; if ($fave->find()) { while ($fave->fetch()) { - $cache->delete(common_cache_key('user:faves:'.$fave->user_id)); + $cache->delete(common_cache_key('fave:ids_by_user:'.$fave->user_id)); if ($blowLast) { - $cache->delete(common_cache_key('user:faves:'.$fave->user_id.';last')); + $cache->delete(common_cache_key('fave:ids_by_user:'.$fave->user_id.';last')); } } } @@ -593,27 +610,80 @@ class Notice extends Memcached_DataObject return $wrapper; } + function getStreamByIds($ids) + { + $cache = common_memcache(); + + if (!empty($cache)) { + $notices = array(); + foreach ($ids as $id) { + $notices[] = Notice::staticGet('id', $id); + } + return new ArrayWrapper($notices); + } else { + $notice = new Notice(); + $notice->whereAdd('id in (' . implode(', ', $ids) . ')'); + $notice->orderBy('id DESC'); + + $notice->find(); + return $notice; + } + } + function publicStream($offset=0, $limit=20, $since_id=0, $before_id=0, $since=null) { + $ids = Notice::stream(array('Notice', '_publicStreamDirect'), + array(), + 'public', + $offset, $limit, $since_id, $before_id, $since); + + return Notice::getStreamByIds($ids); + } + + function _publicStreamDirect($offset=0, $limit=20, $since_id=0, $before_id=0, $since=null) + { + $notice = new Notice(); + + $notice->selectAdd(); // clears it + $notice->selectAdd('id'); - $parts = array(); + $notice->orderBy('id DESC'); - $qry = 'SELECT * FROM notice '; + if (!is_null($offset)) { + $notice->limit($offset, $limit); + } if (common_config('public', 'localonly')) { - $parts[] = 'is_local = 1'; + $notice->whereAdd('is_local = 1'); } else { # -1 == blacklisted - $parts[] = 'is_local != -1'; + $notice->whereAdd('is_local != -1'); } - if ($parts) { - $qry .= ' WHERE ' . implode(' AND ', $parts); + if ($since_id != 0) { + $notice->whereAdd('id > ' . $since_id); } - return Notice::getStream($qry, - 'public', - $offset, $limit, $since_id, $before_id, null, $since); + if ($before_id != 0) { + $notice->whereAdd('id < ' . $before_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; } function addToInboxes() @@ -639,6 +709,33 @@ class Notice extends Memcached_DataObject return; } + function addToAuthorInbox() + { + $enabled = common_config('inboxes', 'enabled'); + + if ($enabled === true || $enabled === 'transitional') { + $user = User::staticGet('id', $this->profile_id); + if (empty($user)) { + return; + } + $inbox = new Notice_inbox(); + $UT = common_config('db','type')=='pgsql'?'"user"':'user'; + $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created) ' . + "SELECT $UT.id, " . $this->id . ", '" . $this->created . "' " . + "FROM $UT " . + "WHERE $UT.id = " . $this->profile_id . ' ' . + 'AND NOT EXISTS (SELECT user_id, notice_id ' . + 'FROM notice_inbox ' . + "WHERE user_id = " . $this->profile_id . ' '. + 'AND notice_id = ' . $this->id . ' )'; + if ($enabled === 'transitional') { + $qry .= " AND $UT.inboxed = 1"; + } + $inbox->query($qry); + } + return; + } + function saveGroups() { $enabled = common_config('inboxes', 'enabled'); @@ -691,24 +788,29 @@ class Notice extends Memcached_DataObject // FIXME: do this in an offline daemon - $inbox = new Notice_inbox(); - $UT = common_config('db','type')=='pgsql'?'"user"':'user'; - $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created, source) ' . - "SELECT $UT.id, " . $this->id . ", '" . $this->created . "', 2 " . - "FROM $UT JOIN group_member ON $UT.id = group_member.profile_id " . - 'WHERE group_member.group_id = ' . $group->id . ' ' . - 'AND NOT EXISTS (SELECT user_id, notice_id ' . - 'FROM notice_inbox ' . - "WHERE user_id = $UT.id " . - 'AND notice_id = ' . $this->id . ' )'; - if ($enabled === 'transitional') { - $qry .= " AND $UT.inboxed = 1"; - } - $result = $inbox->query($qry); + $this->addToGroupInboxes($group); } } } + function addToGroupInboxes($group) + { + $inbox = new Notice_inbox(); + $UT = common_config('db','type')=='pgsql'?'"user"':'user'; + $qry = 'INSERT INTO notice_inbox (user_id, notice_id, created, source) ' . + "SELECT $UT.id, " . $this->id . ", '" . $this->created . "', 2 " . + "FROM $UT JOIN group_member ON $UT.id = group_member.profile_id " . + 'WHERE group_member.group_id = ' . $group->id . ' ' . + 'AND NOT EXISTS (SELECT user_id, notice_id ' . + 'FROM notice_inbox ' . + "WHERE user_id = $UT.id " . + 'AND notice_id = ' . $this->id . ' )'; + if ($enabled === 'transitional') { + $qry .= " AND $UT.inboxed = 1"; + } + $result = $inbox->query($qry); + } + function saveReplies() { // Alternative reply format @@ -895,4 +997,59 @@ class Notice extends Memcached_DataObject array('notice' => $this->id)); } } + + function stream($fn, $args, $cachekey, $offset=0, $limit=20, $since_id=0, $before_id=0, $since=null) + { + $cache = common_memcache(); + + if (empty($cache) || + $since_id != 0 || $before_id != 0 || !is_null($since) || + ($offset + $limit) > NOTICE_CACHE_WINDOW) { + return call_user_func_array($fn, array_merge($args, array($offset, $limit, $since_id, + $before_id, $since))); + } + + $idkey = common_cache_key($cachekey); + + $idstr = $cache->get($idkey); + + if (!empty($idstr)) { + // Cache hit! Woohoo! + $window = explode(',', $idstr); + $ids = array_slice($window, $offset, $limit); + return $ids; + } + + $laststr = $cache->get($idkey.';last'); + + if (!empty($laststr)) { + $window = explode(',', $laststr); + $last_id = $window[0]; + $new_ids = call_user_func_array($fn, array_merge($args, array(0, NOTICE_CACHE_WINDOW, + $last_id, 0, null))); + + $new_window = array_merge($new_ids, $window); + + $new_windowstr = implode(',', $new_window); + + $result = $cache->set($idkey, $new_windowstr); + $result = $cache->set($idkey . ';last', $new_windowstr); + + $ids = array_slice($new_window, $offset, $limit); + + return $ids; + } + + $window = call_user_func_array($fn, array_merge($args, array(0, NOTICE_CACHE_WINDOW, + 0, 0, null))); + + $windowstr = implode(',', $window); + + $result = $cache->set($idkey, $windowstr); + $result = $cache->set($idkey . ';last', $windowstr); + + $ids = array_slice($window, $offset, $limit); + + return $ids; + } } diff --git a/classes/Notice_inbox.php b/classes/Notice_inbox.php index 81ddb4538..dec14b0d1 100644 --- a/classes/Notice_inbox.php +++ b/classes/Notice_inbox.php @@ -1,7 +1,7 @@ <?php /* * Laconica - a distributed open-source microblogging tool - * Copyright (C) 2008, Controlez-Vous, Inc. + * Copyright (C) 2008, 2009, Control Yourself, 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 @@ -21,7 +21,11 @@ if (!defined('LACONICA')) { exit(1); } require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Notice_inbox extends Memcached_DataObject +// We keep 5 pages of inbox notices in memcache, +1 for pagination check + +define('INBOX_CACHE_WINDOW', 101); + +class Notice_inbox extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -38,4 +42,47 @@ class Notice_inbox extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + function stream($user_id, $offset, $limit, $since_id, $before_id, $since) + { + return Notice::stream(array('Notice_inbox', '_streamDirect'), + array($user_id), + 'notice_inbox:by_user:'.$user_id, + $offset, $limit, $since_id, $before_id, $since); + } + + function _streamDirect($user_id, $offset, $limit, $since_id, $before_id, $since) + { + $inbox = new Notice_inbox(); + + $inbox->user_id = $user_id; + + if ($since_id != 0) { + $inbox->whereAdd('notice_id > ' . $since_id); + } + + if ($before_id != 0) { + $inbox->whereAdd('notice_id < ' . $before_id); + } + + if (!is_null($since)) { + $inbox->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\''); + } + + $inbox->orderBy('notice_id DESC'); + + if (!is_null($offset)) { + $inbox->limit($offset, $limit); + } + + $ids = array(); + + if ($inbox->find()) { + while ($inbox->fetch()) { + $ids[] = $inbox->notice_id; + } + } + + return $ids; + } } diff --git a/classes/Notice_tag.php b/classes/Notice_tag.php index f2247299a..e5b772243 100644 --- a/classes/Notice_tag.php +++ b/classes/Notice_tag.php @@ -37,21 +37,62 @@ class Notice_tag extends Memcached_DataObject ###END_AUTOCODE static function getStream($tag, $offset=0, $limit=20) { - $qry = - 'SELECT notice.* ' . - 'FROM notice JOIN notice_tag ON notice.id = notice_tag.notice_id ' . - "WHERE notice_tag.tag = '%s' "; - - return Notice::getStream(sprintf($qry, $tag), - 'notice_tag:notice_stream:' . common_keyize($tag), - $offset, $limit); + + $ids = Notice::stream(array('Notice_tag', '_streamDirect'), + array($tag), + 'notice_tag:notice_ids:' . common_keyize($tag), + $offset, $limit); + + return Notice::getStreamByIds($ids); + } + + function _streamDirect($tag, $offset, $limit, $since_id, $before_id, $since) + { + $nt = new Notice_tag(); + + $nt->tag = $tag; + + $nt->selectAdd(); + $nt->selectAdd('notice_id'); + + if ($since_id != 0) { + $nt->whereAdd('notice_id > ' . $since_id); + } + + if ($before_id != 0) { + $nt->whereAdd('notice_id < ' . $before_id); + } + + if (!is_null($since)) { + $nt->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\''); + } + + $nt->orderBy('notice_id DESC'); + + if (!is_null($offset)) { + $nt->limit($offset, $limit); + } + + $ids = array(); + + if ($nt->find()) { + while ($nt->fetch()) { + $ids[] = $nt->notice_id; + } + } + + return $ids; } - function blowCache() + function blowCache($blowLast=false) { $cache = common_memcache(); if ($cache) { - $cache->delete(common_cache_key('notice_tag:notice_stream:' . $this->tag)); + $idkey = common_cache_key('notice_tag:notice_ids:' . common_keyize($this->tag)); + $cache->delete($idkey); + if ($blowLast) { + $cache->delete($idkey.';last'); + } } } diff --git a/classes/Profile.php b/classes/Profile.php index f3bfe299c..ae5641d79 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -155,14 +155,51 @@ class Profile extends Memcached_DataObject function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) { - $qry = - 'SELECT * ' . - 'FROM notice ' . - 'WHERE profile_id = %d '; - - return Notice::getStream(sprintf($qry, $this->id), - 'profile:notices:'.$this->id, - $offset, $limit, $since_id, $before_id); + // XXX: I'm not sure this is going to be any faster. It probably isn't. + $ids = Notice::stream(array($this, '_streamDirect'), + array(), + 'profile:notice_ids:' . $this->id, + $offset, $limit, $since_id, $before_id); + + return Notice::getStreamByIds($ids); + } + + function _streamDirect($offset, $limit, $since_id, $before_id, $since) + { + $notice = new Notice(); + + $notice->profile_id = $this->id; + + $notice->selectAdd(); + $notice->selectAdd('id'); + + if ($since_id != 0) { + $notice->whereAdd('id > ' . $since_id); + } + + if ($before_id != 0) { + $notice->whereAdd('id < ' . $before_id); + } + + if (!is_null($since)) { + $notice->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\''); + } + + $notice->orderBy('id DESC'); + + if (!is_null($offset)) { + $notice->limit($offset, $limit); + } + + $ids = array(); + + if ($notice->find()) { + while ($notice->fetch()) { + $ids[] = $notice->id; + } + } + + return $ids; } function isMember($group) diff --git a/classes/Reply.php b/classes/Reply.php index af86aaf87..4439053b4 100644 --- a/classes/Reply.php +++ b/classes/Reply.php @@ -4,7 +4,7 @@ */ require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; -class Reply extends Memcached_DataObject +class Reply extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -13,7 +13,7 @@ class Reply extends Memcached_DataObject public $notice_id; // int(4) primary_key not_null public $profile_id; // int(4) primary_key not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP - public $replied_id; // int(4) + public $replied_id; // int(4) /* Static get */ function staticGet($k,$v=null) @@ -21,4 +21,47 @@ class Reply extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + function stream($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null) + { + $ids = Notice::stream(array('Reply', '_streamDirect'), + array($user_id), + 'reply:stream:' . $user_id, + $offset, $limit, $since_id, $before_id, $since); + return $ids; + } + + function _streamDirect($user_id, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null) + { + $reply = new Reply(); + $reply->profile_id = $user_id; + + if ($since_id != 0) { + $reply->whereAdd('notice_id > ' . $since_id); + } + + if ($before_id != 0) { + $reply->whereAdd('notice_id < ' . $before_id); + } + + if (!is_null($since)) { + $reply->whereAdd('modified > \'' . date('Y-m-d H:i:s', $since) . '\''); + } + + $reply->orderBy('notice_id DESC'); + + if (!is_null($offset)) { + $reply->limit($offset, $limit); + } + + $ids = array(); + + if ($reply->find()) { + while ($reply->fetch()) { + $ids[] = $reply->notice_id; + } + } + + return $ids; + } } diff --git a/classes/User.php b/classes/User.php index 3b9b5cd83..b5ac7b220 100644 --- a/classes/User.php +++ b/classes/User.php @@ -349,30 +349,31 @@ class User extends Memcached_DataObject $cache = common_memcache(); // XXX: Kind of a hack. + if ($cache) { // This is the stream of favorite notices, in rev chron // order. This forces it into cache. - $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW); - $cnt = 0; - while ($faves->fetch()) { - if ($faves->id < $notice->id) { - // If we passed it, it's not a fave - return false; - } else if ($faves->id == $notice->id) { - // If it matches a cached notice, then it's a fave - return true; - } - $cnt++; + + $ids = Fave::stream($this->id, 0, NOTICE_CACHE_WINDOW); + + // If it's in the list, then it's a fave + + if (in_array($notice->id, $ids)) { + return true; } + // If we're not past the end of the cache window, // then the cache has all available faves, so this one // is not a fave. - if ($cnt < NOTICE_CACHE_WINDOW) { + + if (count($ids) < NOTICE_CACHE_WINDOW) { return false; } + // Otherwise, cache doesn't have all faves; // fall through to the default } + $fave = Fave::pkeyGet(array('user_id' => $this->id, 'notice_id' => $notice->id)); return ((is_null($fave)) ? false : true); @@ -401,13 +402,9 @@ class User extends Memcached_DataObject function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null) { - $qry = - 'SELECT notice.* ' . - 'FROM notice JOIN reply ON notice.id = reply.notice_id ' . - 'WHERE reply.profile_id = %d '; - return Notice::getStream(sprintf($qry, $this->id), - 'user:replies:'.$this->id, - $offset, $limit, $since_id, $before_id, null, $since); + $ids = Reply::stream($this->id, $offset, $limit, $since_id, $before_id, $since); + common_debug("Ids = " . implode(',', $ids)); + return Notice::getStreamByIds($ids); } function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null) @@ -422,13 +419,8 @@ class User extends Memcached_DataObject function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE) { - $qry = - 'SELECT notice.* ' . - 'FROM notice JOIN fave ON notice.id = fave.notice_id ' . - 'WHERE fave.user_id = %d '; - return Notice::getStream(sprintf($qry, $this->id), - 'user:faves:'.$this->id, - $offset, $limit); + $ids = Fave::stream($this->id, $offset, $limit); + return Notice::getStreamByIds($ids); } function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0, $since=null) @@ -444,21 +436,17 @@ class User extends Memcached_DataObject 'SELECT notice.* ' . 'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' . 'WHERE subscription.subscriber = %d '; - $order = null; + return Notice::getStream(sprintf($qry, $this->id), + 'user:notices_with_friends:' . $this->id, + $offset, $limit, $since_id, $before_id, + $order, $since); } else if ($enabled === true || ($enabled == 'transitional' && $this->inboxed == 1)) { - $qry = - 'SELECT notice.* ' . - 'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' . - 'WHERE notice_inbox.user_id = %d '; - // NOTE: we override ORDER - $order = null; - } - return Notice::getStream(sprintf($qry, $this->id), - 'user:notices_with_friends:' . $this->id, - $offset, $limit, $since_id, $before_id, - $order, $since); + $ids = Notice_inbox::stream($this->id, $offset, $limit, $since_id, $before_id, $since); + + return Notice::getStreamByIds($ids); + } } function blowFavesCache() @@ -467,8 +455,8 @@ class User extends Memcached_DataObject if ($cache) { // Faves don't happen chronologically, so we need to blow // ;last cache, too - $cache->delete(common_cache_key('user:faves:'.$this->id)); - $cache->delete(common_cache_key('user:faves:'.$this->id).';last'); + $cache->delete(common_cache_key('fave:ids_by_user:'.$this->id)); + $cache->delete(common_cache_key('fave:ids_by_user:'.$this->id.';last')); } } diff --git a/classes/User_group.php b/classes/User_group.php index d152f9d56..7cc31e702 100755 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -50,13 +50,50 @@ class User_group extends Memcached_DataObject function getNotices($offset, $limit) { - $qry = - 'SELECT notice.* ' . - 'FROM notice JOIN group_inbox ON notice.id = group_inbox.notice_id ' . - 'WHERE group_inbox.group_id = %d '; - return Notice::getStream(sprintf($qry, $this->id), - 'group:notices:'.$this->id, - $offset, $limit); + $ids = Notice::stream(array($this, '_streamDirect'), + array(), + 'user_group:notice_ids:' . $this->id, + $offset, $limit); + + return Notice::getStreamByIds($ids); + } + + function _streamDirect($offset, $limit, $since_id, $before_id, $since) + { + $inbox = new Group_inbox(); + + $inbox->group_id = $this->id; + + $inbox->selectAdd(); + $inbox->selectAdd('notice_id'); + + if ($since_id != 0) { + $inbox->whereAdd('notice_id > ' . $since_id); + } + + if ($before_id != 0) { + $inbox->whereAdd('notice_id < ' . $before_id); + } + + if (!is_null($since)) { + $inbox->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\''); + } + + $inbox->orderBy('notice_id DESC'); + + if (!is_null($offset)) { + $inbox->limit($offset, $limit); + } + + $ids = array(); + + if ($inbox->find()) { + while ($inbox->fetch()) { + $ids[] = $inbox->notice_id; + } + } + + return $ids; } function allowedNickname($nickname) @@ -91,7 +128,7 @@ class User_group extends Memcached_DataObject function setOriginal($filename) { $imagefile = new ImageFile($this->id, Avatar::path($filename)); - + $orig = clone($this); $this->original_logo = Avatar::url($filename); $this->homepage_logo = Avatar::url($imagefile->resize(AVATAR_PROFILE_SIZE)); diff --git a/classes/laconica.ini b/classes/laconica.ini index 529454d99..c05419588 100755 --- a/classes/laconica.ini +++ b/classes/laconica.ini @@ -55,6 +55,8 @@ credentials = 2 noticesync = 145 friendsync = 145 profilesync = 145 +last_noticesync = 14 +last_friendsync = 14 created = 142 modified = 384 diff --git a/config.php.sample b/config.php.sample index 0a01552fe..e70d9ab46 100644 --- a/config.php.sample +++ b/config.php.sample @@ -30,6 +30,8 @@ $config['site']['path'] = 'laconica'; #$config['site']['closed'] = true; #Only allow registration for people invited by another user #$config['site']['inviteonly'] = true; +#Make the site invisible to non-logged-in users +#$config['site']['private'] = true; # If you want logging sent to a file instead of syslog #$config['site']['logfile'] = '/tmp/laconica.log'; diff --git a/db/laconica.sql b/db/laconica.sql index a790a3fd2..c9730098e 100644 --- a/db/laconica.sql +++ b/db/laconica.sql @@ -117,6 +117,7 @@ create table notice ( index notice_profile_id_idx (profile_id), index notice_created_idx (created), + index notice_replyto_idx (reply_to), FULLTEXT(content) ) ENGINE=MyISAM CHARACTER SET utf8 COLLATE utf8_general_ci; @@ -288,6 +289,8 @@ create table foreign_link ( noticesync tinyint not null default 1 comment 'notice synchronization, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies', friendsync tinyint not null default 2 comment 'friend synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', profilesync tinyint not null default 1 comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming', + last_noticesync datetime default null comment 'last time notices were imported', + last_friendsync datetime default null comment 'last time friends were imported', created datetime not null comment 'date this record was created', modified timestamp comment 'date this record was modified', diff --git a/db/laconica_pg.sql b/db/laconica_pg.sql index f879d7936..a27a616f2 100644 --- a/db/laconica_pg.sql +++ b/db/laconica_pg.sql @@ -291,6 +291,8 @@ create table foreign_link ( noticesync int not null default 1 /* comment 'notice synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies' */,
friendsync int not null default 2 /* comment 'friend synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming */,
profilesync int not null default 1 /* comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming' */,
+ last_noticesync timestamp default null /* comment 'last time notices were imported' */,
+ last_friendsync timestamp default null /* comment 'last time friends were imported' */,
created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */,
modified timestamp /* comment 'date this record was modified' */,
diff --git a/db/notice_source.sql b/db/notice_source.sql index 76aadc673..ac73d3d13 100644 --- a/db/notice_source.sql +++ b/db/notice_source.sql @@ -1,30 +1,36 @@ INSERT INTO notice_source (code, name, url, created) VALUES + ('adium', 'Adium', 'http://www.adiumx.com/', now()), + ('AgentSolo.com','AgentSolo.com','http://www.agentsolo.com/', now()), + ('betwittered','BeTwittered','http://www.32hours.com/betwitteredinfo/', now()), + ('bti','bti','http://gregkh.github.com/bti/', now()), + ('cliqset', 'Cliqset', 'http://www.cliqset.com/', now()), + ('deskbar','Deskbar-Applet','http://www.gnome.org/projects/deskbar-applet/', now()), ('Do','Gnome Do','http://do.davebsd.com/wiki/index.php?title=Microblog_Plugin', now()), + ('eventbox','EventBox','http://thecosmicmachine.com/eventbox/ ', now()), ('Facebook','Facebook','http://apps.facebook.com/identica/', now()), + ('feed2omb','feed2omb','http://projects.ciarang.com/p/feed2omb/', now()), + ('gravity', 'Gravity', 'http://mobileways.de/gravity', now()), ('Gwibber','Gwibber','http://launchpad.net/gwibber', now()), ('HelloTxt','HelloTxt','http://hellotxt.com/', now()), - ('IdentiFox','IdentiFox','http://www.bitbucket.org/uncryptic/identifox/', now()), - ('LaTwit','LaTwit','http://latwit.mac65.com/', now()), - ('Nambu','Nambu','http://www.nambu.com/', now()), - ('Pikchur','Pikchur','http://www.pikchur.com/', now()), - ('Ping.fm','Ping.fm','http://ping.fm/', now()), - ('Twidge','Twidge','http://software.complete.org/twidge', now()), - ('Updating.Me','Updating.Me','http://updating.me/', now()), - ('betwittered','BeTwittered','http://www.32hours.com/betwitteredinfo/', now()), - ('bti','bti','http://gregkh.github.com/bti/', now()), - ('deskbar','Deskbar-Applet','http://www.gnome.org/projects/deskbar-applet/', now()), ('identicatools','Laconica Tools','http://bitbucketlabs.net/laconica-tools/', now()), ('identichat','identichat','http://identichat.prosody.im/', now()), + ('IdentiFox','IdentiFox','http://www.bitbucket.org/uncryptic/identifox/', now()), ('identitwitch','IdentiTwitch','http://richfish.org/identitwitch/', now()), + ('LaTwit','LaTwit','http://latwit.mac65.com/', now()), ('maisha', 'Maisha', 'http://maisha.grango.org/', now()), ('mbpidgin','mbpidgin','http://code.google.com/p/microblog-purple/', now()), ('Mobidentica', 'Mobidentica', 'http://www.substanceofcode.com/software/mobidentica/', now()), ('moconica','Moconica','http://moconica.com/', now()), + ('nambu','Nambu','http://www.nambu.com/', now()), ('peoplebrowsr', 'PeopleBrowsr', 'http://www.peoplebrowsr.com/', now()), + ('Pikchur','Pikchur','http://www.pikchur.com/', now()), + ('Ping.fm','Ping.fm','http://ping.fm/', now()), + ('pingvine','PingVine','http://pingvine.com/', now()), ('pocketwit','PockeTwit','http://code.google.com/p/pocketwit/', now()), ('posty','Posty','http://spreadingfunkyness.com/posty/', now()), + ('qtwitter','qTwitter','http://qtwitter.ayoy.net/', now()), ('royalewithcheese','Royale With Cheese','http://p.hellyeah.org/', now()), ('rssdent','rssdent','http://github.com/zcopley/rssdent/tree/master', now()), ('rygh.no','rygh.no','http://rygh.no/', now()), @@ -34,9 +40,11 @@ VALUES ('tarpipe','tarpipe','http://tarpipe.com/', now()), ('tjunar','Tjunar','http://nederflash.nl/boek/titels/tjunar-air', now()), ('tr.im','tr.im','http://tr.im/', now()), + ('triklepost', 'Tricklepost', 'http://github.com/zcopley/tricklepost/tree/master', now()), ('tweenky','Tweenky','http://beta.tweenky.com/', now()), ('twhirl','Twhirl','http://www.twhirl.org/', now()), ('twibble','twibble','http://www.twibble.de/', now()), + ('Twidge','Twidge','http://software.complete.org/twidge', now()), ('twidge','Twidge','http://software.complete.org/twidge', now()), ('twidroid','twidroid','http://www.twidroid.com/', now()), ('twittelator','Twittelator','http://www.stone.com/iPhone/Twittelator/', now()), @@ -46,6 +54,6 @@ VALUES ('twittertools','Twitter Tools','http://wordpress.org/extend/plugins/twitter-tools/', now()), ('twitux','Twitux','http://live.gnome.org/DanielMorales/Twitux', now()), ('twitvim','TwitVim','http://vim.sourceforge.net/scripts/script.php?script_id=2204', now()), + ('Updating.Me','Updating.Me','http://updating.me/', now()), ('urfastr','urfastr','http://urfastr.net/', now()), - ('adium', 'Adium', 'http://www.adiumx.com/', now()), ('yatca','Yatca','http://www.yatca.com/', now()); @@ -101,6 +101,8 @@ function main() $args = array_merge($args, $_REQUEST); + Event::handle('ArgsInitialize', array(&$args)); + $action = $args['action']; if (!$action || !preg_match('/^[a-zA-Z0-9_-]*$/', $action)) { diff --git a/install.php b/install.php index 0240349bb..87a99a650 100644 --- a/install.php +++ b/install.php @@ -1,4 +1,22 @@ -<? +<?php +/** + * Laconica - a distributed open-source microblogging tool + * Copyright (C) 2009, Controlez-Vous, 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 <http://www.gnu.org/licenses/>. + */ + define('INSTALLDIR', dirname(__FILE__)); function main() @@ -19,12 +37,12 @@ function checkPrereqs() { if (file_exists(INSTALLDIR.'/config.php')) { ?><p class="error">Config file "config.php" already exists.</p> - <? + <?php return false; } if (version_compare(PHP_VERSION, '5.0.0', '<')) { - ?><p class="error">Require PHP version 5 or greater.</p><? + ?><p class="error">Require PHP version 5 or greater.</p><?php return false; } @@ -34,23 +52,23 @@ function checkPrereqs() foreach ($reqs as $req) { if (!checkExtension($req)) { - ?><p class="error">Cannot load required extension "<?= $req ?>".</p><? + ?><p class="error">Cannot load required extension "<?php echo $req; ?>".</p><?php return false; } } if (!is_writable(INSTALLDIR)) { - ?><p class="error">Cannot write config file to "<?= INSTALLDIR ?>".</p> + ?><p class="error">Cannot write config file to "<?php echo INSTALLDIR; ?>".</p> <p>On your server, try this command:</p> - <blockquote>chmod a+w <?= INSTALLDIR ?></blockquote> - <? + <blockquote>chmod a+w <?php echo INSTALLDIR; ?></blockquote> + <?php return false; } if (!is_writable(INSTALLDIR.'/avatar/')) { - ?><p class="error">Cannot write avatar directory "<?= INSTALLDIR ?>/avatar/".</p> + ?><p class="error">Cannot write avatar directory "<?php echo INSTALLDIR; ?>/avatar/".</p> <p>On your server, try this command:</p> - <blockquote>chmod a+w <?= INSTALLDIR ?>/avatar/</blockquote> + <blockquote>chmod a+w <?php echo INSTALLDIR; ?>/avatar/</blockquote> <? return false; } @@ -211,7 +229,7 @@ function handlePost() function writeConf($sitename, $sqlUrl) { $res = file_put_contents(INSTALLDIR.'/config.php', - "<?\n". + "<?php\n". "\$config['site']['name'] = \"$sitename\";\n\n". "\$config['db']['database'] = \"$sqlUrl\";\n\n"); return $res; @@ -247,9 +265,9 @@ function runDbScript($filename, $conn) <div id="core"> <div id="content"> <h1>Install Laconica</h1> -<? main() ?> +<?php main(); ?> </div> </div> </div> </body> -</html>
\ No newline at end of file +</html> diff --git a/js/identica-badge.js b/js/identica-badge.js index 869230b7a..ffa55ae93 100644 --- a/js/identica-badge.js +++ b/js/identica-badge.js @@ -128,7 +128,7 @@ var a = document.createElement('A'); a.innerHTML = 'get this'; a.target = '_blank'; - a.href = 'http://identica/doc/badge'; + a.href = 'http://identi.ca/doc/badge'; $.s.f.appendChild(a); $.s.appendChild($.s.f); $.f.getUser(); diff --git a/js/util.js b/js/util.js index 81139744f..3f14bc61c 100644 --- a/js/util.js +++ b/js/util.js @@ -166,19 +166,45 @@ $(document).ready(function(){ $("#notice_action-submit").addClass("disabled"); return true; }, - success: function(xml) { if ($("#error", xml).length > 0 || $("#command_result", xml).length > 0) { + timeout: '60000', + error: function (xhr, textStatus, errorThrown) { $("#form_notice").removeClass("processing"); + $("#notice_action-submit").removeAttr("disabled"); + $("#notice_action-submit").removeClass("disabled"); + if (textStatus == "timeout") { + alert ("Sorry! We had trouble sending your notice. The servers are overloaded. Please try again, and contact the site administrator if this problem persists"); + } + else { + if ($(".error", xhr.responseXML).length > 0) { + $('#form_notice').append(document._importNode($(".error", xhr.responseXML).get(0), true)); + } + else { + alert("Sorry! We had trouble sending your notice ("+xhr.status+" "+xhr.statusText+"). Please report the problem to the site administrator if this happens again."); + } + } + }, + success: function(xml) { if ($("#error", xml).length > 0) { var result = document._importNode($("p", xml).get(0), true); result = result.textContent || result.innerHTML; alert(result); } else { - $("#notices_primary .notices").prepend(document._importNode($("li", xml).get(0), true)); + if ($("#command_result", xml).length > 0) { + var result = document._importNode($("p", xml).get(0), true); + result = result.textContent || result.innerHTML; + alert(result); + } + else { + li = $("li", xml).get(0); + if ($("#"+li.id).length == 0) { + $("#notices_primary .notices").prepend(document._importNode(li, true)); + $("#notices_primary .notice:first").css({display:"none"}); + $("#notices_primary .notice:first").fadeIn(2500); + NoticeHover(); + NoticeReply(); + } + } $("#notice_data-text").val(""); - counter(); - $("#notices_primary .notice:first").css({display:"none"}); - $("#notices_primary .notice:first").fadeIn(2500); - NoticeHover(); - NoticeReply(); + counter(); } $("#form_notice").removeClass("processing"); $("#notice_action-submit").removeAttr("disabled"); @@ -187,7 +213,6 @@ $(document).ready(function(){ }; $("#form_notice").ajaxForm(PostNotice); $("#form_notice").each(addAjaxHidden); - NoticeHover(); NoticeReply(); }); diff --git a/lib/action.php b/lib/action.php index 1ba062812..6b130b6d5 100644 --- a/lib/action.php +++ b/lib/action.php @@ -98,15 +98,15 @@ class Action extends HTMLOutputter // lawsuit Event::handle('EndShowHTML', array($this)); } if (Event::handle('StartShowHead', array($this))) { - $this->showHead(); + $this->showHead(); Event::handle('EndShowHead', array($this)); } if (Event::handle('StartShowBody', array($this))) { - $this->showBody(); + $this->showBody(); Event::handle('EndShowBody', array($this)); } if (Event::handle('StartEndHTML', array($this))) { - $this->endHTML(); + $this->endHTML(); Event::handle('EndEndHTML', array($this)); } } @@ -124,6 +124,7 @@ class Action extends HTMLOutputter // lawsuit $this->showShortcutIcon(); $this->showStylesheets(); $this->showScripts(); + $this->showRelationshipLinks(); $this->showOpenSearch(); $this->showFeeds(); $this->showDescription(); @@ -194,10 +195,6 @@ class Action extends HTMLOutputter // lawsuit if (Event::handle('StartShowLaconicaStyles', array($this))) { $this->element('link', array('rel' => 'stylesheet', 'type' => 'text/css', - 'href' => theme_path('css/display.css', 'base') . '?version=' . LACONICA_VERSION, - 'media' => 'screen, projection, tv')); - $this->element('link', array('rel' => 'stylesheet', - 'type' => 'text/css', 'href' => theme_path('css/display.css', null) . '?version=' . LACONICA_VERSION, 'media' => 'screen, projection, tv')); if (common_config('site', 'mobile')) { @@ -265,6 +262,19 @@ class Action extends HTMLOutputter // lawsuit } /** + * Show document relationship links + * + * SHOULD overload + * + * @return nothing + */ + function showRelationshipLinks() + { + // output <link> elements with appropriate HTML4.01 link types: + // http://www.w3.org/TR/html401/types.html#type-links + } + + /** * Show OpenSearch headers * * @return nothing @@ -337,7 +347,7 @@ class Action extends HTMLOutputter // lawsuit { $this->elementStart('body', (common_current_user()) ? array('id' => $this->trimmed('action'), 'class' => 'user_in') - : array('id' => $this->trimmed('action'))); + : array('id' => $this->trimmed('action'))); $this->elementStart('div', array('id' => 'wrap')); if (Event::handle('StartShowHeader', array($this))) { $this->showHeader(); @@ -421,10 +431,10 @@ class Action extends HTMLOutputter // lawsuit _('Connect'), _('Connect to SMS, Twitter'), false, 'nav_connect'); } $this->menuItem(common_local_url('invite'), - _('Invite'), - sprintf(_('Invite friends and colleagues to join you on %s'), - common_config('site', 'name')), - false, 'nav_invitecontact'); + _('Invite'), + sprintf(_('Invite friends and colleagues to join you on %s'), + common_config('site', 'name')), + false, 'nav_invitecontact'); $this->menuItem(common_local_url('logout'), _('Logout'), _('Logout from the site'), false, 'nav_logout'); } @@ -581,7 +591,10 @@ class Action extends HTMLOutputter // lawsuit 'class' => 'system_notice')); $this->element('dt', null, _('Page notice')); $this->elementStart('dd'); - $this->showPageNotice(); + if (Event::handle('StartShowPageNotice', array($this))) { + $this->showPageNotice(); + Event::handle('EndShowPageNotice', array($this)); + } $this->elementEnd('dd'); $this->elementEnd('dl'); } @@ -619,7 +632,7 @@ class Action extends HTMLOutputter // lawsuit $this->elementStart('div', array('id' => 'aside_primary', 'class' => 'aside')); if (Event::handle('StartShowExportData', array($this))) { - $this->showExportData(); + $this->showExportData(); Event::handle('EndShowExportData', array($this)); } if (Event::handle('StartShowSections', array($this))) { @@ -1042,4 +1055,36 @@ class Action extends HTMLOutputter // lawsuit { return null; } + + /** + * Generate document metadata for sequential navigation + * + * @param boolean $have_before is there something before? + * @param boolean $have_after is there something after? + * @param integer $page current page + * @param string $action current action + * @param array $args rest of query arguments + * + * @return nothing + */ + function sequenceRelationships($have_next, $have_previous, $page, $action, $args=null) + { + // Outputs machine-readable pagination in <link> elements. + // Pattern taken from $this->pagination() method. + + // "next" is equivalent to "after" + if ($have_next) { + $pargs = array('page' => $page-1); + $this->element('link', array('rel' => 'next', + 'href' => common_local_url($action, $args, $pargs), + 'title' => _('Next'))); + } + // "previous" is equivalent to "before" + if ($have_previous=true) { // FIXME + $pargs = array('page' => $page+1); + $this->element('link', array('rel' => 'prev', + 'href' => common_local_url($action, $args, $pargs), + 'title' => _('Previous'))); + } + } } diff --git a/lib/common.php b/lib/common.php index b3882d207..f983c4d16 100644 --- a/lib/common.php +++ b/lib/common.php @@ -192,7 +192,7 @@ $_config_files[] = INSTALLDIR.'/config.php'; $_have_a_config = false; foreach ($_config_files as $_config_file) { - if (file_exists($_config_file)) { + if (@file_exists($_config_file)) { include_once($_config_file); $_have_a_config = true; } diff --git a/lib/facebookutil.php b/lib/facebookutil.php index ec3987273..242d2e06f 100644 --- a/lib/facebookutil.php +++ b/lib/facebookutil.php @@ -27,9 +27,21 @@ define("FACEBOOK_PROMPTED_UPDATE_PREF", 2); function getFacebook() { + static $facebook = null; + $apikey = common_config('facebook', 'apikey'); $secret = common_config('facebook', 'secret'); - return new Facebook($apikey, $secret); + + if ($facebook === null) { + $facebook = new Facebook($apikey, $secret); + } + + if (!$facebook) { + common_log(LOG_ERR, 'Could not make new Facebook client obj!', + __FILE__); + } + + return $facebook; } function updateProfileBox($facebook, $flink, $notice) { @@ -92,7 +104,6 @@ function isFacebookBound($notice, $flink) { } - function facebookBroadcastNotice($notice) { $facebook = getFacebook(); diff --git a/lib/galleryaction.php b/lib/galleryaction.php index 0484918ce..8fa11a756 100644 --- a/lib/galleryaction.php +++ b/lib/galleryaction.php @@ -134,9 +134,11 @@ class GalleryAction extends Action $this->elementStart('li', array('id'=>'filter_tags_item')); $this->elementStart('form', array('name' => 'bytag', 'id' => 'bytag', + 'action' => common_path('?action=' . $this->trimmed('action')), 'method' => 'post')); $this->dropdown('tag', _('Tag'), $content, _('Choose a tag to narrow list'), false, $tag); + $this->hidden('nickname', $this->user->nickname); $this->submit('submit', _('Go')); $this->elementEnd('form'); $this->elementEnd('li'); @@ -169,4 +171,4 @@ class GalleryAction extends Action { return array(); } -}
\ No newline at end of file +} diff --git a/lib/personalgroupnav.php b/lib/personalgroupnav.php index 63e6138df..acc033667 100644 --- a/lib/personalgroupnav.php +++ b/lib/personalgroupnav.php @@ -93,43 +93,45 @@ class PersonalGroupNav extends Widget $this->out->elementStart('ul', array('class' => 'nav')); - $this->out->menuItem(common_local_url('all', array('nickname' => - $nickname)), - _('Personal'), - sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), - $action == 'all', 'nav_timeline_personal'); - $this->out->menuItem(common_local_url('replies', array('nickname' => - $nickname)), - _('Replies'), - sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), - $action == 'replies', 'nav_timeline_replies'); - $this->out->menuItem(common_local_url('showstream', array('nickname' => - $nickname)), - _('Profile'), - ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname, - $action == 'showstream', 'nav_profile'); - $this->out->menuItem(common_local_url('showfavorites', array('nickname' => - $nickname)), - _('Favorites'), - sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')), - $action == 'showfavorites', 'nav_timeline_favorites'); + if (Event::handle('StartPersonalGroupNav', array($this))) { + $this->out->menuItem(common_local_url('all', array('nickname' => + $nickname)), + _('Personal'), + sprintf(_('%s and friends'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), + $action == 'all', 'nav_timeline_personal'); + $this->out->menuItem(common_local_url('replies', array('nickname' => + $nickname)), + _('Replies'), + sprintf(_('Replies to %s'), (($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)), + $action == 'replies', 'nav_timeline_replies'); + $this->out->menuItem(common_local_url('showstream', array('nickname' => + $nickname)), + _('Profile'), + ($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname, + $action == 'showstream', 'nav_profile'); + $this->out->menuItem(common_local_url('showfavorites', array('nickname' => + $nickname)), + _('Favorites'), + sprintf(_('%s\'s favorite notices'), ($user_profile) ? $user_profile->getBestName() : _('User')), + $action == 'showfavorites', 'nav_timeline_favorites'); - $cur = common_current_user(); + $cur = common_current_user(); - if ($cur && $cur->id == $user->id) { + if ($cur && $cur->id == $user->id) { - $this->out->menuItem(common_local_url('inbox', array('nickname' => - $nickname)), - _('Inbox'), - _('Your incoming messages'), - $action == 'inbox'); - $this->out->menuItem(common_local_url('outbox', array('nickname' => - $nickname)), - _('Outbox'), - _('Your sent messages'), - $action == 'outbox'); + $this->out->menuItem(common_local_url('inbox', array('nickname' => + $nickname)), + _('Inbox'), + _('Your incoming messages'), + $action == 'inbox'); + $this->out->menuItem(common_local_url('outbox', array('nickname' => + $nickname)), + _('Outbox'), + _('Your sent messages'), + $action == 'outbox'); + } + Event::handle('EndPersonalGroupNav', array($this)); } - $this->out->elementEnd('ul'); } } diff --git a/lib/popularnoticesection.php b/lib/popularnoticesection.php index 0505f0fa9..a8d47ef54 100644 --- a/lib/popularnoticesection.php +++ b/lib/popularnoticesection.php @@ -50,17 +50,26 @@ class PopularNoticeSection extends NoticeSection { if (common_config('db', 'type') == 'pgsql') { $weightexpr='sum(exp(-extract(epoch from (now() - fave.modified)) / %s))'; + if (!empty($this->out->tag)) { + $tag = pg_escape_string($this->tag); + } } else { $weightexpr='sum(exp(-(now() - fave.modified) / %s))'; + if (!empty($this->out->tag)) { + $tag = mysql_escape_string($this->out->tag); + } } - - $qry = 'SELECT notice.*, '. - $weightexpr . ' as weight ' . - 'FROM notice JOIN fave ON notice.id = fave.notice_id ' . - 'GROUP BY notice.id,notice.profile_id,notice.content,notice.uri,' . - 'notice.rendered,notice.url,notice.created,notice.modified,' . - 'notice.reply_to,notice.is_local,notice.source ' . - 'ORDER BY weight DESC'; + $qry = "SELECT notice.*, $weightexpr as weight "; + if(isset($tag)) { + $qry .= 'FROM notice_tag, notice JOIN fave ON notice.id = fave.notice_id ' . + "WHERE notice.id = notice_tag.notice_id and '$tag' = notice_tag.tag"; + } else { + $qry .= 'FROM notice JOIN fave ON notice.id = fave.notice_id'; + } + $qry .= ' GROUP BY notice.id,notice.profile_id,notice.content,notice.uri,' . + 'notice.rendered,notice.url,notice.created,notice.modified,' . + 'notice.reply_to,notice.is_local,notice.source ' . + 'ORDER BY weight DESC'; $offset = 0; $limit = NOTICES_PER_SECTION + 1; diff --git a/lib/queuehandler.php b/lib/queuehandler.php index 9ce9e32b3..fde650d9e 100644 --- a/lib/queuehandler.php +++ b/lib/queuehandler.php @@ -36,7 +36,7 @@ class QueueHandler extends Daemon $this->set_id($id); } } - + function class_name() { return ucfirst($this->transport()) . 'Handler'; @@ -46,7 +46,7 @@ class QueueHandler extends Daemon { return strtolower($this->class_name().'.'.$this->get_id()); } - + function get_id() { return $this->_id; @@ -56,16 +56,16 @@ class QueueHandler extends Daemon { $this->_id = $id; } - + function transport() { return null; } - + function start() { } - + function finish() { } @@ -74,14 +74,14 @@ class QueueHandler extends Daemon { return true; } - + function run() { if (!$this->start()) { return false; } - $this->log(LOG_INFO, 'checking for queued notices'); $transport = $this->transport(); + $this->log(LOG_INFO, 'checking for queued notices for "' . $transport . '"'); do { $qi = Queue_item::top($transport); if ($qi) { @@ -113,7 +113,7 @@ class QueueHandler extends Daemon } else { $this->clear_old_claims(); $this->idle(5); - } + } } while (true); if (!$this->finish()) { return false; @@ -127,7 +127,7 @@ class QueueHandler extends Daemon sleep($timeout); } } - + function clear_old_claims() { $qi = new Queue_item(); @@ -137,10 +137,9 @@ class QueueHandler extends Daemon $qi->free(); unset($qi); } - + function log($level, $msg) { common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg); } } -
\ No newline at end of file diff --git a/lib/router.php b/lib/router.php index 6fb2f9487..12590b790 100644 --- a/lib/router.php +++ b/lib/router.php @@ -231,12 +231,12 @@ class Router $m->connect('api/statuses/:method', array('action' => 'api', 'apiaction' => 'statuses'), - array('method' => '(public_timeline|friends_timeline|user_timeline|update|replies|friends|followers|featured)(\.(atom|rss|xml|json))?')); + array('method' => '(public_timeline|friends_timeline|user_timeline|update|replies|mentions|friends|followers|featured)(\.(atom|rss|xml|json))?')); $m->connect('api/statuses/:method/:argument', array('action' => 'api', 'apiaction' => 'statuses'), - array('method' => '(user_timeline|friends_timeline|replies|show|destroy|friends|followers)')); + array('method' => '(user_timeline|friends_timeline|replies|mentions|show|destroy|friends|followers)')); // users diff --git a/lib/subgroupnav.php b/lib/subgroupnav.php index 31c3ea0b5..4a9b36ae8 100644 --- a/lib/subgroupnav.php +++ b/lib/subgroupnav.php @@ -74,38 +74,44 @@ class SubGroupNav extends Widget $this->out->elementStart('ul', array('class' => 'nav')); - $this->out->menuItem(common_local_url('subscriptions', - array('nickname' => - $this->user->nickname)), - _('Subscriptions'), - sprintf(_('People %s subscribes to'), - $this->user->nickname), - $action == 'subscriptions', - 'nav_subscriptions'); - $this->out->menuItem(common_local_url('subscribers', - array('nickname' => - $this->user->nickname)), - _('Subscribers'), - sprintf(_('People subscribed to %s'), - $this->user->nickname), - $action == 'subscribers', - 'nav_subscribers'); - $this->out->menuItem(common_local_url('usergroups', - array('nickname' => - $this->user->nickname)), - _('Groups'), - sprintf(_('Groups %s is a member of'), - $this->user->nickname), - $action == 'usergroups', - 'nav_usergroups'); - if (!is_null($cur) && $this->user->id === $cur->id) { - $this->out->menuItem(common_local_url('invite'), - _('Invite'), - sprintf(_('Invite friends and colleagues to join you on %s'), - common_config('site', 'name')), - $action == 'invite', - 'nav_invite'); + if (Event::handle('StartSubGroupNav', array($this))) { + + $this->out->menuItem(common_local_url('subscriptions', + array('nickname' => + $this->user->nickname)), + _('Subscriptions'), + sprintf(_('People %s subscribes to'), + $this->user->nickname), + $action == 'subscriptions', + 'nav_subscriptions'); + $this->out->menuItem(common_local_url('subscribers', + array('nickname' => + $this->user->nickname)), + _('Subscribers'), + sprintf(_('People subscribed to %s'), + $this->user->nickname), + $action == 'subscribers', + 'nav_subscribers'); + $this->out->menuItem(common_local_url('usergroups', + array('nickname' => + $this->user->nickname)), + _('Groups'), + sprintf(_('Groups %s is a member of'), + $this->user->nickname), + $action == 'usergroups', + 'nav_usergroups'); + if (!is_null($cur) && $this->user->id === $cur->id) { + $this->out->menuItem(common_local_url('invite'), + _('Invite'), + sprintf(_('Invite friends and colleagues to join you on %s'), + common_config('site', 'name')), + $action == 'invite', + 'nav_invite'); + } + + Event::handle('EndSubGroupNav', array($this)); } + $this->out->elementEnd('ul'); } } diff --git a/lib/subpeopletagcloudsection.php b/lib/subpeopletagcloudsection.php new file mode 100644 index 000000000..9f6948dc9 --- /dev/null +++ b/lib/subpeopletagcloudsection.php @@ -0,0 +1,77 @@ +<?php +/** + * Laconica, the distributed open-source microblogging tool + * + * Personal tag cloud section + * + * PHP version 5 + * + * LICENCE: 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 <http://www.gnu.org/licenses/>. + * + * @category Widget + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +/** + * Personal tag cloud section + * + * @category Widget + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +class SubPeopleTagCloudSection extends TagCloudSection +{ + function getTags() + { + $qry = $this->query(); + $limit = TAGS_PER_SECTION; + $offset = 0; + + if (common_config('db','type') == 'pgsql') { + $qry .= ' LIMIT ' . $limit . ' OFFSET ' . $offset; + } else { + $qry .= ' LIMIT ' . $offset . ', ' . $limit; + } + + $profile_tag = Memcached_DataObject::cachedQuery('Profile_tag', + sprintf($qry, + $this->out->user->id)); + return $profile_tag; + } + + function tagUrl($tag) { + return common_local_url('peopletag', array('tag' => $tag)); + } + + function showTag($tag, $weight, $relative) { + $rel = 'tag-cloud-'; + $rel .= 1+intval(7 * $relative * $weight - 0.01); + + $this->out->elementStart('li', $rel); + $this->out->element('a', array('href' => $this->tagUrl($tag)), $tag); + $this->out->elementEnd('li'); + } +} + diff --git a/lib/subscriberspeopleselftagcloudsection.php b/lib/subscriberspeopleselftagcloudsection.php new file mode 100644 index 000000000..115241a53 --- /dev/null +++ b/lib/subscriberspeopleselftagcloudsection.php @@ -0,0 +1,62 @@ +<?php +/** + * Laconica, the distributed open-source microblogging tool + * + * Personal tag cloud section + * + * PHP version 5 + * + * LICENCE: 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 <http://www.gnu.org/licenses/>. + * + * @category Widget + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +/** + * Personal tag cloud section + * + * @category Widget + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +class SubscribersPeopleSelfTagCloudSection extends SubPeopleTagCloudSection +{ + function title() + { + return _('People Tagcloud as self-tagged'); + } + + function query() { +// return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscriber where subscribed=%d and subscribed != subscriber and tagger = tagged group by tag order by weight desc'; + + + return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscriber where subscribed=%d and subscribed != subscriber and tagger = tagged and tag is not null group by tag order by weight desc'; + +// return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscribed where subscriber=%d and subscribed != subscriber and tagger = tagged and tag is not null group by tag order by weight desc'; + + + } +} + diff --git a/lib/subscriberspeopletagcloudsection.php b/lib/subscriberspeopletagcloudsection.php new file mode 100644 index 000000000..4dafbc1c7 --- /dev/null +++ b/lib/subscriberspeopletagcloudsection.php @@ -0,0 +1,61 @@ +<?php +/** + * Laconica, the distributed open-source microblogging tool + * + * Personal tag cloud section + * + * PHP version 5 + * + * LICENCE: 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 <http://www.gnu.org/licenses/>. + * + * @category Widget + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +/** + * Personal tag cloud section + * + * @category Widget + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +class SubscribersPeopleTagCloudSection extends SubPeopleTagCloudSection +{ + function title() + { + return _('People Tagcloud as tagged'); + } + + function tagUrl($tag) { + $nickname = $this->out->profile->nickname; + return common_local_url('subscribers', array('nickname' => $nickname, 'tag' => $tag)); + } + + function query() { +// return 'select tag, count(tag) as weight from subscription left join profile_tag on subscriber=tagged and subscribed=tagger where subscribed=%d and subscriber != subscribed group by tag order by weight desc'; + return 'select tag, count(tag) as weight from subscription left join profile_tag on subscriber=tagged and subscribed=tagger where subscribed=%d and subscriber != subscribed and tag is not null group by tag order by weight desc'; + } +} + diff --git a/lib/subscriptionspeopleselftagcloudsection.php b/lib/subscriptionspeopleselftagcloudsection.php new file mode 100644 index 000000000..3896294d2 --- /dev/null +++ b/lib/subscriptionspeopleselftagcloudsection.php @@ -0,0 +1,61 @@ +<?php +/** + * Laconica, the distributed open-source microblogging tool + * + * Personal tag cloud section + * + * PHP version 5 + * + * LICENCE: 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 <http://www.gnu.org/licenses/>. + * + * @category Widget + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +/** + * Personal tag cloud section + * + * @category Widget + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +class SubscriptionsPeopleSelfTagCloudSection extends SubPeopleTagCloudSection +{ + function title() + { + return _('People Tagcloud as self-tagged'); + } + + function query() { +// return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscriber where subscribed=%d and subscriber != subscribed and tagger = tagged group by tag order by weight desc'; + + + + return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscribed where subscriber=%d and subscribed != subscriber and tagger = tagged and tag is not null group by tag order by weight desc'; + +// return 'select tag, count(tag) as weight from subscription left join profile_tag on tagger = subscriber where subscribed=%d and subscribed != subscriber and tagger = tagged and tag is not null group by tag order by weight desc'; + } +} + diff --git a/lib/subscriptionspeopletagcloudsection.php b/lib/subscriptionspeopletagcloudsection.php new file mode 100644 index 000000000..f9c8672e3 --- /dev/null +++ b/lib/subscriptionspeopletagcloudsection.php @@ -0,0 +1,61 @@ +<?php +/** + * Laconica, the distributed open-source microblogging tool + * + * Personal tag cloud section + * + * PHP version 5 + * + * LICENCE: 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 <http://www.gnu.org/licenses/>. + * + * @category Widget + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +/** + * Personal tag cloud section + * + * @category Widget + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +class SubscriptionsPeopleTagCloudSection extends SubPeopleTagCloudSection +{ + function title() + { + return _('People Tagcloud as tagged'); + } + + function tagUrl($tag) { + $nickname = $this->out->profile->nickname; + return common_local_url('subscriptions', array('nickname' => $nickname, 'tag' => $tag)); + } + + function query() { +// return 'select tag, count(tag) as weight from subscription left join profile_tag on subscriber=tagger and subscribed=tagged where subscriber=%d and subscriber != subscribed group by tag order by weight desc'; + return 'select tag, count(tag) as weight from subscription left join profile_tag on subscriber=tagger and subscribed=tagged where subscriber=%d and subscriber != subscribed and tag is not null group by tag order by weight desc'; + } +} + diff --git a/lib/twitterapi.php b/lib/twitterapi.php index b8357c688..caf8c0716 100644 --- a/lib/twitterapi.php +++ b/lib/twitterapi.php @@ -51,6 +51,26 @@ class TwitterapiAction extends Action parent::handle($args); } + /** + * Overrides XMLOutputter::element to write booleans as strings (true|false). + * See that method's documentation for more info. + * + * @param string $tag Element type or tagname + * @param array $attrs Array of element attributes, as + * key-value pairs + * @param string $content string content of the element + * + * @return void + */ + function element($tag, $attrs=null, $content=null) + { + if (is_bool($content)) { + $content = ($content ? 'true' : 'false'); + } + + return parent::element($tag, $attrs, $content); + } + function twitter_user_array($profile, $get_notice=false) { @@ -66,7 +86,7 @@ class TwitterapiAction extends Action $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE); $twitter_user['profile_image_url'] = ($avatar) ? $avatar->displayUrl() : Avatar::defaultImage(AVATAR_STREAM_SIZE); - $twitter_user['protected'] = 'false'; # not supported by Laconica yet + $twitter_user['protected'] = false; # not supported by Laconica yet $twitter_user['url'] = ($profile->homepage) ? $profile->homepage : null; if ($get_notice) { @@ -86,7 +106,7 @@ class TwitterapiAction extends Action $twitter_status = array(); $twitter_status['text'] = $notice->content; - $twitter_status['truncated'] = 'false'; # Not possible on Laconica + $twitter_status['truncated'] = false; # Not possible on Laconica $twitter_status['created_at'] = $this->date_twitter($notice->created); $twitter_status['in_reply_to_status_id'] = ($notice->reply_to) ? intval($notice->reply_to) : null; @@ -108,10 +128,9 @@ class TwitterapiAction extends Action ($replier_profile) ? $replier_profile->nickname : null; if (isset($this->auth_user)) { - $twitter_status['favorited'] = - ($this->auth_user->hasFave($notice)) ? 'true' : 'false'; + $twitter_status['favorited'] = $this->auth_user->hasFave($notice); } else { - $twitter_status['favorited'] = 'false'; + $twitter_status['favorited'] = false; } if ($include_user) { @@ -418,7 +437,7 @@ class TwitterapiAction extends Action function date_twitter($dt) { $t = strtotime($dt); - return date("D M d G:i:s O Y", $t); + return date("D M d H:i:s O Y", $t); } // XXX: Candidate for a general utility method somewhere? diff --git a/lib/util.php b/lib/util.php index 675ff51f0..f862d7fcc 100644 --- a/lib/util.php +++ b/lib/util.php @@ -519,11 +519,16 @@ function common_shorten_links($text) function common_shorten_link($url, $reverse = false) { + static $url_cache = array(); if ($reverse) return isset($url_cache[$url]) ? $url_cache[$url] : $url; $user = common_current_user(); - + if (!isset($user)) { + // common current user does not find a user when called from the XMPP daemon + // therefore we'll set one here fix, so that XMPP given URLs may be shortened + $user->urlshorteningservice = 'ur1.ca'; + } $curlh = curl_init(); curl_setopt($curlh, CURLOPT_CONNECTTIMEOUT, 20); // # seconds to wait curl_setopt($curlh, CURLOPT_USERAGENT, 'Laconica'); @@ -874,7 +879,23 @@ function common_broadcast_notice($notice, $remote=false) function common_enqueue_notice($notice) { - foreach (array('jabber', 'omb', 'sms', 'public', 'twitter', 'facebook', 'ping') as $transport) { + $transports = array('omb', 'sms', 'twitter', 'facebook', 'ping'); + + if (common_config('xmpp', 'enabled')) { + $transports = array_merge($transports, array('jabber', 'public')); + } + + if (common_config('memcached', 'enabled')) { + // Note: limited to 8 chars + $transports[] = 'memcache'; + } + + if (common_config('inboxes', 'enabled') === true || + common_config('inboxes', 'enabled') === 'transitional') { + $transports[] = 'inbox'; + } + + foreach ($transports as $transport) { $qi = new Queue_item(); $qi->notice_id = $notice->id; $qi->transport = $transport; @@ -961,7 +982,7 @@ function common_root_url($ssl=false) function common_good_rand($bytes) { // XXX: use random.org...? - if (file_exists('/dev/urandom')) { + if (@file_exists('/dev/urandom')) { return common_urandom($bytes); } else { // FIXME: this is probably not good enough return common_mtrand($bytes); @@ -1327,10 +1348,10 @@ function common_compatible_license($from, $to) */ function common_database_tablename($tablename) { - + if(common_config('db','quote_identifiers')) { $tablename = '"'. $tablename .'"'; } //table prefixes could be added here later return $tablename; -}
\ No newline at end of file +} diff --git a/locale/pl_PL/LC_MESSAGES/laconica.mo b/locale/pl_PL/LC_MESSAGES/laconica.mo Binary files differindex faf549054..9a9cdccf3 100644 --- a/locale/pl_PL/LC_MESSAGES/laconica.mo +++ b/locale/pl_PL/LC_MESSAGES/laconica.mo diff --git a/locale/pl_PL/LC_MESSAGES/laconica.po b/locale/pl_PL/LC_MESSAGES/laconica.po index 9a61ada6b..8da9dd59b 100644 --- a/locale/pl_PL/LC_MESSAGES/laconica.po +++ b/locale/pl_PL/LC_MESSAGES/laconica.po @@ -1,41 +1,33 @@ -# #-#-#-#-# laconica.pot (PACKAGE VERSION) #-#-#-#-# -# SOME DESCRIPTIVE TITLE. -# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER -# This file is distributed under the same license as the PACKAGE package. +# translation of pl.po to Polish # Paweł Wilk <siefca@gnu.org>, 2008. +# Piotr Drąg <piotrdrag@gmail.com>, 2009. # -# #-#-#-#-# laconica.new.pot (PACKAGE VERSION) #-#-#-#-# -# 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 <EMAIL@ADDRESS>, YEAR. +# Polish language has 3 plural forms. +# Special case is used for one and some numbers ending in 2, 3, or 4. +# Example: +# 1 WINDOW -> 1 OKNO +# x2 to x4 WINDOWS -> x2 do x4 OKNA (x != 1) +# 5 or more WINDOWS -> 5 lub więcej OKIEN # msgid "" msgstr "" -"Project-Id-Version: PACKAGE VERSION\n" +"Project-Id-Version: pl\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2009-01-25 16:24+0000\n" -"PO-Revision-Date: 2009-02-28 17:14+0000\n" -"Last-Translator: Ryba <ryba-laconica@h4v.eu>\n" -"Language-Team: LANGUAGE <LL@li.org>\n" +"POT-Creation-Date: 2009-03-11 09:33+0000\n" +"PO-Revision-Date: 2009-04-10 00:39+0200\n" +"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n" +"Language-Team: Polish <pl@li.org>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " -"|| n%100>=20) ? 1 : 2);\n" -"X-Generator: Pootle 1.1.0\n" - -# Polish language has 3 plural forms. -# Special case is used for one and some numbers ending in 2, 3, or 4. -# Example: -# 1 WINDOW -> 1 OKNO -# x2 to x4 WINDOWS -> x2 do x4 OKNA (x != 1) -# 5 or more WINDOWS -> 5 lub więcej OKIEN +"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%" +"100<10 || n%100>=20) ? 1 : 2);\n" + #: ../actions/noticesearchrss.php:64 actions/noticesearchrss.php:68 #: actions/noticesearchrss.php:88 #, php-format msgid " Search Stream for \"%s\"" -msgstr "Szukaj strumienia dla \"%s\"" +msgstr " Znajdź strumień dla \"%s\"" #: ../actions/finishopenidlogin.php:82 ../actions/register.php:191 #: actions/finishopenidlogin.php:88 actions/register.php:205 @@ -43,26 +35,27 @@ msgstr "Szukaj strumienia dla \"%s\"" msgid "" " except this private data: password, email address, IM address, phone number." msgstr "" -"z wyłączeniem tych prywatnych danych: e-maila, identyfikatora IM, numeru " +" poza tymi prywatnymi danymi: hasło, adres e-mail, adres komunikatora, numer " "telefonu." #: ../actions/showstream.php:400 ../lib/stream.php:109 #: actions/showstream.php:418 lib/mailbox.php:164 lib/stream.php:76 msgid " from " -msgstr "" +msgstr " od " #: ../actions/twitapistatuses.php:478 actions/twitapistatuses.php:412 -#: actions/twitapistatuses.php:347 +#: actions/twitapistatuses.php:347 actions/twitapistatuses.php:363 #, php-format msgid "%1$s / Updates replying to %2$s" -msgstr "" +msgstr "%1$s/aktualizacje odpowiadające na %2$s" #: ../actions/invite.php:168 actions/invite.php:176 actions/invite.php:211 +#: actions/invite.php:218 #, php-format msgid "%1$s has invited you to join them on %2$s" -msgstr "%1$s zapraszają Cię byś dołączył do nich w %2$s" +msgstr "%1$s zapraszają Cię, abyś dołączył do nich w %2$s" -#: ../actions/invite.php:170 +#: ../actions/invite.php:170 actions/invite.php:220 #, php-format msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" @@ -92,11 +85,38 @@ msgid "" "\n" "Sincerely, %2$s\n" msgstr "" +"Użytkownik %1$s zapraszają Cię, abyś dołączył do nich w %2$s (%3$s).\n" +"\n" +"%2$s jest usługą mikroblogowania, która umożliwia pozostawanie w kontakcie z " +"osobami, których znasz i z tymi, którzy Cię interesują.\n" +"\n" +"Możesz także dzielić się w sieci nowinkami o sobie, swoimi przemyśleniami, " +"lub swoim życiem z osobami, którzy Cię znają. To także wspaniały sposób na " +"poznawanie nowych osób, którzy dzielą Twoje zainteresowania.\n" +"\n" +"Użytkownik %1$s powiedział:\n" +"\n" +"%4$s\n" +"\n" +"Możesz zobaczyć stronę profilu %1$s na %2$s tutaj:\n" +"\n" +"%5$s\n" +"\n" +"Jeśli chcesz wypróbować usługę, naciśnij na poniższy odnośnik, aby " +"zaakceptować zaproszenie.\n" +"\n" +"%6$s\n" +"\n" +"Jeśli nie, możesz zignorować tę wiadomość. Dziękujemy za Twoją cierpliwość i " +"czas.\n" +"\n" +"Z poważaniem, %2$s\n" #: ../lib/mail.php:124 lib/mail.php:124 lib/mail.php:126 lib/mail.php:241 +#: lib/mail.php:236 #, php-format msgid "%1$s is now listening to your notices on %2$s." -msgstr "%1$s obserwuje teraz Twoje wpisy na %2$s." +msgstr "Użytkownik %1$s obserwuje teraz Twoje wpisy na %2$s." #: ../lib/mail.php:126 #, php-format @@ -108,16 +128,18 @@ msgid "" "Faithfully yours,\n" "%4$s.\n" msgstr "" -"%1$s obserwuje teraz Twoje wpisy na %2$s.\n" +"Użytkownik %1$s obserwuje teraz Twoje wpisy na %2$s.\n" "\n" -"Kłaniam się,\n" +"\t%3$s\n" +"\n" +"Z poważaniem,\n" "%4$s.\n" #: ../actions/twitapistatuses.php:482 actions/twitapistatuses.php:415 -#: actions/twitapistatuses.php:350 +#: actions/twitapistatuses.php:350 actions/twitapistatuses.php:367 #, php-format msgid "%1$s updates that reply to updates from %2$s / %3$s." -msgstr "" +msgstr "%1$s aktualizuje tę odpowiedź na aktualizacje od %2$s/%3$s." #: ../actions/shownotice.php:45 actions/shownotice.php:45 #: actions/shownotice.php:161 @@ -129,7 +151,7 @@ msgstr "Status użytkownika %1$s na %2$s" #: actions/invite.php:99 actions/invite.php:123 actions/invite.php:131 #, php-format msgid "%s (%s)" -msgstr "" +msgstr "%s (%s)" #: ../actions/publicrss.php:62 actions/publicrss.php:48 #: actions/publicrss.php:90 @@ -142,68 +164,74 @@ msgstr "Publiczny strumień %s" #: actions/allrss.php:60 actions/twitapistatuses.php:155 lib/personal.php:51 #: actions/all.php:65 actions/allrss.php:103 actions/facebookhome.php:164 #: actions/twitapistatuses.php:126 lib/personalgroupnav.php:99 +#: actions/all.php:68 actions/all.php:114 actions/allrss.php:106 +#: actions/facebookhome.php:163 actions/twitapistatuses.php:130 #, php-format msgid "%s and friends" msgstr "%s i przyjaciele" #: ../actions/twitapistatuses.php:49 actions/twitapistatuses.php:49 -#: actions/twitapistatuses.php:33 +#: actions/twitapistatuses.php:33 actions/twitapistatuses.php:32 #, php-format msgid "%s public timeline" msgstr "Publiczna oś czasu %s" -#: ../lib/mail.php:206 lib/mail.php:212 lib/mail.php:411 +#: ../lib/mail.php:206 lib/mail.php:212 lib/mail.php:411 lib/mail.php:412 #, php-format msgid "%s status" -msgstr "status %s" +msgstr "Status %s" #: ../actions/twitapistatuses.php:338 actions/twitapistatuses.php:265 -#: actions/twitapistatuses.php:199 +#: actions/twitapistatuses.php:199 actions/twitapistatuses.php:209 #, php-format msgid "%s timeline" -msgstr "oś czasu %s" +msgstr "Oś czasu %s" #: ../actions/twitapistatuses.php:52 actions/twitapistatuses.php:52 -#: actions/twitapistatuses.php:36 +#: actions/twitapistatuses.php:36 actions/twitapistatuses.php:38 #, php-format msgid "%s updates from everyone!" -msgstr "" +msgstr "%s aktualizuje od każdego!" -#: ../actions/register.php:213 +#: ../actions/register.php:213 actions/register.php:497 msgid "" "(You should receive a message by email momentarily, with instructions on how " "to confirm your email address.)" msgstr "" +"(Powinieneś właśnie otrzymać wiadomość e-mail, zawierającą instrukcje " +"potwierdzenia adresu e-mail)" -#: ../lib/util.php:257 lib/util.php:273 lib/action.php:605 +#: ../lib/util.php:257 lib/util.php:273 lib/action.php:605 lib/action.php:702 #, php-format msgid "" "**%%site.name%%** is a microblogging service brought to you by [%%site." "broughtby%%](%%site.broughtbyurl%%). " msgstr "" -"**%%site.name%%** to serwis z mikroblogami prowadzony przez [%%site.broughtby" -"%%](%%site.broughtbyurl%%)." +"**%%site.name%%** jest usługą mikroblogowania prowadzony przez [%%site." +"broughtby%%](%%site.broughtbyurl%%). " -#: ../lib/util.php:259 lib/util.php:275 lib/action.php:607 +#: ../lib/util.php:259 lib/util.php:275 lib/action.php:607 lib/action.php:704 #, php-format msgid "**%%site.name%%** is a microblogging service. " -msgstr "**%%site.name%%** to serwis do mikroblogowania." +msgstr "**%%site.name%%** jest usługą mikroblogowania. " #: ../lib/util.php:274 lib/util.php:290 msgid ". Contributors should be attributed by full name or nickname." msgstr "" -". Współpracownicy powinni być wymienieni z imienia i nazwiska lub pseudonimu." +". Współtwórcy powinni być wymienieni z imienia i nazwiska lub pseudonimu." #: ../actions/finishopenidlogin.php:73 ../actions/profilesettings.php:43 #: actions/finishopenidlogin.php:79 actions/profilesettings.php:76 #: actions/finishopenidlogin.php:101 actions/profilesettings.php:100 #: lib/groupeditform.php:139 msgid "1-64 lowercase letters or numbers, no punctuation or spaces" -msgstr "Max. 64 znaki alfanumeryczne, bez spacji i znaków przestankowych" +msgstr "1-64 małe litery lub liczby, bez spacji i znaków przestankowych" #: ../actions/register.php:152 actions/register.php:166 +#: actions/register.php:368 msgid "1-64 lowercase letters or numbers, no punctuation or spaces. Required." msgstr "" +"1-64 małe litery lub liczby, bez spacji i znaków przestankowych. Wymagane." #: ../actions/password.php:42 actions/profilesettings.php:181 #: actions/passwordsettings.php:102 @@ -213,39 +241,41 @@ msgstr "6 lub więcej znaków" #: ../actions/recoverpassword.php:180 actions/recoverpassword.php:186 #: actions/recoverpassword.php:220 msgid "6 or more characters, and don't forget it!" -msgstr "6 lub więcej znaków – nie zapomnij go!" +msgstr "6 lub więcej znaków, i nie zapomnij go!" #: ../actions/register.php:154 actions/register.php:168 #: actions/register.php:373 msgid "6 or more characters. Required." -msgstr "" +msgstr "6 lub więcej znaków. Wymagane." #: ../actions/imsettings.php:197 actions/imsettings.php:205 +#: actions/imsettings.php:321 #, php-format msgid "" "A confirmation code was sent to the IM address you added. You must approve %" "s for sending messages to you." msgstr "" -"Na Twój adres komunikatora został wysłany kod potwierdzający. Musisz " +"Kod potwierdzający został wysłany na dodany adres komunikatora. Musisz " "zaakceptować otrzymywanie wiadomości od %s." #: ../actions/emailsettings.php:213 actions/emailsettings.php:231 +#: actions/emailsettings.php:350 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 "" -"Kod potwierdzający został wysłany na podany przez Ciebie adres e-mail. " -"Sprawdź w swojej skrzynce odbiorczej (także w folderze SPAM) czy otrzymałeś " -"kod i instrukcje dotyczące jego użycia. " +"Kod potwierdzający został wysłany na dodany adres e-mail. Sprawdź w swojej " +"skrzynce odbiorczej (także w wiadomościach niechcianych!), czy otrzymałeś " +"kod i instrukcje dotyczące jego użycia." #: ../actions/smssettings.php:216 actions/smssettings.php:224 msgid "" "A confirmation code was sent to the phone number you added. Check your inbox " "(and spam box!) for the code and instructions on how to use it." msgstr "" -"Kod potwierdzający został wysłany na podany przez Ciebie numer telefonu. " -"Sprawdź w swojej skrzynce odbiorczej (także w folderze SPAM) czy otrzymałeś " -"kod i instrukcje dotyczące jego użycia. " +"Kod potwierdzający został wysłany na dodany numer telefonu. Sprawdź w swojej " +"skrzynce odbiorczej (także w wiadomościach niechcianych!), czy otrzymałeś " +"kod i instrukcje dotyczące jego użycia." #: ../actions/twitapiaccount.php:49 ../actions/twitapihelp.php:45 #: ../actions/twitapistatuses.php:88 ../actions/twitapistatuses.php:259 @@ -265,9 +295,14 @@ msgstr "" #: actions/twitapistatuses.php:147 actions/twitapistatuses.php:228 #: actions/twitapistatuses.php:239 actions/twitapistatuses.php:392 #: actions/twitapistatuses.php:402 actions/twitapistatuses.php:429 -#: actions/twitapiusers.php:32 +#: actions/twitapiusers.php:32 actions/twitapidirect_messages.php:120 +#: actions/twitapifavorites.php:91 actions/twitapifavorites.php:108 +#: actions/twitapistatuses.php:82 actions/twitapistatuses.php:159 +#: actions/twitapistatuses.php:246 actions/twitapistatuses.php:257 +#: actions/twitapistatuses.php:416 actions/twitapistatuses.php:426 +#: actions/twitapistatuses.php:453 msgid "API method not found!" -msgstr "metoda API nie znaleziona!" +msgstr "Nie znaleziono metody API!" #: ../actions/twitapiaccount.php:57 ../actions/twitapiaccount.php:113 #: ../actions/twitapiaccount.php:119 ../actions/twitapiblocks.php:28 @@ -288,18 +323,21 @@ msgstr "metoda API nie znaleziona!" #: actions/twitapidirect_messages.php:184 actions/twitapifavorites.php:143 #: actions/twitapihelp.php:52 actions/twitapilaconica.php:172 #: actions/twitapinotifications.php:31 actions/twitapinotifications.php:37 -#: actions/twitapistatuses.php:562 +#: actions/twitapistatuses.php:562 actions/twitapiaccount.php:46 +#: actions/twitapiaccount.php:98 actions/twitapiaccount.php:104 +#: actions/twitapidirect_messages.php:193 actions/twitapifavorites.php:149 +#: actions/twitapistatuses.php:625 actions/twitapitrends.php:87 msgid "API method under construction." -msgstr "metoda API w trakcie powstawania." +msgstr "Metoda API jest w trakcie tworzenia." -#: ../lib/util.php:324 lib/util.php:340 lib/action.php:568 +#: ../lib/util.php:324 lib/util.php:340 lib/action.php:568 lib/action.php:661 msgid "About" -msgstr "O serwisie" +msgstr "O usłudze" #: ../actions/userauthorization.php:119 actions/userauthorization.php:126 #: actions/userauthorization.php:143 msgid "Accept" -msgstr "Akceptuj" +msgstr "Zaakceptuj" #: ../actions/emailsettings.php:62 ../actions/imsettings.php:63 #: ../actions/openidsettings.php:57 ../actions/smssettings.php:71 @@ -308,6 +346,7 @@ msgstr "Akceptuj" #: actions/twittersettings.php:85 actions/emailsettings.php:120 #: actions/imsettings.php:127 actions/openidsettings.php:111 #: actions/smssettings.php:133 actions/twittersettings.php:163 +#: actions/twittersettings.php:166 msgid "Add" msgstr "Dodaj" @@ -330,13 +369,14 @@ msgid "Address" msgstr "Adres" #: ../actions/invite.php:131 actions/invite.php:139 actions/invite.php:176 +#: actions/invite.php:181 msgid "Addresses of friends to invite (one per line)" -msgstr "Adresy subskrybentów, których zapraszasz (jeden w każdej linii)" +msgstr "Adresy przyjaciół, których zapraszasz (jeden na wiersz)" #: ../actions/showstream.php:273 actions/showstream.php:288 #: actions/showstream.php:422 msgid "All subscriptions" -msgstr "Wszyscy obserwowani" +msgstr "Wszystkie subskrypcje" #: ../actions/publicrss.php:64 actions/publicrss.php:50 #: actions/publicrss.php:92 @@ -348,7 +388,7 @@ msgstr "Wszystkie aktualizacje od %s" #: actions/noticesearchrss.php:90 #, php-format msgid "All updates matching search term \"%s\"" -msgstr "Wszystkie aktualizacje pasujące do wzorca wyszukiwania \"%s\"" +msgstr "Wszystkie aktualizacje pasujące do wyszukiwanego terminu \"%s\"" #: ../actions/finishopenidlogin.php:29 ../actions/login.php:31 #: ../actions/openidlogin.php:29 ../actions/register.php:30 @@ -361,68 +401,72 @@ msgstr "Jesteś już zalogowany." #: ../lib/subs.php:42 lib/subs.php:42 lib/subs.php:49 msgid "Already subscribed!." -msgstr "Już obserwujesz!" +msgstr "Już subskrybowane!" #: ../actions/deletenotice.php:54 actions/deletenotice.php:55 -#: actions/deletenotice.php:113 +#: actions/deletenotice.php:113 actions/deletenotice.php:114 msgid "Are you sure you want to delete this notice?" msgstr "Jesteś pewien, że chcesz usunąć ten wpis?" #: ../actions/userauthorization.php:77 actions/userauthorization.php:83 #: actions/userauthorization.php:81 msgid "Authorize subscription" -msgstr "Pozwól na obserwację" +msgstr "Upoważnij subskrypcję" #: ../actions/login.php:104 ../actions/register.php:178 -#: actions/register.php:192 +#: actions/register.php:192 actions/login.php:218 actions/openidlogin.php:117 +#: actions/register.php:416 msgid "Automatically login in the future; not for shared computers!" msgstr "" -"Automatycznie loguj mnie na konto. Nie używać w przypadku współdzielonych " -"komputerów!" +"Automatyczne logowanie. Nie użyj na komputerach używanych przez wiele osób!" #: ../actions/profilesettings.php:65 actions/profilesettings.php:98 +#: actions/profilesettings.php:144 msgid "" "Automatically subscribe to whoever subscribes to me (best for non-humans)" msgstr "" -"Automatycznie zasubskrybuj każdego kto mnie zasubskrybuje (najlepsze dla " +"Automatycznie zasubskrybuj każdego, kto mnie zasubskrybuje (najlepsze dla " "botów)" #: ../actions/avatar.php:32 ../lib/settingsaction.php:90 #: actions/profilesettings.php:34 actions/avatarsettings.php:65 #: actions/showgroup.php:209 lib/accountsettingsaction.php:107 +#: actions/avatarsettings.php:67 actions/showgroup.php:211 msgid "Avatar" msgstr "Awatar" #: ../actions/avatar.php:113 actions/profilesettings.php:350 -#: actions/avatarsettings.php:395 +#: actions/avatarsettings.php:395 actions/avatarsettings.php:346 msgid "Avatar updated." -msgstr "Awatar załadowany." +msgstr "Zaktualizowano awatar." #: ../actions/imsettings.php:55 actions/imsettings.php:56 +#: actions/imsettings.php:108 #, 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 "" -"Oczekiwanie na potwierdzenie dla tego adresu. Sprawdź czy na Twoje konto " -"Jabbera/GTalka przyszła wiadomość z dalszymi instrukcjami. (Nie zapomnij " -"dodać %s do listy znajomych.)" +"Oczekiwanie na potwierdzenie tego adresu. Sprawdź swoje konto Jabbera/GTalk, " +"czy otrzymałeś wiadomość z dalszymi instrukcjami (dodałeś %s do listy " +"znajomych?)." #: ../actions/emailsettings.php:54 actions/emailsettings.php:55 +#: actions/emailsettings.php:107 msgid "" "Awaiting confirmation on this address. Check your inbox (and spam box!) for " "a message with further instructions." msgstr "" -"Ten adres oczekuje potwierdzenia. Sprawdź swoją skrzynkę odbiorczą (także " -"folder SPAM!) czy dostałeś wiadomość z dalszymi instrukcjami. " +"Oczekiwanie na potwierdzenie tego adresu. Sprawdź swoją skrzynkę odbiorczą " +"(także w wiadomościach niechcianych!), czy otrzymałeś wiadomość z dalszymi " +"instrukcjami." #: ../actions/smssettings.php:58 actions/smssettings.php:58 #: actions/smssettings.php:111 msgid "Awaiting confirmation on this phone number." -msgstr "Oczekiwanie na potwierdzenie dla tego numeru telefonu." +msgstr "Oczekiwanie na potwierdzenie tego numeru telefonu." #: ../lib/util.php:1318 lib/util.php:1452 -#, fuzzy msgid "Before »" msgstr "Wcześniej »" @@ -436,23 +480,24 @@ msgstr "O mnie" #: ../actions/updateprofile.php:103 actions/profilesettings.php:216 #: actions/register.php:89 actions/updateprofile.php:104 #: actions/profilesettings.php:205 actions/register.php:174 -#: actions/updateprofile.php:107 +#: actions/updateprofile.php:107 actions/updateprofile.php:109 msgid "Bio is too long (max 140 chars)." -msgstr "Wpis \"O mnie\" jest za długi (maks. 140 znaków)" +msgstr "Wpis \"O mnie\" jest za długi (maksymalnie 140 znaków)." #: ../lib/deleteaction.php:41 lib/deleteaction.php:41 lib/deleteaction.php:69 msgid "Can't delete this notice." -msgstr "Nie można usunąć tego wpisu. " +msgstr "Nie można usunąć tego wpisu." #: ../actions/updateprofile.php:119 actions/updateprofile.php:120 -#: actions/updateprofile.php:123 +#: actions/updateprofile.php:123 actions/updateprofile.php:125 #, php-format msgid "Can't read avatar URL '%s'" -msgstr "Nie można odczytać URL-a awatara '%s'" +msgstr "Nie można odczytać adresu URL awatara \"%s\"" #: ../actions/password.php:85 ../actions/recoverpassword.php:300 #: actions/profilesettings.php:404 actions/recoverpassword.php:313 #: actions/passwordsettings.php:169 actions/recoverpassword.php:347 +#: actions/passwordsettings.php:174 msgid "Can't save new password." msgstr "Nie można zapisać nowego hasła." @@ -465,8 +510,9 @@ msgid "Cancel" msgstr "Anuluj" #: ../lib/openid.php:121 lib/openid.php:121 lib/openid.php:130 +#: lib/openid.php:133 msgid "Cannot instantiate OpenID consumer object." -msgstr "Nie można stworzyć instancji obiektu OpenID." +msgstr "Nie można utworzyć instancji obiektu klienta OpenID." #: ../actions/imsettings.php:163 actions/imsettings.php:171 #: actions/imsettings.php:286 @@ -474,9 +520,9 @@ msgid "Cannot normalize that Jabber ID" msgstr "Nie można znormalizować tego identyfikatora Jabbera" #: ../actions/emailsettings.php:181 actions/emailsettings.php:199 -#: actions/emailsettings.php:311 +#: actions/emailsettings.php:311 actions/emailsettings.php:318 msgid "Cannot normalize that email address" -msgstr "" +msgstr "Nie można znormalizować tego adresu e-mail" #: ../actions/password.php:45 actions/profilesettings.php:184 #: actions/passwordsettings.php:110 @@ -486,7 +532,7 @@ msgstr "Zmień" #: ../lib/settingsaction.php:88 lib/settingsaction.php:88 #: lib/accountsettingsaction.php:114 msgid "Change email handling" -msgstr "" +msgstr "Zmień obsługę adresu e-mail" #: ../actions/password.php:32 actions/profilesettings.php:36 #: actions/passwordsettings.php:58 @@ -495,12 +541,12 @@ msgstr "Zmień hasło" #: ../lib/settingsaction.php:94 lib/accountsettingsaction.php:111 msgid "Change your password" -msgstr "" +msgstr "Zmień hasło" #: ../lib/settingsaction.php:85 lib/settingsaction.php:85 #: lib/accountsettingsaction.php:105 msgid "Change your profile settings" -msgstr "" +msgstr "Zmień ustawienia profilu" #: ../actions/password.php:43 ../actions/recoverpassword.php:181 #: ../actions/register.php:155 ../actions/smssettings.php:65 @@ -520,21 +566,21 @@ msgstr "Potwierdź adres" #: ../actions/smssettings.php:245 actions/emailsettings.php:256 #: actions/imsettings.php:230 actions/smssettings.php:253 #: actions/emailsettings.php:379 actions/imsettings.php:361 -#: actions/smssettings.php:374 +#: actions/smssettings.php:374 actions/emailsettings.php:386 msgid "Confirmation cancelled." msgstr "Anulowano potwierdzenie." #: ../actions/smssettings.php:63 actions/smssettings.php:63 #: actions/smssettings.php:118 msgid "Confirmation code" -msgstr "" +msgstr "Kod potwierdzający" #: ../actions/confirmaddress.php:38 actions/confirmaddress.php:38 #: actions/confirmaddress.php:80 msgid "Confirmation code not found." msgstr "Nie znaleziono kodu potwierdzającego." -#: ../actions/register.php:202 +#: ../actions/register.php:202 actions/register.php:473 #, php-format msgid "" "Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may " @@ -552,9 +598,24 @@ msgid "" "\n" "Thanks for signing up and we hope you enjoy using this service." msgstr "" +"Gratulacje, %s! Witaj na %%%%site.name%%%%. Stąd możesz chcieć...\n" +"\n" +"* Przejść do [swojego profilu](%s) i wysłać swoją pierwszą wiadomość.\n" +"* Dodać [adres Jabbera/GTalk](%%%%action.imsettings%%%%), abyś mógł wysyłać " +"wpisy przez komunikatora.\n" +"* [Poszukać osób](%%%%action.peoplesearch%%%%), których możesz znać lub " +"którzy dzielą Twoje zainteresowania. \n" +"* Zaktualizować swoje [ustawienia profilu](%%%%action.profilesettings%%%%), " +"aby powiedzieć innym więcej o sobie. \n" +"* Przeczytać [dokumentację w sieci](%%%%doc.help%%%%), aby dowiedzieć się o " +"funkcjach, które mogłeś pominąć. \n" +"\n" +"Dziękujemy za zarejestrowanie się i mamy nadzieję, że używanie tej usługi " +"sprawi Ci przyjemność." #: ../actions/finishopenidlogin.php:91 actions/finishopenidlogin.php:97 -#: actions/finishopenidlogin.php:119 lib/action.php:330 +#: actions/finishopenidlogin.php:119 lib/action.php:330 lib/action.php:403 +#: lib/action.php:406 msgid "Connect" msgstr "Połącz" @@ -563,11 +624,12 @@ msgstr "Połącz" msgid "Connect existing account" msgstr "Połącz z istniejącym kontem" -#: ../lib/util.php:332 lib/util.php:348 lib/action.php:576 +#: ../lib/util.php:332 lib/util.php:348 lib/action.php:576 lib/action.php:669 msgid "Contact" msgstr "Kontakt" #: ../lib/openid.php:178 lib/openid.php:178 lib/openid.php:187 +#: lib/openid.php:190 #, php-format msgid "Could not create OpenID form: %s" msgstr "Nie można utworzyć formularza OpenID: %s" @@ -577,45 +639,46 @@ msgstr "Nie można utworzyć formularza OpenID: %s" #: actions/twitapifriendships.php:48 actions/twitapifriendships.php:64 #, php-format msgid "Could not follow user: %s is already on your list." -msgstr "" +msgstr "Nie można obserwować użytkownika: %s jest już na Twojej liście." #: ../actions/twitapifriendships.php:53 actions/twitapifriendships.php:53 #: actions/twitapifriendships.php:41 msgid "Could not follow user: User not found." -msgstr "" +msgstr "Nie można obserwować użytkownika: nie znaleziono użytkownika." #: ../lib/openid.php:160 lib/openid.php:160 lib/openid.php:169 +#: lib/openid.php:172 #, php-format msgid "Could not redirect to server: %s" msgstr "Nie można przekierować do serwera: %s" #: ../actions/updateprofile.php:162 actions/updateprofile.php:163 -#: actions/updateprofile.php:166 +#: actions/updateprofile.php:166 actions/updateprofile.php:176 msgid "Could not save avatar info" msgstr "Nie można zapisać informacji o awatarze" #: ../actions/updateprofile.php:155 actions/updateprofile.php:156 -#: actions/updateprofile.php:159 +#: actions/updateprofile.php:159 actions/updateprofile.php:163 msgid "Could not save new profile info" msgstr "Nie można zapisać informacji o nowym profilu" #: ../lib/subs.php:54 lib/subs.php:61 lib/subs.php:72 msgid "Could not subscribe other to you." -msgstr "" +msgstr "Nie można zasubskrybować innych do Ciebie." #: ../lib/subs.php:46 lib/subs.php:46 lib/subs.php:57 msgid "Could not subscribe." -msgstr "" +msgstr "Nie można zasubskrybować." #: ../actions/recoverpassword.php:102 actions/recoverpassword.php:105 #: actions/recoverpassword.php:111 msgid "Could not update user with confirmed email address." -msgstr "" +msgstr "Nie można zaktualizować użytkownika z potwierdzonym adresem e-mail." #: ../actions/finishremotesubscribe.php:99 #: actions/finishremotesubscribe.php:101 actions/finishremotesubscribe.php:114 msgid "Couldn't convert request tokens to access tokens." -msgstr "Nie można przekształcić tokenów z żądaniami na tokeny dostępu." +msgstr "Nie można przekonwertować tokenów żądań na tokeny dostępu." #: ../actions/confirmaddress.php:84 ../actions/emailsettings.php:234 #: ../actions/imsettings.php:218 ../actions/smssettings.php:241 @@ -623,52 +686,56 @@ msgstr "Nie można przekształcić tokenów z żądaniami na tokeny dostępu." #: actions/imsettings.php:226 actions/smssettings.php:249 #: actions/confirmaddress.php:126 actions/emailsettings.php:375 #: actions/imsettings.php:357 actions/smssettings.php:370 +#: actions/emailsettings.php:382 msgid "Couldn't delete email confirmation." -msgstr "Nie można skasować potwierdzenia adresu e-mail." +msgstr "Nie można usunąć potwierdzenia adresu e-mail." #: ../lib/subs.php:103 lib/subs.php:116 lib/subs.php:134 msgid "Couldn't delete subscription." -msgstr "Nie można usunąć obserwacji." +msgstr "Nie można usunąć subskrypcji." #: ../actions/twitapistatuses.php:93 actions/twitapistatuses.php:98 -#: actions/twitapistatuses.php:84 +#: actions/twitapistatuses.php:84 actions/twitapistatuses.php:87 msgid "Couldn't find any statuses." -msgstr "" +msgstr "Nie można znaleźć żadnych statusów." #: ../actions/remotesubscribe.php:127 actions/remotesubscribe.php:136 #: actions/remotesubscribe.php:178 msgid "Couldn't get a request token." -msgstr "Nie można uzyskać tokena z żądaniem." +msgstr "Nie można uzyskać tokenu żądana." #: ../actions/emailsettings.php:205 ../actions/imsettings.php:187 #: ../actions/smssettings.php:206 actions/emailsettings.php:223 #: actions/imsettings.php:195 actions/smssettings.php:214 #: actions/emailsettings.php:337 actions/imsettings.php:311 -#: actions/smssettings.php:325 +#: actions/smssettings.php:325 actions/emailsettings.php:344 msgid "Couldn't insert confirmation code." msgstr "Nie można wprowadzić kodu potwierdzającego." #: ../actions/finishremotesubscribe.php:180 #: actions/finishremotesubscribe.php:182 actions/finishremotesubscribe.php:218 msgid "Couldn't insert new subscription." -msgstr "Nie można wprowadzić nowej obserwacji." +msgstr "Nie można wprowadzić nowej subskrypcji." #: ../actions/profilesettings.php:184 ../actions/twitapiaccount.php:96 #: actions/profilesettings.php:299 actions/twitapiaccount.php:94 #: actions/profilesettings.php:302 actions/twitapiaccount.php:81 +#: actions/twitapiaccount.php:82 msgid "Couldn't save profile." msgstr "Nie można zapisać profilu." #: ../actions/profilesettings.php:161 actions/profilesettings.php:276 #: actions/profilesettings.php:279 msgid "Couldn't update user for autosubscribe." -msgstr "" +msgstr "Nie można zaktualizować użytkownika do automatycznej subskrypcji." #: ../actions/emailsettings.php:280 ../actions/emailsettings.php:294 #: actions/emailsettings.php:298 actions/emailsettings.php:312 #: actions/emailsettings.php:440 actions/emailsettings.php:462 +#: actions/emailsettings.php:447 actions/emailsettings.php:469 +#: actions/smssettings.php:515 actions/smssettings.php:539 msgid "Couldn't update user record." -msgstr "" +msgstr "Nie można zaktualizować wpisu użytkownika." #: ../actions/confirmaddress.php:72 ../actions/emailsettings.php:156 #: ../actions/emailsettings.php:259 ../actions/imsettings.php:138 @@ -682,7 +749,8 @@ msgstr "" #: actions/emailsettings.php:411 actions/imsettings.php:252 #: actions/imsettings.php:395 actions/othersettings.php:162 #: actions/profilesettings.php:259 actions/smssettings.php:266 -#: actions/smssettings.php:408 +#: actions/smssettings.php:408 actions/emailsettings.php:287 +#: actions/emailsettings.php:418 msgid "Couldn't update user." msgstr "Nie można zaktualizować użytkownika." @@ -694,57 +762,61 @@ msgstr "Utwórz" #: ../actions/finishopenidlogin.php:70 actions/finishopenidlogin.php:76 #: actions/finishopenidlogin.php:98 msgid "Create a new user with this nickname." -msgstr "Załóż użytkownika o tym pseudonimie." +msgstr "Utwórz nowego użytkownika o tym pseudonimie." #: ../actions/finishopenidlogin.php:68 actions/finishopenidlogin.php:74 #: actions/finishopenidlogin.php:96 msgid "Create new account" -msgstr "Załóż nowe konto" +msgstr "Utwórz nowe konto" #: ../actions/finishopenidlogin.php:191 actions/finishopenidlogin.php:197 #: actions/finishopenidlogin.php:231 msgid "Creating new account for OpenID that already has a user." -msgstr "Tworzenie nowego konta użytkownika na podstawie identyfikatora OpenID." +msgstr "" +"Tworzenie nowego konta dla identyfikatora OpenID, który posiada już " +"użytkownika." #: ../actions/imsettings.php:45 actions/imsettings.php:46 #: actions/imsettings.php:100 msgid "Current confirmed Jabber/GTalk address." -msgstr "Potwierdzone adresy Jabbera/GTalka" +msgstr "Obecnie potwierdzone adresy Jabbera/GTalk." #: ../actions/smssettings.php:46 actions/smssettings.php:46 #: actions/smssettings.php:100 msgid "Current confirmed SMS-enabled phone number." -msgstr "" +msgstr "Obecnie potwierdzone numery telefonów z włączoną usługą SMS." #: ../actions/emailsettings.php:44 actions/emailsettings.php:45 #: actions/emailsettings.php:99 msgid "Current confirmed email address." -msgstr "" +msgstr "Obecnie potwierdzone adresy e-mail." #: ../actions/showstream.php:356 actions/showstream.php:367 msgid "Currently" msgstr "Obecnie" #: ../classes/Notice.php:72 classes/Notice.php:86 classes/Notice.php:91 +#: classes/Notice.php:114 #, php-format msgid "DB error inserting hashtag: %s" -msgstr "" +msgstr "Błąd bazy danych podczas wprowadzania znacznika hasha: %s" #: ../lib/util.php:1061 lib/util.php:1110 classes/Notice.php:698 +#: classes/Notice.php:757 #, php-format msgid "DB error inserting reply: %s" -msgstr "Błąd przy dodawaniu do bazy danych: %s" +msgstr "Błąd bazy danych podczas wprowadzania odpowiedzi: %s" #: ../actions/deletenotice.php:41 actions/deletenotice.php:41 -#: actions/deletenotice.php:79 +#: actions/deletenotice.php:79 actions/deletenotice.php:111 msgid "Delete notice" -msgstr "" +msgstr "Usuń wpis" #: ../actions/profilesettings.php:51 ../actions/register.php:172 #: actions/profilesettings.php:84 actions/register.php:186 -#: actions/profilesettings.php:114 +#: actions/profilesettings.php:114 actions/register.php:404 msgid "Describe yourself and your interests in 140 chars" -msgstr "Opisz się w 140 znakach" +msgstr "Opisz się i swoje zainteresowania w 140 znakach" #: ../actions/register.php:158 ../actions/register.php:161 #: ../lib/settingsaction.php:87 actions/register.php:172 @@ -756,59 +828,60 @@ msgstr "E-mail" #: ../actions/emailsettings.php:59 actions/emailsettings.php:60 #: actions/emailsettings.php:115 msgid "Email Address" -msgstr "" +msgstr "Adres e-mail" #: ../actions/emailsettings.php:32 actions/emailsettings.php:32 #: actions/emailsettings.php:60 msgid "Email Settings" -msgstr "" +msgstr "Ustawienia adresu e-mail" #: ../actions/register.php:73 actions/register.php:80 actions/register.php:163 msgid "Email address already exists." -msgstr "Taki e-mail już istnieje" +msgstr "Adres e-mail już istnieje." #: ../lib/mail.php:90 lib/mail.php:90 lib/mail.php:173 msgid "Email address confirmation" -msgstr "Potwierdzenie adresu e-mailowego" +msgstr "Potwierdzenie adresu e-mail" #: ../actions/emailsettings.php:61 actions/emailsettings.php:62 #: actions/emailsettings.php:117 msgid "Email address, like \"UserName@example.org\"" -msgstr "" +msgstr "Adres e-mail, taki jak \"NazwaUżytkownika@przykład.org\"" #: ../actions/invite.php:129 actions/invite.php:137 actions/invite.php:174 +#: actions/invite.php:179 msgid "Email addresses" -msgstr "" +msgstr "Adresy e-mail" #: ../actions/recoverpassword.php:191 actions/recoverpassword.php:197 #: actions/recoverpassword.php:231 msgid "Enter a nickname or email address." -msgstr "Podaj pseudonim lub adres e-mailowy" +msgstr "Podaj pseudonim lub adres e-mail." #: ../actions/smssettings.php:64 actions/smssettings.php:64 #: actions/smssettings.php:119 msgid "Enter the code you received on your phone." -msgstr "" +msgstr "Podaj kod, który otrzymałeś na telefonie." #: ../actions/userauthorization.php:137 actions/userauthorization.php:144 #: actions/userauthorization.php:161 msgid "Error authorizing token" -msgstr "Błąd podczas autoryzacji tokena" +msgstr "Błąd podczas upoważniania tokena" #: ../actions/finishopenidlogin.php:253 actions/finishopenidlogin.php:259 -#: actions/finishopenidlogin.php:297 +#: actions/finishopenidlogin.php:297 actions/finishopenidlogin.php:302 msgid "Error connecting user to OpenID." -msgstr "Błąd w podłączaniu użytkownika do OpenID." +msgstr "Błąd podczas łączenia użytkownika z OpenID." #: ../actions/finishaddopenid.php:78 actions/finishaddopenid.php:78 #: actions/finishaddopenid.php:126 msgid "Error connecting user." -msgstr "Błąd w podłączaniu użytkownika." +msgstr "Błąd podczas łączenia użytkownika." #: ../actions/finishremotesubscribe.php:151 #: actions/finishremotesubscribe.php:153 actions/finishremotesubscribe.php:166 msgid "Error inserting avatar" -msgstr "Błąd we wstawianiu awatara" +msgstr "Błąd podczas wprowadzania awatara" #: ../actions/finishremotesubscribe.php:143 #: actions/finishremotesubscribe.php:145 actions/finishremotesubscribe.php:158 @@ -823,33 +896,36 @@ msgstr "Błąd podczas wprowadzania zdalnego profilu" #: ../actions/recoverpassword.php:240 actions/recoverpassword.php:246 #: actions/recoverpassword.php:280 msgid "Error saving address confirmation." -msgstr "Błąd w zapisie potwierdzenia adresu." +msgstr "Błąd podczas zapisywania potwierdzenia adresu." #: ../actions/userauthorization.php:140 actions/userauthorization.php:147 #: actions/userauthorization.php:164 msgid "Error saving remote profile" -msgstr "Błąd w zapisie zdalnego profilu." +msgstr "Błąd podczas zapisie zdalnego profilu" #: ../lib/openid.php:226 lib/openid.php:226 lib/openid.php:235 +#: lib/openid.php:238 msgid "Error saving the profile." -msgstr "Błąd w zapisie profilu." +msgstr "Błąd podczas zapisywania profilu." #: ../lib/openid.php:237 lib/openid.php:237 lib/openid.php:246 +#: lib/openid.php:249 msgid "Error saving the user." -msgstr "Błąd w zapisie użytkownika." +msgstr "Błąd podczas zapisywanie użytkownika." #: ../actions/password.php:80 actions/profilesettings.php:399 -#: actions/passwordsettings.php:164 +#: actions/passwordsettings.php:164 actions/passwordsettings.php:169 msgid "Error saving user; invalid." -msgstr "Błąd podczas zapisywania użytkownika; niepoprawne dane." +msgstr "Błąd podczas zapisywania użytkownika; nieprawidłowy." #: ../actions/login.php:47 ../actions/login.php:73 #: ../actions/recoverpassword.php:307 ../actions/register.php:98 #: actions/login.php:47 actions/login.php:73 actions/recoverpassword.php:320 #: actions/register.php:108 actions/login.php:112 actions/login.php:138 #: actions/recoverpassword.php:354 actions/register.php:198 +#: actions/login.php:120 msgid "Error setting user." -msgstr "Błąd w ustawianiu danych użytkownika." +msgstr "Błąd podczas ustawiania użytkownika." #: ../actions/finishaddopenid.php:83 actions/finishaddopenid.php:83 #: actions/finishaddopenid.php:131 @@ -869,78 +945,83 @@ msgstr "Błąd kodu potwierdzającego." #: ../actions/finishopenidlogin.php:89 actions/finishopenidlogin.php:95 #: actions/finishopenidlogin.php:117 msgid "Existing nickname" -msgstr "Dotychczasowy pseudonim" +msgstr "Istniejący pseudonim" -#: ../lib/util.php:326 lib/util.php:342 lib/action.php:570 +#: ../lib/util.php:326 lib/util.php:342 lib/action.php:570 lib/action.php:663 msgid "FAQ" msgstr "FAQ" #: ../actions/avatar.php:115 actions/profilesettings.php:352 -#: actions/avatarsettings.php:397 +#: actions/avatarsettings.php:397 actions/avatarsettings.php:349 msgid "Failed updating avatar." -msgstr "Uaktualnianie awatara nie powiodło się." +msgstr "Zaktualizowanie awatara nie powiodło się." #: ../actions/all.php:61 ../actions/allrss.php:64 actions/all.php:61 #: actions/allrss.php:64 actions/all.php:75 actions/allrss.php:107 +#: actions/allrss.php:110 #, php-format msgid "Feed for friends of %s" msgstr "Kanał dla znajomych użytkownika %s" #: ../actions/replies.php:65 ../actions/repliesrss.php:80 #: actions/replies.php:65 actions/repliesrss.php:66 actions/replies.php:134 -#: actions/repliesrss.php:71 +#: actions/repliesrss.php:71 actions/replies.php:136 #, php-format msgid "Feed for replies to %s" msgstr "Kanał dla odpowiedzi do użytkownika %s" #: ../actions/tag.php:55 actions/tag.php:55 actions/tag.php:61 +#: actions/tag.php:68 #, php-format msgid "Feed for tag %s" -msgstr "" +msgstr "Kanał dla znaczników %s" #: ../lib/searchaction.php:105 lib/searchaction.php:105 #: lib/searchgroupnav.php:83 msgid "Find content of notices" -msgstr "" +msgstr "Przeszukaj zawartość wpisów" #: ../lib/searchaction.php:101 lib/searchaction.php:101 #: lib/searchgroupnav.php:81 msgid "Find people on this site" -msgstr "" +msgstr "Znajdź osoby na tej stronie" -#: ../actions/login.php:122 +#: ../actions/login.php:122 actions/login.php:247 msgid "" "For security reasons, please re-enter your user name and password before " "changing your settings." msgstr "" -"Z powodów bezpieczeństwa wprowadź proszę ponownie nazwę użytkownika i hasło " -"przed zmianą swoich ustawień." +"Z powodów bezpieczeństwa ponownie podaj nazwę użytkownika i hasło przed " +"zmienianiem ustawień." #: ../actions/profilesettings.php:44 ../actions/register.php:164 #: actions/profilesettings.php:77 actions/register.php:178 #: actions/profilesettings.php:103 actions/register.php:391 #: actions/showgroup.php:235 actions/showstream.php:262 #: actions/tagother.php:105 lib/groupeditform.php:142 +#: actions/showgroup.php:237 actions/showstream.php:255 +#: actions/tagother.php:104 msgid "Full name" -msgstr "Pełna nazwa" +msgstr "Imię i nazwisko" #: ../actions/profilesettings.php:98 ../actions/register.php:79 #: ../actions/updateprofile.php:93 actions/profilesettings.php:213 #: actions/register.php:86 actions/updateprofile.php:94 #: actions/editgroup.php:195 actions/newgroup.php:146 #: actions/profilesettings.php:202 actions/register.php:171 -#: actions/updateprofile.php:97 +#: actions/updateprofile.php:97 actions/updateprofile.php:99 msgid "Full name is too long (max 255 chars)." -msgstr "Pełna nazwa jest zbyt długa (max. 255 znaków)." +msgstr "Imię i nazwisko jest za długie (maksymalnie 255 znaków)." #: ../lib/util.php:322 lib/util.php:338 lib/action.php:344 lib/action.php:566 +#: lib/action.php:421 lib/action.php:659 msgid "Help" msgstr "Pomoc" #: ../lib/util.php:298 lib/util.php:314 lib/action.php:322 -#: lib/facebookaction.php:200 +#: lib/facebookaction.php:200 lib/action.php:393 lib/facebookaction.php:213 msgid "Home" -msgstr "Początek" +msgstr "Strona główna" #: ../actions/profilesettings.php:46 ../actions/register.php:167 #: actions/profilesettings.php:79 actions/register.php:181 @@ -954,17 +1035,17 @@ msgstr "Strona domowa" #: actions/editgroup.php:192 actions/newgroup.php:143 #: actions/profilesettings.php:199 actions/register.php:168 msgid "Homepage is not a valid URL." -msgstr "Adres strony domowej nie jest poprawnym URL-em." +msgstr "Strona domowa nie jest prawidłowym adresem URL." #: ../actions/emailsettings.php:91 actions/emailsettings.php:98 -#: actions/emailsettings.php:173 +#: actions/emailsettings.php:173 actions/emailsettings.php:178 msgid "I want to post notices by email." -msgstr "" +msgstr "Chcę wysyłać wpisy przez e-mail." #: ../lib/settingsaction.php:102 lib/settingsaction.php:96 #: lib/connectsettingsaction.php:104 msgid "IM" -msgstr "" +msgstr "Komunikator" #: ../actions/imsettings.php:60 actions/imsettings.php:61 #: actions/imsettings.php:118 @@ -982,146 +1063,149 @@ msgid "" "If you already have an account, login with your username and password to " "connect it to your OpenID." msgstr "" -"Jeśli już masz konto, zaloguj się używając nazwy użytkownika i hasła, aby " +"Jeśli już masz konto, zaloguj się za pomocą nazwy użytkownika i hasła, aby " "połączyć je ze swoim identyfikatorem OpenID." -#: ../actions/openidsettings.php:45 +#: ../actions/openidsettings.php:45 actions/openidsettings.php:96 msgid "" "If you want to add an OpenID to your account, enter it in the box below and " "click \"Add\"." msgstr "" -"Jeśli chcesz skojarzyć konto OpenID ze swoim lokalnym kontem, wprowadź " -"identyfikator w poniższe pole i kliknij \"Dodaj\"." +"Jeśli chcesz dodać identyfikator OpenID do swojego konta, podaj go w " +"poniższym polu i naciśnij \"Dodaj\"." -#: ../actions/recoverpassword.php:137 +#: ../actions/recoverpassword.php:137 actions/recoverpassword.php:152 msgid "" "If you've forgotten or lost your password, you can get a new one sent to the " "email address you have stored in your account." msgstr "" +"Jeśli zapomniałeś lub zgubiłeś swoje hasło, możesz dostać nowe na adres e-" +"mail, który podałeś." #: ../actions/emailsettings.php:67 ../actions/smssettings.php:76 #: actions/emailsettings.php:68 actions/smssettings.php:76 #: actions/emailsettings.php:127 actions/smssettings.php:140 msgid "Incoming email" -msgstr "" +msgstr "Wiadomości przychodzące" #: ../actions/emailsettings.php:283 actions/emailsettings.php:301 -#: actions/emailsettings.php:443 +#: actions/emailsettings.php:443 actions/emailsettings.php:450 +#: actions/smssettings.php:518 msgid "Incoming email address removed." -msgstr "" +msgstr "Usunięto przychodzący adres e-mail." #: ../actions/password.php:69 actions/profilesettings.php:388 -#: actions/passwordsettings.php:153 +#: actions/passwordsettings.php:153 actions/passwordsettings.php:158 msgid "Incorrect old password" -msgstr "Stare hasło jest niepoprawne" +msgstr "Niepoprawne stare hasło" #: ../actions/login.php:67 actions/login.php:67 actions/facebookhome.php:131 -#: actions/login.php:132 +#: actions/login.php:132 actions/facebookhome.php:130 actions/login.php:114 msgid "Incorrect username or password." -msgstr "Błędna nazwa użytkownika lub hasło." +msgstr "Niepoprawna nazwa użytkownika lub hasło." -#: ../actions/recoverpassword.php:265 +#: ../actions/recoverpassword.php:265 actions/recoverpassword.php:304 msgid "" "Instructions for recovering your password have been sent to the email " "address registered to your account." msgstr "" -"Instrukcje dotyczące przywrócenia hasła zostały wysłane na adres e-mailowy " -"skojarzony z Twoim kontem." +"Instrukcje przywracania hasła zostały wysłane na adres e-mail zarejestrowany " +"z Twoim kontem." #: ../actions/updateprofile.php:114 actions/updateprofile.php:115 -#: actions/updateprofile.php:118 +#: actions/updateprofile.php:118 actions/updateprofile.php:120 #, php-format msgid "Invalid avatar URL '%s'" -msgstr "Błędny URL awatara '%s'" +msgstr "Nieprawidłowy adres URL awatara \"%s\"" #: ../actions/invite.php:55 actions/invite.php:62 actions/invite.php:70 #, php-format msgid "Invalid email address: %s" -msgstr "" +msgstr "Nieprawidłowy adres e-mail: %s" #: ../actions/updateprofile.php:98 actions/updateprofile.php:99 -#: actions/updateprofile.php:102 +#: actions/updateprofile.php:102 actions/updateprofile.php:104 #, php-format msgid "Invalid homepage '%s'" -msgstr "Błędna strona domowa '%s'" +msgstr "Nieprawidłowa strona domowa \"%s\"" #: ../actions/updateprofile.php:82 actions/updateprofile.php:83 -#: actions/updateprofile.php:86 +#: actions/updateprofile.php:86 actions/updateprofile.php:88 #, php-format msgid "Invalid license URL '%s'" -msgstr "Błędny URL licencji '%s'" +msgstr "Nieprawidłowy adres URL licencji \"%s\"" #: ../actions/postnotice.php:61 actions/postnotice.php:62 #: actions/postnotice.php:66 msgid "Invalid notice content" -msgstr "Błędna zawartość wpisu" +msgstr "Nieprawidłowa zawartość wpisu" #: ../actions/postnotice.php:67 actions/postnotice.php:68 #: actions/postnotice.php:72 msgid "Invalid notice uri" -msgstr "Błędny URI wpisu" +msgstr "Nieprawidłowy adres URI wpisu" #: ../actions/postnotice.php:72 actions/postnotice.php:73 #: actions/postnotice.php:77 msgid "Invalid notice url" -msgstr "Błędny URL wpisu" +msgstr "Nieprawidłowy adres URL wpisu" #: ../actions/updateprofile.php:87 actions/updateprofile.php:88 -#: actions/updateprofile.php:91 +#: actions/updateprofile.php:91 actions/updateprofile.php:93 #, php-format msgid "Invalid profile URL '%s'." -msgstr "Błędny URL profilu '%s'." +msgstr "Nieprawidłowy adres URL profilu \"%s\"." #: ../actions/remotesubscribe.php:96 actions/remotesubscribe.php:105 #: actions/remotesubscribe.php:135 msgid "Invalid profile URL (bad format)" -msgstr "Błędny URL profilu (zły format)" +msgstr "Nieprawidłowy adres URL profilu (błędny format)" #: ../actions/finishremotesubscribe.php:77 #: actions/finishremotesubscribe.php:79 actions/finishremotesubscribe.php:80 msgid "Invalid profile URL returned by server." -msgstr "Błędny URL profilu zwrócony przez serwer." +msgstr "Nieprawidłowy adres URL profilu zwrócony przez serwer." #: ../actions/avatarbynickname.php:37 actions/avatarbynickname.php:37 #: actions/avatarbynickname.php:69 msgid "Invalid size." -msgstr "Niepoprawny rozmiar." +msgstr "Nieprawidłowy rozmiar." #: ../actions/finishopenidlogin.php:235 ../actions/register.php:93 #: ../actions/register.php:111 actions/finishopenidlogin.php:241 #: actions/register.php:103 actions/register.php:121 #: actions/finishopenidlogin.php:279 actions/register.php:193 -#: actions/register.php:211 +#: actions/register.php:211 actions/finishopenidlogin.php:284 msgid "Invalid username or password." -msgstr "Błędna nazwa użytkownika lub hasło." +msgstr "Nieprawidłowa nazwa użytkownika lub hasło." #: ../actions/invite.php:79 actions/invite.php:86 actions/invite.php:102 msgid "Invitation(s) sent" -msgstr "" +msgstr "Wysłano zaproszenia" #: ../actions/invite.php:97 actions/invite.php:104 actions/invite.php:136 msgid "Invitation(s) sent to the following people:" -msgstr "" +msgstr "Wysłano zaproszenia do następujących osób:" #: ../lib/util.php:306 lib/util.php:322 lib/facebookaction.php:207 -#: lib/subgroupnav.php:103 +#: lib/subgroupnav.php:103 lib/facebookaction.php:220 msgid "Invite" -msgstr "" +msgstr "Zaproś" #: ../actions/invite.php:123 actions/invite.php:130 actions/invite.php:104 msgid "Invite new users" -msgstr "" +msgstr "Zaproś nowych użytkowników" -#: ../lib/util.php:261 lib/util.php:277 lib/action.php:609 +#: ../lib/util.php:261 lib/util.php:277 lib/action.php:609 lib/action.php:706 #, php-format msgid "" "It runs the [Laconica](http://laconi.ca/) microblogging software, version %" "s, available under the [GNU Affero General Public License](http://www.fsf." "org/licensing/licenses/agpl-3.0.html)." msgstr "" -"Działa pod kontrolą oprogramowania [Laconica](http://laconi.ca/) służącego " -"do prowadzenia mikroblogów, w wersji %s, dostępnego na licencji [GNU Affero " -"General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html)." +"Działa pod kontrolą oprogramowania do mikroblogowania [Laconica](http://" +"laconi.ca/) w wersji %s, dostępnego na [Powszechnej Licencji Publicznej GNU " +"Affero](http://www.fsf.org/licensing/licenses/agpl-3.0.html)." #: ../actions/imsettings.php:173 actions/imsettings.php:181 #: actions/imsettings.php:296 @@ -1129,132 +1213,143 @@ msgid "Jabber ID already belongs to another user." msgstr "Identyfikator Jabbera należy już do innego użytkownika." #: ../actions/imsettings.php:62 actions/imsettings.php:63 +#: actions/imsettings.php:120 #, 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 "" -"Adres Jabbera lub GTalka w postaci \"Użytkownik@przykladowadomena.org\". Nie " -"zapomnij dodać %s do listy znajomych w swoim komunikatorze lub panelu GTalka." +"Adres Jabbera lub GTalk, taki jak \"NazwaUżytkownika@przykład.org\". " +"Najpierw upewnij się, że dodałeś %s do listy znajomych w komunikatorze lub " +"na GTalk." #: ../actions/profilesettings.php:57 actions/profilesettings.php:90 #: actions/profilesettings.php:128 msgid "Language" -msgstr "" +msgstr "Język" #: ../actions/profilesettings.php:113 actions/profilesettings.php:228 #: actions/profilesettings.php:217 msgid "Language is too long (max 50 chars)." -msgstr "" +msgstr "Język jest za długi (maksymalnie 50 znaków)." #: ../actions/profilesettings.php:52 ../actions/register.php:173 #: actions/profilesettings.php:85 actions/register.php:187 #: actions/profilesettings.php:117 actions/register.php:408 #: actions/showgroup.php:244 actions/showstream.php:271 #: actions/tagother.php:113 lib/groupeditform.php:156 lib/grouplist.php:126 -#: lib/profilelist.php:125 +#: lib/profilelist.php:125 actions/showgroup.php:246 +#: actions/showstream.php:264 actions/tagother.php:112 lib/profilelist.php:123 msgid "Location" -msgstr "Lokalizacja" +msgstr "Położenie" #: ../actions/profilesettings.php:104 ../actions/register.php:85 #: ../actions/updateprofile.php:108 actions/profilesettings.php:219 #: actions/register.php:92 actions/updateprofile.php:109 #: actions/editgroup.php:201 actions/newgroup.php:152 #: actions/profilesettings.php:208 actions/register.php:177 -#: actions/updateprofile.php:112 +#: actions/updateprofile.php:112 actions/updateprofile.php:114 msgid "Location is too long (max 255 chars)." -msgstr "Lokalizacja jest za długa (max. 255 znaków)." +msgstr "Położenie jest za długie (maksymalnie 255 znaków)." #: ../actions/login.php:97 ../actions/login.php:106 #: ../actions/openidlogin.php:68 ../lib/util.php:310 actions/login.php:97 #: actions/login.php:106 actions/openidlogin.php:77 lib/util.php:326 #: actions/facebooklogin.php:93 actions/login.php:186 actions/login.php:239 #: actions/openidlogin.php:112 lib/action.php:335 lib/facebookaction.php:288 -#: lib/facebookaction.php:315 lib/logingroupnav.php:75 +#: lib/facebookaction.php:315 lib/logingroupnav.php:75 actions/login.php:169 +#: actions/login.php:222 actions/openidlogin.php:121 lib/action.php:412 +#: lib/facebookaction.php:293 lib/facebookaction.php:319 #, php-format msgid "Login" -msgstr "Login" +msgstr "Zaloguj się" #: ../actions/openidlogin.php:44 actions/openidlogin.php:52 -#: actions/openidlogin.php:62 +#: actions/openidlogin.php:62 actions/openidlogin.php:70 #, php-format msgid "Login with an [OpenID](%%doc.openid%%) account." -msgstr "Zaloguj się używając konta [OpenID](%%doc.openid%%)." +msgstr "Zaloguj się za pomocą konta [OpenID](%%doc.openid%%)." -#: ../actions/login.php:126 +#: ../actions/login.php:126 actions/login.php:251 #, php-format msgid "" "Login with your username and password. Don't have a username yet? [Register]" "(%%action.register%%) a new account, or try [OpenID](%%action.openidlogin%" "%). " msgstr "" -"Zaloguj się używając nazwy użytkownika i hasła. Nie masz ich jeszcze? " -"[Zarejestruj się](%%action.register%%) i utwórz konto, albo użyj swojego " -"[OpenID](%%action.openidlogin%%)." +"Zaloguj się za pomocą nazwy użytkownika i hasła. Nie masz ich jeszcze? " +"[Zarejestruj](%%action.register%%) nowe konto lub wypróbuj [OpenID](%%action." +"openidlogin%%). " -#: ../lib/util.php:308 lib/util.php:324 lib/action.php:332 +#: ../lib/util.php:308 lib/util.php:324 lib/action.php:332 lib/action.php:409 msgid "Logout" -msgstr "Wyloguj" +msgstr "Wyloguj się" #: ../actions/register.php:166 actions/register.php:180 #: actions/register.php:393 msgid "Longer name, preferably your \"real\" name" -msgstr "" +msgstr "Dłuższa nazwa, najlepiej twoje \"prawdziwe\" nazwisko" #: ../actions/login.php:110 actions/login.php:110 actions/login.php:245 -#: lib/facebookaction.php:320 +#: lib/facebookaction.php:320 actions/login.php:228 lib/facebookaction.php:325 msgid "Lost or forgotten password?" -msgstr "Zgubione hasło?" +msgstr "Zgubione lub zapomniane hasło?" #: ../actions/emailsettings.php:80 ../actions/smssettings.php:89 #: actions/emailsettings.php:81 actions/smssettings.php:89 +#: actions/emailsettings.php:139 actions/smssettings.php:150 msgid "Make a new email address for posting to; cancels the old one." -msgstr "" +msgstr "Używaj nowego adresu e-mail do wysyłania; anuluj stary." #: ../actions/emailsettings.php:27 actions/emailsettings.php:27 #: actions/emailsettings.php:71 #, php-format msgid "Manage how you get email from %%site.name%%." -msgstr "" +msgstr "Zarządzaj, jak otrzymywać wiadomości e-mail od %%site.name%%." #: ../actions/showstream.php:300 actions/showstream.php:315 #: actions/showstream.php:480 msgid "Member since" -msgstr "W serwisie od" +msgstr "Członek od" #: ../actions/userrss.php:70 actions/userrss.php:67 actions/userrss.php:72 #, php-format msgid "Microblog by %s" -msgstr "%s – mikroblog" +msgstr "Mikroblog użytkownika %s" -#: ../actions/smssettings.php:304 +#: ../actions/smssettings.php:304 actions/smssettings.php:464 #, 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 "" +"Operator komórkowy Twojego telefonu. Jeśli znasz operatora, który akceptuje " +"wiadomości SMS przez e-mail, a nie znajduje się na liście, wyślij wiadomość " +"e-mail na %s (w języku angielskim), aby nam o tym powiedzieć." #: ../actions/finishopenidlogin.php:79 ../actions/register.php:188 #: actions/finishopenidlogin.php:85 actions/register.php:202 #: actions/finishopenidlogin.php:107 actions/register.php:429 +#: actions/register.php:430 msgid "My text and files are available under " -msgstr "Moje teksty i pliki są widoczne pod" +msgstr "Moje teksty i pliki są dostępne na " #: ../actions/emailsettings.php:82 ../actions/smssettings.php:91 #: actions/emailsettings.php:83 actions/smssettings.php:91 #: actions/emailsettings.php:142 actions/smssettings.php:152 msgid "New" -msgstr "" +msgstr "Nowe" #: ../lib/mail.php:144 lib/mail.php:144 lib/mail.php:286 #, php-format msgid "New email address for posting to %s" -msgstr "" +msgstr "Nowy adres e-mail do wysyłania do %s" #: ../actions/emailsettings.php:297 actions/emailsettings.php:315 -#: actions/emailsettings.php:465 +#: actions/emailsettings.php:465 actions/emailsettings.php:472 +#: actions/smssettings.php:542 msgid "New incoming email address added." -msgstr "" +msgstr "Dodano nowy przychodzący adres e-mail." #: ../actions/finishopenidlogin.php:71 actions/finishopenidlogin.php:77 #: actions/finishopenidlogin.php:99 @@ -1272,9 +1367,9 @@ msgstr "Nowy wpis" msgid "New password" msgstr "Nowe hasło" -#: ../actions/recoverpassword.php:314 +#: ../actions/recoverpassword.php:314 actions/recoverpassword.php:361 msgid "New password successfully saved. You are now logged in." -msgstr "Nowe hasło zapisano pomyślnie. Możesz się zalogować." +msgstr "Pomyślnie zapisano nowe hasło. Jesteś teraz zalogowany." #: ../actions/login.php:101 ../actions/profilesettings.php:41 #: ../actions/register.php:151 actions/login.php:101 @@ -1282,7 +1377,9 @@ msgstr "Nowe hasło zapisano pomyślnie. Możesz się zalogować." #: actions/login.php:228 actions/profilesettings.php:98 #: actions/register.php:367 actions/showgroup.php:224 #: actions/showstream.php:251 actions/tagother.php:95 -#: lib/facebookaction.php:308 lib/groupeditform.php:137 +#: lib/facebookaction.php:308 lib/groupeditform.php:137 actions/login.php:211 +#: actions/showgroup.php:226 actions/showstream.php:244 +#: actions/tagother.php:94 lib/facebookaction.php:312 msgid "Nickname" msgstr "Pseudonim" @@ -1293,21 +1390,23 @@ msgstr "Pseudonim" #: actions/newgroup.php:134 actions/profilesettings.php:214 #: actions/register.php:159 msgid "Nickname already in use. Try another one." -msgstr "Ten pseudonim jest już w użyciu. Wybierz inny." +msgstr "Pseudonim jest już używany. Spróbuj innego." #: ../actions/finishopenidlogin.php:165 ../actions/profilesettings.php:88 #: ../actions/register.php:67 ../actions/updateprofile.php:77 #: actions/finishopenidlogin.php:171 actions/profilesettings.php:203 #: actions/register.php:74 actions/updateprofile.php:78 #: actions/finishopenidlogin.php:205 actions/profilesettings.php:192 -#: actions/updateprofile.php:81 +#: actions/updateprofile.php:81 actions/editgroup.php:179 +#: actions/newgroup.php:130 actions/register.php:156 +#: actions/updateprofile.php:83 msgid "Nickname must have only lowercase letters and numbers and no spaces." -msgstr "Pseudonim musi zawierać tylko małe litery i cyfry, bez znaków spacji." +msgstr "Pseudonim może zawierać tylko małe litery i cyfry, bez spacji." #: ../actions/finishopenidlogin.php:170 actions/finishopenidlogin.php:176 #: actions/finishopenidlogin.php:210 msgid "Nickname not allowed." -msgstr "Pseudonim niedozwolony." +msgstr "Niedozwolony pseudonim." #: ../actions/remotesubscribe.php:72 actions/remotesubscribe.php:81 #: actions/remotesubscribe.php:106 @@ -1317,12 +1416,13 @@ msgstr "Pseudonim użytkownika którego chcesz obserwować" #: ../actions/recoverpassword.php:162 actions/recoverpassword.php:167 #: actions/recoverpassword.php:186 msgid "Nickname or email" -msgstr "Pseudonim lub e-mail" +msgstr "Pseudonim lub adres e-mail" #: ../actions/deletenotice.php:59 actions/deletenotice.php:60 #: actions/block.php:147 actions/deletenotice.php:118 +#: actions/deletenotice.php:116 msgid "No" -msgstr "" +msgstr "Nie" #: ../actions/imsettings.php:156 actions/imsettings.php:164 #: actions/imsettings.php:279 @@ -1332,17 +1432,17 @@ msgstr "Brak identyfikatora Jabbera." #: ../actions/userauthorization.php:129 actions/userauthorization.php:136 #: actions/userauthorization.php:153 msgid "No authorization request!" -msgstr "Brak żądania autoryzacji!" +msgstr "Brak żądania upoważnienia!" #: ../actions/smssettings.php:181 actions/smssettings.php:189 #: actions/smssettings.php:299 msgid "No carrier selected." -msgstr "" +msgstr "Nie wybrano operatora." #: ../actions/smssettings.php:316 actions/smssettings.php:324 #: actions/smssettings.php:486 msgid "No code entered" -msgstr "" +msgstr "Nie podano kodu" #: ../actions/confirmaddress.php:33 actions/confirmaddress.php:33 #: actions/confirmaddress.php:75 @@ -1352,27 +1452,29 @@ msgstr "Brak kodu potwierdzającego." #: ../actions/newnotice.php:44 actions/newmessage.php:53 #: actions/newnotice.php:44 classes/Command.php:197 actions/newmessage.php:109 #: actions/newnotice.php:126 classes/Command.php:223 +#: actions/newmessage.php:142 actions/newnotice.php:131 lib/command.php:223 msgid "No content!" msgstr "Brak zawartości!" #: ../actions/emailsettings.php:174 actions/emailsettings.php:192 -#: actions/emailsettings.php:304 +#: actions/emailsettings.php:304 actions/emailsettings.php:311 msgid "No email address." -msgstr "" +msgstr "Brak adresu e-mail." #: ../actions/userbyid.php:32 actions/userbyid.php:32 actions/userbyid.php:70 msgid "No id." msgstr "Brak identyfikatora." #: ../actions/emailsettings.php:271 actions/emailsettings.php:289 -#: actions/emailsettings.php:430 +#: actions/emailsettings.php:430 actions/emailsettings.php:437 +#: actions/smssettings.php:505 msgid "No incoming email address." -msgstr "" +msgstr "Brak przychodzącego adresu e-mail." #: ../actions/finishremotesubscribe.php:65 #: actions/finishremotesubscribe.php:67 actions/finishremotesubscribe.php:68 msgid "No nickname provided by remote server." -msgstr "Zdalny serwer nie wysłał pseudonimu." +msgstr "Zdalny serwer nie dostarczył pseudonimu." #: ../actions/avatarbynickname.php:27 actions/avatarbynickname.php:27 #: actions/avatarbynickname.php:59 actions/leavegroup.php:81 @@ -1383,24 +1485,24 @@ msgstr "Brak pseudonimu." #: ../actions/smssettings.php:229 actions/emailsettings.php:240 #: actions/imsettings.php:214 actions/smssettings.php:237 #: actions/emailsettings.php:363 actions/imsettings.php:345 -#: actions/smssettings.php:358 +#: actions/smssettings.php:358 actions/emailsettings.php:370 msgid "No pending confirmation to cancel." msgstr "Brak oczekujących potwierdzeń do anulowania." #: ../actions/smssettings.php:176 actions/smssettings.php:184 #: actions/smssettings.php:294 msgid "No phone number." -msgstr "" +msgstr "Brak numeru telefonu." #: ../actions/finishremotesubscribe.php:72 #: actions/finishremotesubscribe.php:74 actions/finishremotesubscribe.php:75 msgid "No profile URL returned by server." -msgstr "Serwer nie zwrócił żadnego URL-a." +msgstr "Serwer nie zwrócił adresu URL profilu." #: ../actions/recoverpassword.php:226 actions/recoverpassword.php:232 #: actions/recoverpassword.php:266 msgid "No registered email address for that user." -msgstr "Brak zarejestrowanych adresów e-mailowych dla tego użytkownika." +msgstr "Brak zarejestrowanych adresów e-mail dla tego użytkownika." #: ../actions/userauthorization.php:49 actions/userauthorization.php:55 #: actions/userauthorization.php:57 @@ -1410,51 +1512,52 @@ msgstr "Nie znaleziono żądania!" #: ../actions/noticesearch.php:64 ../actions/peoplesearch.php:64 #: actions/noticesearch.php:69 actions/peoplesearch.php:69 #: actions/groupsearch.php:81 actions/noticesearch.php:104 -#: actions/peoplesearch.php:85 +#: actions/peoplesearch.php:85 actions/noticesearch.php:117 msgid "No results" msgstr "Brak wyników" #: ../actions/avatarbynickname.php:32 actions/avatarbynickname.php:32 #: actions/avatarbynickname.php:64 msgid "No size." -msgstr "Zerowy rozmiar." +msgstr "Brak rozmiaru." #: ../actions/twitapistatuses.php:595 actions/twitapifavorites.php:136 #: actions/twitapistatuses.php:520 actions/twitapifavorites.php:112 -#: actions/twitapistatuses.php:446 +#: actions/twitapistatuses.php:446 actions/twitapifavorites.php:118 +#: actions/twitapistatuses.php:470 msgid "No status found with that ID." -msgstr "" +msgstr "Nie znaleziono statusów z tym identyfikatorem." #: ../actions/twitapistatuses.php:555 actions/twitapistatuses.php:478 -#: actions/twitapistatuses.php:418 +#: actions/twitapistatuses.php:418 actions/twitapistatuses.php:442 msgid "No status with that ID found." -msgstr "" +msgstr "Nie znaleziono statusów z tym identyfikatorem." #: ../actions/openidsettings.php:135 actions/openidsettings.php:144 #: actions/openidsettings.php:222 msgid "No such OpenID." -msgstr "Brak takiego identyfikatora OpenID." +msgstr "Nie ma takiego identyfikatora OpenID." #: ../actions/doc.php:29 actions/doc.php:29 actions/doc.php:64 msgid "No such document." -msgstr "Brak takiego dokumentu." +msgstr "Nie ma takiego dokumentu." #: ../actions/shownotice.php:32 ../actions/shownotice.php:83 #: ../lib/deleteaction.php:30 actions/shownotice.php:32 #: actions/shownotice.php:83 lib/deleteaction.php:30 actions/shownotice.php:87 #: lib/deleteaction.php:51 msgid "No such notice." -msgstr "Brak takiego wpisu." +msgstr "Nie ma takiego wpisu." #: ../actions/recoverpassword.php:56 actions/recoverpassword.php:56 #: actions/recoverpassword.php:62 msgid "No such recovery code." -msgstr "Brak takiego kodu przywracania." +msgstr "Nie ma takiego kodu przywracania." #: ../actions/postnotice.php:56 actions/postnotice.php:57 #: actions/postnotice.php:60 msgid "No such subscription" -msgstr "Nie ma takiej obserwacji" +msgstr "Nie ma takiej subskrypcji" #: ../actions/all.php:34 ../actions/allrss.php:35 #: ../actions/avatarbynickname.php:43 ../actions/foaf.php:40 @@ -1480,14 +1583,16 @@ msgstr "Nie ma takiej obserwacji" #: actions/usergroups.php:92 actions/userrss.php:38 actions/xrds.php:73 #: classes/Command.php:140 classes/Command.php:185 classes/Command.php:234 #: classes/Command.php:271 lib/galleryaction.php:60 lib/mailbox.php:82 -#: lib/subs.php:34 lib/subs.php:109 +#: lib/subs.php:34 lib/subs.php:109 actions/all.php:56 actions/allrss.php:68 +#: actions/favoritesrss.php:74 lib/command.php:140 lib/command.php:185 +#: lib/command.php:234 lib/command.php:271 lib/mailbox.php:84 msgid "No such user." msgstr "Brak takiego użytkownika." #: ../actions/recoverpassword.php:211 actions/recoverpassword.php:217 #: actions/recoverpassword.php:251 msgid "No user with that email address or username." -msgstr "" +msgstr "Brak użytkownika z tym adresem e-mail lub nazwą użytkownika." #: ../lib/gallery.php:80 lib/gallery.php:85 msgid "Nobody to show!" @@ -1501,64 +1606,66 @@ msgstr "To nie jest kod przywracania." #: ../scripts/maildaemon.php:50 scripts/maildaemon.php:50 #: scripts/maildaemon.php:53 msgid "Not a registered user." -msgstr "" +msgstr "To nie jest zarejestrowany użytkownik." #: ../lib/twitterapi.php:226 ../lib/twitterapi.php:247 #: ../lib/twitterapi.php:332 lib/twitterapi.php:391 lib/twitterapi.php:418 #: lib/twitterapi.php:502 lib/twitterapi.php:448 lib/twitterapi.php:476 -#: lib/twitterapi.php:566 +#: lib/twitterapi.php:566 lib/twitterapi.php:483 lib/twitterapi.php:511 +#: lib/twitterapi.php:601 msgid "Not a supported data format." -msgstr "" +msgstr "To nie jest obsługiwany format danych." #: ../actions/imsettings.php:167 actions/imsettings.php:175 #: actions/imsettings.php:290 msgid "Not a valid Jabber ID" -msgstr "Niepoprawny identyfikator Jabbera" +msgstr "To nie jest prawidłowy identyfikator Jabbera" #: ../lib/openid.php:131 lib/openid.php:131 lib/openid.php:140 +#: lib/openid.php:143 msgid "Not a valid OpenID." -msgstr "Niepoprawny identyfikator OpenID." +msgstr "To nie jest prawidłowy identyfikator OpenID." #: ../actions/emailsettings.php:185 actions/emailsettings.php:203 -#: actions/emailsettings.php:315 +#: actions/emailsettings.php:315 actions/emailsettings.php:322 msgid "Not a valid email address" -msgstr "" +msgstr "To nie jest prawidłowy adres e-mail" #: ../actions/register.php:63 actions/register.php:70 actions/register.php:152 msgid "Not a valid email address." -msgstr "Niewłaściwy adres e-mailowy." +msgstr "To nie jest prawidłowy adres e-mail." #: ../actions/profilesettings.php:91 ../actions/register.php:71 #: actions/profilesettings.php:206 actions/register.php:78 #: actions/editgroup.php:186 actions/newgroup.php:137 #: actions/profilesettings.php:195 actions/register.php:161 msgid "Not a valid nickname." -msgstr "Niewłaściwy pseudonim." +msgstr "To nie jest prawidłowy pseudonim." #: ../actions/remotesubscribe.php:120 actions/remotesubscribe.php:129 #: actions/remotesubscribe.php:159 msgid "Not a valid profile URL (incorrect services)." -msgstr "Błędny URL profilu (niepoprawne usługi)" +msgstr "To nie jest prawidłowy adres URL profilu (niepoprawne usługi)." #: ../actions/remotesubscribe.php:113 actions/remotesubscribe.php:122 #: actions/remotesubscribe.php:152 msgid "Not a valid profile URL (no XRDS defined)." -msgstr "Błędny URL profilu (nie zdefiniowany XRDS)" +msgstr "To nie jest prawidłowy adres URL profilu (nie podano XRDS)." #: ../actions/remotesubscribe.php:104 actions/remotesubscribe.php:113 #: actions/remotesubscribe.php:143 msgid "Not a valid profile URL (no YADIS document)." -msgstr "Błędny URL profilu (brak dokumentu YADIS)" +msgstr "To nie jest prawidłowy adres URL profilu (brak dokumentu YADIS)." #: ../actions/avatar.php:95 actions/profilesettings.php:332 -#: lib/imagefile.php:87 +#: lib/imagefile.php:87 lib/imagefile.php:90 msgid "Not an image or corrupt file." -msgstr "Brak obrazka lub plik uszkodzony." +msgstr "To nie jest obraz lub lub plik jest uszkodzony." #: ../actions/finishremotesubscribe.php:51 #: actions/finishremotesubscribe.php:53 actions/finishremotesubscribe.php:54 msgid "Not authorized." -msgstr "Brak autoryzacji." +msgstr "Brak upoważnienia." #: ../actions/finishremotesubscribe.php:38 #: actions/finishremotesubscribe.php:38 actions/finishremotesubscribe.php:40 @@ -1566,9 +1673,9 @@ msgid "Not expecting this response!" msgstr "Nieoczekiwana odpowiedź!" #: ../actions/twitapistatuses.php:422 actions/twitapistatuses.php:361 -#: actions/twitapistatuses.php:309 +#: actions/twitapistatuses.php:309 actions/twitapistatuses.php:327 msgid "Not found" -msgstr "" +msgstr "Nie znaleziono" #: ../actions/finishaddopenid.php:29 ../actions/logout.php:33 #: ../actions/newnotice.php:29 ../actions/subscribe.php:28 @@ -1582,18 +1689,18 @@ msgstr "" #: actions/newmessage.php:83 actions/newnotice.php:90 actions/nudge.php:63 #: actions/subedit.php:31 actions/subscribe.php:30 actions/unblock.php:60 #: actions/unsubscribe.php:27 lib/deleteaction.php:66 -#: lib/settingsaction.php:72 +#: lib/settingsaction.php:72 actions/newmessage.php:87 msgid "Not logged in." msgstr "Niezalogowany." #: ../lib/subs.php:91 lib/subs.php:104 lib/subs.php:122 msgid "Not subscribed!." -msgstr "Nie obserwujesz!." +msgstr "Nie zasubskrybowane!" #: ../actions/opensearch.php:35 actions/opensearch.php:35 #: actions/opensearch.php:67 msgid "Notice Search" -msgstr "" +msgstr "Wyszukiwanie wpisów" #: ../actions/showstream.php:82 actions/showstream.php:82 #: actions/showstream.php:180 actions/showstream.php:187 @@ -1605,19 +1712,19 @@ msgstr "Kanał wpisów dla %s" #: ../actions/shownotice.php:39 actions/shownotice.php:39 #: actions/shownotice.php:94 msgid "Notice has no profile" -msgstr "Wpis nie ma przypisanego profilu" +msgstr "Wpis nie posiada profilu" #: ../actions/showstream.php:316 actions/showstream.php:331 #: actions/showstream.php:504 lib/facebookaction.php:477 lib/mailbox.php:116 -#: lib/noticelist.php:87 +#: lib/noticelist.php:87 lib/facebookaction.php:581 lib/mailbox.php:118 msgid "Notices" msgstr "Wpisy" #: ../actions/tag.php:35 ../actions/tag.php:81 actions/tag.php:35 -#: actions/tag.php:81 actions/tag.php:41 +#: actions/tag.php:81 actions/tag.php:41 actions/tag.php:49 #, php-format msgid "Notices tagged with %s" -msgstr "" +msgstr "Wpisy ze znacznikiem %s" #: ../actions/password.php:39 actions/profilesettings.php:178 #: actions/passwordsettings.php:97 @@ -1626,7 +1733,7 @@ msgstr "Stare hasło" #: ../lib/settingsaction.php:96 ../lib/util.php:314 lib/settingsaction.php:90 #: lib/util.php:330 lib/accountsettingsaction.php:116 lib/action.php:341 -#: lib/logingroupnav.php:81 +#: lib/logingroupnav.php:81 lib/action.php:418 msgid "OpenID" msgstr "OpenID" @@ -1636,39 +1743,43 @@ msgid "OpenID Account Setup" msgstr "Ustawienia konta OpenID" #: ../lib/openid.php:180 lib/openid.php:180 lib/openid.php:266 +#: lib/openid.php:269 msgid "OpenID Auto-Submit" -msgstr "Automatyczne zatwierdzanie OpenID" +msgstr "Automatyczne wysłanie OpenID" #: ../actions/finishaddopenid.php:99 ../actions/finishopenidlogin.php:140 #: ../actions/openidlogin.php:60 actions/finishaddopenid.php:99 #: actions/finishopenidlogin.php:146 actions/openidlogin.php:68 #: actions/finishaddopenid.php:170 actions/openidlogin.php:80 +#: actions/openidlogin.php:89 msgid "OpenID Login" -msgstr "Użytkownik OpenID" +msgstr "Login OpenID" #: ../actions/openidlogin.php:65 ../actions/openidsettings.php:49 #: actions/openidlogin.php:74 actions/openidsettings.php:50 #: actions/openidlogin.php:102 actions/openidsettings.php:101 +#: actions/openidlogin.php:111 msgid "OpenID URL" -msgstr "URL usługi OpenID" +msgstr "Adres URL identyfikatora OpenID" #: ../actions/finishaddopenid.php:42 ../actions/finishopenidlogin.php:103 #: actions/finishaddopenid.php:42 actions/finishopenidlogin.php:109 #: actions/finishaddopenid.php:88 actions/finishopenidlogin.php:130 msgid "OpenID authentication cancelled." -msgstr "Uwiarygadnianie OpenID przerwane." +msgstr "Anulowano uwierzytelnienie OpenID." #: ../actions/finishaddopenid.php:46 ../actions/finishopenidlogin.php:107 #: actions/finishaddopenid.php:46 actions/finishopenidlogin.php:113 #: actions/finishaddopenid.php:92 actions/finishopenidlogin.php:134 #, php-format msgid "OpenID authentication failed: %s" -msgstr "Uwiarygadnianie OpenID nie powiodło się: %s" +msgstr "Uwierzytelnienie OpenID nie powiodło się: %s" #: ../lib/openid.php:133 lib/openid.php:133 lib/openid.php:142 +#: lib/openid.php:145 #, php-format msgid "OpenID failure: %s" -msgstr "Awaria OpenID: %s" +msgstr "Niepowodzenie OpenID: %s" #: ../actions/openidsettings.php:144 actions/openidsettings.php:153 #: actions/openidsettings.php:231 @@ -1681,13 +1792,14 @@ msgid "OpenID settings" msgstr "Ustawienia OpenID" #: ../actions/invite.php:135 actions/invite.php:143 actions/invite.php:180 +#: actions/invite.php:186 msgid "Optionally add a personal message to the invitation." -msgstr "" +msgstr "Opcjonalnie dodaj osobistą wiadomość do zaproszenia." #: ../actions/avatar.php:84 actions/profilesettings.php:321 -#: lib/imagefile.php:75 +#: lib/imagefile.php:75 lib/imagefile.php:79 msgid "Partial upload." -msgstr "Częściowa wysyłka." +msgstr "Częściowo wysłano." #: ../actions/finishopenidlogin.php:90 ../actions/login.php:102 #: ../actions/register.php:153 ../lib/settingsaction.php:93 @@ -1695,63 +1807,68 @@ msgstr "Częściowa wysyłka." #: actions/register.php:167 actions/finishopenidlogin.php:118 #: actions/login.php:231 actions/register.php:372 #: lib/accountsettingsaction.php:110 lib/facebookaction.php:311 +#: actions/login.php:214 lib/facebookaction.php:315 msgid "Password" msgstr "Hasło" #: ../actions/recoverpassword.php:288 actions/recoverpassword.php:301 #: actions/recoverpassword.php:335 msgid "Password and confirmation do not match." -msgstr "Hasło i jego potwierdzenie nie pasują do siebie." +msgstr "Hasło i potwierdzenie nie pasują do siebie." #: ../actions/recoverpassword.php:284 actions/recoverpassword.php:297 #: actions/recoverpassword.php:331 msgid "Password must be 6 chars or more." -msgstr "Hasło musi mieć 6 lub więcej znaków." +msgstr "Hasło musi mieć sześć lub więcej znaków." #: ../actions/recoverpassword.php:261 ../actions/recoverpassword.php:263 #: actions/recoverpassword.php:267 actions/recoverpassword.php:269 #: actions/recoverpassword.php:199 actions/recoverpassword.php:301 msgid "Password recovery requested" -msgstr "Zażądano odzyskania hasła" +msgstr "Zażądano przywracania hasła" #: ../actions/password.php:89 ../actions/recoverpassword.php:313 #: actions/profilesettings.php:408 actions/recoverpassword.php:326 #: actions/passwordsettings.php:173 actions/recoverpassword.php:200 +#: actions/passwordsettings.php:178 msgid "Password saved." -msgstr "Hasło zostało zapisane." +msgstr "Zapisano hasło." #: ../actions/password.php:61 ../actions/register.php:88 #: actions/profilesettings.php:380 actions/register.php:98 #: actions/passwordsettings.php:145 actions/register.php:183 +#: actions/passwordsettings.php:150 msgid "Passwords don't match." -msgstr "Podane hasła nie pasują do siebie." +msgstr "Hasła nie pasują do siebie." #: ../lib/searchaction.php:100 lib/searchaction.php:100 #: lib/searchgroupnav.php:80 msgid "People" -msgstr "" +msgstr "Osoby" #: ../actions/opensearch.php:33 actions/opensearch.php:33 #: actions/opensearch.php:64 msgid "People Search" -msgstr "" +msgstr "Wyszukiwanie osób" #: ../actions/peoplesearch.php:33 actions/peoplesearch.php:33 #: actions/peoplesearch.php:58 msgid "People search" -msgstr "Szukaj ludzi" +msgstr "Wyszukiwanie osób" #: ../lib/stream.php:50 lib/personal.php:50 lib/personalgroupnav.php:98 msgid "Personal" msgstr "Osobiste" #: ../actions/invite.php:133 actions/invite.php:141 actions/invite.php:178 +#: actions/invite.php:184 msgid "Personal message" -msgstr "" +msgstr "Osobista wiadomość" #: ../actions/smssettings.php:69 actions/smssettings.php:69 +#: actions/smssettings.php:128 msgid "Phone number, no punctuation or spaces, with area code" -msgstr "" +msgstr "Numer telefonu, bez znaków przestankowych i spacji, z kodem państwa" #: ../actions/userauthorization.php:78 msgid "" @@ -1759,21 +1876,20 @@ msgid "" "user's notices. If you didn't just ask to subscribe to someone's notices, " "click \"Cancel\"." msgstr "" -"Sprawdź proszę poniższe informacje, aby upewnić się czy na pewno chcesz " -"obserwować wpisy tego użytkownika. Jeżeli to pomyłka lub chodziło o kogoś " -"innego kliknij \"Anuluj\"." +"Sprawdź te szczegóły, aby upewnić się, czy chcesz subskrybować wpisy tego " +"użytkownika. Jeśli nie chcesz, po prostu naciśnij \"Anuluj\"." #: ../actions/imsettings.php:73 actions/imsettings.php:74 #: actions/imsettings.php:142 msgid "Post a notice when my Jabber/GTalk status changes." -msgstr "Utwórz wpis kiedy zmieni się status na komunikatorze." +msgstr "Wyślij wpis, kiedy zmieni się mój status na Jabberze/GTalk." #: ../actions/emailsettings.php:85 ../actions/imsettings.php:67 #: ../actions/smssettings.php:94 actions/emailsettings.php:86 #: actions/imsettings.php:68 actions/smssettings.php:94 #: actions/twittersettings.php:70 actions/emailsettings.php:147 #: actions/imsettings.php:133 actions/smssettings.php:157 -#: actions/twittersettings.php:134 +#: actions/twittersettings.php:134 actions/twittersettings.php:137 msgid "Preferences" msgstr "Preferencje" @@ -1782,22 +1898,24 @@ msgstr "Preferencje" #: actions/imsettings.php:152 actions/smssettings.php:171 #: actions/emailsettings.php:286 actions/imsettings.php:258 #: actions/othersettings.php:168 actions/smssettings.php:272 +#: actions/emailsettings.php:293 msgid "Preferences saved." -msgstr "Preferencje zostały zapisane." +msgstr "Zapisano preferencje." #: ../actions/profilesettings.php:57 actions/profilesettings.php:90 #: actions/profilesettings.php:129 msgid "Preferred language" -msgstr "" +msgstr "Preferowany język" -#: ../lib/util.php:328 lib/util.php:344 lib/action.php:572 +#: ../lib/util.php:328 lib/util.php:344 lib/action.php:572 lib/action.php:665 msgid "Privacy" msgstr "Prywatność" #: ../classes/Notice.php:95 ../classes/Notice.php:106 classes/Notice.php:109 #: classes/Notice.php:119 classes/Notice.php:145 classes/Notice.php:155 +#: classes/Notice.php:178 classes/Notice.php:188 msgid "Problem saving notice." -msgstr "Problem z zachowywaniem wpisu." +msgstr "Problem podczas zapisywania wpisu." #: ../lib/settingsaction.php:84 ../lib/stream.php:60 lib/personal.php:60 #: lib/settingsaction.php:84 lib/accountsettingsaction.php:104 @@ -1808,7 +1926,7 @@ msgstr "Profil" #: ../actions/remotesubscribe.php:73 actions/remotesubscribe.php:82 #: actions/remotesubscribe.php:109 msgid "Profile URL" -msgstr "URL profilu" +msgstr "Adres URL profilu" #: ../actions/profilesettings.php:34 actions/profilesettings.php:32 #: actions/profilesettings.php:58 @@ -1818,32 +1936,33 @@ msgstr "Ustawienia profilu" #: ../actions/postnotice.php:51 ../actions/updateprofile.php:52 #: actions/postnotice.php:52 actions/updateprofile.php:53 #: actions/postnotice.php:55 actions/updateprofile.php:56 +#: actions/updateprofile.php:58 msgid "Profile unknown" msgstr "Nieznany profil" #: ../actions/public.php:54 actions/public.php:54 actions/public.php:124 msgid "Public Stream Feed" -msgstr "Publiczny Kanał Strumieni" +msgstr "Kanał publicznego strumienia" #: ../actions/public.php:33 actions/public.php:33 actions/public.php:109 -#: lib/publicgroupnav.php:77 +#: lib/publicgroupnav.php:77 actions/public.php:112 lib/publicgroupnav.php:79 msgid "Public timeline" msgstr "Publiczna oś czasu" #: ../actions/imsettings.php:79 actions/imsettings.php:80 #: actions/imsettings.php:153 msgid "Publish a MicroID for my Jabber/GTalk address." -msgstr "" +msgstr "Opublikuj MicroID adresu Jabbera/GTalk." #: ../actions/emailsettings.php:94 actions/emailsettings.php:101 -#: actions/emailsettings.php:178 +#: actions/emailsettings.php:178 actions/emailsettings.php:183 msgid "Publish a MicroID for my email address." -msgstr "" +msgstr "Opublikuj MicroID adresu e-mail." #: ../actions/tag.php:75 ../actions/tag.php:76 actions/tag.php:75 #: actions/tag.php:76 msgid "Recent Tags" -msgstr "" +msgstr "Ostatnie znaczniki" #: ../actions/recoverpassword.php:166 actions/recoverpassword.php:171 #: actions/recoverpassword.php:190 @@ -1853,29 +1972,30 @@ msgstr "Przywróć" #: ../actions/recoverpassword.php:156 actions/recoverpassword.php:161 #: actions/recoverpassword.php:198 msgid "Recover password" -msgstr "Odzyskiwanie hasła" +msgstr "Przywróć hasło" #: ../actions/recoverpassword.php:67 actions/recoverpassword.php:67 #: actions/recoverpassword.php:73 msgid "Recovery code for unknown user." -msgstr "Kod przywracający dla nieznanego użytkownika." +msgstr "Kod przywracania dla nieznanego użytkownika." #: ../actions/register.php:142 ../actions/register.php:193 ../lib/util.php:312 #: actions/register.php:152 actions/register.php:207 lib/util.php:328 #: actions/register.php:69 actions/register.php:436 lib/action.php:338 #: lib/facebookaction.php:277 lib/logingroupnav.php:78 +#: actions/register.php:438 lib/action.php:415 lib/facebookaction.php:279 msgid "Register" -msgstr "Zarejestruj" +msgstr "Zarejestruj się" #: ../actions/register.php:28 actions/register.php:28 #: actions/finishopenidlogin.php:196 actions/register.php:90 msgid "Registration not allowed." -msgstr "" +msgstr "Rejestracja nie jest dozwolona." #: ../actions/register.php:200 actions/register.php:214 #: actions/register.php:67 msgid "Registration successful" -msgstr "" +msgstr "Rejestracja powiodła się" #: ../actions/userauthorization.php:120 actions/userauthorization.php:127 #: actions/userauthorization.php:144 @@ -1884,19 +2004,19 @@ msgstr "Odrzuć" #: ../actions/login.php:103 ../actions/register.php:176 actions/login.php:103 #: actions/register.php:190 actions/login.php:234 actions/openidlogin.php:107 -#: actions/register.php:414 +#: actions/register.php:414 actions/login.php:217 actions/openidlogin.php:116 msgid "Remember me" -msgstr "Pamiętaj mnie" +msgstr "Zapamiętaj mnie" #: ../actions/updateprofile.php:70 actions/updateprofile.php:71 -#: actions/updateprofile.php:74 +#: actions/updateprofile.php:74 actions/updateprofile.php:76 msgid "Remote profile with no matching profile" -msgstr "Zdalny profil bez odpowiadającego profilu lokalnego" +msgstr "Zdalny profil bez odpowiadającego profilu" #: ../actions/remotesubscribe.php:65 actions/remotesubscribe.php:73 #: actions/remotesubscribe.php:88 msgid "Remote subscribe" -msgstr "Zdalna subskrypcja" +msgstr "Zasubskrybuj zdalnie" #: ../actions/emailsettings.php:47 ../actions/emailsettings.php:75 #: ../actions/imsettings.php:48 ../actions/openidsettings.php:106 @@ -1908,21 +2028,22 @@ msgstr "Zdalna subskrypcja" #: actions/emailsettings.php:134 actions/imsettings.php:102 #: actions/openidsettings.php:166 actions/smssettings.php:103 #: actions/smssettings.php:146 actions/twittersettings.php:115 +#: actions/twittersettings.php:118 msgid "Remove" msgstr "Usuń" #: ../actions/openidsettings.php:68 actions/openidsettings.php:69 #: actions/openidsettings.php:123 msgid "Remove OpenID" -msgstr "Usuń konto OpenID" +msgstr "Usuń identyfikator OpenID" -#: ../actions/openidsettings.php:73 +#: ../actions/openidsettings.php:73 actions/openidsettings.php:128 msgid "" "Removing your only OpenID would make it impossible to log in! If you need to " "remove it, add another OpenID first." msgstr "" -"Usunięcie jedynego konta OpenID uniemożliwi dalsze logowanie! Jeśli musisz " -"je usunąć dodaj wcześniej jakieś inne." +"Usunięcie jedynego identyfikatora OpenID uniemożliwi zalogowanie się! Jeśli " +"musisz je usunąć, dodaj najpierw inne." #: ../lib/stream.php:55 lib/personal.php:55 lib/personalgroupnav.php:103 msgid "Replies" @@ -1931,7 +2052,7 @@ msgstr "Odpowiedzi" #: ../actions/replies.php:47 ../actions/repliesrss.php:76 ../lib/stream.php:56 #: actions/replies.php:47 actions/repliesrss.php:62 lib/personal.php:56 #: actions/replies.php:116 actions/repliesrss.php:67 -#: lib/personalgroupnav.php:104 +#: lib/personalgroupnav.php:104 actions/replies.php:118 #, php-format msgid "Replies to %s" msgstr "Odpowiedzi na %s" @@ -1939,41 +2060,42 @@ msgstr "Odpowiedzi na %s" #: ../actions/recoverpassword.php:183 actions/recoverpassword.php:189 #: actions/recoverpassword.php:223 msgid "Reset" -msgstr "Wyzeruj" +msgstr "Przywróć" #: ../actions/recoverpassword.php:173 actions/recoverpassword.php:178 #: actions/recoverpassword.php:197 msgid "Reset password" -msgstr "Ustaw ponownie hasło" +msgstr "Przywróć hasło" #: ../lib/settingsaction.php:99 lib/settingsaction.php:93 #: actions/subscriptions.php:123 lib/connectsettingsaction.php:107 +#: actions/subscriptions.php:125 msgid "SMS" -msgstr "" +msgstr "SMS" #: ../actions/smssettings.php:67 actions/smssettings.php:67 #: actions/smssettings.php:126 msgid "SMS Phone number" -msgstr "" +msgstr "Numer telefonu SMS" #: ../actions/smssettings.php:33 actions/smssettings.php:33 #: actions/smssettings.php:58 msgid "SMS Settings" -msgstr "" +msgstr "Ustawienia SMS" -#: ../lib/mail.php:219 lib/mail.php:225 lib/mail.php:437 +#: ../lib/mail.php:219 lib/mail.php:225 lib/mail.php:437 lib/mail.php:438 msgid "SMS confirmation" -msgstr "" +msgstr "Potwierdzenie SMS" #: ../actions/recoverpassword.php:182 actions/recoverpassword.php:188 #: actions/recoverpassword.php:222 msgid "Same as password above" -msgstr "Takie samo jak hasło wprowadzone powyżej" +msgstr "Takie samo jak powyższe hasło" #: ../actions/register.php:156 actions/register.php:170 #: actions/register.php:377 msgid "Same as password above. Required." -msgstr "" +msgstr "Takie samo jak powyższe hasło. Wymagane." #: ../actions/emailsettings.php:97 ../actions/imsettings.php:81 #: ../actions/profilesettings.php:67 ../actions/smssettings.php:100 @@ -1984,48 +2106,51 @@ msgstr "" #: actions/othersettings.php:117 actions/profilesettings.php:150 #: actions/smssettings.php:169 actions/subscriptions.php:124 #: actions/tagother.php:152 actions/twittersettings.php:161 -#: lib/groupeditform.php:171 +#: lib/groupeditform.php:171 actions/emailsettings.php:187 +#: actions/subscriptions.php:126 actions/tagother.php:154 +#: actions/twittersettings.php:164 msgid "Save" msgstr "Zapisz" #: ../lib/searchaction.php:84 ../lib/util.php:300 lib/searchaction.php:84 -#: lib/util.php:316 lib/action.php:325 +#: lib/util.php:316 lib/action.php:325 lib/action.php:396 msgid "Search" -msgstr "Szukaj" +msgstr "Znajdź" #: ../actions/noticesearch.php:80 actions/noticesearch.php:85 #: actions/noticesearch.php:127 msgid "Search Stream Feed" -msgstr "Szukaj Kanału Strumieni" +msgstr "Znajdź kanał strumienia" #: ../actions/noticesearch.php:30 actions/noticesearch.php:30 -#: actions/noticesearch.php:57 +#: actions/noticesearch.php:57 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 "" -"Wyszukiwanie w treści wpisów w serwisie %%site.name%%. Użyj spacji aby " -"oddzielić elementy wyszukiwania. Słowa muszą mieć minimum 3 znaki." +"Znajdź wpisy na %%site.name%% według ich zawartości. Oddziel wyszukiwane " +"terminy spacjami. Terminy muszą mieć trzy znaki lub więcej." -#: ../actions/peoplesearch.php:28 +#: ../actions/peoplesearch.php:28 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 "" -"Szukaj ludzi w serwisie %%site.name%%. Kryteriami mogą być imiona i " -"nazwiska, miejscowości lub zainteresowania. Użyj spacji aby oddzielić " -"elementy wyszukiwania. Słowa muszą mieć minimum 3 znaki." +"Znajdź osoby na %%site.name%% według ich nazwiska, położenia lub " +"zainteresowań. Oddziel wyszukiwane terminy spacjami. Terminy muszą mieć trzy " +"znaki lub więcej." #: ../actions/smssettings.php:296 actions/smssettings.php:304 #: actions/smssettings.php:457 msgid "Select a carrier" -msgstr "" +msgstr "Wybierz operatora" #: ../actions/invite.php:137 ../lib/util.php:1172 actions/invite.php:145 #: lib/util.php:1306 lib/util.php:1731 actions/invite.php:182 -#: lib/messageform.php:167 lib/noticeform.php:177 +#: lib/messageform.php:167 lib/noticeform.php:177 actions/invite.php:189 +#: lib/messageform.php:165 msgid "Send" msgstr "Wyślij" @@ -2033,45 +2158,51 @@ msgstr "Wyślij" #: actions/emailsettings.php:74 actions/smssettings.php:82 #: actions/emailsettings.php:132 actions/smssettings.php:145 msgid "Send email to this address to post new notices." -msgstr "" +msgstr "Wyślij wiadomość e-mail na ten adres, aby wysyłać nowe wpisy." #: ../actions/emailsettings.php:88 actions/emailsettings.php:89 #: actions/emailsettings.php:152 msgid "Send me notices of new subscriptions through email." -msgstr "" +msgstr "Wyślij mi wpisy nowych subskrypcji przez e-mail." #: ../actions/imsettings.php:70 actions/imsettings.php:71 #: actions/imsettings.php:137 msgid "Send me notices through Jabber/GTalk." -msgstr "Wysyłaj mi wpisy przez Jabbera/GTalka" +msgstr "Wyślij mi wpisy przez Jabbera/GTalk." #: ../actions/smssettings.php:97 actions/smssettings.php:97 +#: actions/smssettings.php:162 msgid "" "Send me notices through SMS; I understand I may incur exorbitant charges " "from my carrier." msgstr "" +"Wyślij mi wpisy przez SMS. Rozumiem, że mogę otrzymywać większe rachunki od " +"swojego operatora." #: ../actions/imsettings.php:76 actions/imsettings.php:77 +#: actions/imsettings.php:147 msgid "Send me replies through Jabber/GTalk from people I'm not subscribed to." msgstr "" +"Wyślij mi odpowiedzi przez Jabbera/GTalk od osób, których nie subskrybuję." #: ../lib/util.php:304 lib/util.php:320 lib/facebookaction.php:215 +#: lib/facebookaction.php:228 msgid "Settings" msgstr "Ustawienia" #: ../actions/profilesettings.php:192 actions/profilesettings.php:307 #: actions/profilesettings.php:319 msgid "Settings saved." -msgstr "Ustawienia zostały zapisane." +msgstr "Zapisano ustawienia." #: ../actions/tag.php:60 actions/tag.php:60 msgid "Showing most popular tags from the last week" -msgstr "" +msgstr "Wyświetlanie najpopularniejszych znaczników od ostatniego tygodnia" #: ../actions/finishaddopenid.php:66 actions/finishaddopenid.php:66 #: actions/finishaddopenid.php:114 msgid "Someone else already has this OpenID." -msgstr "Ktoś inny posługuje się już tym identyfikatorem OpenID." +msgstr "Ktoś inny już posiada ten identyfikator OpenID." #: ../actions/finishopenidlogin.php:42 ../actions/openidsettings.php:126 #: actions/finishopenidlogin.php:47 actions/openidsettings.php:135 @@ -2082,27 +2213,28 @@ msgstr "Stało się coś dziwnego." #: ../scripts/maildaemon.php:58 scripts/maildaemon.php:58 #: scripts/maildaemon.php:61 msgid "Sorry, no incoming email allowed." -msgstr "" +msgstr "Przepraszamy, przychodzący e-mail nie jest dozwolony." #: ../scripts/maildaemon.php:54 scripts/maildaemon.php:54 #: scripts/maildaemon.php:57 msgid "Sorry, that is not your incoming email address." -msgstr "" +msgstr "Przepraszamy, to nie jest twój przychodzący adres e-mail." -#: ../lib/util.php:330 lib/util.php:346 lib/action.php:574 +#: ../lib/util.php:330 lib/util.php:346 lib/action.php:574 lib/action.php:667 msgid "Source" msgstr "Kod źródłowy" #: ../actions/showstream.php:296 actions/showstream.php:311 -#: actions/showstream.php:476 +#: actions/showstream.php:476 actions/showgroup.php:375 msgid "Statistics" msgstr "Statystyki" #: ../actions/finishopenidlogin.php:182 ../actions/finishopenidlogin.php:246 #: actions/finishopenidlogin.php:188 actions/finishopenidlogin.php:252 #: actions/finishopenidlogin.php:222 actions/finishopenidlogin.php:290 +#: actions/finishopenidlogin.php:295 msgid "Stored OpenID not found." -msgstr "Nie znaleziono zapisanego konta OpenID." +msgstr "Nie znaleziono przechowywanego identyfikatora OpenID." #: ../actions/remotesubscribe.php:75 ../actions/showstream.php:188 #: ../actions/showstream.php:197 actions/remotesubscribe.php:84 @@ -2110,7 +2242,7 @@ msgstr "Nie znaleziono zapisanego konta OpenID." #: actions/remotesubscribe.php:113 actions/showstream.php:376 #: lib/subscribeform.php:139 msgid "Subscribe" -msgstr "Subskrybuj" +msgstr "Zasubskrybuj" #: ../actions/showstream.php:313 ../actions/subscribers.php:27 #: actions/showstream.php:328 actions/subscribers.php:27 @@ -2120,14 +2252,14 @@ msgid "Subscribers" msgstr "Subskrybenci" #: ../actions/userauthorization.php:310 actions/userauthorization.php:322 -#: actions/userauthorization.php:338 +#: actions/userauthorization.php:338 actions/userauthorization.php:344 msgid "Subscription authorized" -msgstr "Subskrypcja uwierzytelniona" +msgstr "Upoważniono subskrypcję" #: ../actions/userauthorization.php:320 actions/userauthorization.php:332 -#: actions/userauthorization.php:349 +#: actions/userauthorization.php:349 actions/userauthorization.php:355 msgid "Subscription rejected" -msgstr "Subskrypcja odrzucona" +msgstr "Odrzucono subskrypcję" #: ../actions/showstream.php:230 ../actions/showstream.php:307 #: ../actions/subscriptions.php:27 actions/showstream.php:240 @@ -2138,25 +2270,26 @@ msgid "Subscriptions" msgstr "Subskrypcje" #: ../actions/avatar.php:87 actions/profilesettings.php:324 -#: lib/imagefile.php:78 +#: lib/imagefile.php:78 lib/imagefile.php:82 msgid "System error uploading file." -msgstr "Błąd systemowy podczas wysyłania pliku." +msgstr "Błąd systemu podczas wysyłania pliku." #: ../actions/tag.php:41 ../lib/util.php:301 actions/tag.php:41 #: lib/util.php:317 actions/profilesettings.php:122 actions/showstream.php:297 #: actions/tagother.php:147 actions/tagother.php:207 lib/profilelist.php:162 -#: lib/profilelist.php:164 +#: lib/profilelist.php:164 actions/showstream.php:290 actions/tagother.php:149 +#: actions/tagother.php:209 lib/profilelist.php:160 msgid "Tags" -msgstr "" +msgstr "Znaczniki" #: ../lib/searchaction.php:104 lib/searchaction.php:104 msgid "Text" -msgstr "" +msgstr "Tekst" #: ../actions/noticesearch.php:34 actions/noticesearch.php:34 -#: actions/noticesearch.php:67 +#: actions/noticesearch.php:67 actions/noticesearch.php:78 msgid "Text search" -msgstr "Szukaj tekstu" +msgstr "Znajdź tekst" #: ../actions/openidsettings.php:140 actions/openidsettings.php:149 #: actions/openidsettings.php:227 @@ -2166,7 +2299,7 @@ msgstr "Ten identyfikator OpenID nie należy do Ciebie." #: ../actions/confirmaddress.php:52 actions/confirmaddress.php:52 #: actions/confirmaddress.php:94 msgid "That address has already been confirmed." -msgstr "Ten adres został już potwierdzony" +msgstr "Ten adres został już potwierdzony." #: ../actions/confirmaddress.php:43 actions/confirmaddress.php:43 #: actions/confirmaddress.php:85 @@ -2174,8 +2307,9 @@ msgid "That confirmation code is not for you!" msgstr "Ten kod potwierdzający nie jest przeznaczony dla Ciebie!" #: ../actions/emailsettings.php:191 actions/emailsettings.php:209 +#: actions/emailsettings.php:328 msgid "That email address already belongs to another user." -msgstr "" +msgstr "Ten adres e-mail należy już do innego użytkownika." #: ../actions/avatar.php:80 actions/profilesettings.php:317 #: lib/imagefile.php:71 @@ -2185,17 +2319,17 @@ msgstr "Ten plik jest za duży." #: ../actions/imsettings.php:170 actions/imsettings.php:178 #: actions/imsettings.php:293 msgid "That is already your Jabber ID." -msgstr "Ten identyfikator Jabbera jest już do Ciebie przypisany." +msgstr "Ten identyfikator Jabbera jest już Twój." #: ../actions/emailsettings.php:188 actions/emailsettings.php:206 -#: actions/emailsettings.php:318 +#: actions/emailsettings.php:318 actions/emailsettings.php:325 msgid "That is already your email address." -msgstr "" +msgstr "Ten adres e-mail jest już Twój." #: ../actions/smssettings.php:188 actions/smssettings.php:196 #: actions/smssettings.php:306 msgid "That is already your phone number." -msgstr "" +msgstr "Ten numer telefonu jest już Twój." #: ../actions/imsettings.php:233 actions/imsettings.php:241 #: actions/imsettings.php:381 @@ -2203,109 +2337,117 @@ msgid "That is not your Jabber ID." msgstr "To nie jest Twój identyfikator Jabbera." #: ../actions/emailsettings.php:249 actions/emailsettings.php:267 -#: actions/emailsettings.php:397 +#: actions/emailsettings.php:397 actions/emailsettings.php:404 msgid "That is not your email address." -msgstr "" +msgstr "To nie jest Twój adres e-mail." #: ../actions/smssettings.php:257 actions/smssettings.php:265 #: actions/smssettings.php:393 msgid "That is not your phone number." -msgstr "" +msgstr "To nie jest Twój numer telefonu." #: ../actions/emailsettings.php:226 ../actions/imsettings.php:210 #: actions/emailsettings.php:244 actions/imsettings.php:218 #: actions/emailsettings.php:367 actions/imsettings.php:349 +#: actions/emailsettings.php:374 msgid "That is the wrong IM address." msgstr "To jest błędny adres komunikatora." #: ../actions/smssettings.php:233 actions/smssettings.php:241 #: actions/smssettings.php:362 msgid "That is the wrong confirmation number." -msgstr "" +msgstr "To jest błędny numer potwierdzenia." #: ../actions/smssettings.php:191 actions/smssettings.php:199 #: actions/smssettings.php:309 msgid "That phone number already belongs to another user." -msgstr "" +msgstr "Ten numer telefonu należy już do innego użytkownika." #: ../actions/newnotice.php:49 ../actions/twitapistatuses.php:408 #: actions/newnotice.php:49 actions/twitapistatuses.php:330 #: actions/facebookhome.php:243 actions/twitapistatuses.php:276 +#: actions/newnotice.php:136 actions/twitapistatuses.php:294 +#: lib/facebookaction.php:485 msgid "That's too long. Max notice size is 140 chars." -msgstr "Wpis za długi. Maksymalna długość to 140 znaków." +msgstr "Wpis jest za długi. Maksymalna długość to 140 znaków." #: ../actions/twitapiaccount.php:74 actions/twitapiaccount.php:72 -#: actions/twitapiaccount.php:62 +#: actions/twitapiaccount.php:62 actions/twitapiaccount.php:63 msgid "That's too long. Max notice size is 255 chars." -msgstr "" +msgstr "Wpis jest za długi. Maksymalna długość to 255 znaków." #: ../actions/confirmaddress.php:92 actions/confirmaddress.php:92 +#: actions/confirmaddress.php:159 #, php-format msgid "The address \"%s\" has been confirmed for your account." -msgstr "Skojarzony z Twoim kontem adres \"%s\" został potwierdzony." +msgstr "Adres \"%s\" został potwierdzony dla Twojego konta." #: ../actions/emailsettings.php:264 ../actions/imsettings.php:250 #: ../actions/smssettings.php:274 actions/emailsettings.php:282 #: actions/imsettings.php:258 actions/smssettings.php:282 #: actions/emailsettings.php:416 actions/imsettings.php:402 -#: actions/smssettings.php:413 +#: actions/smssettings.php:413 actions/emailsettings.php:423 msgid "The address was removed." msgstr "Adres został usunięty." -#: ../actions/userauthorization.php:312 +#: ../actions/userauthorization.php:312 actions/userauthorization.php:346 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 "" -"Twoje żądanie obserwacji zostało odrzucone, ale nie przekazano żadnego URL-a " -"do zwrotnego komunikatu. Sprawdź w instrukcjach serwisu w jaki sposób " -"dokładnie odbywa się odrzucanie subskrypcji. Twój token subskrypcji to:" +"Subskrypcja została upoważniona, ale nie przekazano zwrotnego adresu URL. " +"Sprawdź w instrukcjach strony, jak upoważnić subskrypcję. Token subskrypcji:" -#: ../actions/userauthorization.php:322 +#: ../actions/userauthorization.php:322 actions/userauthorization.php:357 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 "" -"Twoje żądanie obserwacji zostało odrzucone, ale nie przekazano żadnego URL-a " -"do zwrotnego komunikatu. Sprawdź w instrukcjach serwisu w jaki sposób " -"dokładnie odbywa się odrzucanie subskrypcji." +"Subskrypcja została odrzucona, ale nie przekazano zwrotnego adresu URL. " +"Sprawdź w instrukcjach strony, jak w pełni odrzucić subskrypcję." #: ../actions/subscribers.php:35 actions/subscribers.php:35 +#: actions/subscribers.php:67 #, php-format msgid "These are the people who listen to %s's notices." -msgstr "Ludzie obserwujący wpisy użytkownika %s." +msgstr "Osoby obserwujące wpisy użytkownika %s." #: ../actions/subscribers.php:33 actions/subscribers.php:33 +#: actions/subscribers.php:63 msgid "These are the people who listen to your notices." -msgstr "Ludzie obserwujący Twoje wpisy." +msgstr "Osoby obserwujący Twoje wpisy." #: ../actions/subscriptions.php:35 actions/subscriptions.php:35 +#: actions/subscriptions.php:69 #, php-format msgid "These are the people whose notices %s listens to." -msgstr "Ludzie, których wpisy obserwuje użytkownik %s." +msgstr "Osoby, których wpisy obserwuje użytkownik %s." #: ../actions/subscriptions.php:33 actions/subscriptions.php:33 +#: actions/subscriptions.php:65 msgid "These are the people whose notices you listen to." -msgstr "Ludzie których wpisy obserwujesz." +msgstr "Osoby, których wpisy obserwujesz." #: ../actions/invite.php:89 actions/invite.php:96 actions/invite.php:128 msgid "" "These people are already users and you were automatically subscribed to them:" msgstr "" +"Te osoby są już użytkownikami i zostałeś do nich automatycznie " +"zasubskrybowany:" -#: ../actions/recoverpassword.php:88 +#: ../actions/recoverpassword.php:88 actions/recoverpassword.php:97 msgid "This confirmation code is too old. Please start again." -msgstr "Kod potwierdzający jest przeterminowany. Zacznij jeszcze raz." +msgstr "Kod potwierdzający jest za stary. Rozpocznij ponownie." -#: ../lib/openid.php:195 +#: ../lib/openid.php:195 lib/openid.php:206 msgid "" "This form should automatically submit itself. If not, click the submit " "button to go to your OpenID provider." msgstr "" -"Ten formularz powinien wysłać się automatycznie. Jeśli tak się nie stanie " -"kliknij Wyślij, aby przejść do Twojego dostawcy OpenID." +"Ten formularz powinien wysłać się automatycznie. Jeśli tak się nie stanie, " +"naciśnij przycisk Wyślij, aby przejść do dostawcy OpenID." #: ../actions/finishopenidlogin.php:56 actions/finishopenidlogin.php:61 #: actions/finishopenidlogin.php:67 @@ -2315,66 +2457,69 @@ msgid "" "to a local account. You can either create a new account, or connect with " "your existing account, if you have one." msgstr "" -"Jeżeli logujesz się po raz pierwszy do %s to twoje konto OpenID musi zostać " -"skojarzone z kontem lokalnym. Możesz więc albo utworzyć nowe konto, albo " -"połączyć je z posiadanym istniejącym." +"Jeżeli logujesz się do %s po raz pierwszy, musimy połączyć identyfikator " +"OpenID z lokalnym kontem. Można utworzyć nowe konto lub połączyć z " +"istniejącym, jeśli je posiadasz." #: ../actions/twitapifriendships.php:108 ../actions/twitapistatuses.php:586 #: actions/twitapifavorites.php:127 actions/twitapifriendships.php:108 #: actions/twitapistatuses.php:511 actions/twitapifavorites.php:97 #: actions/twitapifriendships.php:85 actions/twitapistatuses.php:436 +#: actions/twitapifavorites.php:103 actions/twitapistatuses.php:460 msgid "This method requires a POST or DELETE." -msgstr "" +msgstr "Ta metoda wymaga POST lub DELETE." #: ../actions/twitapiaccount.php:65 ../actions/twitapifriendships.php:44 #: ../actions/twitapistatuses.php:381 actions/twitapiaccount.php:63 #: actions/twitapidirect_messages.php:114 actions/twitapifriendships.php:44 #: actions/twitapistatuses.php:303 actions/twitapiaccount.php:53 #: actions/twitapidirect_messages.php:122 actions/twitapifriendships.php:32 -#: actions/twitapistatuses.php:244 +#: actions/twitapistatuses.php:244 actions/twitapiaccount.php:54 +#: actions/twitapidirect_messages.php:131 actions/twitapistatuses.php:262 msgid "This method requires a POST." -msgstr "" +msgstr "Ta metoda wymaga POST." -#: ../lib/util.php:164 lib/util.php:246 +#: ../lib/util.php:164 lib/util.php:246 lib/htmloutputter.php:104 msgid "This page is not available in a media type you accept" -msgstr "Ta strona nie jest dostępna dla medium, którego typ akceptujesz" +msgstr "Ta strona jest niedostępna dla akceptowanego typu medium" #: ../actions/profilesettings.php:63 actions/profilesettings.php:96 #: actions/profilesettings.php:138 msgid "Timezone" -msgstr "" +msgstr "Strefa czasowa" #: ../actions/profilesettings.php:107 actions/profilesettings.php:222 #: actions/profilesettings.php:211 msgid "Timezone not selected." -msgstr "" +msgstr "Nie wybrano strefy czasowej." -#: ../actions/remotesubscribe.php:43 +#: ../actions/remotesubscribe.php:43 actions/remotesubscribe.php:74 #, 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 "" -"Aby się zapisać możesz się [zalogować](%%action.login%%) lub [zarejestrować]" -"(%%action.register%%). Jeśli już posiadasz konto w [kompatybilnym serwisie](%" -"%doc.openmublog%%) wprowadź poniżej identyfikator URL." +"Aby zasubskrybować, można [zalogować się](%%action.login%%) lub " +"[zarejestrować](%%action.register%%) nowe konto. Jeśli już posiadasz konto " +"na [zgodnej stronie mikroblogowania](%%doc.openmublog%%), podaj poniżej " +"adres URL profilu." #: ../actions/twitapifriendships.php:163 actions/twitapifriendships.php:167 #: actions/twitapifriendships.php:132 msgid "Two user ids or screen_names must be supplied." -msgstr "" +msgstr "Należy dostarczyć dwa identyfikatory lub nazwy użytkowników." #: ../actions/profilesettings.php:48 ../actions/register.php:169 #: actions/profilesettings.php:81 actions/register.php:183 -#: actions/profilesettings.php:109 +#: actions/profilesettings.php:109 actions/register.php:398 msgid "URL of your homepage, blog, or profile on another site" -msgstr "URL Twojej strony domowej, bloga, lub profilu na innej stronie" +msgstr "Adres URL strony domowej, bloga lub profilu na innej stronie" #: ../actions/remotesubscribe.php:74 actions/remotesubscribe.php:83 #: actions/remotesubscribe.php:110 msgid "URL of your profile on another compatible microblogging service" -msgstr "URL Twojego profilu na kompatybilnym serwisie do mikroblogów" +msgstr "Adres URL profilu na innej, zgodnej usłudze mikroblogowania" #: ../actions/emailsettings.php:130 ../actions/imsettings.php:110 #: ../actions/recoverpassword.php:39 ../actions/smssettings.php:135 @@ -2384,17 +2529,19 @@ msgstr "URL Twojego profilu na kompatybilnym serwisie do mikroblogów" #: actions/emailsettings.php:242 actions/grouplogo.php:317 #: actions/imsettings.php:214 actions/recoverpassword.php:44 #: actions/smssettings.php:236 actions/twittersettings.php:302 +#: actions/avatarsettings.php:263 actions/emailsettings.php:247 +#: actions/grouplogo.php:324 actions/twittersettings.php:306 msgid "Unexpected form submission." -msgstr "Nieoczekiwane przesłanie formularza." +msgstr "Nieoczekiwane wysłanie formularza." #: ../actions/recoverpassword.php:276 actions/recoverpassword.php:289 #: actions/recoverpassword.php:323 msgid "Unexpected password reset." -msgstr "Nieoczekiwane wyzerowanie hasła." +msgstr "Nieoczekiwane przywrócenie hasła." #: ../index.php:57 index.php:57 actions/recoverpassword.php:202 msgid "Unknown action" -msgstr "" +msgstr "Nieznane działanie" #: ../actions/finishremotesubscribe.php:58 #: actions/finishremotesubscribe.php:60 actions/finishremotesubscribe.php:61 @@ -2406,8 +2553,8 @@ msgid "" "Unless otherwise specified, contents of this site are copyright by the " "contributors and available under the " msgstr "" -"Prawo do kopiowania zawartości tej strony, chyba że zaznaczono inaczej, " -"należy do tworzących jej treści i uwarunkowane zasadami" +"Jeśli nie podano inaczej, prawa autorskie do zawartości tej strony należy do " +"współtwórców i jest dostępna na warunkach licencji " #: ../actions/confirmaddress.php:48 actions/confirmaddress.php:48 #: actions/confirmaddress.php:90 @@ -2423,38 +2570,40 @@ msgstr "Zrezygnuj z subskrypcji" #: ../actions/postnotice.php:44 ../actions/updateprofile.php:45 #: actions/postnotice.php:45 actions/updateprofile.php:46 #: actions/postnotice.php:48 actions/updateprofile.php:49 +#: actions/updateprofile.php:51 msgid "Unsupported OMB version" msgstr "Nieobsługiwana wersja OMB" #: ../actions/avatar.php:105 actions/profilesettings.php:342 -#: lib/imagefile.php:102 +#: lib/imagefile.php:102 lib/imagefile.php:99 msgid "Unsupported image file format." msgstr "Nieobsługiwany format pliku obrazu." #: ../lib/settingsaction.php:100 lib/settingsaction.php:94 #: lib/connectsettingsaction.php:108 msgid "Updates by SMS" -msgstr "" +msgstr "Aktualizacje przez wiadomości SMS" #: ../lib/settingsaction.php:103 lib/settingsaction.php:97 #: lib/connectsettingsaction.php:105 msgid "Updates by instant messenger (IM)" -msgstr "" +msgstr "Aktualizacje przez komunikator" #: ../actions/twitapistatuses.php:241 actions/twitapistatuses.php:158 -#: actions/twitapistatuses.php:129 +#: actions/twitapistatuses.php:129 actions/twitapistatuses.php:134 #, php-format msgid "Updates from %1$s and friends on %2$s!" -msgstr "" +msgstr "Aktualizacje od %1$s i przyjaciół na %2$s!" #: ../actions/twitapistatuses.php:341 actions/twitapistatuses.php:268 -#: actions/twitapistatuses.php:202 +#: actions/twitapistatuses.php:202 actions/twitapistatuses.php:213 #, php-format msgid "Updates from %1$s on %2$s!" -msgstr "" +msgstr "Aktualizacje od %1$s na %2$s!" #: ../actions/avatar.php:68 actions/profilesettings.php:161 #: actions/avatarsettings.php:162 actions/grouplogo.php:232 +#: actions/avatarsettings.php:165 actions/grouplogo.php:238 msgid "Upload" msgstr "Wyślij" @@ -2465,23 +2614,25 @@ msgid "" "site license, also. Use a picture that belongs to you and that you want to " "share." msgstr "" -"Tu możesz wysłać nowego \"awatara\" (wizerunek użytkownika). Nie da się " -"edytować obrazu po jego umieszczeniu w serwisie, więc upewnij się, że jest w " -"miarę kwadratowy. Wysyłając go zgadzasz się na jego publikację na warunkach " -"podanych w licencji strony. Użyj grafiki, która należy do Ciebie i którą " -"możesz dzielić się z innymi." +"Tu można wysłać nowego \"awatara\" (obraz użytkownika). Nie można " +"modyfikować obrazu po jego wysłaniu, więc upewnij się, że jest w miarę " +"kwadratowy. Musi być także na licencji strony. Użyj obrazu, który należy do " +"Ciebie, i którym chcesz się dzielić." #: ../lib/settingsaction.php:91 msgid "Upload a new profile image" -msgstr "" +msgstr "Wyślij nowy obraz profilu" #: ../actions/invite.php:114 actions/invite.php:121 actions/invite.php:154 msgid "" "Use this form to invite your friends and colleagues to use this service." msgstr "" +"Użyj tego formularza, aby zaprosić przyjaciół i kolegów do używania tej " +"usługi." #: ../actions/register.php:159 ../actions/register.php:162 -#: actions/register.php:173 actions/register.php:176 +#: actions/register.php:173 actions/register.php:176 actions/register.php:382 +#: actions/register.php:386 msgid "Used only for updates, announcements, and password recovery" msgstr "Używane tylko do aktualizacji, ogłoszeń i przywracania hasła" @@ -2505,8 +2656,10 @@ msgstr "Obserwowany użytkownik nie istnieje." #: actions/twitapifavorites.php:42 actions/twitapistatuses.php:167 #: actions/twitapistatuses.php:503 actions/twitapiusers.php:55 #: actions/usergroups.php:99 lib/galleryaction.php:67 lib/twitterapi.php:626 +#: actions/twitapiaccount.php:71 actions/twitapistatuses.php:179 +#: actions/twitapistatuses.php:535 actions/twitapiusers.php:59 msgid "User has no profile." -msgstr "Użytkownik nie ma profilu." +msgstr "Użytkownik nie posiada profilu." #: ../actions/remotesubscribe.php:71 actions/remotesubscribe.php:80 #: actions/remotesubscribe.php:105 @@ -2515,12 +2668,12 @@ msgstr "Pseudonim użytkownika" #: ../actions/twitapiusers.php:75 actions/twitapiusers.php:80 msgid "User not found." -msgstr "" +msgstr "Nie znaleziono użytkownika." #: ../actions/profilesettings.php:63 actions/profilesettings.php:96 #: actions/profilesettings.php:139 msgid "What timezone are you normally in?" -msgstr "" +msgstr "W jakiej strefie czasowej zwykle się znajdujesz?" #: ../lib/util.php:1159 lib/util.php:1293 lib/noticeform.php:141 #, php-format @@ -2529,111 +2682,115 @@ msgstr "Co słychać, %s?" #: ../actions/profilesettings.php:54 ../actions/register.php:175 #: actions/profilesettings.php:87 actions/register.php:189 -#: actions/profilesettings.php:119 +#: actions/profilesettings.php:119 actions/register.php:410 msgid "Where you are, like \"City, State (or Region), Country\"" -msgstr "Gdzie jesteś? (np. \"miasto, region, kraj\")" +msgstr "Gdzie jesteś, np. \"miasto, województwo (lub region), kraj\"" #: ../actions/updateprofile.php:128 actions/updateprofile.php:129 -#: actions/updateprofile.php:132 +#: actions/updateprofile.php:132 actions/updateprofile.php:134 #, php-format msgid "Wrong image type for '%s'" -msgstr "Nieprawidłowy typ obrazu dla '%s'" +msgstr "Błędny typ obrazu dla \"%s\"" #: ../actions/updateprofile.php:123 actions/updateprofile.php:124 -#: actions/updateprofile.php:127 +#: actions/updateprofile.php:127 actions/updateprofile.php:129 #, php-format msgid "Wrong size image at '%s'" -msgstr "Nieprawidłowy rozmiar obrazu dla '%s'" +msgstr "Błędny rozmiar obrazu \"%s\"" #: ../actions/deletenotice.php:63 ../actions/deletenotice.php:72 #: actions/deletenotice.php:64 actions/deletenotice.php:79 #: actions/block.php:148 actions/deletenotice.php:122 -#: actions/deletenotice.php:141 +#: actions/deletenotice.php:141 actions/deletenotice.php:115 msgid "Yes" -msgstr "" +msgstr "Tak" #: ../actions/finishaddopenid.php:64 actions/finishaddopenid.php:64 #: actions/finishaddopenid.php:112 msgid "You already have this OpenID!" -msgstr "Już masz ten identyfikator OpenID!" +msgstr "Już posiadasz ten identyfikator OpenID!" #: ../actions/deletenotice.php:37 actions/deletenotice.php:37 msgid "" "You are about to permanently delete a notice. Once this is done, it cannot " "be undone." msgstr "" +"Wpis zostanie za chwilę trwale usunięty. Kiedy to się stanie, to już się nie " +"odstanie." #: ../actions/recoverpassword.php:31 actions/recoverpassword.php:31 #: actions/recoverpassword.php:36 msgid "You are already logged in!" -msgstr "Nie musisz ponownie się logować!" +msgstr "Jesteś już zalogowany!" #: ../actions/invite.php:81 actions/invite.php:88 actions/invite.php:120 msgid "You are already subscribed to these users:" -msgstr "" +msgstr "Jesteś już zasubskrybowany do tych użytkowników:" #: ../actions/twitapifriendships.php:128 actions/twitapifriendships.php:128 #: actions/twitapifriendships.php:105 msgid "You are not friends with the specified user." -msgstr "" +msgstr "Nie jesteś przyjacielem podanego użytkownika." #: ../actions/password.php:27 msgid "You can change your password here. Choose a good one!" -msgstr "Tu możesz zmienić hasło. Wybierz porządne!" +msgstr "Tutaj można zmienić hasło. Wybierz dobre!" #: ../actions/register.php:135 actions/register.php:145 msgid "You can create a new account to start posting notices." -msgstr "Możesz utworzyć nowe konto, aby rozpocząć wysyłanie wpisów." +msgstr "Można utworzyć nowe konto, aby rozpocząć wysyłanie wpisów." #: ../actions/smssettings.php:28 actions/smssettings.php:28 #: actions/smssettings.php:69 #, php-format msgid "You can receive SMS messages through email from %%site.name%%." -msgstr "" +msgstr "Można otrzymywać wiadomości SMS przez e-mail od %%site.name%%." -#: ../actions/openidsettings.php:86 +#: ../actions/openidsettings.php:86 actions/openidsettings.php:143 msgid "" "You can remove an OpenID from your account by clicking the button marked " "\"Remove\"." msgstr "" -"Możesz usunąć łączność z serwerem OpenID ze swojego konta klikając \"Usuń\"." +"Można usunąć identyfikator OpenID ze swojego konta naciskając przycisk \"Usuń" +"\"." #: ../actions/imsettings.php:28 actions/imsettings.php:28 +#: 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 "" -"Możesz wysyłać i odbierać wpisy przez komunikator Jabber/GTalk (%%doc.im%%). " -"Poniżej możesz skonfigurować swój adres i ustawienia IM." +"Można wysyłać i odbierać wpisy przez [komunikator](%%doc.im%%) Jabber/GTalk. " +"Skonfiguruj adres i ustawienia poniżej." -#: ../actions/profilesettings.php:27 +#: ../actions/profilesettings.php:27 actions/profilesettings.php:69 msgid "" "You can update your personal profile info here so people know more about you." msgstr "" -"W tym miejscu możesz zaktualizować informacje zawarte w Twoim osobistym " -"profilu, aby inni mogli lepiej Cię poznać." +"Tutaj można zaktualizować osobiste informacje w profilu, aby inni mogli " +"lepiej Cię poznać." #: ../actions/finishremotesubscribe.php:31 ../actions/remotesubscribe.php:31 #: actions/finishremotesubscribe.php:31 actions/remotesubscribe.php:31 #: actions/finishremotesubscribe.php:33 actions/finishremotesubscribe.php:85 #: actions/finishremotesubscribe.php:101 actions/remotesubscribe.php:35 msgid "You can use the local subscription!" -msgstr "Możesz skorzystać z lokalnej subskrypcji!" +msgstr "Można używać lokalnej subskrypcji!" #: ../actions/finishopenidlogin.php:33 ../actions/register.php:61 #: actions/finishopenidlogin.php:38 actions/register.php:68 -#: actions/finishopenidlogin.php:43 +#: actions/finishopenidlogin.php:43 actions/register.php:149 msgid "You can't register if you don't agree to the license." msgstr "" "Nie możesz się zarejestrować, jeśli nie zgadzasz się z warunkami licencji." #: ../actions/updateprofile.php:63 actions/updateprofile.php:64 -#: actions/updateprofile.php:67 +#: actions/updateprofile.php:67 actions/updateprofile.php:69 msgid "You did not send us that profile" -msgstr "Ten profil nie był wysłany przez Ciebie" +msgstr "Nie wysłałeś nam tego profilu" -#: ../lib/mail.php:147 +#: ../lib/mail.php:147 lib/mail.php:289 #, php-format msgid "" "You have a new posting address on %1$s.\n" @@ -2645,122 +2802,132 @@ msgid "" "Faithfully yours,\n" "%4$s" msgstr "" +"Posiadasz nowy adres wysyłania na %1$s.\n" +"\n" +"Wyślij wiadomość e-mail na %2$s, aby wysłać nowe wpisy.\n" +"\n" +"Więcej instrukcji dotyczących poczty e-mail można znaleźć na %3$s.\n" +"\n" +"Z poważaniem,\n" +"%4$s" #: ../actions/twitapistatuses.php:612 actions/twitapistatuses.php:537 -#: actions/twitapistatuses.php:463 +#: actions/twitapistatuses.php:463 actions/twitapistatuses.php:486 msgid "You may not delete another user's status." -msgstr "" +msgstr "Nie można usuwać statusów innych użytkowników." #: ../actions/invite.php:31 actions/invite.php:31 actions/invite.php:39 #, php-format msgid "You must be logged in to invite other users to use %s" msgstr "" +"Należy być zalogowanym, aby zapraszać innych użytkowników do używania %s" #: ../actions/invite.php:103 actions/invite.php:110 actions/invite.php:142 msgid "" "You will be notified when your invitees accept the invitation and register " "on the site. Thanks for growing the community!" msgstr "" +"Zostaniesz powiadomiony, kiedy ktoś zaakceptuje zaproszenie i zarejestruje " +"się na stronie. Dziękujemy za pomoc w zwiększaniu społeczności!" -#: ../actions/recoverpassword.php:149 +#: ../actions/recoverpassword.php:149 actions/recoverpassword.php:158 msgid "You've been identified. Enter a new password below. " -msgstr "Identyfikacja pomyślna. Wprowadź poniżej nowe hasło." +msgstr "Zostałeś zidentyfikowany. Podaj poniżej nowe hasło. " #: ../actions/openidlogin.php:67 actions/openidlogin.php:76 -#: actions/openidlogin.php:104 +#: actions/openidlogin.php:104 actions/openidlogin.php:113 msgid "Your OpenID URL" -msgstr "URL Twojej usługi OpenID" +msgstr "Twój adres URL OpenID" -#: ../actions/recoverpassword.php:164 +#: ../actions/recoverpassword.php:164 actions/recoverpassword.php:188 msgid "Your nickname on this server, or your registered email address." -msgstr "" -"Twój pseudonim na tym serwerze lub adres e-mailowy użyty podczas rejestracji." +msgstr "Twój pseudonim na tym serwerze lub zarejestrowany adres e-mail." -#: ../actions/openidsettings.php:28 +#: ../actions/openidsettings.php:28 actions/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 "" -"[OpenID](%%doc.openid%%) pozwala logować Ci się do wielu serwisów z " -"wykorzystaniem jednego konta użytkownika. Tu możesz zarządzać swoimi " +"[OpenID](%%doc.openid%%) umożliwia logowanie się do wielu stron za pomocą " +"tego samego konta użytkownika. Tu można zarządzać powiązanymi " "identyfikatorami OpenID." -#: ../lib/util.php:943 lib/util.php:992 lib/util.php:945 +#: ../lib/util.php:943 lib/util.php:992 lib/util.php:945 lib/util.php:756 msgid "a few seconds ago" msgstr "kilka sekund temu" -#: ../lib/util.php:955 lib/util.php:1004 lib/util.php:957 +#: ../lib/util.php:955 lib/util.php:1004 lib/util.php:957 lib/util.php:768 #, php-format msgid "about %d days ago" msgstr "około %d dni temu" -#: ../lib/util.php:951 lib/util.php:1000 lib/util.php:953 +#: ../lib/util.php:951 lib/util.php:1000 lib/util.php:953 lib/util.php:764 #, php-format msgid "about %d hours ago" msgstr "około %d godzin temu" -#: ../lib/util.php:947 lib/util.php:996 lib/util.php:949 +#: ../lib/util.php:947 lib/util.php:996 lib/util.php:949 lib/util.php:760 #, php-format msgid "about %d minutes ago" msgstr "około %d minut temu" -#: ../lib/util.php:959 lib/util.php:1008 lib/util.php:961 +#: ../lib/util.php:959 lib/util.php:1008 lib/util.php:961 lib/util.php:772 #, php-format msgid "about %d months ago" msgstr "około %d miesięcy temu" -#: ../lib/util.php:953 lib/util.php:1002 lib/util.php:955 +#: ../lib/util.php:953 lib/util.php:1002 lib/util.php:955 lib/util.php:766 msgid "about a day ago" msgstr "blisko dzień temu" -#: ../lib/util.php:945 lib/util.php:994 lib/util.php:947 +#: ../lib/util.php:945 lib/util.php:994 lib/util.php:947 lib/util.php:758 msgid "about a minute ago" -msgstr "blisko minutę temu" +msgstr "około minutę temu" -#: ../lib/util.php:957 lib/util.php:1006 lib/util.php:959 +#: ../lib/util.php:957 lib/util.php:1006 lib/util.php:959 lib/util.php:770 msgid "about a month ago" -msgstr "blisko miesiąc temu" +msgstr "około miesiąc temu" -#: ../lib/util.php:961 lib/util.php:1010 lib/util.php:963 +#: ../lib/util.php:961 lib/util.php:1010 lib/util.php:963 lib/util.php:774 msgid "about a year ago" -msgstr "blisko rok temu" +msgstr "około rok temu" -#: ../lib/util.php:949 lib/util.php:998 lib/util.php:951 +#: ../lib/util.php:949 lib/util.php:998 lib/util.php:951 lib/util.php:762 msgid "about an hour ago" -msgstr "blisko godzinę temu" +msgstr "około godzinę temu" #: ../actions/showstream.php:423 ../lib/stream.php:132 #: actions/showstream.php:441 lib/stream.php:99 msgid "delete" -msgstr "" +msgstr "usuń" #: ../actions/noticesearch.php:130 ../actions/showstream.php:408 #: ../lib/stream.php:117 actions/noticesearch.php:136 #: actions/showstream.php:426 lib/stream.php:84 actions/noticesearch.php:187 msgid "in reply to..." -msgstr "w odpowiedzi na…" +msgstr "w odpowiedzi na..." #: ../actions/noticesearch.php:137 ../actions/showstream.php:415 #: ../lib/stream.php:124 actions/noticesearch.php:143 #: actions/showstream.php:433 lib/stream.php:91 actions/noticesearch.php:194 msgid "reply" -msgstr "odpowiedź" +msgstr "odpowiedz" #: ../actions/password.php:44 actions/profilesettings.php:183 #: actions/passwordsettings.php:106 msgid "same as password above" -msgstr "takie samo hasło jak powyżej" +msgstr "takie samo jak hasło powyżej" #: ../actions/twitapistatuses.php:755 actions/twitapistatuses.php:678 -#: actions/twitapistatuses.php:555 +#: actions/twitapistatuses.php:555 actions/twitapistatuses.php:596 +#: actions/twitapistatuses.php:618 msgid "unsupported file type" -msgstr "" +msgstr "nieobsługiwany typ pliku" #: ../lib/util.php:1309 lib/util.php:1443 -#, fuzzy msgid "« After" -msgstr "« następne" +msgstr "« Następne" #: actions/deletenotice.php:74 actions/disfavor.php:43 #: actions/emailsettings.php:127 actions/favor.php:45 @@ -2775,68 +2942,80 @@ msgstr "« następne" #: actions/finishopenidlogin.php:38 actions/invite.php:54 actions/nudge.php:80 #: actions/openidlogin.php:37 actions/recoverpassword.php:316 #: actions/subscribe.php:46 actions/unblock.php:65 actions/unsubscribe.php:43 +#: actions/avatarsettings.php:251 actions/emailsettings.php:229 +#: actions/grouplogo.php:314 actions/imsettings.php:200 actions/login.php:103 +#: actions/newmessage.php:133 actions/newnotice.php:96 +#: actions/openidsettings.php:188 actions/othersettings.php:136 +#: actions/passwordsettings.php:131 actions/profilesettings.php:172 +#: actions/register.php:113 actions/remotesubscribe.php:53 +#: actions/smssettings.php:216 actions/subedit.php:38 actions/tagother.php:166 +#: actions/twittersettings.php:294 actions/userauthorization.php:39 msgid "There was a problem with your session token. Try again, please." -msgstr "" +msgstr "Wystąpił problem z tokenem sesji. Spróbuj ponownie." #: actions/disfavor.php:55 actions/disfavor.php:81 msgid "This notice is not a favorite!" -msgstr "" +msgstr "Ten wpis nie jest ulubiony!" #: actions/disfavor.php:63 actions/disfavor.php:87 msgid "Could not delete favorite." -msgstr "" +msgstr "Nie można usunąć ulubionego wpisu." #: actions/disfavor.php:72 lib/favorform.php:140 msgid "Favor" -msgstr "" +msgstr "Dodaj do ulubionych" -#: actions/emailsettings.php:92 +#: actions/emailsettings.php:92 actions/emailsettings.php:157 msgid "Send me email when someone adds my notice as a favorite." -msgstr "" +msgstr "Wyślij mi wiadomość e-mail, kiedy ktoś doda mój wpis jako ulubiony." #: actions/emailsettings.php:95 actions/emailsettings.php:163 msgid "Send me email when someone sends me a private message." -msgstr "" +msgstr "Wyślij mi wiadomość e-mail, kiedy ktoś wyśle mi prywatną wiadomość." #: actions/favor.php:53 actions/twitapifavorites.php:142 actions/favor.php:81 -#: actions/twitapifavorites.php:118 +#: actions/twitapifavorites.php:118 actions/twitapifavorites.php:124 msgid "This notice is already a favorite!" -msgstr "" +msgstr "Ten wpis jest już ulubiony!" #: actions/favor.php:60 actions/twitapifavorites.php:151 #: classes/Command.php:132 actions/favor.php:86 #: actions/twitapifavorites.php:125 classes/Command.php:152 +#: actions/twitapifavorites.php:131 lib/command.php:152 msgid "Could not create favorite." -msgstr "" +msgstr "Nie można utworzyć ulubionego wpisu." #: actions/favor.php:70 msgid "Disfavor" -msgstr "" +msgstr "Usuń wpis z ulubionych" #: actions/favoritesrss.php:60 actions/showfavorites.php:47 #: actions/favoritesrss.php:100 actions/showfavorites.php:77 +#: actions/favoritesrss.php:110 #, php-format msgid "%s favorite notices" -msgstr "" +msgstr "Ulubione wpisy użytkownika %s" #: actions/favoritesrss.php:64 actions/favoritesrss.php:104 +#: actions/favoritesrss.php:114 #, php-format msgid "Feed of favorite notices of %s" -msgstr "" +msgstr "Kanał ulubionych wpisów użytkownika %s" #: actions/inbox.php:28 actions/inbox.php:59 #, php-format msgid "Inbox for %s - page %d" -msgstr "" +msgstr "Odebrane wiadomości użytkownika %s - strona %d" #: actions/inbox.php:30 actions/inbox.php:62 #, php-format msgid "Inbox for %s" -msgstr "" +msgstr "Odebrane wiadomości użytkownika %s" #: actions/inbox.php:53 actions/inbox.php:115 msgid "This is your inbox, which lists your incoming private messages." msgstr "" +"To jest skrzynka odbiorcza, która wyświetla przychodzące wiadomości prywatne." #: actions/invite.php:178 actions/invite.php:213 #, php-format @@ -2844,234 +3023,260 @@ msgid "" "%1$s has invited you to join them on %2$s (%3$s).\n" "\n" msgstr "" +"%1$s zaprosił się do dołączenia do %2$s (%3$s).\n" +"\n" #: actions/login.php:104 actions/login.php:235 actions/openidlogin.php:108 #: actions/register.php:416 msgid "Automatically login in the future; " -msgstr "" +msgstr "Automatyczne logowanie; " #: actions/login.php:122 actions/login.php:264 msgid "For security reasons, please re-enter your " -msgstr "" +msgstr "Z powodów bezpieczeństwa ponownie podaj " #: actions/login.php:126 actions/login.php:268 msgid "Login with your username and password. " -msgstr "" +msgstr "Zaloguj się za pomocą nazwy użytkownika i hasła. " #: actions/newmessage.php:58 actions/twitapidirect_messages.php:130 -#: actions/twitapidirect_messages.php:141 +#: actions/twitapidirect_messages.php:141 actions/newmessage.php:148 +#: actions/twitapidirect_messages.php:150 msgid "That's too long. Max message size is 140 chars." -msgstr "" +msgstr "Wiadomość jest za długa. Maksymalna długość to 140 znaków." #: actions/newmessage.php:65 actions/newmessage.php:128 +#: actions/newmessage.php:155 msgid "No recipient specified." -msgstr "" +msgstr "Nie podano odbiorcy." #: actions/newmessage.php:68 actions/newmessage.php:113 #: classes/Command.php:206 actions/newmessage.php:131 #: actions/newmessage.php:168 classes/Command.php:237 +#: actions/newmessage.php:119 actions/newmessage.php:158 lib/command.php:237 msgid "You can't send a message to this user." -msgstr "" +msgstr "Nie można wysłać wiadomości do tego użytkownika." #: actions/newmessage.php:71 actions/twitapidirect_messages.php:146 #: classes/Command.php:209 actions/twitapidirect_messages.php:158 -#: classes/Command.php:240 +#: classes/Command.php:240 actions/newmessage.php:161 +#: actions/twitapidirect_messages.php:167 lib/command.php:240 msgid "" "Don't send a message to yourself; just say it to yourself quietly instead." -msgstr "" +msgstr "Nie wysyłaj wiadomości do siebie, po prostu powiedz to sobie po cichu." #: actions/newmessage.php:108 actions/microsummary.php:62 -#: actions/newmessage.php:163 +#: actions/newmessage.php:163 actions/newmessage.php:114 msgid "No such user" -msgstr "" +msgstr "Nie ma takiego użytkownika" #: actions/newmessage.php:117 actions/newmessage.php:67 +#: actions/newmessage.php:71 msgid "New message" -msgstr "" +msgstr "Nowa wiadomość" #: actions/noticesearch.php:95 actions/noticesearch.php:146 msgid "Notice without matching profile" -msgstr "" +msgstr "Wpis bez odpowiadającego profilu" #: actions/openidsettings.php:28 actions/openidsettings.php:70 #, php-format msgid "[OpenID](%%doc.openid%%) lets you log into many sites " -msgstr "" +msgstr "[OpenID](%%doc.openid%%) umożliwia logowanie się na wiele stron " #: actions/openidsettings.php:46 actions/openidsettings.php:96 msgid "If you want to add an OpenID to your account, " -msgstr "" +msgstr "Jeśli chcesz dodać identyfikator OpenID do konta, " #: actions/openidsettings.php:74 msgid "Removing your only OpenID would make it impossible to log in! " -msgstr "" +msgstr "Usunięcie jedynego identyfikatora OpenID uniemożliwi zalogowanie się! " #: actions/openidsettings.php:87 actions/openidsettings.php:143 msgid "You can remove an OpenID from your account " -msgstr "" +msgstr "Można usunąć identyfikator OpenID z konta " #: actions/outbox.php:28 actions/outbox.php:58 #, php-format msgid "Outbox for %s - page %d" -msgstr "" +msgstr "Wysłane wiadomości użytkownika %s - strona %d" #: actions/outbox.php:30 actions/outbox.php:61 #, php-format msgid "Outbox for %s" -msgstr "" +msgstr "Wysłane wiadomości użytkownika %s" #: actions/outbox.php:53 actions/outbox.php:116 msgid "This is your outbox, which lists private messages you have sent." -msgstr "" +msgstr "To są wiadomości wysłane, czyli prywatne wiadomości, które wysłałeś." #: actions/peoplesearch.php:28 actions/peoplesearch.php:52 #, php-format msgid "" "Search for people on %%site.name%% by their name, location, or interests. " msgstr "" +"Znajdź osoby na %%site.name%% według ich nazwiska, położenia lub " +"zainteresowań. " #: actions/profilesettings.php:27 actions/profilesettings.php:69 msgid "You can update your personal profile info here " -msgstr "" +msgstr "Można tutaj zaktualizować osobiste informacje profilu " #: actions/profilesettings.php:115 actions/remotesubscribe.php:320 #: actions/userauthorization.php:159 actions/userrss.php:76 #: actions/avatarsettings.php:104 actions/avatarsettings.php:179 #: actions/grouplogo.php:177 actions/remotesubscribe.php:367 #: actions/userauthorization.php:176 actions/userrss.php:82 +#: actions/avatarsettings.php:106 actions/avatarsettings.php:182 +#: actions/grouplogo.php:183 actions/remotesubscribe.php:366 msgid "User without matching profile" -msgstr "" +msgstr "Użytkownik bez odpowiadającego profilu" #: actions/recoverpassword.php:91 actions/recoverpassword.php:97 msgid "This confirmation code is too old. " -msgstr "" +msgstr "Ten kod potwierdzający jest za stary. " #: actions/recoverpassword.php:141 actions/recoverpassword.php:152 msgid "If you've forgotten or lost your" -msgstr "" +msgstr "Jeśli zapomniałeś lub zgubiłeś" #: actions/recoverpassword.php:154 actions/recoverpassword.php:158 msgid "You've been identified. Enter a " -msgstr "" +msgstr "Zostałeś zidentyfikowany. Podaj " #: actions/recoverpassword.php:169 actions/recoverpassword.php:188 msgid "Your nickname on this server, " -msgstr "" +msgstr "Pseudonim na tym serwerze, " #: actions/recoverpassword.php:271 actions/recoverpassword.php:304 msgid "Instructions for recovering your password " -msgstr "" +msgstr "Instrukcje przywracania hasła " #: actions/recoverpassword.php:327 actions/recoverpassword.php:361 msgid "New password successfully saved. " -msgstr "" +msgstr "Pomyślnie zapisano nowe hasło. " #: actions/register.php:95 actions/register.php:180 +#: actions/passwordsettings.php:147 msgid "Password must be 6 or more characters." -msgstr "" +msgstr "Hasło musi mieć sześć lub więcej znaków." #: actions/register.php:216 #, php-format msgid "" "Congratulations, %s! And welcome to %%%%site.name%%%%. From here, you may " "want to..." -msgstr "" +msgstr "Gratulacje, %s! Witaj na %%%%site.name%%%%. Stąd możesz chcieć..." #: actions/register.php:227 msgid "(You should receive a message by email momentarily, with " -msgstr "" +msgstr "(Powinieneś właśnie otrzymać wiadomość przez e-mail z " #: actions/remotesubscribe.php:51 actions/remotesubscribe.php:74 #, php-format msgid "To subscribe, you can [login](%%action.login%%)," -msgstr "" +msgstr "Aby zasubskrybować, można [zalogować się](%%action.login%%)," #: actions/showfavorites.php:61 actions/showfavorites.php:145 +#: actions/showfavorites.php:147 #, php-format msgid "Feed for favorites of %s" -msgstr "" +msgstr "Kanał ulubionych wpisów użytkownika %s" #: actions/showfavorites.php:84 actions/twitapifavorites.php:85 #: actions/showfavorites.php:202 actions/twitapifavorites.php:59 +#: actions/showfavorites.php:179 msgid "Could not retrieve favorite notices." -msgstr "" +msgstr "Nie można odebrać ulubionych wpisów." #: actions/showmessage.php:33 actions/showmessage.php:81 msgid "No such message." -msgstr "" +msgstr "Nie ma takiej wiadomości." -#: actions/showmessage.php:42 +#: actions/showmessage.php:42 actions/showmessage.php:98 msgid "Only the sender and recipient may read this message." -msgstr "" +msgstr "Tylko nadawca i odbiorca mogą przeczytać tę wiadomość." #: actions/showmessage.php:61 actions/showmessage.php:108 #, php-format msgid "Message to %1$s on %2$s" -msgstr "" +msgstr "Wiadomość do użytkownika %1$s na %2$s" #: actions/showmessage.php:66 actions/showmessage.php:113 #, php-format msgid "Message from %1$s on %2$s" -msgstr "" +msgstr "Wiadomość od użytkownika %1$s na %2$s" #: actions/showstream.php:154 msgid "Send a message" -msgstr "" +msgstr "Wyślij wiadomość" #: actions/smssettings.php:312 actions/smssettings.php:464 #, php-format msgid "Mobile carrier for your phone. " -msgstr "" +msgstr "Operator komórkowy Twojego telefonu. " #: actions/twitapidirect_messages.php:76 actions/twitapidirect_messages.php:68 +#: actions/twitapidirect_messages.php:67 #, php-format msgid "Direct messages to %s" -msgstr "" +msgstr "Bezpośrednia wiadomość do użytkownika %s" #: actions/twitapidirect_messages.php:77 actions/twitapidirect_messages.php:69 +#: actions/twitapidirect_messages.php:68 #, php-format msgid "All the direct messages sent to %s" -msgstr "" +msgstr "Wszystkie bezpośrednie wiadomości wysłane do użytkownika %s" #: actions/twitapidirect_messages.php:81 actions/twitapidirect_messages.php:73 +#: actions/twitapidirect_messages.php:72 msgid "Direct Messages You've Sent" -msgstr "" +msgstr "Wysłane bezpośrednie wiadomości" #: actions/twitapidirect_messages.php:82 actions/twitapidirect_messages.php:74 +#: actions/twitapidirect_messages.php:73 #, php-format msgid "All the direct messages sent from %s" -msgstr "" +msgstr "Wszystkie bezpośrednie wiadomości wysłane od użytkownika %s" #: actions/twitapidirect_messages.php:128 #: actions/twitapidirect_messages.php:137 +#: actions/twitapidirect_messages.php:146 msgid "No message text!" -msgstr "" +msgstr "Brak tekstu wiadomości!" #: actions/twitapidirect_messages.php:138 #: actions/twitapidirect_messages.php:150 +#: actions/twitapidirect_messages.php:159 msgid "Recipient user not found." -msgstr "" +msgstr "Nie znaleziono odbiorcy." #: actions/twitapidirect_messages.php:141 #: actions/twitapidirect_messages.php:153 +#: actions/twitapidirect_messages.php:162 msgid "Can't send direct messages to users who aren't your friend." msgstr "" +"Nie można wysłać bezpośredniej wiadomości do użytkowników, którzy nie są " +"Twoimi przyjaciółmi." #: actions/twitapifavorites.php:92 actions/twitapifavorites.php:66 +#: actions/twitapifavorites.php:64 #, php-format msgid "%s / Favorites from %s" -msgstr "" +msgstr "%s/ulubione wpisy od %s" #: actions/twitapifavorites.php:95 actions/twitapifavorites.php:69 +#: actions/twitapifavorites.php:68 #, php-format msgid "%s updates favorited by %s / %s." -msgstr "" +msgstr "Użytkownik %s aktualizuje ulubione według %s/%s." #: actions/twitapifavorites.php:187 lib/mail.php:275 #: actions/twitapifavorites.php:164 lib/mail.php:553 +#: actions/twitapifavorites.php:170 lib/mail.php:554 #, php-format msgid "%s added your notice as a favorite" -msgstr "" +msgstr "Użytkownik %s dodał Twój wpis jako ulubiony" #: actions/twitapifavorites.php:188 lib/mail.php:276 #: actions/twitapifavorites.php:165 @@ -3080,230 +3285,251 @@ msgid "" "%1$s just added your notice from %2$s as one of their favorites.\n" "\n" msgstr "" +"Użytkownik %1$s właśnie dodał Twój wpis od %2$s jako jeden z jego " +"ulubionych.\n" +"\n" #: actions/twittersettings.php:27 msgid "" "Add your Twitter account to automatically send your notices to Twitter, " msgstr "" +"Dodaj swoje konto Twittera, aby automatycznie wysyłać wpisy na Twittera, " #: actions/twittersettings.php:41 actions/twittersettings.php:60 +#: actions/twittersettings.php:61 msgid "Twitter settings" -msgstr "" +msgstr "Ustawienia Twittera" #: actions/twittersettings.php:48 actions/twittersettings.php:105 +#: actions/twittersettings.php:106 msgid "Twitter Account" -msgstr "" +msgstr "Konto Twittera" #: actions/twittersettings.php:56 actions/twittersettings.php:113 +#: actions/twittersettings.php:114 msgid "Current verified Twitter account." -msgstr "" +msgstr "Obecnie sprawdzone konto Twittera." #: actions/twittersettings.php:63 msgid "Twitter Username" -msgstr "" +msgstr "Nazwa użytkownika Twitter" #: actions/twittersettings.php:65 actions/twittersettings.php:123 +#: actions/twittersettings.php:126 msgid "No spaces, please." -msgstr "" +msgstr "Bez spacji." #: actions/twittersettings.php:67 msgid "Twitter Password" -msgstr "" +msgstr "Hasło Twittera" #: actions/twittersettings.php:72 actions/twittersettings.php:139 +#: actions/twittersettings.php:142 msgid "Automatically send my notices to Twitter." -msgstr "" +msgstr "Automatycznie wyślij moje wpisy na Twittera." #: actions/twittersettings.php:75 actions/twittersettings.php:146 +#: actions/twittersettings.php:149 msgid "Send local \"@\" replies to Twitter." -msgstr "" +msgstr "Wyślij lokalne odpowiedzi \"@\" na Twittera." #: actions/twittersettings.php:78 actions/twittersettings.php:153 +#: actions/twittersettings.php:156 msgid "Subscribe to my Twitter friends here." -msgstr "" +msgstr "Zasubskrybuj tutaj moich przyjaciół z Twittera." -#: actions/twittersettings.php:122 +#: actions/twittersettings.php:122 actions/twittersettings.php:331 msgid "" "Username must have only numbers, upper- and lowercase letters, and " "underscore (_). 15 chars max." msgstr "" +"Nazwa użytkownika może zawierać tylko liczby, małe i wielkie litery oraz " +"podkreślnik (_). Maksymalnie 15 znaków." #: actions/twittersettings.php:128 actions/twittersettings.php:334 +#: actions/twittersettings.php:338 msgid "Could not verify your Twitter credentials!" -msgstr "" +msgstr "Nie można sprawdzić danych uwierzytelniających Twittera!" #: actions/twittersettings.php:137 #, php-format msgid "Unable to retrieve account information for \"%s\" from Twitter." -msgstr "" +msgstr "Nie można pobrać informacji o koncie \"%s\" z Twittera." #: actions/twittersettings.php:151 actions/twittersettings.php:170 #: actions/twittersettings.php:348 actions/twittersettings.php:368 +#: actions/twittersettings.php:352 actions/twittersettings.php:372 msgid "Unable to save your Twitter settings!" -msgstr "" +msgstr "Nie można zapisać ustawień Twittera!" #: actions/twittersettings.php:174 actions/twittersettings.php:376 +#: actions/twittersettings.php:380 msgid "Twitter settings saved." -msgstr "" +msgstr "Zapisano ustawienia Twittera." #: actions/twittersettings.php:192 actions/twittersettings.php:395 +#: actions/twittersettings.php:399 msgid "That is not your Twitter account." -msgstr "" +msgstr "To nie jest Twoje konto Twittera." #: actions/twittersettings.php:200 actions/twittersettings.php:208 -#: actions/twittersettings.php:403 +#: actions/twittersettings.php:403 actions/twittersettings.php:407 msgid "Couldn't remove Twitter user." -msgstr "" +msgstr "Nie można usunąć użytkownika Twittera." #: actions/twittersettings.php:212 actions/twittersettings.php:407 +#: actions/twittersettings.php:411 msgid "Twitter account removed." -msgstr "" +msgstr "Usunięto użytkownika Twittera." #: actions/twittersettings.php:225 actions/twittersettings.php:239 #: actions/twittersettings.php:428 actions/twittersettings.php:439 -#: actions/twittersettings.php:453 +#: actions/twittersettings.php:453 actions/twittersettings.php:432 +#: actions/twittersettings.php:443 actions/twittersettings.php:457 msgid "Couldn't save Twitter preferences." -msgstr "" +msgstr "Nie można zapisać preferencji Twittera." #: actions/twittersettings.php:245 actions/twittersettings.php:461 +#: actions/twittersettings.php:465 msgid "Twitter preferences saved." -msgstr "" +msgstr "Zapisano preferencje Twittera." #: actions/userauthorization.php:84 actions/userauthorization.php:86 msgid "Please check these details to make sure " -msgstr "" +msgstr "Sprawdź te szczegóły, aby upewnić się " #: actions/userauthorization.php:324 actions/userauthorization.php:340 msgid "The subscription has been authorized, but no " -msgstr "" +msgstr "Subskrypcja została upoważniona, ale nie " #: actions/userauthorization.php:334 actions/userauthorization.php:351 msgid "The subscription has been rejected, but no " -msgstr "" +msgstr "Subskrypcja została odrzucona, ale nie " #: classes/Channel.php:113 classes/Channel.php:132 classes/Channel.php:151 +#: lib/channel.php:138 lib/channel.php:158 msgid "Command results" -msgstr "" +msgstr "Wyniki polecenia" -#: classes/Channel.php:148 classes/Channel.php:204 +#: classes/Channel.php:148 classes/Channel.php:204 lib/channel.php:210 msgid "Command complete" -msgstr "" +msgstr "Zakończono polecenie" -#: classes/Channel.php:158 classes/Channel.php:215 +#: classes/Channel.php:158 classes/Channel.php:215 lib/channel.php:221 msgid "Command failed" -msgstr "" +msgstr "Polecenie nie powiodło się" -#: classes/Command.php:39 classes/Command.php:44 +#: classes/Command.php:39 classes/Command.php:44 lib/command.php:44 msgid "Sorry, this command is not yet implemented." -msgstr "" +msgstr "Przepraszamy, te polecenie nie zostało jeszcze zaimplementowane." #: classes/Command.php:96 classes/Command.php:113 #, php-format msgid "Subscriptions: %1$s\n" -msgstr "" +msgstr "Subskrypcje: %1$s\n" #: classes/Command.php:125 classes/Command.php:242 classes/Command.php:145 -#: classes/Command.php:276 +#: classes/Command.php:276 lib/command.php:145 lib/command.php:276 msgid "User has no last notice" -msgstr "" +msgstr "Użytkownik nie posiada ostatniego wpisu" -#: classes/Command.php:146 classes/Command.php:166 +#: classes/Command.php:146 classes/Command.php:166 lib/command.php:166 msgid "Notice marked as fave." -msgstr "" +msgstr "Zaznaczono wpis jako ulubiony." -#: classes/Command.php:166 classes/Command.php:189 +#: classes/Command.php:166 classes/Command.php:189 lib/command.php:189 #, php-format msgid "%1$s (%2$s)" -msgstr "" +msgstr "%1$s (%2$s)" -#: classes/Command.php:169 classes/Command.php:192 +#: classes/Command.php:169 classes/Command.php:192 lib/command.php:192 #, php-format msgid "Fullname: %s" -msgstr "" +msgstr "Imię i nazwisko: %s" -#: classes/Command.php:172 classes/Command.php:195 +#: classes/Command.php:172 classes/Command.php:195 lib/command.php:195 #, php-format msgid "Location: %s" -msgstr "" +msgstr "Położenie: %s" -#: classes/Command.php:175 classes/Command.php:198 +#: classes/Command.php:175 classes/Command.php:198 lib/command.php:198 #, php-format msgid "Homepage: %s" -msgstr "" +msgstr "Strona domowa: %s" -#: classes/Command.php:178 classes/Command.php:201 +#: classes/Command.php:178 classes/Command.php:201 lib/command.php:201 #, php-format msgid "About: %s" -msgstr "" +msgstr "O mnie: %s" -#: classes/Command.php:200 classes/Command.php:228 +#: classes/Command.php:200 classes/Command.php:228 lib/command.php:228 #, php-format msgid "Message too long - maximum is 140 characters, you sent %d" -msgstr "" +msgstr "Wiadomość jest za długa - maksymalnie 140 znaków, wysłano %d" -#: classes/Command.php:214 classes/Command.php:245 +#: classes/Command.php:214 classes/Command.php:245 lib/command.php:245 #, php-format msgid "Direct message to %s sent" -msgstr "" +msgstr "Wysłano bezpośrednią wiadomość do użytkownika %s" -#: classes/Command.php:216 classes/Command.php:247 +#: classes/Command.php:216 classes/Command.php:247 lib/command.php:247 msgid "Error sending direct message." -msgstr "" +msgstr "Błąd podczas wysyłania bezpośredniej wiadomości." -#: classes/Command.php:263 classes/Command.php:300 +#: classes/Command.php:263 classes/Command.php:300 lib/command.php:300 msgid "Specify the name of the user to subscribe to" -msgstr "" +msgstr "Podaj nazwę użytkownika do zasubskrybowania" -#: classes/Command.php:270 classes/Command.php:307 +#: classes/Command.php:270 classes/Command.php:307 lib/command.php:307 #, php-format msgid "Subscribed to %s" -msgstr "" +msgstr "Zasubskrybowano użytkownika %s" -#: classes/Command.php:288 classes/Command.php:328 +#: classes/Command.php:288 classes/Command.php:328 lib/command.php:328 msgid "Specify the name of the user to unsubscribe from" -msgstr "" +msgstr "Podaj nazwę użytkownika do usunięcia subskrypcji" -#: classes/Command.php:295 classes/Command.php:335 +#: classes/Command.php:295 classes/Command.php:335 lib/command.php:335 #, php-format msgid "Unsubscribed from %s" -msgstr "" +msgstr "Usunięto subskrypcję użytkownika %s" #: classes/Command.php:310 classes/Command.php:330 classes/Command.php:353 -#: classes/Command.php:376 +#: classes/Command.php:376 lib/command.php:353 lib/command.php:376 msgid "Command not yet implemented." -msgstr "" +msgstr "Nie zaimplementowano polecenia." -#: classes/Command.php:313 classes/Command.php:356 +#: classes/Command.php:313 classes/Command.php:356 lib/command.php:356 msgid "Notification off." -msgstr "" +msgstr "Wyłączono powiadomienia." -#: classes/Command.php:315 classes/Command.php:358 +#: classes/Command.php:315 classes/Command.php:358 lib/command.php:358 msgid "Can't turn off notification." -msgstr "" +msgstr "Nie można wyłączyć powiadomień." -#: classes/Command.php:333 classes/Command.php:379 +#: classes/Command.php:333 classes/Command.php:379 lib/command.php:379 msgid "Notification on." -msgstr "" +msgstr "Włączono powiadomienia." -#: classes/Command.php:335 classes/Command.php:381 +#: classes/Command.php:335 classes/Command.php:381 lib/command.php:381 msgid "Can't turn on notification." -msgstr "" +msgstr "Nie można włączyć powiadomień." #: classes/Command.php:344 classes/Command.php:392 msgid "Commands:\n" -msgstr "" +msgstr "Polecenia:\n" #: classes/Message.php:53 classes/Message.php:56 msgid "Could not insert message." -msgstr "" +msgstr "Nie można wprowadzić wiadomości." #: classes/Message.php:63 classes/Message.php:66 msgid "Could not update message with new URI." -msgstr "" +msgstr "Nie można zaktualizować wiadomości za pomocą nowego adresu URL." #: lib/gallery.php:46 msgid "User without matching profile in system." -msgstr "" +msgstr "Użytkownik bez odpowiadającego profilu w systemie." #: lib/mail.php:147 lib/mail.php:289 #, php-format @@ -3311,11 +3537,13 @@ msgid "" "You have a new posting address on %1$s.\n" "\n" msgstr "" +"Posiadasz nowy adres wysyłania na %1$s.\n" +"\n" -#: lib/mail.php:249 lib/mail.php:508 +#: lib/mail.php:249 lib/mail.php:508 lib/mail.php:509 #, php-format msgid "New private message from %s" -msgstr "" +msgstr "Nowa prywatna wiadomość od użytkownika %s" #: lib/mail.php:253 lib/mail.php:512 #, php-format @@ -3323,88 +3551,97 @@ msgid "" "%1$s (%2$s) sent you a private message:\n" "\n" msgstr "" +"Użytkownik %1$s (%2$s) wysłał Ci prywatną wiadomość:\n" +"\n" -#: lib/mailbox.php:43 lib/mailbox.php:89 +#: lib/mailbox.php:43 lib/mailbox.php:89 lib/mailbox.php:91 msgid "Only the user can read their own mailboxes." -msgstr "" +msgstr "Tylko użytkownik może czytać swoje skrzynki pocztowe." #: lib/openid.php:195 lib/openid.php:203 msgid "This form should automatically submit itself. " -msgstr "" +msgstr "Ten formularz powinien automatycznie się wysłać. " #: lib/personal.php:65 lib/personalgroupnav.php:113 msgid "Favorites" -msgstr "" +msgstr "Ulubione" #: lib/personal.php:66 lib/personalgroupnav.php:114 #, php-format msgid "%s's favorite notices" -msgstr "" +msgstr "Ulubione wpisy użytkownika %s" #: lib/personal.php:66 lib/personalgroupnav.php:114 msgid "User" -msgstr "" +msgstr "Użytkownik" #: lib/personal.php:75 lib/personalgroupnav.php:123 msgid "Inbox" -msgstr "" +msgstr "Odebrane" #: lib/personal.php:76 lib/personalgroupnav.php:124 msgid "Your incoming messages" -msgstr "" +msgstr "Wiadomości przychodzące" #: lib/personal.php:80 lib/personalgroupnav.php:128 msgid "Outbox" -msgstr "" +msgstr "Wysłane" #: lib/personal.php:81 lib/personalgroupnav.php:129 msgid "Your sent messages" -msgstr "" +msgstr "Wysłane wiadomości" #: lib/settingsaction.php:99 lib/connectsettingsaction.php:110 msgid "Twitter" -msgstr "" +msgstr "Twitter" #: lib/settingsaction.php:100 lib/connectsettingsaction.php:111 msgid "Twitter integration options" -msgstr "" +msgstr "Opcje integracji z Twitterem" #: lib/util.php:1718 lib/messageform.php:139 lib/noticelist.php:422 +#: lib/messageform.php:137 lib/noticelist.php:425 msgid "To" -msgstr "" +msgstr "Do" #: scripts/maildaemon.php:45 scripts/maildaemon.php:48 msgid "Could not parse message." -msgstr "" +msgstr "Nie można przeanalizować wiadomości." -#: actions/all.php:63 actions/facebookhome.php:162 -#, fuzzy, php-format +#: actions/all.php:63 actions/facebookhome.php:162 actions/all.php:66 +#: actions/facebookhome.php:161 +#, php-format msgid "%s and friends, page %d" -msgstr "%s i przyjaciele" +msgstr "Użytkownik %s i przyjaciele, strona %d" #: actions/avatarsettings.php:76 msgid "You can upload your personal avatar." -msgstr "" +msgstr "Można wysłać osobisty awatar." #: actions/avatarsettings.php:117 actions/avatarsettings.php:191 -#: actions/grouplogo.php:250 -#, fuzzy +#: actions/grouplogo.php:250 actions/avatarsettings.php:119 +#: actions/avatarsettings.php:194 actions/grouplogo.php:256 msgid "Avatar settings" -msgstr "Ustawienia" +msgstr "Ustawienia awatara" #: actions/avatarsettings.php:124 actions/avatarsettings.php:199 #: actions/grouplogo.php:198 actions/grouplogo.php:258 +#: actions/avatarsettings.php:126 actions/avatarsettings.php:202 +#: actions/grouplogo.php:204 actions/grouplogo.php:264 msgid "Original" -msgstr "" +msgstr "Oryginał" #: actions/avatarsettings.php:139 actions/avatarsettings.php:211 #: actions/grouplogo.php:209 actions/grouplogo.php:270 +#: actions/avatarsettings.php:141 actions/avatarsettings.php:214 +#: actions/grouplogo.php:215 actions/grouplogo.php:276 msgid "Preview" -msgstr "" +msgstr "Podgląd" #: actions/avatarsettings.php:225 actions/grouplogo.php:284 +#: actions/avatarsettings.php:228 actions/grouplogo.php:291 msgid "Crop" -msgstr "" +msgstr "Przytnij" #: actions/avatarsettings.php:248 actions/deletenotice.php:133 #: actions/emailsettings.php:224 actions/grouplogo.php:307 @@ -3416,594 +3653,567 @@ msgstr "" #: actions/subedit.php:38 actions/twittersettings.php:290 #: actions/userauthorization.php:39 msgid "There was a problem with your session token. " -msgstr "" +msgstr "Wystąpił problem z tokenem sesji. " #: actions/avatarsettings.php:303 actions/grouplogo.php:360 +#: actions/avatarsettings.php:308 msgid "Pick a square area of the image to be your avatar" -msgstr "" +msgstr "Wybierz kwadratowy obszar obrazu do awatara" #: actions/avatarsettings.php:327 actions/grouplogo.php:384 +#: actions/avatarsettings.php:323 actions/grouplogo.php:382 msgid "Lost our file data." -msgstr "" +msgstr "Utracono dane pliku." #: actions/avatarsettings.php:334 actions/grouplogo.php:391 -#: classes/User_group.php:112 -#, fuzzy +#: classes/User_group.php:112 lib/imagefile.php:112 msgid "Lost our file." -msgstr "Brak takiego wpisu." +msgstr "Utracono plik." #: actions/avatarsettings.php:349 actions/avatarsettings.php:383 #: actions/grouplogo.php:406 actions/grouplogo.php:440 -#: classes/User_group.php:129 classes/User_group.php:161 +#: classes/User_group.php:129 classes/User_group.php:161 lib/imagefile.php:144 +#: lib/imagefile.php:191 msgid "Unknown file type" -msgstr "" +msgstr "Nieznany typ pliku" #: actions/block.php:69 actions/subedit.php:46 actions/unblock.php:70 msgid "No profile specified." -msgstr "" +msgstr "Nie podano profilu." #: actions/block.php:74 actions/subedit.php:53 actions/tagother.php:46 #: actions/unblock.php:75 msgid "No profile with that ID." -msgstr "" +msgstr "Brak profilu o tym identyfikatorze." #: actions/block.php:111 -#, fuzzy msgid "Block user" -msgstr "Brak takiego użytkownika." +msgstr "Zablokuj użytkownika" #: actions/block.php:129 msgid "Are you sure you want to block this user? " -msgstr "" +msgstr "Na pewno chcesz zablokować tego użytkownika? " #: actions/block.php:162 -#, fuzzy msgid "You have already blocked this user." -msgstr "Nie musisz ponownie się logować!" +msgstr "Ten użytkownik został już zablokowany." #: actions/block.php:167 msgid "Failed to save block information." -msgstr "" +msgstr "Zapisanie informacji o blokadzie nie powiodło się." #: actions/confirmaddress.php:159 -#, fuzzy, php-format +#, php-format msgid "The address \"%s\" has been " -msgstr "Adres został usunięty." +msgstr "Adres \"%s\" został " #: actions/deletenotice.php:73 msgid "You are about to permanently delete a notice. " -msgstr "" +msgstr "Za chwilę wpis zostanie trwale usunięty. " #: actions/disfavor.php:94 msgid "Add to favorites" -msgstr "" +msgstr "Dodaj do ulubionych" #: actions/editgroup.php:54 #, php-format msgid "Edit %s group" -msgstr "" +msgstr "Edytuj grupę %s" #: actions/editgroup.php:66 actions/groupbyid.php:72 actions/grouplogo.php:66 #: actions/joingroup.php:60 actions/newgroup.php:65 actions/showgroup.php:100 +#: actions/grouplogo.php:70 actions/grouprss.php:80 msgid "Inboxes must be enabled for groups to work" -msgstr "" +msgstr "Skrzynki odbiorcze grup muszą być włączone, aby działały" #: actions/editgroup.php:71 actions/grouplogo.php:71 actions/newgroup.php:70 +#: actions/grouplogo.php:75 msgid "You must be logged in to create a group." -msgstr "" +msgstr "Musisz być zalogowany, aby utworzyć grupę." #: actions/editgroup.php:87 actions/grouplogo.php:87 #: actions/groupmembers.php:76 actions/joingroup.php:81 -#: actions/showgroup.php:121 -#, fuzzy +#: actions/showgroup.php:121 actions/grouplogo.php:91 actions/grouprss.php:96 msgid "No nickname" -msgstr "Brak pseudonimu." +msgstr "Brak pseudonimu" #: actions/editgroup.php:99 actions/groupbyid.php:88 actions/grouplogo.php:100 #: actions/groupmembers.php:83 actions/joingroup.php:88 -#: actions/showgroup.php:128 -#, fuzzy +#: actions/showgroup.php:128 actions/grouplogo.php:104 +#: actions/grouprss.php:103 msgid "No such group" -msgstr "Brak takiego wpisu." +msgstr "Nie ma takiej grupy" #: actions/editgroup.php:106 actions/editgroup.php:165 -#: actions/grouplogo.php:107 +#: actions/grouplogo.php:107 actions/grouplogo.php:111 msgid "You must be an admin to edit the group" -msgstr "" +msgstr "Musisz być administratorem, aby zmodyfikować grupę" #: actions/editgroup.php:157 msgid "Use this form to edit the group." -msgstr "" +msgstr "Użyj tego formularza, aby zmodyfikować grupę." #: actions/editgroup.php:179 actions/newgroup.php:130 actions/register.php:156 -#, fuzzy msgid "Nickname must have only lowercase letters " -msgstr "Pseudonim musi zawierać tylko małe litery i cyfry, bez znaków spacji." +msgstr "Pseudonim może zawierać tylko małe litery " #: actions/editgroup.php:198 actions/newgroup.php:149 -#, fuzzy msgid "description is too long (max 140 chars)." -msgstr "Wpis \"O mnie\" jest za długi (maks. 140 znaków)" +msgstr "opis jest za długi (maksymalnie 140 znaków)." #: actions/editgroup.php:218 -#, fuzzy msgid "Could not update group." -msgstr "Nie można zaktualizować użytkownika." +msgstr "Nie można zaktualizować grupy." #: actions/editgroup.php:226 -#, fuzzy msgid "Options saved." -msgstr "Ustawienia zostały zapisane." +msgstr "Zapisano opcje." #: actions/emailsettings.php:107 actions/imsettings.php:108 -#, fuzzy, php-format +#, php-format msgid "Awaiting confirmation on this address. " -msgstr "Błąd kodu potwierdzającego." +msgstr "Oczekiwanie na potwierdzenie tego adresu. " #: actions/emailsettings.php:139 actions/smssettings.php:150 msgid "Make a new email address for posting to; " -msgstr "" +msgstr "Utwórz nowy adres e-mail do wysyłania; " #: actions/emailsettings.php:157 msgid "Send me email when someone " -msgstr "" +msgstr "Wyślij mi wiadomość e-mail, kiedy ktoś " -#: actions/emailsettings.php:168 +#: actions/emailsettings.php:168 actions/emailsettings.php:173 msgid "Allow friends to nudge me and send me an email." -msgstr "" +msgstr "Pozwól przyjaciołom na szturchanie mnie i wyślij mi wiadomość e-mail." #: actions/emailsettings.php:321 -#, fuzzy msgid "That email address already belongs " -msgstr "Taki e-mail już istnieje" +msgstr "Ten adres e-mail już należy " #: actions/emailsettings.php:343 -#, fuzzy msgid "A confirmation code was sent to the email address you added. " -msgstr "" -"Na Twój adres komunikatora został wysłany kod potwierdzający. Musisz " -"zaakceptować otrzymywanie wiadomości od %s." +msgstr "Kod potwierdzający został wysłany na dodany adres e-mail. " #: actions/facebookhome.php:110 msgid "Server error - couldn't get user!" -msgstr "" +msgstr "Błąd serwera - nie można uzyskać użytkownika!" #: actions/facebookhome.php:196 #, php-format msgid "If you would like the %s app to automatically update " -msgstr "" +msgstr "Jeśli chcesz, aby aplikacja %s automatycznie aktualizowała " #: actions/facebookhome.php:213 actions/facebooksettings.php:137 #, php-format msgid "Allow %s to update my Facebook status" -msgstr "" +msgstr "Pozwól %s na aktualizowanie mojego statusu na Facebook" -#: actions/facebookhome.php:218 +#: actions/facebookhome.php:218 actions/facebookhome.php:223 msgid "Skip" -msgstr "" +msgstr "Pomiń" -#: actions/facebookhome.php:235 -#, fuzzy +#: actions/facebookhome.php:235 lib/facebookaction.php:479 msgid "No notice content!" -msgstr "Brak zawartości!" +msgstr "Brak zawartości wpisu!" #: actions/facebookhome.php:295 lib/action.php:870 lib/facebookaction.php:399 +#: actions/facebookhome.php:253 lib/action.php:973 lib/facebookaction.php:433 msgid "Pagination" -msgstr "" +msgstr "Paginacja" #: actions/facebookhome.php:304 lib/action.php:879 lib/facebookaction.php:408 -#, fuzzy +#: actions/facebookhome.php:262 lib/action.php:982 lib/facebookaction.php:442 msgid "After" -msgstr "« następne" +msgstr "Następne" #: actions/facebookhome.php:312 lib/action.php:887 lib/facebookaction.php:416 -#, fuzzy +#: actions/facebookhome.php:270 lib/action.php:990 lib/facebookaction.php:450 msgid "Before" -msgstr "Wcześniej »" +msgstr "Wcześniej" #: actions/facebookinvite.php:70 #, php-format msgid "Thanks for inviting your friends to use %s" -msgstr "" +msgstr "Dziękujemy za zaproszenie przyjaciół do używania %s" #: actions/facebookinvite.php:72 msgid "Invitations have been sent to the following users:" -msgstr "" +msgstr "Zaproszenia zostały wysłane do następujących użytkowników:" -#: actions/facebookinvite.php:96 +#: actions/facebookinvite.php:96 actions/facebookinvite.php:102 #, php-format msgid "You have been invited to %s" -msgstr "" +msgstr "Zostałeś zaproszony do %s" -#: actions/facebookinvite.php:105 -#, fuzzy, php-format +#: actions/facebookinvite.php:105 actions/facebookinvite.php:111 +#, php-format msgid "Invite your friends to use %s" -msgstr "Kanał dla znajomych użytkownika %s" +msgstr "Zaproś przyjaciół do używania %s" -#: actions/facebookinvite.php:113 +#: actions/facebookinvite.php:113 actions/facebookinvite.php:126 #, php-format msgid "Friends already using %s:" -msgstr "" +msgstr "Przyjaciele już używający %s:" -#: actions/facebookinvite.php:130 +#: actions/facebookinvite.php:130 actions/facebookinvite.php:143 #, php-format msgid "Send invitations" -msgstr "" +msgstr "Wyślij zaproszenia" #: actions/facebookremove.php:56 -#, fuzzy msgid "Couldn't remove Facebook user." -msgstr "Nie można zaktualizować użytkownika." +msgstr "Nie można usunąć użytkownika Facebook." #: actions/facebooksettings.php:65 msgid "There was a problem saving your sync preferences!" -msgstr "" +msgstr "Wystąpił problem podczas zapisywania preferencji synchronizacji!" #: actions/facebooksettings.php:67 -#, fuzzy msgid "Sync preferences saved." -msgstr "Preferencje zostały zapisane." +msgstr "Zapisano preferencje synchronizacji." #: actions/facebooksettings.php:90 msgid "Automatically update my Facebook status with my notices." -msgstr "" +msgstr "Automatycznie aktualizuj status na Facebook moimi wpisami." #: actions/facebooksettings.php:97 msgid "Send \"@\" replies to Facebook." -msgstr "" +msgstr "Wyślij odpowiedzi \"@\" do Facebook." #: actions/facebooksettings.php:106 -#, fuzzy msgid "Prefix" -msgstr "Profil" +msgstr "Przedrostek" #: actions/facebooksettings.php:108 msgid "A string to prefix notices with." -msgstr "" +msgstr "Tekst do poprzedzenia wpisów." #: actions/facebooksettings.php:124 #, php-format msgid "If you would like %s to automatically update " -msgstr "" +msgstr "Jeśli chcesz, aby %s automatycznie aktualizowało " #: actions/facebooksettings.php:147 -#, fuzzy msgid "Sync preferences" -msgstr "Preferencje" +msgstr "Zsynchronizuj preferencje" #: actions/favor.php:94 lib/disfavorform.php:140 msgid "Disfavor favorite" -msgstr "" +msgstr "Usuń wpis z ulubionych" #: actions/favorited.php:65 lib/popularnoticesection.php:76 -#: lib/publicgroupnav.php:91 -#, fuzzy +#: lib/publicgroupnav.php:91 lib/popularnoticesection.php:82 +#: lib/publicgroupnav.php:93 msgid "Popular notices" -msgstr "Brak takiego wpisu." +msgstr "Popularne wpisy" #: actions/favorited.php:67 -#, fuzzy, php-format +#, php-format msgid "Popular notices, page %d" -msgstr "Brak takiego wpisu." +msgstr "Popularne wpisy, strona %d" #: actions/favorited.php:79 msgid "The most popular notices on the site right now." -msgstr "" +msgstr "Najpopularniejsze wpisy na stronie w te chwili." #: actions/featured.php:69 lib/featureduserssection.php:82 -#: lib/publicgroupnav.php:87 +#: lib/publicgroupnav.php:87 lib/publicgroupnav.php:89 msgid "Featured users" -msgstr "" +msgstr "Znani użytkownicy" #: actions/featured.php:71 #, php-format msgid "Featured users, page %d" -msgstr "" +msgstr "Znani użytkownicy, strona %d" #: actions/featured.php:99 #, php-format msgid "A selection of some of the great users on %s" -msgstr "" +msgstr "Wybór znanych użytkowników na %s" #: actions/finishremotesubscribe.php:188 msgid "That user has blocked you from subscribing." -msgstr "" +msgstr "Ten użytkownik zablokował Cię z subskrypcji." #: actions/groupbyid.php:79 msgid "No ID" -msgstr "" +msgstr "Brak identyfikatora" #: actions/grouplogo.php:138 actions/grouplogo.php:191 +#: actions/grouplogo.php:144 actions/grouplogo.php:197 msgid "Group logo" -msgstr "" +msgstr "Logo grupy" #: actions/grouplogo.php:149 msgid "You can upload a logo image for your group." -msgstr "" +msgstr "Można wysłać obraz logo dla grupy." -#: actions/grouplogo.php:448 -#, fuzzy +#: actions/grouplogo.php:448 actions/grouplogo.php:401 msgid "Logo updated." -msgstr "Awatar załadowany." +msgstr "Zaktualizowano logo." -#: actions/grouplogo.php:450 -#, fuzzy +#: actions/grouplogo.php:450 actions/grouplogo.php:403 msgid "Failed updating logo." -msgstr "Uaktualnianie awatara nie powiodło się." +msgstr "Zaktualizowanie logo nie powiodło się." #: actions/groupmembers.php:93 lib/groupnav.php:91 #, php-format msgid "%s group members" -msgstr "" +msgstr "Członkowie grupy %s" #: actions/groupmembers.php:96 #, php-format msgid "%s group members, page %d" -msgstr "" +msgstr "Członkowie grupy %s, strona %d" #: actions/groupmembers.php:111 msgid "A list of the users in this group." -msgstr "" +msgstr "Lista użytkowników znajdujących się w tej grupie." #: actions/groups.php:62 actions/showstream.php:518 lib/publicgroupnav.php:79 -#: lib/subgroupnav.php:96 +#: lib/subgroupnav.php:96 lib/publicgroupnav.php:81 msgid "Groups" -msgstr "" +msgstr "Grupy" #: actions/groups.php:64 #, php-format msgid "Groups, page %d" -msgstr "" +msgstr "Grupy, strona %d" #: actions/groups.php:90 #, php-format msgid "%%%%site.name%%%% groups let you find and talk with " -msgstr "" +msgstr "Grupy %%%%site.name%%%% pozwalają na szukanie i rozmawianie z " #: actions/groups.php:106 actions/usergroups.php:124 lib/groupeditform.php:123 -#, fuzzy +#: actions/usergroups.php:125 msgid "Create a new group" -msgstr "Załóż nowe konto" +msgstr "Utwórz nową grupę" #: actions/groupsearch.php:57 -#, fuzzy, php-format +#, php-format msgid "" "Search for groups on %%site.name%% by their name, location, or description. " -msgstr "" -"Szukaj ludzi w serwisie %%site.name%%. Kryteriami mogą być imiona i " -"nazwiska, miejscowości lub zainteresowania. Użyj spacji aby oddzielić " -"elementy wyszukiwania. Słowa muszą mieć minimum 3 znaki." +msgstr "Znajdź grupy na %%site.name%% według ich nazw, położenia lub opisu. " #: actions/groupsearch.php:63 -#, fuzzy msgid "Group search" -msgstr "Szukaj ludzi" +msgstr "Znajdź grupę" #: actions/imsettings.php:70 msgid "You can send and receive notices through " -msgstr "" +msgstr "Można wysyłać i otrzymywać wpisy przez " #: actions/imsettings.php:120 #, php-format msgid "Jabber or GTalk address, " -msgstr "" +msgstr "adres Jabbera lub GTalk, " #: actions/imsettings.php:147 -#, fuzzy msgid "Send me replies through Jabber/GTalk " -msgstr "Wysyłaj mi wpisy przez Jabbera/GTalka" +msgstr "Wyślij mi odpowiedzi przez Jabbera/GTalk " #: actions/imsettings.php:321 -#, fuzzy, php-format +#, php-format msgid "A confirmation code was sent " -msgstr "Brak kodu potwierdzającego." +msgstr "Kod potwierdzający został wysłany " #: actions/joingroup.php:65 msgid "You must be logged in to join a group." -msgstr "" +msgstr "Musisz być zalogowany, aby dołączyć do grupy." #: actions/joingroup.php:95 -#, fuzzy msgid "You are already a member of that group" -msgstr "Nie musisz ponownie się logować!" +msgstr "Jesteś już członkiem tej grupy" #: actions/joingroup.php:128 -#, fuzzy, php-format +#, php-format msgid "Could not join user %s to group %s" -msgstr "Nie można przekierować do serwera: %s" +msgstr "Nie można dołączyć użytkownika %s do grupy %s" #: actions/joingroup.php:135 #, php-format msgid "%s joined group %s" -msgstr "" +msgstr "Użytkownik %s dołączył do grupy %s" #: actions/leavegroup.php:60 msgid "Inboxes must be enabled for groups to work." -msgstr "" +msgstr "Skrzynki odbiorcze dla grup muszą być włączone, aby działały." #: actions/leavegroup.php:65 msgid "You must be logged in to leave a group." -msgstr "" +msgstr "Musisz być zalogowany, aby opuścić grupę." #: actions/leavegroup.php:88 -#, fuzzy msgid "No such group." -msgstr "Brak takiego wpisu." +msgstr "Nie ma takiej grupy." #: actions/leavegroup.php:95 -#, fuzzy msgid "You are not a member of that group." -msgstr "Ten profil nie był wysłany przez Ciebie" +msgstr "Nie jesteś członkiem tej grupy." #: actions/leavegroup.php:100 msgid "You may not leave a group while you are its administrator." -msgstr "" +msgstr "Nie możesz opuścić grupy, kiedy jesteś jej administratorem." -#: actions/leavegroup.php:130 +#: actions/leavegroup.php:130 actions/leavegroup.php:124 msgid "Could not find membership record." -msgstr "" +msgstr "Nie można znaleźć wpisu członkostwa." -#: actions/leavegroup.php:138 -#, fuzzy, php-format +#: actions/leavegroup.php:138 actions/leavegroup.php:132 +#, php-format msgid "Could not remove user %s to group %s" -msgstr "Nie można utworzyć formularza OpenID: %s" +msgstr "Nie można usunąć użytkownika %s z grupy %s" -#: actions/leavegroup.php:145 +#: actions/leavegroup.php:145 actions/leavegroup.php:139 #, php-format msgid "%s left group %s" -msgstr "" +msgstr "Użytkownik %s opuścił grupę %s" -#: actions/login.php:225 lib/facebookaction.php:304 +#: actions/login.php:225 lib/facebookaction.php:304 actions/login.php:208 msgid "Login to site" -msgstr "" +msgstr "Zaloguj się na stronie" #: actions/microsummary.php:69 msgid "No current status" -msgstr "" +msgstr "Brak obecnego statusu" #: actions/newgroup.php:53 msgid "New group" -msgstr "" +msgstr "Nowa grupa" #: actions/newgroup.php:115 msgid "Use this form to create a new group." -msgstr "" +msgstr "Użyj tego formularza, aby utworzyć nową grupę." #: actions/newgroup.php:177 -#, fuzzy msgid "Could not create group." -msgstr "Nie można zapisać informacji o awatarze" +msgstr "Nie można utworzyć grupy." #: actions/newgroup.php:191 -#, fuzzy msgid "Could not set group membership." -msgstr "Nie można obserwować." +msgstr "Nie można ustawić członkostwa w grupie." #: actions/newmessage.php:119 actions/newnotice.php:132 -#, fuzzy msgid "That's too long. " -msgstr "Ten plik jest za duży." +msgstr "Wiadomość jest za długa. " #: actions/newmessage.php:134 msgid "Don't send a message to yourself; " -msgstr "" +msgstr "Nie wysyłaj wiadomości do siebie; " -#: actions/newnotice.php:166 -#, fuzzy +#: actions/newnotice.php:166 actions/newnotice.php:174 msgid "Notice posted" -msgstr "Wpisy" +msgstr "Wysłano wpis" -#: actions/newnotice.php:200 classes/Channel.php:163 +#: actions/newnotice.php:200 classes/Channel.php:163 actions/newnotice.php:208 +#: lib/channel.php:170 msgid "Ajax Error" -msgstr "" +msgstr "Błąd AJAX" #: actions/nudge.php:85 msgid "" "This user doesn't allow nudges or hasn't confirmed or set his email yet." msgstr "" +"Ten użytkownik nie pozwala na szturchnięcia lub nie potwierdził lub nie " +"ustawił jeszcze swojego adresu e-mail." #: actions/nudge.php:94 msgid "Nudge sent" -msgstr "" +msgstr "Wysłano szturchnięcie" #: actions/nudge.php:97 msgid "Nudge sent!" -msgstr "" +msgstr "Wysłano szturchnięcie!" -#: actions/openidlogin.php:97 -#, fuzzy +#: actions/openidlogin.php:97 actions/openidlogin.php:106 msgid "OpenID login" -msgstr "Użytkownik OpenID" +msgstr "Login OpenID" #: actions/openidsettings.php:128 -#, fuzzy msgid "Removing your only OpenID " -msgstr "Usuń konto OpenID" +msgstr "Usuwanie jedynego identyfikatora OpenID " #: actions/othersettings.php:60 -#, fuzzy msgid "Other Settings" -msgstr "Ustawienia" +msgstr "Inne ustawienia" #: actions/othersettings.php:71 msgid "Manage various other options." -msgstr "" +msgstr "Zarządzaj różnymi innymi opcjami." #: actions/othersettings.php:93 msgid "URL Auto-shortening" -msgstr "" +msgstr "Automatyczne skracanie adresów URL" #: actions/othersettings.php:112 -#, fuzzy msgid "Service" -msgstr "Szukaj" +msgstr "Usługa" #: actions/othersettings.php:113 msgid "Automatic shortening service to use." -msgstr "" +msgstr "Używana automatyczna usługa skracania." #: actions/othersettings.php:144 -#, fuzzy msgid "URL shortening service is too long (max 50 chars)." -msgstr "Lokalizacja jest za długa (max. 255 znaków)." +msgstr "Adres URL usługi skracania jest za długi (maksymalnie 50 znaków)." #: actions/passwordsettings.php:69 -#, fuzzy msgid "Change your password." -msgstr "Zmień hasło" +msgstr "Zmień hasło." #: actions/passwordsettings.php:89 -#, fuzzy msgid "Password change" -msgstr "Hasło zostało zapisane." +msgstr "Zmiana hasła" -#: actions/peopletag.php:35 -#, fuzzy, php-format +#: actions/peopletag.php:35 actions/peopletag.php:70 +#, php-format msgid "Not a valid people tag: %s" -msgstr "Niewłaściwy adres e-mailowy." +msgstr "Nieprawidłowy znacznik osób: %s" -#: actions/peopletag.php:47 +#: actions/peopletag.php:47 actions/peopletag.php:144 #, php-format msgid "Users self-tagged with %s - page %d" -msgstr "" +msgstr "Użytkownicy używający znacznika %s - strona %d" #: actions/peopletag.php:91 #, php-format msgid "These are users who have tagged themselves \"%s\" " -msgstr "" +msgstr "To są użytkownicy którzy nadali sobie znacznik \"%s\" " #: actions/profilesettings.php:91 -#, fuzzy msgid "Profile information" -msgstr "Nieznany profil" +msgstr "Informacje o profilu" #: actions/profilesettings.php:124 msgid "" "Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated" msgstr "" +"Znaczniki dla siebie (litery, liczby, -, . i _), oddzielone przecinkami lub " +"spacjami" #: actions/profilesettings.php:144 msgid "Automatically subscribe to whoever " -msgstr "" +msgstr "Automatycznie zasubskrybuj do każdego " #: actions/profilesettings.php:229 actions/tagother.php:176 -#, fuzzy, php-format +#: actions/tagother.php:178 +#, php-format msgid "Invalid tag: \"%s\"" -msgstr "Błędna strona domowa '%s'" +msgstr "Nieprawidłowy znacznik: \"%s\"" #: actions/profilesettings.php:311 -#, fuzzy msgid "Couldn't save tags." -msgstr "Nie można zapisać profilu." +msgstr "Nie można zapisać znaczników." -#: actions/public.php:107 -#, fuzzy, php-format +#: actions/public.php:107 actions/public.php:110 +#, php-format msgid "Public timeline, page %d" -msgstr "Publiczna oś czasu" +msgstr "Publiczna oś czasu, strona %d" -#: actions/public.php:173 +#: actions/public.php:173 actions/public.php:184 msgid "Could not retrieve public stream." -msgstr "" +msgstr "Nie można pobrać publicznego strumienia." #: actions/public.php:220 #, php-format @@ -4011,139 +4221,132 @@ msgid "" "This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" "blogging) service " msgstr "" +"To jest %%site.name%%, usługa [mikroblogowania](http://en.wikipedia.org/wiki/" +"Micro-blogging) " #: actions/publictagcloud.php:57 -#, fuzzy msgid "Public tag cloud" -msgstr "Publiczny Kanał Strumieni" +msgstr "Publiczna chmura znaczników" #: actions/publictagcloud.php:63 #, php-format msgid "These are most popular recent tags on %s " -msgstr "" +msgstr "To są najpopularniejsze ostatnie znaczniki na %s " #: actions/publictagcloud.php:119 msgid "Tag cloud" -msgstr "" +msgstr "Chmura znaczników" #: actions/register.php:139 actions/register.php:349 msgid "Sorry, only invited people can register." -msgstr "" +msgstr "Przepraszamy, tylko zaproszone osoby mogą się rejestrować." #: actions/register.php:149 -#, fuzzy msgid "You can't register if you don't " -msgstr "" -"Nie możesz się zarejestrować, jeśli nie zgadzasz się z warunkami licencji." +msgstr "Nie możesz się zarejestrować, jeśli nie " #: actions/register.php:286 msgid "With this form you can create " -msgstr "" +msgstr "Za pomocą tego formularza można utworzyć " #: actions/register.php:368 -#, fuzzy msgid "1-64 lowercase letters or numbers, " -msgstr "Max. 64 znaki alfanumeryczne, bez spacji i znaków przestankowych" +msgstr "1-64 małe litery lub liczby, " #: actions/register.php:382 actions/register.php:386 -#, fuzzy msgid "Used only for updates, announcements, " -msgstr "Używane tylko do aktualizacji, ogłoszeń i przywracania hasła" +msgstr "Używane tylko do aktualizacji, ogłoszeń, " #: actions/register.php:398 -#, fuzzy msgid "URL of your homepage, blog, " -msgstr "URL Twojej strony domowej, bloga, lub profilu na innej stronie" +msgstr "Adres URL strony domowej, bloga, " #: actions/register.php:404 -#, fuzzy msgid "Describe yourself and your " -msgstr "Opisz się w 140 znakach" +msgstr "Opisz się i swoje " #: actions/register.php:410 -#, fuzzy msgid "Where you are, like \"City, " -msgstr "Gdzie jesteś? (np. \"miasto, region, kraj\")" +msgstr "Gdzie jesteś, np. \"miasto, " #: actions/register.php:432 -#, fuzzy msgid " except this private data: password, " -msgstr "" -"z wyłączeniem tych prywatnych danych: e-maila, identyfikatora IM, numeru " -"telefonu." +msgstr " poza tymi prywatnymi danymi: hasło, " #: actions/register.php:471 #, php-format msgid "Congratulations, %s! And welcome to %%%%site.name%%%%. " -msgstr "" +msgstr "Gratulacje, %s! Witaj na %%%%site.name%%%%. " #: actions/register.php:495 msgid "(You should receive a message by email " -msgstr "" +msgstr "(Powinieneś otrzymać wiadomość przez e-mail " #: actions/remotesubscribe.php:166 actions/remotesubscribe.php:171 msgid "That's a local profile! Login to subscribe." -msgstr "" +msgstr "To jest profil lokalny! Zaloguj się, aby zasubskrybować." -#: actions/replies.php:118 -#, fuzzy, php-format +#: actions/replies.php:118 actions/replies.php:120 +#, php-format msgid "Replies to %s, page %d" -msgstr "Odpowiedzi na %s" +msgstr "Odpowiedzi na %s, strona %d" #: actions/showfavorites.php:79 #, php-format msgid "%s favorite notices, page %d" -msgstr "" +msgstr "Ulubione wpisy użytkownika %s, strona %d" #: actions/showgroup.php:77 lib/groupnav.php:85 #, php-format msgid "%s group" -msgstr "" +msgstr "Grupa %s" #: actions/showgroup.php:79 #, php-format msgid "%s group, page %d" -msgstr "" +msgstr "Grupa %s, strona %d" -#: actions/showgroup.php:206 -#, fuzzy +#: actions/showgroup.php:206 actions/showgroup.php:208 msgid "Group profile" -msgstr "Brak takiego wpisu." +msgstr "Profil grupy" #: actions/showgroup.php:251 actions/showstream.php:278 #: actions/tagother.php:119 lib/grouplist.php:134 lib/profilelist.php:133 +#: actions/showgroup.php:253 actions/showstream.php:271 +#: actions/tagother.php:118 lib/profilelist.php:131 msgid "URL" -msgstr "" +msgstr "Adres URL" #: actions/showgroup.php:262 actions/showstream.php:289 #: actions/tagother.php:129 lib/grouplist.php:145 lib/profilelist.php:144 -#, fuzzy +#: actions/showgroup.php:264 actions/showstream.php:282 +#: actions/tagother.php:128 lib/profilelist.php:142 msgid "Note" -msgstr "Wpisy" +msgstr "Wpis" -#: actions/showgroup.php:270 +#: actions/showgroup.php:270 actions/showgroup.php:272 msgid "Group actions" -msgstr "" +msgstr "Działania grupy" -#: actions/showgroup.php:323 -#, fuzzy, php-format +#: actions/showgroup.php:323 actions/showgroup.php:304 +#, php-format msgid "Notice feed for %s group" -msgstr "Kanał wpisów dla %s" +msgstr "Kanał wpisów dla grupy %s" -#: actions/showgroup.php:357 lib/groupnav.php:90 -#, fuzzy +#: actions/showgroup.php:357 lib/groupnav.php:90 actions/showgroup.php:339 +#: actions/showgroup.php:384 msgid "Members" -msgstr "W serwisie od" +msgstr "Członkowie" #: actions/showgroup.php:363 actions/showstream.php:413 #: actions/showstream.php:442 actions/showstream.php:524 lib/section.php:95 -#: lib/tagcloudsection.php:71 +#: lib/tagcloudsection.php:71 actions/showgroup.php:344 msgid "(None)" -msgstr "" +msgstr "(Brak)" -#: actions/showgroup.php:370 +#: actions/showgroup.php:370 actions/showgroup.php:350 msgid "All members" -msgstr "" +msgstr "Wszyscy członkowie" #: actions/showgroup.php:378 #, php-format @@ -4151,50 +4354,51 @@ msgid "" "**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en." "wikipedia.org/wiki/Micro-blogging) service " msgstr "" +"**%s** jest grupą użytkowników na %%%%site.name%%%%, usłudze " +"[mikroblogowania](http://en.wikipedia.org/wiki/Micro-blogging) " #: actions/showmessage.php:98 msgid "Only the sender and recipient " -msgstr "" +msgstr "Tylko nadawca i odbiorca " #: actions/showstream.php:73 #, php-format msgid "%s, page %d" -msgstr "" +msgstr "%s, strona %d" #: actions/showstream.php:143 -#, fuzzy msgid "'s profile" -msgstr "Profil" +msgstr " - profil" #: actions/showstream.php:236 actions/tagother.php:77 -#, fuzzy +#: actions/showstream.php:220 msgid "User profile" -msgstr "Użytkownik nie ma profilu." +msgstr "Profil użytkownika" #: actions/showstream.php:240 actions/tagother.php:81 +#: actions/showstream.php:224 msgid "Photo" -msgstr "" +msgstr "Zdjęcie" -#: actions/showstream.php:317 +#: actions/showstream.php:317 actions/showstream.php:309 msgid "User actions" -msgstr "" +msgstr "Działania użytkownika" #: actions/showstream.php:342 msgid "Send a direct message to this user" -msgstr "" +msgstr "Wyślij bezpośrednią wiadomość do tego użytkownika" #: actions/showstream.php:343 msgid "Message" -msgstr "" +msgstr "Wiadomość" #: actions/showstream.php:451 -#, fuzzy msgid "All subscribers" -msgstr "Subskrybenci" +msgstr "Wszyscy subskrybenci" #: actions/showstream.php:533 msgid "All groups" -msgstr "" +msgstr "Wszystkie grupy" #: actions/showstream.php:542 #, php-format @@ -4202,480 +4406,449 @@ msgid "" "**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en." "wikipedia.org/wiki/Micro-blogging) service " msgstr "" +"**%s** posiada konto na %%%%site.name%%%%, usłudze [mikroblogowania](http://" +"en.wikipedia.org/wiki/Micro-blogging) " #: actions/smssettings.php:128 -#, fuzzy msgid "Phone number, no punctuation or spaces, " -msgstr "Max. 64 znaki alfanumeryczne, bez spacji i znaków przestankowych" +msgstr "Numer telefonu, bez znaków przestankowych i spacji, " #: actions/smssettings.php:162 -#, fuzzy msgid "Send me notices through SMS; " -msgstr "Wysyłaj mi wpisy przez Jabbera/GTalka" +msgstr "Wyślij mi wpisy przez SMS; " #: actions/smssettings.php:335 -#, fuzzy msgid "A confirmation code was sent to the phone number you added. " -msgstr "Ten kod potwierdzający nie jest przeznaczony dla Ciebie!" +msgstr "Kod potwierdzający został wysłany na dodany numer telefonu. " #: actions/smssettings.php:453 msgid "Mobile carrier" -msgstr "" +msgstr "Operator komórkowy" #: actions/subedit.php:70 -#, fuzzy msgid "You are not subscribed to that profile." -msgstr "Ten profil nie był wysłany przez Ciebie" +msgstr "Nie jesteś zasubskrybowany do tego profilu." #: actions/subedit.php:83 -#, fuzzy msgid "Could not save subscription." -msgstr "Nie można obserwować." +msgstr "Nie można zapisać subskrypcji." #: actions/subscribe.php:55 -#, fuzzy msgid "Not a local user." -msgstr "Brak takiego użytkownika." +msgstr "Nie jest lokalnym użytkownikiem." #: actions/subscribe.php:69 -#, fuzzy msgid "Subscribed" -msgstr "Subskrybuj" +msgstr "Zasubskrybowano" #: actions/subscribers.php:50 -#, fuzzy, php-format +#, php-format msgid "%s subscribers" -msgstr "Subskrybenci" +msgstr "Subskrybenci %s" #: actions/subscribers.php:52 #, php-format msgid "%s subscribers, page %d" -msgstr "" +msgstr "Subskrybenci %s, strona %d" #: actions/subscribers.php:63 -#, fuzzy msgid "These are the people who listen to " -msgstr "Ludzie obserwujący wpisy użytkownika %s." +msgstr "Osoby obserwujące " #: actions/subscribers.php:67 -#, fuzzy, php-format +#, php-format msgid "These are the people who " -msgstr "Ludzie obserwujący wpisy użytkownika %s." +msgstr "Osoby, które " #: actions/subscriptions.php:52 -#, fuzzy, php-format +#, php-format msgid "%s subscriptions" -msgstr "Wszyscy obserwowani" +msgstr "Subskrypcje %s" #: actions/subscriptions.php:54 -#, fuzzy, php-format +#, php-format msgid "%s subscriptions, page %d" -msgstr "Wszyscy obserwowani" +msgstr "Subskrypcje %s, strona %d" #: actions/subscriptions.php:65 -#, fuzzy msgid "These are the people whose notices " -msgstr "Ludzie, których wpisy obserwuje użytkownik %s." +msgstr "Osoby, których wpisy " #: actions/subscriptions.php:69 -#, fuzzy, php-format +#, php-format msgid "These are the people whose " -msgstr "Ludzie obserwujący wpisy użytkownika %s." +msgstr "Osoby, których " -#: actions/subscriptions.php:122 -#, fuzzy +#: actions/subscriptions.php:122 actions/subscriptions.php:124 msgid "Jabber" -msgstr "Brak identyfikatora Jabbera." +msgstr "Jabber" -#: actions/tag.php:43 -#, fuzzy, php-format +#: actions/tag.php:43 actions/tag.php:51 +#, php-format msgid "Notices tagged with %s, page %d" -msgstr "%s – mikroblog" +msgstr "Wpisy ze znacznikiem %s, strona %d" -#: actions/tag.php:66 +#: actions/tag.php:66 actions/tag.php:73 #, php-format msgid "Messages tagged \"%s\", most recent first" -msgstr "" +msgstr "Wiadomości ze znacznikiem \"%s\", najpierw najnowsze" #: actions/tagother.php:33 -#, fuzzy msgid "Not logged in" -msgstr "Niezalogowany." +msgstr "Nie zalogowano" #: actions/tagother.php:39 -#, fuzzy msgid "No id argument." -msgstr "Brak takiego dokumentu." +msgstr "Brak parametru identyfikatora." #: actions/tagother.php:65 #, php-format msgid "Tag %s" -msgstr "" +msgstr "Znacznik %s" #: actions/tagother.php:141 msgid "Tag user" -msgstr "" +msgstr "Znacznik użytkownika" -#: actions/tagother.php:149 +#: actions/tagother.php:149 actions/tagother.php:151 msgid "" "Tags for this user (letters, numbers, -, ., and _), comma- or space- " "separated" msgstr "" +"Znaczniki dla tego użytkownika (litery, liczby, -, . i _), oddzielone " +"przecinkami lub spacjami" #: actions/tagother.php:164 msgid "There was a problem with your session token." -msgstr "" +msgstr "Wystąpił problem z tokenem sesji." -#: actions/tagother.php:191 +#: actions/tagother.php:191 actions/tagother.php:193 msgid "" "You can only tag people you are subscribed to or who are subscribed to you." msgstr "" +"Można nadawać znaczniki tylko osobom, których subskrybujesz lub którzy " +"subskrybują Ciebie." -#: actions/tagother.php:198 -#, fuzzy +#: actions/tagother.php:198 actions/tagother.php:200 msgid "Could not save tags." -msgstr "Nie można zapisać informacji o awatarze" +msgstr "Nie można zapisać znaczników." -#: actions/tagother.php:233 +#: actions/tagother.php:233 actions/tagother.php:235 msgid "Use this form to add tags to your subscribers or subscriptions." msgstr "" +"Użyj tego formularza, aby dodać znaczniki subskrybentom lub subskrypcjom." #: actions/tagrss.php:35 -#, fuzzy msgid "No such tag." -msgstr "Brak takiego wpisu." +msgstr "Nie ma takiego znacznika." -#: actions/tagrss.php:66 -#, fuzzy, php-format +#: actions/tagrss.php:66 actions/tagrss.php:64 +#, php-format msgid "Microblog tagged with %s" -msgstr "%s – mikroblog" +msgstr "Mikroblogi ze znacznikiem %s" #: actions/twitapiblocks.php:47 msgid "Block user failed." -msgstr "" +msgstr "Zablokowanie użytkownika nie powiodło się." #: actions/twitapiblocks.php:69 msgid "Unblock user failed." -msgstr "" +msgstr "Odblokowanie użytkownika nie powiodło się." -#: actions/twitapiusers.php:48 -#, fuzzy +#: actions/twitapiusers.php:48 actions/twitapiusers.php:52 msgid "Not found." -msgstr "Nie znaleziono żądania!" +msgstr "Nie znaleziono." #: actions/twittersettings.php:71 msgid "Add your Twitter account to automatically send " -msgstr "" +msgstr "Dodaj konto Twittera, aby automatycznie wysyłać " -#: actions/twittersettings.php:119 +#: actions/twittersettings.php:119 actions/twittersettings.php:122 msgid "Twitter user name" -msgstr "" +msgstr "Nazwa użytkownika Twittera" -#: actions/twittersettings.php:126 -#, fuzzy +#: actions/twittersettings.php:126 actions/twittersettings.php:129 msgid "Twitter password" -msgstr "Nowe hasło" +msgstr "Hasło Twittera" -#: actions/twittersettings.php:228 +#: actions/twittersettings.php:228 actions/twittersettings.php:232 msgid "Twitter Friends" -msgstr "" +msgstr "Przyjaciele z Twittera" #: actions/twittersettings.php:327 msgid "Username must have only numbers, " -msgstr "" +msgstr "Nazwa użytkownika może zawierać tylko liczby, " #: actions/twittersettings.php:341 -#, fuzzy, php-format +#, php-format msgid "Unable to retrieve account information " -msgstr "Nie można skasować potwierdzenia adresu e-mail." +msgstr "Nie można pobrać informacji o koncie " #: actions/unblock.php:108 -#, fuzzy msgid "Error removing the block." -msgstr "Błąd w zapisie użytkownika." +msgstr "Błąd podczas usuwania blokady." #: actions/unsubscribe.php:50 -#, fuzzy msgid "No profile id in request." -msgstr "Serwer nie zwrócił żadnego URL-a." +msgstr "Brak identyfikatora profilu w żądaniu." #: actions/unsubscribe.php:57 -#, fuzzy msgid "No profile with that id." -msgstr "Zdalny profil bez odpowiadającego profilu lokalnego" +msgstr "Brak profilu z tym identyfikatorem." #: actions/unsubscribe.php:71 -#, fuzzy msgid "Unsubscribed" -msgstr "Zrezygnuj z subskrypcji" +msgstr "Zrezygnowano z subskrypcji" #: actions/usergroups.php:63 #, php-format msgid "%s groups" -msgstr "" +msgstr "Grupy %s" #: actions/usergroups.php:65 #, php-format msgid "%s groups, page %d" -msgstr "" +msgstr "Grupy %s, strona %d" -#: classes/Notice.php:104 -#, fuzzy +#: classes/Notice.php:104 classes/Notice.php:128 msgid "Problem saving notice. Unknown user." -msgstr "Problem z zachowywaniem wpisu." +msgstr "Problem podczas zapisywania wpisu. Nieznany użytkownik." -#: classes/Notice.php:109 +#: classes/Notice.php:109 classes/Notice.php:133 msgid "" "Too many notices too fast; take a breather and post again in a few minutes." msgstr "" +"Za dużo wpisów w za krótkim czasie, weź głęboki oddech i wyślij ponownie za " +"kilka minut." -#: classes/Notice.php:116 +#: classes/Notice.php:116 classes/Notice.php:145 msgid "You are banned from posting notices on this site." -msgstr "" +msgstr "Zabroniono Ci wysyłania wpisów na tej stronie." #: lib/accountsettingsaction.php:108 -#, fuzzy msgid "Upload an avatar" -msgstr "Uaktualnianie awatara nie powiodło się." +msgstr "Wyślij awatar" #: lib/accountsettingsaction.php:119 msgid "Other" -msgstr "" +msgstr "Inne" #: lib/accountsettingsaction.php:120 msgid "Other options" -msgstr "" +msgstr "Inne opcje" -#: lib/action.php:130 +#: lib/action.php:130 lib/action.php:132 #, php-format msgid "%s - %s" -msgstr "" +msgstr "%s - %s" -#: lib/action.php:145 +#: lib/action.php:145 lib/action.php:147 msgid "Untitled page" -msgstr "" +msgstr "Strona bez nazwy" -#: lib/action.php:316 +#: lib/action.php:316 lib/action.php:387 msgid "Primary site navigation" -msgstr "" +msgstr "Główna nawigacja strony" -#: lib/action.php:322 +#: lib/action.php:322 lib/action.php:393 msgid "Personal profile and friends timeline" -msgstr "" +msgstr "Profil osobisty i oś czasu przyjaciół" -#: lib/action.php:325 +#: lib/action.php:325 lib/action.php:396 msgid "Search for people or text" -msgstr "" +msgstr "Znajdź osoby lub tekst" -#: lib/action.php:328 -#, fuzzy +#: lib/action.php:328 lib/action.php:399 msgid "Account" -msgstr "O serwisie" +msgstr "Konto" -#: lib/action.php:328 +#: lib/action.php:328 lib/action.php:399 msgid "Change your email, avatar, password, profile" -msgstr "" +msgstr "Zmień adres e-mail, awatar, hasło, profil" -#: lib/action.php:330 +#: lib/action.php:330 lib/action.php:403 msgid "Connect to IM, SMS, Twitter" -msgstr "" +msgstr "Połącz z komunikatorem, SMS, Twitterem" -#: lib/action.php:332 +#: lib/action.php:332 lib/action.php:409 msgid "Logout from the site" -msgstr "" +msgstr "Wyloguj się ze strony" -#: lib/action.php:335 +#: lib/action.php:335 lib/action.php:412 msgid "Login to the site" -msgstr "" +msgstr "Zaloguj się na stronę" -#: lib/action.php:338 -#, fuzzy +#: lib/action.php:338 lib/action.php:415 msgid "Create an account" -msgstr "Załóż nowe konto" +msgstr "Utwórz konto" -#: lib/action.php:341 -#, fuzzy +#: lib/action.php:341 lib/action.php:418 msgid "Login with OpenID" -msgstr "Brak takiego identyfikatora OpenID." +msgstr "Zaloguj się za pomocą OpenID" -#: lib/action.php:344 -#, fuzzy +#: lib/action.php:344 lib/action.php:421 msgid "Help me!" -msgstr "Pomoc" +msgstr "Pomóż mi!" -#: lib/action.php:362 -#, fuzzy +#: lib/action.php:362 lib/action.php:441 msgid "Site notice" -msgstr "Nowy wpis" +msgstr "Wpis strony" -#: lib/action.php:417 +#: lib/action.php:417 lib/action.php:504 msgid "Local views" -msgstr "" +msgstr "Lokalne widoki" -#: lib/action.php:472 -#, fuzzy +#: lib/action.php:472 lib/action.php:559 msgid "Page notice" -msgstr "Nowy wpis" +msgstr "Wpis strony" -#: lib/action.php:562 -#, fuzzy +#: lib/action.php:562 lib/action.php:654 msgid "Secondary site navigation" -msgstr "Subskrypcje" +msgstr "Druga nawigacja strony" -#: lib/action.php:602 lib/action.php:623 +#: lib/action.php:602 lib/action.php:623 lib/action.php:699 lib/action.php:720 msgid "Laconica software license" -msgstr "" +msgstr "Licencja oprogramowania Laconica" -#: lib/action.php:630 +#: lib/action.php:630 lib/action.php:727 msgid "All " -msgstr "" +msgstr "Wszystko " -#: lib/action.php:635 +#: lib/action.php:635 lib/action.php:732 msgid "license." -msgstr "" +msgstr "licencja." #: lib/blockform.php:123 lib/blockform.php:153 -#, fuzzy msgid "Block this user" -msgstr "Brak takiego użytkownika." +msgstr "Zablokuj tego użytkownika" #: lib/blockform.php:153 msgid "Block" -msgstr "" +msgstr "Zablokuj" #: lib/disfavorform.php:114 lib/disfavorform.php:140 msgid "Disfavor this notice" -msgstr "" +msgstr "Usuń ten wpis z ulubionych" #: lib/facebookaction.php:268 #, php-format msgid "To use the %s Facebook Application you need to login " -msgstr "" +msgstr "Aby używać aplikacji Facebook %s, musisz się zalogować " -#: lib/facebookaction.php:271 -#, fuzzy +#: lib/facebookaction.php:271 lib/facebookaction.php:273 msgid " a new account." -msgstr "Załóż nowe konto" +msgstr " nowe konto." #: lib/facebookaction.php:557 lib/mailbox.php:214 lib/noticelist.php:354 -#, fuzzy +#: lib/facebookaction.php:675 lib/mailbox.php:216 lib/noticelist.php:357 msgid "Published" -msgstr "Publiczny" +msgstr "Opublikowano" #: lib/favorform.php:114 lib/favorform.php:140 -#, fuzzy msgid "Favor this notice" -msgstr "Brak takiego wpisu." +msgstr "Dodaj ten wpis do ulubionych" #: lib/feedlist.php:64 msgid "Export data" -msgstr "" +msgstr "Wyeksportuj dane" #: lib/galleryaction.php:121 msgid "Filter tags" -msgstr "" +msgstr "Filtruj znaczniki" #: lib/galleryaction.php:131 msgid "All" -msgstr "" +msgstr "Wszystko" #: lib/galleryaction.php:137 msgid "Tag" -msgstr "" +msgstr "Znacznik" #: lib/galleryaction.php:138 msgid "Choose a tag to narrow list" -msgstr "" +msgstr "Wybierz znacznik do ograniczonej listy" #: lib/galleryaction.php:139 msgid "Go" -msgstr "" +msgstr "Przejdź" #: lib/groupeditform.php:148 -#, fuzzy msgid "URL of the homepage or blog of the group or topic" -msgstr "URL Twojej strony domowej, bloga, lub profilu na innej stronie" +msgstr "Adres URL strony domowej lub bloga grupy, albo temat" #: lib/groupeditform.php:151 -#, fuzzy msgid "Description" -msgstr "Subskrypcje" +msgstr "Opis" #: lib/groupeditform.php:153 -#, fuzzy msgid "Describe the group or topic in 140 chars" -msgstr "Opisz się w 140 znakach" +msgstr "Opisz grupę lub temat w 140 znakach" #: lib/groupeditform.php:158 -#, fuzzy msgid "" "Location for the group, if any, like \"City, State (or Region), Country\"" -msgstr "Gdzie jesteś? (np. \"miasto, region, kraj\")" +msgstr "" +"Położenie grupy, jeśli istnieje, np. \"miasto, województwo (lub region), kraj" +"\"" #: lib/groupnav.php:84 lib/searchgroupnav.php:84 msgid "Group" -msgstr "" +msgstr "Grupa" #: lib/groupnav.php:100 msgid "Admin" -msgstr "" +msgstr "Administrator" #: lib/groupnav.php:101 #, php-format msgid "Edit %s group properties" -msgstr "" +msgstr "Edytuj właściwości grupy %s" #: lib/groupnav.php:106 -#, fuzzy msgid "Logo" -msgstr "Wyloguj" +msgstr "Logo" #: lib/groupnav.php:107 #, php-format msgid "Add or edit %s logo" -msgstr "" +msgstr "Dodaj lub edytuj logo grupy %s" #: lib/groupsbymemberssection.php:71 msgid "Groups with most members" -msgstr "" +msgstr "Grupy z największą liczbą członków" #: lib/groupsbypostssection.php:71 msgid "Groups with most posts" -msgstr "" +msgstr "Grupy z największą ilością wpisów" #: lib/grouptagcloudsection.php:56 #, php-format msgid "Tags in %s group's notices" -msgstr "" +msgstr "Znaczniki we wpisach grupy %s" #: lib/htmloutputter.php:104 -#, fuzzy msgid "This page is not available in a " -msgstr "Ta strona nie jest dostępna dla medium, którego typ akceptujesz" +msgstr "Ta strona nie jest dostępna w " #: lib/joinform.php:114 -#, fuzzy msgid "Join" -msgstr "Login" +msgstr "Dołącz" #: lib/leaveform.php:114 -#, fuzzy msgid "Leave" -msgstr "Zapisz" +msgstr "Opuść" #: lib/logingroupnav.php:76 -#, fuzzy msgid "Login with a username and password" -msgstr "Błędna nazwa użytkownika lub hasło." +msgstr "Zaloguj się za pomocą nazwy użytkownika i hasła" #: lib/logingroupnav.php:79 -#, fuzzy msgid "Sign up for a new account" msgstr "Załóż nowe konto" #: lib/logingroupnav.php:82 msgid "Login or register with OpenID" -msgstr "" +msgstr "Zaloguj się lub zarejestruj za pomocą OpenID" #: lib/mail.php:175 #, php-format @@ -4683,21 +4856,23 @@ msgid "" "Hey, %s.\n" "\n" msgstr "" +"Cześć, %s.\n" +"\n" #: lib/mail.php:236 -#, fuzzy, php-format +#, php-format msgid "%1$s is now listening to " -msgstr "%1$s obserwuje teraz Twoje wpisy na %2$s." +msgstr "%1$s obserwuje teraz " #: lib/mail.php:254 -#, fuzzy, php-format +#, php-format msgid "Location: %s\n" -msgstr "Lokalizacja" +msgstr "Położenie: %s\n" #: lib/mail.php:256 -#, fuzzy, php-format +#, php-format msgid "Homepage: %s\n" -msgstr "Strona domowa" +msgstr "Strona domowa: %s\n" #: lib/mail.php:258 #, php-format @@ -4705,185 +4880,783 @@ msgid "" "Bio: %s\n" "\n" msgstr "" +"O mnie: %s\n" +"\n" -#: lib/mail.php:461 +#: lib/mail.php:461 lib/mail.php:462 #, php-format msgid "You've been nudged by %s" -msgstr "" +msgstr "Zostałeś szturchnięty przez %s" #: lib/mail.php:465 #, php-format msgid "%1$s (%2$s) is wondering what you are up to " -msgstr "" +msgstr "%1$s (%2$s) zastanawia się, co zamierzasz " #: lib/mail.php:555 -#, fuzzy, php-format +#, php-format msgid "%1$s just added your notice from %2$s" -msgstr "%1$s obserwuje teraz Twoje wpisy na %2$s." +msgstr "%1$s właśnie dodał Twój wpis z %2$s" -#: lib/mailbox.php:229 lib/noticelist.php:380 +#: lib/mailbox.php:229 lib/noticelist.php:380 lib/mailbox.php:231 +#: lib/noticelist.php:383 msgid "From" -msgstr "" +msgstr "Od" -#: lib/messageform.php:110 +#: lib/messageform.php:110 lib/messageform.php:109 msgid "Send a direct notice" -msgstr "" +msgstr "Wyślij bezpośredni wpis" #: lib/noticeform.php:125 -#, fuzzy msgid "Send a notice" -msgstr "Nowy wpis" +msgstr "Wyślij wpis" #: lib/noticeform.php:152 -#, fuzzy msgid "Available characters" -msgstr "6 lub więcej znaków" +msgstr "Dostępne znaki" -#: lib/noticelist.php:426 -#, fuzzy +#: lib/noticelist.php:426 lib/noticelist.php:429 msgid "in reply to" -msgstr "w odpowiedzi na…" +msgstr "w odpowiedzi na" -#: lib/noticelist.php:447 lib/noticelist.php:450 +#: lib/noticelist.php:447 lib/noticelist.php:450 lib/noticelist.php:451 +#: lib/noticelist.php:454 msgid "Reply to this notice" -msgstr "" +msgstr "Odpowiedz na ten wpis" -#: lib/noticelist.php:451 -#, fuzzy +#: lib/noticelist.php:451 lib/noticelist.php:455 msgid "Reply" -msgstr "odpowiedź" +msgstr "Odpowiedz" -#: lib/noticelist.php:471 lib/noticelist.php:474 +#: lib/noticelist.php:471 lib/noticelist.php:474 lib/noticelist.php:476 +#: lib/noticelist.php:479 msgid "Delete this notice" -msgstr "" +msgstr "Usuń ten wpis" -#: lib/noticelist.php:474 +#: lib/noticelist.php:474 actions/avatarsettings.php:148 +#: lib/noticelist.php:479 msgid "Delete" -msgstr "" +msgstr "Usuń" #: lib/nudgeform.php:116 msgid "Nudge this user" -msgstr "" +msgstr "Szturchnij tego użytkownika" #: lib/nudgeform.php:128 msgid "Nudge" -msgstr "" +msgstr "Szturchnij" #: lib/nudgeform.php:128 msgid "Send a nudge to this user" -msgstr "" +msgstr "Wyślij szturchnięcie do tego użytkownika" #: lib/personaltagcloudsection.php:56 #, php-format msgid "Tags in %s's notices" -msgstr "" +msgstr "Znaczniki we wpisach użytkownika %s" -#: lib/profilelist.php:182 +#: lib/profilelist.php:182 lib/profilelist.php:180 msgid "(none)" -msgstr "" +msgstr "(brak)" -#: lib/publicgroupnav.php:76 +#: lib/publicgroupnav.php:76 lib/publicgroupnav.php:78 msgid "Public" msgstr "Publiczny" -#: lib/publicgroupnav.php:80 +#: lib/publicgroupnav.php:80 lib/publicgroupnav.php:82 msgid "User groups" -msgstr "" +msgstr "Grupy użytkowników" #: lib/publicgroupnav.php:82 lib/publicgroupnav.php:83 +#: lib/publicgroupnav.php:84 lib/publicgroupnav.php:85 msgid "Recent tags" -msgstr "" +msgstr "Ostatnie znaczniki" -#: lib/publicgroupnav.php:86 +#: lib/publicgroupnav.php:86 lib/publicgroupnav.php:88 msgid "Featured" -msgstr "" +msgstr "Znane" -#: lib/publicgroupnav.php:90 -#, fuzzy +#: lib/publicgroupnav.php:90 lib/publicgroupnav.php:92 msgid "Popular" -msgstr "Szukaj ludzi" +msgstr "Popularne" #: lib/searchgroupnav.php:82 -#, fuzzy msgid "Notice" -msgstr "Wpisy" +msgstr "Wpis" #: lib/searchgroupnav.php:85 msgid "Find groups on this site" -msgstr "" +msgstr "Znajdź grupy na tej stronie" #: lib/section.php:89 msgid "Untitled section" -msgstr "" +msgstr "Sekcja bez nazwy" #: lib/subgroupnav.php:81 -#, fuzzy, php-format +#, php-format msgid "People %s subscribes to" -msgstr "Zdalna subskrypcja" +msgstr "Osoby %s zasubskrybowane do" #: lib/subgroupnav.php:89 -#, fuzzy, php-format +#, php-format msgid "People subscribed to %s" -msgstr "Zdalna subskrypcja" +msgstr "Osoby zasubskrybowane do %s" #: lib/subgroupnav.php:97 #, php-format msgid "Groups %s is a member of" -msgstr "" +msgstr "Grupy %s są członkiem" #: lib/subgroupnav.php:104 #, php-format msgid "Invite friends and colleagues to join you on %s" -msgstr "" +msgstr "Zaproś przyjaciół i kolegów do dołączenia do Ciebie na %s" #: lib/subs.php:53 -#, fuzzy msgid "User has blocked you." -msgstr "Użytkownik nie ma profilu." +msgstr "Użytkownik zablokował Cię." #: lib/subscribeform.php:115 lib/subscribeform.php:139 -#, fuzzy msgid "Subscribe to this user" -msgstr "Subskrypcja uwierzytelniona" +msgstr "Zasubskrybuj tego użytkownika" #: lib/tagcloudsection.php:56 msgid "None" -msgstr "" +msgstr "Brak" #: lib/topposterssection.php:74 msgid "Top posters" -msgstr "" +msgstr "Najczęściej wysyłający wpisy" #: lib/unblockform.php:120 lib/unblockform.php:150 -#, fuzzy msgid "Unblock this user" -msgstr "Brak takiego użytkownika." +msgstr "Odblokuj tego użytkownika" #: lib/unblockform.php:150 msgid "Unblock" -msgstr "" +msgstr "Odblokuj" #: lib/unsubscribeform.php:113 lib/unsubscribeform.php:137 msgid "Unsubscribe from this user" +msgstr "Zrezygnuj z subskrypcji tego użytkownika" + +#: actions/all.php:77 +#, php-format +msgid "Feed for friends of %s (RSS 1.0)" +msgstr "Kanał dla znajomych użytkownika %s (RSS 1.0)" + +#: actions/all.php:82 +#, php-format +msgid "Feed for friends of %s (RSS 2.0)" +msgstr "Kanał dla znajomych użytkownika %s (RSS 2.0)" + +#: actions/all.php:87 +#, php-format +msgid "Feed for friends of %s (Atom)" +msgstr "Kanał dla znajomych użytkownika %s (Atom)" + +#: actions/all.php:112 +msgid "You and friends" +msgstr "Ty i przyjaciele" + +#: actions/avatarsettings.php:78 +#, php-format +msgid "You can upload your personal avatar. The maximum file size is %s." +msgstr "Można wysłać swój osobisty awatar. Maksymalny rozmiar pliku to %s." + +#: actions/avatarsettings.php:373 +msgid "Avatar deleted." +msgstr "Usunięto awatar." + +#: actions/block.php:129 +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 "" +"Jesteś pewny, że chcesz zablokować tego użytkownika. Po tym jego subskrypcja " +"do Ciebie zostanie usunięta, nie będzie mógł Cię zasubskrybować w " +"przyszłości i nie będziesz powiadamiany o żadnych odpowiedziach @ od niego." + +#: actions/deletenotice.php:73 +msgid "" +"You are about to permanently delete a notice. Once this is done, it cannot " +"be undone." +msgstr "" +"Za chwilę wpis zostanie trwale usunięty. Kiedy to się stanie, to już się nie " +"odstanie." + +#: actions/deletenotice.php:127 +msgid "There was a problem with your session token. Try again, please." +msgstr "Wystąpił problem z tokenem sesji. Spróbuj ponownie." + +#: actions/emailsettings.php:168 +msgid "Send me email when someone sends me an \"@-reply\"." +msgstr "Wyślij mi wiadomość e-mail, kiedy ktoś wyśle mi odpowiedź \"@\"." + +#: actions/facebookhome.php:193 +#, 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 "" +"Jeśli chcesz, aby aplikacja %s automatycznie aktualizowała status na " +"Facebook najnowszym wpisem, musisz dać jej pozwolenie." + +#: actions/facebookhome.php:217 +#, php-format +msgid "Okay, do it!" +msgstr "OK, zrób to!" + +#: actions/facebooksettings.php:124 +#, 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 "" +"Jeśli chcesz, aby %s automatycznie aktualizowało status na Facebook " +"najnowszym wpisem, musisz dać mu pozwolenie." -#, fuzzy -#~ msgid "Delete my account" -#~ msgstr "Załóż nowe konto" +#: actions/grouplogo.php:155 +#, php-format +msgid "" +"You can upload a logo image for your group. The maximum file size is %s." +msgstr "Można wysłać obraz logo grupy. Maksymalny rozmiar pliku to %s." -#~ msgid "Couldn't confirm email." -#~ msgstr "Nie można potwierdzić e-maila." +#: actions/grouplogo.php:367 +msgid "Pick a square area of the image to be the logo." +msgstr "Wybierz kwadratowy obszar obrazu, który będzie logo." -#~ msgid "Email address" -#~ msgstr "Adres e-mailowy" +#: actions/grouprss.php:136 +#, php-format +msgid "Microblog by %s group" +msgstr "Mikroblog grupy %s" + +#: actions/groupsearch.php:57 +#, 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 "" +"Znajdź grupy na %%site.name%% według ich nazwy, położenia lub opisu. Oddziel " +"terminy spacjami; muszą mieć trzy znaki lub więcej." + +#: 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 "" +"Grupy %%%%site.name%%%% umożliwiają znalezienie i rozmawianie z osobami o " +"podobnych zainteresowaniach. Po dołączeniu do grupy można wysyłać wiadomości " +"do wszystkich członków używając składni \"!nazwagrupy\". Nie widzisz grupy, " +"która Cię interesuje? Spróbuj ją [znaleźć](%%%%action.groupsearch%%%%) lub " +"[założyć własną!](%%%%action.newgroup%%%%)" + +#: actions/newmessage.php:102 +msgid "Only logged-in users can send direct messages." +msgstr "Tylko zalogowani użytkownicy mogą wysyłać bezpośrednie wiadomości." + +#: actions/noticesearch.php:91 +#, php-format +msgid "Search results for \"%s\" on %s" +msgstr "Wyniki wyszukiwania dla \"%s\" na %s" + +#: actions/openidlogin.php:66 +#, php-format +msgid "" +"For security reasons, please re-login with your [OpenID](%%doc.openid%%) " +"before changing your settings." +msgstr "" +"Z powodów bezpieczeństwa przed zmienianiem ustawień zaloguj się ponownie za " +"pomocą identyfikatora [OpenID](%%doc.openid%%)." + +#: actions/public.php:125 +msgid "Public Stream Feed (RSS 1.0)" +msgstr "Kanał publicznego strumienia (RSS 1.0)" + +#: actions/public.php:130 +msgid "Public Stream Feed (RSS 2.0)" +msgstr "Kanał publicznego strumienia (RSS 2.0)" + +#: actions/public.php:135 +msgid "Public Stream Feed (Atom)" +msgstr "Kanał publicznego strumienia (Atom)" + +#: actions/public.php:210 +#, php-format +msgid "" +"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-" +"blogging) service based on the Free Software [Laconica](http://laconi.ca/) " +"tool. [Join now](%%action.register%%) to share notices about yourself with " +"friends, family, and colleagues! ([Read more](%%doc.help%%))" +msgstr "" +"To jest %%site.name%%, usługa [mikroblogowania](http://en.wikipedia.org/wiki/" +"Micro-blogging) oparta na wolnym narzędziu [Laconica](http://laconi.ca/). " +"[Dołącz teraz](%%action.register%%), aby dzielić się wpisami o sobie z " +"przyjaciółmi, rodziną i kolegami! ([Przeczytaj więcej](%%doc.help%%))" + +#: actions/register.php:286 +#, php-format +msgid "" +"With this form you can create a new account. You can then post notices and " +"link up to friends and colleagues. (Have an [OpenID](http://openid.net/)? " +"Try our [OpenID registration](%%action.openidlogin%%)!)" +msgstr "" +"Za pomocą tego formularza można utworzyć nowe konto. Można wtedy wysyłać " +"wpisy i połączyć się z przyjaciółmi i kolegami. (Posiadasz identyfikator " +"[OpenID](http://openid.net/)? Wypróbuj [rejestracji OpenID](%%action." +"openidlogin%%)!)" + +#: actions/register.php:432 +msgid "Creative Commons Attribution 3.0" +msgstr "Creative Commons Uznanie Autorstwa 3.0" + +#: actions/register.php:433 +msgid "" +" except this private data: password, email address, IM address, and phone " +"number." +msgstr "" +" poza tymi prywatnymi danymi: hasło, adres e-mail, adres komunikatora i " +"numer telefonu." + +#: actions/showgroup.php:378 +msgid "Created" +msgstr "Utworzono" + +#: actions/showgroup.php:393 +#, 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 " +"[Laconica](http://laconi.ca/) 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 "" +"**%s** jest grupą użytkowników na %%%%site.name%%%%, usłudze " +"[mikroblogowania](http://en.wikipedia.org/wiki/Micro-blogging) opartej na " +"wolnym narzędziu [Laconica](http://laconi.ca/). Jej członkowie dzielą się " +"krótkimi wiadomościami o swoim życiu i zainteresowaniach. [Dołącz teraz](%%%%" +"action.register%%%%), aby stać się częścią tej grupy i wiele więcej! " +"([Przeczytaj więcej](%%%%doc.help%%%%))" + +#: actions/showstream.php:147 +msgid "Your profile" +msgstr "Twój profil" + +#: actions/showstream.php:149 +#, php-format +msgid "%s's profile" +msgstr "Profil użytkownika %s" + +#: actions/showstream.php:163 +#, php-format +msgid "Notice feed for %s (RSS 1.0)" +msgstr "Kanał wpisów dla %s (RSS 1.0)" + +#: actions/showstream.php:170 +#, php-format +msgid "Notice feed for %s (RSS 2.0)" +msgstr "Kanał wpisów dla %s (RSS 2.0)" + +#: actions/showstream.php:177 +#, php-format +msgid "Notice feed for %s (Atom)" +msgstr "Kanał wpisów dla %s (Atom)" + +#: actions/showstream.php:182 +#, php-format +msgid "FOAF for %s" +msgstr "FOAF dla %s" + +#: actions/showstream.php:237 +msgid "Edit Avatar" +msgstr "Edytuj awatar" + +#: actions/showstream.php:316 +msgid "Edit profile settings" +msgstr "Edytuj ustawienia profilu" + +#: actions/showstream.php:317 +msgid "Edit" +msgstr "Edytuj" + +#: actions/showstream.php:542 +#, 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 " +"[Laconica](http://laconi.ca/) tool. [Join now](%%%%action.register%%%%) to " +"follow **%s**'s notices and many more! ([Read more](%%%%doc.help%%%%))" +msgstr "" +"**%s** posiada konto na %%%%site.name%%%%, usłudze [mikroblogowania](http://" +"en.wikipedia.org/wiki/Micro-blogging) opartej na wolnym narzędziu [Laconica]" +"(http://laconi.ca/). [Dołącz teraz](%%%%action.register%%%%), aby obserwować " +"wpisy użytkownika **%s** i wiele więcej! ([Przeczytaj więcej](%%%%doc.help%%%" +"%))" + +#: actions/smssettings.php:335 +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 "" +"Kod potwierdzający został wysłany na dodany numer telefonu. Sprawdź telefon, " +"czy otrzymałeś kod i instrukcje jak go użyć." + +#: actions/twitapifavorites.php:171 lib/mail.php:556 +#, php-format +msgid "" +"%1$s just added your notice from %2$s as one of their favorites.\n" +"\n" +"In case you forgot, you can see the text of your notice here:\n" +"\n" +"%3$s\n" +"\n" +"You can see the list of %1$s's favorites here:\n" +"\n" +"%4$s\n" +"\n" +"Faithfully yours,\n" +"%5$s\n" +msgstr "" +"%1$s właśnie dodał Twój wpis z %2$s jako jeden ze swoich ulubionych.\n" +"\n" +"Jeśli go zapomniałeś, tutaj możesz zobaczyć tekst wpisu:\n" +"\n" +"%3$s\n" +"\n" +"Tutaj możesz zobaczyć listę ulubionych wpisów użytkownika %1$s:\n" +"\n" +"%4$s\n" +"\n" +"Z poważaniem,\n" +"%5$s\n" + +#: actions/twitapistatuses.php:124 +msgid "No such user!" +msgstr "Nie ma takiego użytkownika!" + +#: actions/twittersettings.php:72 +msgid "" +"Add your Twitter account to automatically send your notices to Twitter, and " +"subscribe to Twitter friends already here." +msgstr "" +"Dodaj konto Twittera, aby automatycznie wysyłać wpisy do Twittera i " +"zasubskrybować przyjaciół z Twittera, którzy już tu są." + +#: actions/twittersettings.php:345 +#, php-format +msgid "Unable to retrieve account information For \"%s\" from Twitter." +msgstr "Nie można pobrać informacji o koncie dla \"%s\" z Twittera." + +#: actions/userauthorization.php:86 +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 "" +"Sprawdź te szczegóły, aby upewnić się, czy na pewno chcesz zasubskrybować " +"wpisy tego użytkownika. Jeżeli nie prosiłeś o subskrypcję czyichś wpisów, " +"naciśnij \"Odrzuć\"." + +#: actions/usergroups.php:131 +msgid "Search for more groups" +msgstr "Znajdź więcej grup" + +#: classes/Notice.php:138 +msgid "" +"Too many duplicate messages too quickly; take a breather and post again in a " +"few minutes." +msgstr "" +"Za dużo takich samych wiadomości w za krótkim czasie, weź głęboki oddech i " +"wyślij ponownie za kilka minut." + +#: lib/action.php:406 +msgid "Connect to SMS, Twitter" +msgstr "Połącz z SMS, Twitterem" + +#: lib/action.php:671 +msgid "Badge" +msgstr "Odznaka" + +#: lib/command.php:113 +#, php-format +msgid "" +"Subscriptions: %1$s\n" +"Subscribers: %2$s\n" +"Notices: %3$s" +msgstr "" +"Subskrypcje: %1$s\n" +"Subskrybenci: %2$s\n" +"Wpisy: %3$s" + +#: lib/command.php:392 +msgid "" +"Commands:\n" +"on - turn on notifications\n" +"off - turn off notifications\n" +"help - show this help\n" +"follow <nickname> - subscribe to user\n" +"leave <nickname> - unsubscribe from user\n" +"d <nickname> <text> - direct message to user\n" +"get <nickname> - get last notice from user\n" +"whois <nickname> - get profile info on user\n" +"fav <nickname> - add user's last notice as a 'fave'\n" +"stats - get your stats\n" +"stop - same as 'off'\n" +"quit - same as 'off'\n" +"sub <nickname> - same as 'follow'\n" +"unsub <nickname> - same as 'leave'\n" +"last <nickname> - same as 'get'\n" +"on <nickname> - not yet implemented.\n" +"off <nickname> - not yet implemented.\n" +"nudge <nickname> - not yet implemented.\n" +"invite <phone number> - not yet implemented.\n" +"track <word> - not yet implemented.\n" +"untrack <word> - 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 "" +"Polecenia:\n" +"on - włącza powiadomienia\n" +"off - wyłącza powiadomienia\n" +"help - wyświetla tę pomoc\n" +"follow <pseudonim> - subskrybuje użytkownika\n" +"leave <pseudonim> - rezygnuje z subskrypcji użytkownika\n" +"d <pseudonim> <tekst> - bezpośrednia wiadomość do użytkownika\n" +"get <pseudonim> - uzyskuje ostatni wpis użytkownika\n" +"whois <pseudonim> - uzyskuje informacje o profilu użytkownika\n" +"fav <pseudonim> - dodaje ostatni wpis użytkownika jako \"ulubiony\"\n" +"stats - uzyskuje Twoje statystyki\n" +"stop - to samo co \"off\"\n" +"quit - to samo co \"off\"\n" +"sub <pseudonim> - to samo co \"follow\"\n" +"unsub <pseudonim> - to samo co \"leave\"\n" +"last <pseudonim> - to samo co \"get\"\n" +"on <pseudonim> - jeszcze nie zaimplementowano.\n" +"off <pseudonim> - jeszcze nie zaimplementowano.\n" +"nudge <pseudonim> - jeszcze nie zaimplementowano.\n" +"invite <numer telefonu> - jeszcze nie zaimplementowano.\n" +"track <słowo> - jeszcze nie zaimplementowano.\n" +"untrack <słowo> - jeszcze nie zaimplementowano.\n" +"track off - jeszcze nie zaimplementowano.\n" +"untrack all - jeszcze nie zaimplementowano.\n" +"tracks - jeszcze nie zaimplementowano.\n" +"tracking - jeszcze nie zaimplementowano.\n" + +#: lib/dberroraction.php:60 +msgid "Database error" +msgstr "Błąd bazy danych" + +#: lib/facebookaction.php:271 +#, 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 "" +"Aby użyć aplikacji Facebook %s, musisz się zalogować za pomocą nazwy " +"użytkownika i hasła. Nie masz jeszcze nazwy użytkownika? " + +#: lib/feed.php:85 +msgid "RSS 1.0" +msgstr "RSS 1.0" + +#: lib/feed.php:87 +msgid "RSS 2.0" +msgstr "RSS 2.0" + +#: lib/feed.php:89 +msgid "Atom" +msgstr "Atom" + +#: lib/feed.php:91 +msgid "FOAF" +msgstr "FOAF" + +#: lib/imagefile.php:75 +#, php-format +msgid "That file is too big. The maximum file size is %d." +msgstr "Ten plik jest za duży. Maksymalny rozmiar pliku to %d." + +#: lib/mail.php:175 +#, 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 "" +"Cześć, %s.\n" +"\n" +"Ktoś właśnie podał ten adres e-mail na %s.\n" +"\n" +"Jeśli to byłeś Ty, i chcesz potwierdzić swoje wejście, użyj poniższego " +"adresu URL:\n" +"\n" +"\t%s\n" +"\n" +"Jeśli to nie ty, po prostu zignoruj tę wiadomość.\n" +"\n" +"Dziękujemy za Twój czas, \n" +"%s\n" + +#: 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 "" +"Użytkownik %1$s obserwuje teraz Twoje wpisy na %2$s.\n" +"\n" +"\t%3$s\n" +"\n" +"%4$s%5$s%6$s\n" +"Z poważaniem,\n" +"%7$s.\n" +"\n" +"----\n" +"Zmień adres e-mail lub opcje powiadamiania na %8$s\n" + +#: lib/mail.php:466 +#, 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 "" +"Użytkownik %1$s (%2$s) zastanawia się, co się z Tobą dzieje w ostatnich " +"dniach i zaprasza Cię do wysłania jakichś aktualności.\n" +"\n" +"Tak więc do usłyszenia. :)\n" +"\n" +"%3$s\n" +"\n" +"Nie odpowiadaj na tę wiadomość e-mail, nie dotrze ona do nich.\n" +"\n" +"Z poważaniem,\n" +"%4$s\n" + +#: lib/mail.php:513 +#, 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 "" +"Użytkownik %1$s (%2$s) wysłał Ci prywatną wiadomość:\n" +"\n" +"------------------------------------------------------\n" +"%3$s\n" +"------------------------------------------------------\n" +"\n" +"Tutaj możesz na nią odpowiedzieć:\n" +"\n" +"%4$s\n" +"\n" +"Nie odpowiadaj na tę wiadomość e-mail, nie dotrze ona do nich.\n" +"\n" +"Z poważaniem,\n" +"%5$s\n" + +#: lib/mail.php:598 +#, php-format +msgid "%s sent a notice to your attention" +msgstr "Użytkownik %s wysłał wpis wymagający Twojej uwagi" + +#: lib/mail.php:600 +#, php-format +msgid "" +"%1$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" +"You can reply back here:\n" +"\n" +"\t%5$s\n" +"\n" +"The list of all @-replies for you here:\n" +"\n" +"%6$s\n" +"\n" +"Faithfully yours,\n" +"%2$s\n" +"\n" +"P.S. You can turn off these email notifications here: %7$s\n" +msgstr "" +"Użytkownik %1$s właśnie wysłał wpis wymagający Twojej uwagi (odpowiedź \"@" +"\") na %2$s.\n" +"\n" +"Twój wpis znajduje się tutaj:\n" +"\n" +"\t%3$s\n" +"\n" +"Zawiera tekst:\n" +"\n" +"\t%4$s\n" +"\n" +"Tutaj możesz odpowiedzieć:\n" +"\n" +"\t%5$s\n" +"\n" +"Lista wszystkich odpowiedzi \"@\" do Ciebie znajduje się tutaj:\n" +"\n" +"%6$s\n" +"\n" +"Z poważaniem,\n" +"%2$s\n" +"\n" +"PS Tutaj możesz wyłączyć te powiadomienia przez e-mail: %7$s\n" -#~ msgid "Error inserting notice" -#~ msgstr "Błąd przy wprowadzaniu wpisu" +#: lib/searchaction.php:122 +msgid "Search site" +msgstr "Znajdź stronę" -#~ msgid "" -#~ "If you've forgotten or lost your password, you can get a new one sent " -#~ "the email address you have stored in your account." -#~ msgstr "" -#~ "Jeśli Twoje hasło gdzieś się zapodziało lub zostało zapomniane to możesz " -#~ "wygenerować nowe. Zostanie ono wysłane na adres e-mailowy skojarzony z " -#~ "Twoim kontem." +#: lib/section.php:106 +msgid "More..." +msgstr "Więcej..." diff --git a/plugins/Comet/CometPlugin.php b/plugins/Comet/CometPlugin.php new file mode 100644 index 000000000..45251c66f --- /dev/null +++ b/plugins/Comet/CometPlugin.php @@ -0,0 +1,205 @@ +<?php +/** + * Laconica, the distributed open-source microblogging tool + * + * Plugin to do "real time" updates using Comet/Bayeux + * + * PHP version 5 + * + * LICENCE: 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 <http://www.gnu.org/licenses/>. + * + * @category Plugin + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @copyright 2009 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +/** + * Plugin to do realtime updates using Comet + * + * @category Plugin + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +class CometPlugin extends Plugin +{ + var $server = null; + + function __construct($server=null, $username=null, $password=null) + { + $this->server = $server; + $this->username = $username; + $this->password = $password; + + parent::__construct(); + } + + function onEndShowScripts($action) + { + $timeline = null; + + $this->log(LOG_DEBUG, 'got action ' . $action->trimmed('action')); + + switch ($action->trimmed('action')) { + case 'public': + $timeline = '/timelines/public'; + break; + case 'tag': + $tag = $action->trimmed('tag'); + if (!empty($tag)) { + $timeline = '/timelines/tag/'.$tag; + } else { + return true; + } + break; + default: + return true; + } + + $scripts = array('jquery.comet.js', 'json2.js', 'updatetimeline.js'); + + foreach ($scripts as $script) { + $action->element('script', array('type' => 'text/javascript', + 'src' => common_path('plugins/Comet/'.$script)), + ' '); + } + + $user = common_current_user(); + + if (!empty($user->id)) { + $user_id = $user->id; + } else { + $user_id = 0; + } + + $replyurl = common_local_url('newnotice'); + $favorurl = common_local_url('favor'); + // FIXME: need to find a better way to pass this pattern in + $deleteurl = common_local_url('deletenotice', + array('notice' => '0000000000')); + + $action->elementStart('script', array('type' => 'text/javascript')); + $action->raw("$(document).ready(function() { updater.init(\"$this->server\", \"$timeline\", $user_id, \"$replyurl\", \"$favorurl\", \"$deleteurl\"); });"); + $action->elementEnd('script'); + + return true; + } + + function onEndNoticeSave($notice) + { + $this->log(LOG_INFO, "Called for save notice."); + + $timelines = array(); + + // XXX: Add other timelines; this is just for the public one + + if ($notice->is_local || + ($notice->is_local == 0 && !common_config('public', 'localonly'))) { + $timelines[] = '/timelines/public'; + } + + $tags = $this->getNoticeTags($notice); + + if (!empty($tags)) { + foreach ($tags as $tag) { + $timelines[] = '/timelines/tag/' . $tag; + } + } + + if (count($timelines) > 0) { + // Require this, since we need it + require_once(INSTALLDIR.'/plugins/Comet/bayeux.class.inc.php'); + + $json = $this->noticeAsJson($notice); + + // Bayeux? Comet? Huh? These terms confuse me + $bay = new Bayeux($this->server, $this->user, $this->password); + + foreach ($timelines as $timeline) { + $this->log(LOG_INFO, "Posting notice $notice->id to '$timeline'."); + $bay->publish($timeline, $json); + } + + $bay = NULL; + } + + return true; + } + + function noticeAsJson($notice) + { + // FIXME: this code should be abstracted to a neutral third + // party, like Notice::asJson(). I'm not sure of the ethics + // of refactoring from within a plugin, so I'm just abusing + // the TwitterApiAction method. Don't do this unless you're me! + + require_once(INSTALLDIR.'/lib/twitterapi.php'); + + $act = new TwitterApiAction('/dev/null'); + + $arr = $act->twitter_status_array($notice, true); + $arr['url'] = $notice->bestUrl(); + $arr['html'] = htmlspecialchars($notice->rendered); + $arr['source'] = htmlspecialchars($arr['source']); + + if (!empty($notice->reply_to)) { + $reply_to = Notice::staticGet('id', $notice->reply_to); + if (!empty($reply_to)) { + $arr['in_reply_to_status_url'] = $reply_to->bestUrl(); + } + $reply_to = null; + } + + $profile = $notice->getProfile(); + $arr['user']['profile_url'] = $profile->profileurl; + + return $arr; + } + + function getNoticeTags($notice) + { + $tags = null; + + $nt = new Notice_tag(); + $nt->notice_id = $notice->id; + + if ($nt->find()) { + $tags = array(); + while ($nt->fetch()) { + $tags[] = $nt->tag; + } + } + + $nt->free(); + $nt = null; + + return $tags; + } + + // Push this up to Plugin + + function log($level, $msg) + { + common_log($level, get_class($this) . ': '.$msg); + } +} diff --git a/plugins/Comet/README b/plugins/Comet/README new file mode 100644 index 000000000..4abd40af7 --- /dev/null +++ b/plugins/Comet/README @@ -0,0 +1,26 @@ +This is a plugin to automatically load notices in the browser no +matter who creates them -- the kind of thing we see with +search.twitter.com, rejaw.com, or FriendFeed's "real time" news. + +NOTE: this is an insecure version; don't roll it out on a production +server. + +It requires a cometd server. I've only had the cometd-java server work +correctly; something's wiggy with the Twisted-based server. + +After you have a cometd server installed, just add this code to your +config.php: + + require_once(INSTALLDIR.'/plugins/Comet/CometPlugin.php'); + $cp = new CometPlugin('http://example.com:8080/cometd/'); + +Change 'example.com:8080' to the name and port of the server you +installed cometd on. + +TODO: + +* Needs to be tested with Ajax submission. Probably messes everything + up. +* Add more timelines: personal inbox and tags would be great. +* Add security. In particular, only let the PHP code publish notices + to the cometd server. Currently, it doesn't try to authenticate. diff --git a/plugins/Comet/bayeux.class.inc.php b/plugins/Comet/bayeux.class.inc.php new file mode 100644 index 000000000..39ad8a8fc --- /dev/null +++ b/plugins/Comet/bayeux.class.inc.php @@ -0,0 +1,134 @@ +<?php +/* + * + * Phomet: a php comet client + * + * Copyright (C) 2008 Morgan 'ARR!' Allen <morganrallen@gmail.com> http://morglog.alleycatracing.com + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +class Bayeux +{ + private $oCurl = ''; + private $nNextId = 0; + + private $sUser = ''; + private $sPassword = ''; + + public $sUrl = ''; + + function __construct($sUrl, $sUser='', $sPassword='') + { + $this->sUrl = $sUrl; + + $this->oCurl = curl_init(); + + $aHeaders = array(); + $aHeaders[] = 'Connection: Keep-Alive'; + + curl_setopt($this->oCurl, CURLOPT_URL, $sUrl); + curl_setopt($this->oCurl, CURLOPT_HTTPHEADER, $aHeaders); + curl_setopt($this->oCurl, CURLOPT_HEADER, 0); + curl_setopt($this->oCurl, CURLOPT_POST, 1); + curl_setopt($this->oCurl, CURLOPT_RETURNTRANSFER,1); + + if (!is_null($sUser) && mb_strlen($sUser) > 0) { + curl_setopt($this->oCurl, CURLOPT_USERPWD,"$sUser:$sPassword"); + } + + $this->handShake(); + } + + function __destruct() + { + $this->disconnect(); + } + + function handShake() + { + $msgHandshake = array(); + $msgHandshake['channel'] = '/meta/handshake'; + $msgHandshake['version'] = "1.0"; + $msgHandshake['minimumVersion'] = "0.9"; + $msgHandshake['supportedConnectionTypes'] = array('long-polling'); + $msgHandshake['id'] = $this->nNextId++; + + curl_setopt($this->oCurl, CURLOPT_POSTFIELDS, "message=".urlencode(str_replace('\\', '', json_encode(array($msgHandshake))))); + + $data = curl_exec($this->oCurl); + + if(curl_errno($this->oCurl)) + die("Error: " . curl_error($this->oCurl)); + + $oReturn = json_decode($data); + + if (is_array($oReturn)) { + $oReturn = $oReturn[0]; + } + + $bSuccessful = ($oReturn->successful) ? true : false; + + if($bSuccessful) + { + $this->clientId = $oReturn->clientId; + + $this->connect(); + } + } + + public function connect() + { + $aMsg['channel'] = '/meta/connect'; + $aMsg['id'] = $this->nNextId++; + $aMsg['clientId'] = $this->clientId; + $aMsg['connectionType'] = 'long-polling'; + + curl_setopt($this->oCurl, CURLOPT_POSTFIELDS, "message=".urlencode(str_replace('\\', '', json_encode(array($aMsg))))); + + $data = curl_exec($this->oCurl); + } + + function disconnect() + { + $msgHandshake = array(); + $msgHandshake['channel'] = '/meta/disconnect'; + $msgHandshake['id'] = $this->nNextId++; + $msgHandshake['clientId'] = $this->clientId; + + curl_setopt($this->oCurl, CURLOPT_POSTFIELDS, "message=".urlencode(str_replace('\\', '', json_encode(array($msgHandshake))))); + + curl_exec($this->oCurl); + } + + public function publish($sChannel, $oData) + { + if(!$sChannel || !$oData) + return; + + $aMsg = array(); + + $aMsg['channel'] = $sChannel; + $aMsg['id'] = $this->nNextId++; + $aMsg['data'] = $oData; + $aMsg['clientId'] = $this->clientId; + + curl_setopt($this->oCurl, CURLOPT_POSTFIELDS, "message=".urlencode(str_replace('\\', '', json_encode(array($aMsg))))); + + $data = curl_exec($this->oCurl); +// var_dump($data); + } +} diff --git a/plugins/Comet/jquery.comet.js b/plugins/Comet/jquery.comet.js new file mode 100644 index 000000000..6de437fa8 --- /dev/null +++ b/plugins/Comet/jquery.comet.js @@ -0,0 +1,1451 @@ +/** + * Copyright 2008 Mort Bay Consulting Pty. Ltd. + * Dual licensed under the Apache License 2.0 and the MIT license. + * ---------------------------------------------------------------------------- + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * http: *www.apache.org/licenses/LICENSE-2.0 + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ---------------------------------------------------------------------------- + * Licensed under the MIT license; + * Permission is hereby granted, free of charge, to any person obtaining + * a copy of this software and associated documentation files (the + * "Software"), to deal in the Software without restriction, including + * without limitation the rights to use, copy, modify, merge, publish, + * distribute, sublicense, and/or sell copies of the Software, and to + * permit persons to whom the Software is furnished to do so, subject to + * the following conditions: + * + * The above copyright notice and this permission notice shall be + * included in all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE + * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION + * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * ---------------------------------------------------------------------------- + * $Revision$ $Date$ + */ +(function($) +{ + /** + * The constructor for a Comet object. + * There is a default Comet instance already created at the variable <code>$.cometd</code>, + * and hence that can be used to start a comet conversation with a server. + * In the rare case a page needs more than one comet conversation, a new instance can be + * created via: + * <pre> + * var url2 = ...; + * var cometd2 = new $.Cometd(); + * cometd2.init(url2); + * </pre> + */ + $.Cometd = function(name) + { + var _name = name || 'default'; + var _logPriorities = { debug: 1, info: 2, warn: 3, error: 4 }; + var _logLevel = 'info'; + var _url; + var _xd = false; + var _transport; + var _status = 'disconnected'; + var _messageId = 0; + var _clientId = null; + var _batch = 0; + var _messageQueue = []; + var _listeners = {}; + var _backoff = 0; + var _backoffIncrement = 1000; + var _maxBackoff = 60000; + var _scheduledSend = null; + var _extensions = []; + var _advice = {}; + var _handshakeProps; + + /** + * Returns the name assigned to this Comet object, or the string 'default' + * if no name has been explicitely passed as parameter to the constructor. + */ + this.getName = function() + { + return _name; + }; + + /** + * Configures the initial comet communication with the comet server. + * @param cometURL the URL of the comet server + */ + this.configure = function(cometURL) + { + _configure(cometURL); + }; + + function _configure(cometURL) + { + _url = cometURL; + _debug('Initializing comet with url: {}', _url); + + // Check immediately if we're cross domain + // If cross domain, the handshake must not send the long polling transport type + var urlParts = /(^https?:)?(\/\/(([^:\/\?#]+)(:(\d+))?))?([^\?#]*)/.exec(cometURL); + if (urlParts[3]) _xd = urlParts[3] != location.host; + + // Temporary setup a transport to send the initial handshake + // The transport may be changed as a result of handshake + if (_xd) + _transport = newCallbackPollingTransport(); + else + _transport = newLongPollingTransport(); + _debug('Initial transport is {}', _transport.getType()); + }; + + /** + * Configures and establishes the comet communication with the comet server + * via a handshake and a subsequent connect. + * @param cometURL the URL of the comet server + * @param handshakeProps an object to be merged with the handshake message + * @see #configure(cometURL) + * @see #handshake(handshakeProps) + */ + this.init = function(cometURL, handshakeProps) + { + _configure(cometURL); + _handshake(handshakeProps); + }; + + /** + * Establishes the comet communication with the comet server + * via a handshake and a subsequent connect. + * @param handshakeProps an object to be merged with the handshake message + */ + this.handshake = function(handshakeProps) + { + _handshake(handshakeProps); + }; + + /** + * Disconnects from the comet server. + * @param disconnectProps an object to be merged with the disconnect message + */ + this.disconnect = function(disconnectProps) + { + var bayeuxMessage = { + channel: '/meta/disconnect' + }; + var message = $.extend({}, disconnectProps, bayeuxMessage); + // Deliver immediately + // The handshake and connect mechanism make use of startBatch(), and in case + // of a failed handshake the disconnect would not be delivered if using _send(). + _setStatus('disconnecting'); + _deliver([message], false); + }; + + /** + * Marks the start of a batch of application messages to be sent to the server + * in a single request, obtaining a single response containing (possibly) many + * application reply messages. + * Messages are held in a queue and not sent until {@link #endBatch()} is called. + * If startBatch() is called multiple times, then an equal number of endBatch() + * calls must be made to close and send the batch of messages. + * @see #endBatch() + */ + this.startBatch = function() + { + _startBatch(); + }; + + /** + * Marks the end of a batch of application messages to be sent to the server + * in a single request. + * @see #startBatch() + */ + this.endBatch = function() + { + _endBatch(true); + }; + + /** + * Subscribes to the given channel, performing the given callback in the given scope + * when a message for the channel arrives. + * @param channel the channel to subscribe to + * @param scope the scope of the callback + * @param callback the callback to call when a message is delivered to the channel + * @param subscribeProps an object to be merged with the subscribe message + * @return the subscription handle to be passed to {@link #unsubscribe(object)} + */ + this.subscribe = function(channel, scope, callback, subscribeProps) + { + var subscription = this.addListener(channel, scope, callback); + + // Send the subscription message after the subscription registration to avoid + // races where the server would deliver a message to the subscribers, but here + // on the client the subscription has not been added yet to the data structures + var bayeuxMessage = { + channel: '/meta/subscribe', + subscription: channel + }; + var message = $.extend({}, subscribeProps, bayeuxMessage); + _send(message); + + return subscription; + }; + + /** + * Unsubscribes the subscription obtained with a call to {@link #subscribe(string, object, function)}. + * @param subscription the subscription to unsubscribe. + */ + this.unsubscribe = function(subscription, unsubscribeProps) + { + // Remove the local listener before sending the message + // This ensures that if the server fails, this client does not get notifications + this.removeListener(subscription); + var bayeuxMessage = { + channel: '/meta/unsubscribe', + subscription: subscription[0] + }; + var message = $.extend({}, unsubscribeProps, bayeuxMessage); + _send(message); + }; + + /** + * Publishes a message on the given channel, containing the given content. + * @param channel the channel to publish the message to + * @param content the content of the message + * @param publishProps an object to be merged with the publish message + */ + this.publish = function(channel, content, publishProps) + { + var bayeuxMessage = { + channel: channel, + data: content + }; + var message = $.extend({}, publishProps, bayeuxMessage); + _send(message); + }; + + /** + * Adds a listener for bayeux messages, performing the given callback in the given scope + * when a message for the given channel arrives. + * @param channel the channel the listener is interested to + * @param scope the scope of the callback + * @param callback the callback to call when a message is delivered to the channel + * @returns the subscription handle to be passed to {@link #removeListener(object)} + * @see #removeListener(object) + */ + this.addListener = function(channel, scope, callback) + { + // The data structure is a map<channel, subscription[]>, where each subscription + // holds the callback to be called and its scope. + + // Normalize arguments + if (!callback) + { + callback = scope; + scope = undefined; + } + + var subscription = { + scope: scope, + callback: callback + }; + + var subscriptions = _listeners[channel]; + if (!subscriptions) + { + subscriptions = []; + _listeners[channel] = subscriptions; + } + // Pushing onto an array appends at the end and returns the id associated with the element increased by 1. + // Note that if: + // a.push('a'); var hb=a.push('b'); delete a[hb-1]; var hc=a.push('c'); + // then: + // hc==3, a.join()=='a',,'c', a.length==3 + var subscriptionIndex = subscriptions.push(subscription) - 1; + _debug('Added listener: channel \'{}\', callback \'{}\', index {}', channel, callback.name, subscriptionIndex); + + // The subscription to allow removal of the listener is made of the channel and the index + return [channel, subscriptionIndex]; + }; + + /** + * Removes the subscription obtained with a call to {@link #addListener(string, object, function)}. + * @param subscription the subscription to unsubscribe. + */ + this.removeListener = function(subscription) + { + var subscriptions = _listeners[subscription[0]]; + if (subscriptions) + { + delete subscriptions[subscription[1]]; + _debug('Removed listener: channel \'{}\', index {}', subscription[0], subscription[1]); + } + }; + + /** + * Removes all listeners registered with {@link #addListener(channel, scope, callback)} or + * {@link #subscribe(channel, scope, callback)}. + */ + this.clearListeners = function() + { + _listeners = {}; + }; + + /** + * Returns a string representing the status of the bayeux communication with the comet server. + */ + this.getStatus = function() + { + return _status; + }; + + /** + * Sets the backoff period used to increase the backoff time when retrying an unsuccessful or failed message. + * Default value is 1 second, which means if there is a persistent failure the retries will happen + * after 1 second, then after 2 seconds, then after 3 seconds, etc. So for example with 15 seconds of + * elapsed time, there will be 5 retries (at 1, 3, 6, 10 and 15 seconds elapsed). + * @param period the backoff period to set + * @see #getBackoffIncrement() + */ + this.setBackoffIncrement = function(period) + { + _backoffIncrement = period; + }; + + /** + * Returns the backoff period used to increase the backoff time when retrying an unsuccessful or failed message. + * @see #setBackoffIncrement(period) + */ + this.getBackoffIncrement = function() + { + return _backoffIncrement; + }; + + /** + * Returns the backoff period to wait before retrying an unsuccessful or failed message. + */ + this.getBackoffPeriod = function() + { + return _backoff; + }; + + /** + * Sets the log level for console logging. + * Valid values are the strings 'error', 'warn', 'info' and 'debug', from + * less verbose to more verbose. + * @param level the log level string + */ + this.setLogLevel = function(level) + { + _logLevel = level; + }; + + /** + * Registers an extension whose callbacks are called for every incoming message + * (that comes from the server to this client implementation) and for every + * outgoing message (that originates from this client implementation for the + * server). + * The format of the extension object is the following: + * <pre> + * { + * incoming: function(message) { ... }, + * outgoing: function(message) { ... } + * } + * Both properties are optional, but if they are present they will be called + * respectively for each incoming message and for each outgoing message. + * </pre> + * @param name the name of the extension + * @param extension the extension to register + * @return true if the extension was registered, false otherwise + * @see #unregisterExtension(name) + */ + this.registerExtension = function(name, extension) + { + var existing = false; + for (var i = 0; i < _extensions.length; ++i) + { + var existingExtension = _extensions[i]; + if (existingExtension.name == name) + { + existing = true; + return false; + } + } + if (!existing) + { + _extensions.push({ + name: name, + extension: extension + }); + _debug('Registered extension \'{}\'', name); + return true; + } + else + { + _info('Could not register extension with name \'{}\': another extension with the same name already exists'); + return false; + } + }; + + /** + * Unregister an extension previously registered with + * {@link #registerExtension(name, extension)}. + * @param name the name of the extension to unregister. + * @return true if the extension was unregistered, false otherwise + */ + this.unregisterExtension = function(name) + { + var unregistered = false; + $.each(_extensions, function(index, extension) + { + if (extension.name == name) + { + _extensions.splice(index, 1); + unregistered = true; + _debug('Unregistered extension \'{}\'', name); + return false; + } + }); + return unregistered; + }; + + /** + * Starts a the batch of messages to be sent in a single request. + * @see _endBatch(deliverMessages) + */ + function _startBatch() + { + ++_batch; + }; + + /** + * Ends the batch of messages to be sent in a single request, + * optionally delivering messages present in the message queue depending + * on the given argument. + * @param deliverMessages whether to deliver the messages in the queue or not + * @see _startBatch() + */ + function _endBatch(deliverMessages) + { + --_batch; + if (_batch < 0) _batch = 0; + if (deliverMessages && _batch == 0 && !_isDisconnected()) + { + var messages = _messageQueue; + _messageQueue = []; + if (messages.length > 0) _deliver(messages, false); + } + }; + + function _nextMessageId() + { + return ++_messageId; + }; + + /** + * Converts the given response into an array of bayeux messages + * @param response the response to convert + * @return an array of bayeux messages obtained by converting the response + */ + function _convertToMessages(response) + { + if (response === undefined) return []; + if (response instanceof Array) return response; + if (response instanceof String || typeof response == 'string') return eval('(' + response + ')'); + if (response instanceof Object) return [response]; + throw 'Conversion Error ' + response + ', typeof ' + (typeof response); + }; + + function _setStatus(newStatus) + { + _debug('{} -> {}', _status, newStatus); + _status = newStatus; + }; + + function _isDisconnected() + { + return _status == 'disconnecting' || _status == 'disconnected'; + }; + + /** + * Sends the initial handshake message + */ + function _handshake(handshakeProps) + { + _debug('Starting handshake'); + _clientId = null; + + // Start a batch. + // This is needed because handshake and connect are async. + // It may happen that the application calls init() then subscribe() + // and the subscribe message is sent before the connect message, if + // the subscribe message is not held until the connect message is sent. + // So here we start a batch to hold temporarly any message until + // the connection is fully established. + _batch = 0; + _startBatch(); + + // Save the original properties provided by the user + // Deep copy to avoid the user to be able to change them later + _handshakeProps = $.extend(true, {}, handshakeProps); + + var bayeuxMessage = { + version: '1.0', + minimumVersion: '0.9', + channel: '/meta/handshake', + supportedConnectionTypes: _xd ? ['callback-polling'] : ['long-polling', 'callback-polling'] + }; + // Do not allow the user to mess with the required properties, + // so merge first the user properties and *then* the bayeux message + var message = $.extend({}, handshakeProps, bayeuxMessage); + + // We started a batch to hold the application messages, + // so here we must bypass it and deliver immediately. + _setStatus('handshaking'); + _deliver([message], false); + }; + + function _findTransport(handshakeResponse) + { + var transportTypes = handshakeResponse.supportedConnectionTypes; + if (_xd) + { + // If we are cross domain, check if the server supports it, that's the only option + if ($.inArray('callback-polling', transportTypes) >= 0) return _transport; + } + else + { + // Check if we can keep long-polling + if ($.inArray('long-polling', transportTypes) >= 0) return _transport; + + // The server does not support long-polling + if ($.inArray('callback-polling', transportTypes) >= 0) return newCallbackPollingTransport(); + } + return null; + }; + + function _delayedHandshake() + { + _setStatus('handshaking'); + _delayedSend(function() + { + _handshake(_handshakeProps); + }); + }; + + function _delayedConnect() + { + _setStatus('connecting'); + _delayedSend(function() + { + _connect(); + }); + }; + + function _delayedSend(operation) + { + _cancelDelayedSend(); + var delay = _backoff; + _debug("Delayed send: backoff {}, interval {}", _backoff, _advice.interval); + if (_advice.interval && _advice.interval > 0) + delay += _advice.interval; + _scheduledSend = _setTimeout(operation, delay); + }; + + function _cancelDelayedSend() + { + if (_scheduledSend !== null) clearTimeout(_scheduledSend); + _scheduledSend = null; + }; + + function _setTimeout(funktion, delay) + { + return setTimeout(function() + { + try + { + funktion(); + } + catch (x) + { + _debug('Exception during scheduled execution of function \'{}\': {}', funktion.name, x); + } + }, delay); + }; + + /** + * Sends the connect message + */ + function _connect() + { + _debug('Starting connect'); + var message = { + channel: '/meta/connect', + connectionType: _transport.getType() + }; + _setStatus('connecting'); + _deliver([message], true); + _setStatus('connected'); + }; + + function _send(message) + { + if (_batch > 0) + _messageQueue.push(message); + else + _deliver([message], false); + }; + + /** + * Delivers the messages to the comet server + * @param messages the array of messages to send + */ + function _deliver(messages, comet) + { + // We must be sure that the messages have a clientId. + // This is not guaranteed since the handshake may take time to return + // (and hence the clientId is not known yet) and the application + // may create other messages. + $.each(messages, function(index, message) + { + message['id'] = _nextMessageId(); + if (_clientId) message['clientId'] = _clientId; + messages[index] = _applyOutgoingExtensions(message); + }); + + var self = this; + var envelope = { + url: _url, + messages: messages, + onSuccess: function(request, response) + { + try + { + _handleSuccess.call(self, request, response, comet); + } + catch (x) + { + _debug('Exception during execution of success callback: {}', x); + } + }, + onFailure: function(request, reason, exception) + { + try + { + _handleFailure.call(self, request, messages, reason, exception, comet); + } + catch (x) + { + _debug('Exception during execution of failure callback: {}', x); + } + } + }; + _debug('Sending request to {}, message(s): {}', envelope.url, JSON.stringify(envelope.messages)); + _transport.send(envelope, comet); + }; + + function _applyIncomingExtensions(message) + { + for (var i = 0; i < _extensions.length; ++i) + { + var extension = _extensions[i]; + var callback = extension.extension.incoming; + if (callback && typeof callback === 'function') + { + _debug('Calling incoming extension \'{}\', callback \'{}\'', extension.name, callback.name); + message = _applyExtension(extension.name, callback, message) || message; + } + } + return message; + }; + + function _applyOutgoingExtensions(message) + { + for (var i = 0; i < _extensions.length; ++i) + { + var extension = _extensions[i]; + var callback = extension.extension.outgoing; + if (callback && typeof callback === 'function') + { + _debug('Calling outgoing extension \'{}\', callback \'{}\'', extension.name, callback.name); + message = _applyExtension(extension.name, callback, message) || message; + } + } + return message; + }; + + function _applyExtension(name, callback, message) + { + try + { + return callback(message); + } + catch (x) + { + _debug('Exception during execution of extension \'{}\': {}', name, x); + return message; + } + }; + + function _handleSuccess(request, response, comet) + { + var messages = _convertToMessages(response); + _debug('Received response {}', JSON.stringify(messages)); + + // Signal the transport it can deliver other queued requests + _transport.complete(request, true, comet); + + for (var i = 0; i < messages.length; ++i) + { + var message = messages[i]; + message = _applyIncomingExtensions(message); + + if (message.advice) _advice = message.advice; + + var channel = message.channel; + switch (channel) + { + case '/meta/handshake': + _handshakeSuccess(message); + break; + case '/meta/connect': + _connectSuccess(message); + break; + case '/meta/disconnect': + _disconnectSuccess(message); + break; + case '/meta/subscribe': + _subscribeSuccess(message); + break; + case '/meta/unsubscribe': + _unsubscribeSuccess(message); + break; + default: + _messageSuccess(message); + break; + } + } + }; + + function _handleFailure(request, messages, reason, exception, comet) + { + var xhr = request.xhr; + _debug('Request failed, status: {}, reason: {}, exception: {}', xhr && xhr.status, reason, exception); + + // Signal the transport it can deliver other queued requests + _transport.complete(request, false, comet); + + for (var i = 0; i < messages.length; ++i) + { + var message = messages[i]; + var channel = message.channel; + switch (channel) + { + case '/meta/handshake': + _handshakeFailure(xhr, message); + break; + case '/meta/connect': + _connectFailure(xhr, message); + break; + case '/meta/disconnect': + _disconnectFailure(xhr, message); + break; + case '/meta/subscribe': + _subscribeFailure(xhr, message); + break; + case '/meta/unsubscribe': + _unsubscribeFailure(xhr, message); + break; + default: + _messageFailure(xhr, message); + break; + } + } + }; + + function _handshakeSuccess(message) + { + if (message.successful) + { + _debug('Handshake successful'); + // Save clientId, figure out transport, then follow the advice to connect + _clientId = message.clientId; + + var newTransport = _findTransport(message); + if (newTransport === null) + { + throw 'Could not agree on transport with server'; + } + else + { + if (_transport.getType() != newTransport.getType()) + { + _debug('Changing transport from {} to {}', _transport.getType(), newTransport.getType()); + _transport = newTransport; + } + } + + // Notify the listeners + // Here the new transport is in place, as well as the clientId, so + // the listener can perform a publish() if it wants, and the listeners + // are notified before the connect below. + _notifyListeners('/meta/handshake', message); + + var action = _advice.reconnect ? _advice.reconnect : 'retry'; + switch (action) + { + case 'retry': + _delayedConnect(); + break; + default: + break; + } + } + else + { + _debug('Handshake unsuccessful'); + + var retry = !_isDisconnected() && _advice.reconnect != 'none'; + if (!retry) _setStatus('disconnected'); + + _notifyListeners('/meta/handshake', message); + _notifyListeners('/meta/unsuccessful', message); + + // Only try again if we haven't been disconnected and + // the advice permits us to retry the handshake + if (retry) + { + _increaseBackoff(); + _debug('Handshake failure, backing off and retrying in {} ms', _backoff); + _delayedHandshake(); + } + } + }; + + function _handshakeFailure(xhr, message) + { + _debug('Handshake failure'); + + // Notify listeners + var failureMessage = { + successful: false, + failure: true, + channel: '/meta/handshake', + request: message, + xhr: xhr, + advice: { + action: 'retry', + interval: _backoff + } + }; + + var retry = !_isDisconnected() && _advice.reconnect != 'none'; + if (!retry) _setStatus('disconnected'); + + _notifyListeners('/meta/handshake', failureMessage); + _notifyListeners('/meta/unsuccessful', failureMessage); + + // Only try again if we haven't been disconnected and the + // advice permits us to try again + if (retry) + { + _increaseBackoff(); + _debug('Handshake failure, backing off and retrying in {} ms', _backoff); + _delayedHandshake(); + } + }; + + function _connectSuccess(message) + { + var action = _isDisconnected() ? 'none' : (_advice.reconnect ? _advice.reconnect : 'retry'); + if (!_isDisconnected()) _setStatus(action == 'retry' ? 'connecting' : 'disconnecting'); + + if (message.successful) + { + _debug('Connect successful'); + + // End the batch and allow held messages from the application + // to go to the server (see _handshake() where we start the batch). + // The batch is ended before notifying the listeners, so that + // listeners can batch other cometd operations + _endBatch(true); + + // Notify the listeners after the status change but before the next connect + _notifyListeners('/meta/connect', message); + + // Connect was successful. + // Normally, the advice will say "reconnect: 'retry', interval: 0" + // and the server will hold the request, so when a response returns + // we immediately call the server again (long polling) + switch (action) + { + case 'retry': + _resetBackoff(); + _delayedConnect(); + break; + default: + _resetBackoff(); + _setStatus('disconnected'); + break; + } + } + else + { + _debug('Connect unsuccessful'); + + // Notify the listeners after the status change but before the next action + _notifyListeners('/meta/connect', message); + _notifyListeners('/meta/unsuccessful', message); + + // Connect was not successful. + // This may happen when the server crashed, the current clientId + // will be invalid, and the server will ask to handshake again + switch (action) + { + case 'retry': + _increaseBackoff(); + _delayedConnect(); + break; + case 'handshake': + // End the batch but do not deliver the messages until we connect successfully + _endBatch(false); + _resetBackoff(); + _delayedHandshake(); + break; + case 'none': + _resetBackoff(); + _setStatus('disconnected'); + break; + } + } + }; + + function _connectFailure(xhr, message) + { + _debug('Connect failure'); + + // Notify listeners + var failureMessage = { + successful: false, + failure: true, + channel: '/meta/connect', + request: message, + xhr: xhr, + advice: { + action: 'retry', + interval: _backoff + } + }; + _notifyListeners('/meta/connect', failureMessage); + _notifyListeners('/meta/unsuccessful', failureMessage); + + if (!_isDisconnected()) + { + var action = _advice.reconnect ? _advice.reconnect : 'retry'; + switch (action) + { + case 'retry': + _increaseBackoff(); + _debug('Connect failure, backing off and retrying in {} ms', _backoff); + _delayedConnect(); + break; + case 'handshake': + _resetBackoff(); + _delayedHandshake(); + break; + case 'none': + _resetBackoff(); + break; + default: + _debug('Unrecognized reconnect value: {}', action); + break; + } + } + }; + + function _disconnectSuccess(message) + { + if (message.successful) + { + _debug('Disconnect successful'); + _disconnect(false); + _notifyListeners('/meta/disconnect', message); + } + else + { + _debug('Disconnect unsuccessful'); + _disconnect(true); + _notifyListeners('/meta/disconnect', message); + _notifyListeners('/meta/usuccessful', message); + } + }; + + function _disconnect(abort) + { + _cancelDelayedSend(); + if (abort) _transport.abort(); + _clientId = null; + _setStatus('disconnected'); + _batch = 0; + _messageQueue = []; + _resetBackoff(); + }; + + function _disconnectFailure(xhr, message) + { + _debug('Disconnect failure'); + _disconnect(true); + + var failureMessage = { + successful: false, + failure: true, + channel: '/meta/disconnect', + request: message, + xhr: xhr, + advice: { + action: 'none', + interval: 0 + } + }; + _notifyListeners('/meta/disconnect', failureMessage); + _notifyListeners('/meta/unsuccessful', failureMessage); + }; + + function _subscribeSuccess(message) + { + if (message.successful) + { + _debug('Subscribe successful'); + _notifyListeners('/meta/subscribe', message); + } + else + { + _debug('Subscribe unsuccessful'); + _notifyListeners('/meta/subscribe', message); + _notifyListeners('/meta/unsuccessful', message); + } + }; + + function _subscribeFailure(xhr, message) + { + _debug('Subscribe failure'); + + var failureMessage = { + successful: false, + failure: true, + channel: '/meta/subscribe', + request: message, + xhr: xhr, + advice: { + action: 'none', + interval: 0 + } + }; + _notifyListeners('/meta/subscribe', failureMessage); + _notifyListeners('/meta/unsuccessful', failureMessage); + }; + + function _unsubscribeSuccess(message) + { + if (message.successful) + { + _debug('Unsubscribe successful'); + _notifyListeners('/meta/unsubscribe', message); + } + else + { + _debug('Unsubscribe unsuccessful'); + _notifyListeners('/meta/unsubscribe', message); + _notifyListeners('/meta/unsuccessful', message); + } + }; + + function _unsubscribeFailure(xhr, message) + { + _debug('Unsubscribe failure'); + + var failureMessage = { + successful: false, + failure: true, + channel: '/meta/unsubscribe', + request: message, + xhr: xhr, + advice: { + action: 'none', + interval: 0 + } + }; + _notifyListeners('/meta/unsubscribe', failureMessage); + _notifyListeners('/meta/unsuccessful', failureMessage); + }; + + function _messageSuccess(message) + { + if (message.successful === undefined) + { + if (message.data) + { + // It is a plain message, and not a bayeux meta message + _notifyListeners(message.channel, message); + } + else + { + _debug('Unknown message {}', JSON.stringify(message)); + } + } + else + { + if (message.successful) + { + _debug('Publish successful'); + _notifyListeners('/meta/publish', message); + } + else + { + _debug('Publish unsuccessful'); + _notifyListeners('/meta/publish', message); + _notifyListeners('/meta/unsuccessful', message); + } + } + }; + + function _messageFailure(xhr, message) + { + _debug('Publish failure'); + + var failureMessage = { + successful: false, + failure: true, + channel: message.channel, + request: message, + xhr: xhr, + advice: { + action: 'none', + interval: 0 + } + }; + _notifyListeners('/meta/publish', failureMessage); + _notifyListeners('/meta/unsuccessful', failureMessage); + }; + + function _notifyListeners(channel, message) + { + // Notify direct listeners + _notify(channel, message); + + // Notify the globbing listeners + var channelParts = channel.split("/"); + var last = channelParts.length - 1; + for (var i = last; i > 0; --i) + { + var channelPart = channelParts.slice(0, i).join('/') + '/*'; + // We don't want to notify /foo/* if the channel is /foo/bar/baz, + // so we stop at the first non recursive globbing + if (i == last) _notify(channelPart, message); + // Add the recursive globber and notify + channelPart += '*'; + _notify(channelPart, message); + } + }; + + function _notify(channel, message) + { + var subscriptions = _listeners[channel]; + if (subscriptions && subscriptions.length > 0) + { + for (var i = 0; i < subscriptions.length; ++i) + { + var subscription = subscriptions[i]; + // Subscriptions may come and go, so the array may have 'holes' + if (subscription) + { + try + { + _debug('Notifying subscription: channel \'{}\', callback \'{}\'', channel, subscription.callback.name); + subscription.callback.call(subscription.scope, message); + } + catch (x) + { + // Ignore exceptions from callbacks + _warn('Exception during execution of callback \'{}\' on channel \'{}\' for message {}, exception: {}', subscription.callback.name, channel, JSON.stringify(message), x); + } + } + } + } + }; + + function _resetBackoff() + { + _backoff = 0; + }; + + function _increaseBackoff() + { + if (_backoff < _maxBackoff) _backoff += _backoffIncrement; + }; + + var _error = this._error = function(text, args) + { + _log('error', _format.apply(this, arguments)); + }; + + var _warn = this._warn = function(text, args) + { + _log('warn', _format.apply(this, arguments)); + }; + + var _info = this._info = function(text, args) + { + _log('info', _format.apply(this, arguments)); + }; + + var _debug = this._debug = function(text, args) + { + _log('debug', _format.apply(this, arguments)); + }; + + function _log(level, text) + { + var priority = _logPriorities[level]; + var configPriority = _logPriorities[_logLevel]; + if (!configPriority) configPriority = _logPriorities['info']; + if (priority >= configPriority) + { + if (window.console) window.console.log(text); + } + }; + + function _format(text) + { + var braces = /\{\}/g; + var result = ''; + var start = 0; + var count = 0; + while (braces.test(text)) + { + result += text.substr(start, braces.lastIndex - start - 2); + var arg = arguments[++count]; + result += arg !== undefined ? arg : '{}'; + start = braces.lastIndex; + } + result += text.substr(start, text.length - start); + return result; + }; + + function newLongPollingTransport() + { + return $.extend({}, new Transport('long-polling'), new LongPollingTransport()); + }; + + function newCallbackPollingTransport() + { + return $.extend({}, new Transport('callback-polling'), new CallbackPollingTransport()); + }; + + /** + * Base object with the common functionality for transports. + * The key responsibility is to allow at most 2 outstanding requests to the server, + * to avoid that requests are sent behind a long poll. + * To achieve this, we have one reserved request for the long poll, and all other + * requests are serialized one after the other. + */ + var Transport = function(type) + { + var _maxRequests = 2; + var _requestIds = 0; + var _cometRequest = null; + var _requests = []; + var _packets = []; + + this.getType = function() + { + return type; + }; + + this.send = function(packet, comet) + { + if (comet) + _cometSend(this, packet); + else + _send(this, packet); + }; + + function _cometSend(self, packet) + { + if (_cometRequest !== null) throw 'Concurrent comet requests not allowed, request ' + _cometRequest.id + ' not yet completed'; + + var requestId = ++_requestIds; + _debug('Beginning comet request {}', requestId); + + var request = {id: requestId}; + _debug('Delivering comet request {}', requestId); + self.deliver(packet, request); + _cometRequest = request; + }; + + function _send(self, packet) + { + var requestId = ++_requestIds; + _debug('Beginning request {}, {} other requests, {} queued requests', requestId, _requests.length, _packets.length); + + var request = {id: requestId}; + // Consider the comet request which should always be present + if (_requests.length < _maxRequests - 1) + { + _debug('Delivering request {}', requestId); + self.deliver(packet, request); + _requests.push(request); + } + else + { + _packets.push([packet, request]); + _debug('Queued request {}, {} queued requests', requestId, _packets.length); + } + }; + + this.complete = function(request, success, comet) + { + if (comet) + _cometComplete(request); + else + _complete(this, request, success); + }; + + function _cometComplete(request) + { + var requestId = request.id; + if (_cometRequest !== request) throw 'Comet request mismatch, completing request ' + requestId; + + // Reset comet request + _cometRequest = null; + _debug('Ended comet request {}', requestId); + }; + + function _complete(self, request, success) + { + var requestId = request.id; + var index = $.inArray(request, _requests); + // The index can be negative the request has been aborted + if (index >= 0) _requests.splice(index, 1); + _debug('Ended request {}, {} other requests, {} queued requests', requestId, _requests.length, _packets.length); + + if (_packets.length > 0) + { + var packet = _packets.shift(); + if (success) + { + _debug('Dequeueing and sending request {}, {} queued requests', packet[1].id, _packets.length); + _send(self, packet[0]); + } + else + { + _debug('Dequeueing and failing request {}, {} queued requests', packet[1].id, _packets.length); + // Keep the semantic of calling response callbacks asynchronously after the request + setTimeout(function() { packet[0].onFailure(packet[1], 'error'); }, 0); + } + } + }; + + this.abort = function() + { + for (var i = 0; i < _requests.length; ++i) + { + var request = _requests[i]; + _debug('Aborting request {}', request.id); + if (request.xhr) request.xhr.abort(); + } + if (_cometRequest) + { + _debug('Aborting comet request {}', _cometRequest.id); + if (_cometRequest.xhr) _cometRequest.xhr.abort(); + } + _cometRequest = null; + _requests = []; + _packets = []; + }; + }; + + var LongPollingTransport = function() + { + this.deliver = function(packet, request) + { + request.xhr = $.ajax({ + url: packet.url, + type: 'POST', + contentType: 'text/json;charset=UTF-8', + beforeSend: function(xhr) + { + xhr.setRequestHeader('Connection', 'Keep-Alive'); + return true; + }, + data: JSON.stringify(packet.messages), + success: function(response) { packet.onSuccess(request, response); }, + error: function(xhr, reason, exception) { packet.onFailure(request, reason, exception); } + }); + }; + }; + + var CallbackPollingTransport = function() + { + var _maxLength = 2000; + this.deliver = function(packet, request) + { + // Microsoft Internet Explorer has a 2083 URL max length + // We must ensure that we stay within that length + var messages = JSON.stringify(packet.messages); + // Encode the messages because all brackets, quotes, commas, colons, etc + // present in the JSON will be URL encoded, taking many more characters + var urlLength = packet.url.length + encodeURI(messages).length; + _debug('URL length: {}', urlLength); + // Let's stay on the safe side and use 2000 instead of 2083 + // also because we did not count few characters among which + // the parameter name 'message' and the parameter 'jsonp', + // which sum up to about 50 chars + if (urlLength > _maxLength) + { + var x = packet.messages.length > 1 ? + 'Too many bayeux messages in the same batch resulting in message too big ' + + '(' + urlLength + ' bytes, max is ' + _maxLength + ') for transport ' + this.getType() : + 'Bayeux message too big (' + urlLength + ' bytes, max is ' + _maxLength + ') ' + + 'for transport ' + this.getType(); + // Keep the semantic of calling response callbacks asynchronously after the request + _setTimeout(function() { packet.onFailure(request, 'error', x); }, 0); + } + else + { + $.ajax({ + url: packet.url, + type: 'GET', + dataType: 'jsonp', + jsonp: 'jsonp', + beforeSend: function(xhr) + { + xhr.setRequestHeader('Connection', 'Keep-Alive'); + return true; + }, + data: + { + // In callback-polling, the content must be sent via the 'message' parameter + message: messages + }, + success: function(response) { packet.onSuccess(request, response); }, + error: function(xhr, reason, exception) { packet.onFailure(request, reason, exception); } + }); + } + }; + }; + }; + + /** + * The JS object that exposes the comet API to applications + */ + $.cometd = new $.Cometd(); // The default instance + +})(jQuery); diff --git a/plugins/Comet/json2.js b/plugins/Comet/json2.js new file mode 100644 index 000000000..7e27df518 --- /dev/null +++ b/plugins/Comet/json2.js @@ -0,0 +1,478 @@ +/* + http://www.JSON.org/json2.js + 2009-04-16 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + This file creates a global JSON object containing two methods: stringify + and parse. + + JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or ' '), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the object holding the key. + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be + used to select the members to be serialized. It filters the results + such that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. +*/ + +/*jslint evil: true */ + +/*global JSON */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, + call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +if (!this.JSON) { + JSON = {}; +} +(function () { + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function (key) { + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function (key) { + return this.valueOf(); + }; + } + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? + '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : + '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : + gap ? '[\n' + gap + + partial.join(',\n' + gap) + '\n' + + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + k = rep[i]; + if (typeof k === 'string') { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : + gap ? '{\n' + gap + partial.join(',\n' + gap) + '\n' + + mind + '}' : '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== 'function') { + JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/. +test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@'). +replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']'). +replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + } +}()); diff --git a/plugins/Comet/updatetimeline.js b/plugins/Comet/updatetimeline.js new file mode 100644 index 000000000..170949e9b --- /dev/null +++ b/plugins/Comet/updatetimeline.js @@ -0,0 +1,154 @@ +// update the local timeline from a Comet server +// + +var updater = function() +{ + var _server; + var _timeline; + var _userid; + var _replyurl; + var _favorurl; + var _deleteurl; + var _cometd; + + return { + init: function(server, timeline, userid, replyurl, favorurl, deleteurl) + { + _cometd = $.cometd; // Uses the default Comet object + _cometd.setLogLevel('debug'); + _cometd.init(server); + _server = server; + _timeline = timeline; + _userid = userid; + _favorurl = favorurl; + _replyurl = replyurl; + _deleteurl = deleteurl; + _cometd.subscribe(timeline, receive); + $(window).unload(leave); + } + } + + function leave() + { + _cometd.disconnect(); + } + + function receive(message) + { + id = message.data.id; + + // Don't add it if it already exists + + if ($("#notice-"+id).length > 0) { + return; + } + + var noticeItem = makeNoticeItem(message.data); + $("#notices_primary .notices").prepend(noticeItem, true); + $("#notices_primary .notice:first").css({display:"none"}); + $("#notices_primary .notice:first").fadeIn(1000); + NoticeHover(); + NoticeReply(); + } + + function makeNoticeItem(data) + { + user = data['user']; + html = data['html'].replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"'); + source = data['source'].replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"'); + + ni = "<li class=\"hentry notice\" id=\"notice-"+data['id']+"\">"+ + "<div class=\"entry-title\">"+ + "<span class=\"vcard author\">"+ + "<a href=\""+user['profile_url']+"\" class=\"url\">"+ + "<img src=\""+user['profile_image_url']+"\" class=\"avatar photo\" width=\"48\" height=\"48\" alt=\""+user['screen_name']+"\"/>"+ + "<span class=\"nickname fn\">"+user['screen_name']+"</span>"+ + "</a>"+ + "</span>"+ + "<p class=\"entry-content\">"+html+"</p>"+ + "</div>"+ + "<div class=\"entry-content\">"+ + "<dl class=\"timestamp\">"+ + "<dt>Published</dt>"+ + "<dd>"+ + "<a rel=\"bookmark\" href=\""+data['url']+"\" >"+ + "<abbr class=\"published\" title=\""+data['created_at']+"\">a few seconds ago</abbr>"+ + "</a> "+ + "</dd>"+ + "</dl>"+ + "<dl class=\"device\">"+ + "<dt>From</dt> "+ + "<dd>"+source+"</dd>"+ // may have a link, I think + "</dl>"; + + if (data['in_reply_to_status_id']) { + ni = ni+" <dl class=\"response\">"+ + "<dt>To</dt>"+ + "<dd>"+ + "<a href=\""+data['in_reply_to_status_url']+"\" rel=\"in-reply-to\">in reply to</a>"+ + "</dd>"+ + "</dl>"; + } + + ni = ni+"</div>"+ + "<div class=\"notice-options\">"; + + if (_userid != 0) { + var input = $("form#form_notice fieldset input#token"); + var session_key = input.val(); + ni = ni+makeFavoriteForm(data['id'], session_key); + ni = ni+makeReplyLink(data['id'], data['user']['screen_name']); + if (_userid == data['user']['id']) { + ni = ni+makeDeleteLink(data['id']); + } + } + + ni = ni+"</div>"+ + "</li>"; + return ni; + } + + function makeFavoriteForm(id, session_key) + { + var ff; + + ff = "<form id=\"favor-"+id+"\" class=\"form_favor\" method=\"post\" action=\""+_favorurl+"\">"+ + "<fieldset>"+ + "<legend>Favor this notice</legend>"+ // XXX: i18n + "<input name=\"token-"+id+"\" type=\"hidden\" id=\"token-"+id+"\" value=\""+session_key+"\"/>"+ + "<input name=\"notice\" type=\"hidden\" id=\"notice-n"+id+"\" value=\""+id+"\"/>"+ + "<input type=\"submit\" id=\"favor-submit-"+id+"\" name=\"favor-submit-"+id+"\" class=\"submit\" value=\"Favor\" title=\"Favor this notice\"/>"+ + "</fieldset>"+ + "</form>"; + return ff; + } + + function makeReplyLink(id, nickname) + { + var rl; + rl = "<dl class=\"notice_reply\">"+ + "<dt>Reply to this notice</dt>"+ + "<dd>"+ + "<a href=\""+_replyurl+"?replyto="+nickname+"\" title=\"Reply to this notice\">Reply <span class=\"notice_id\">"+id+"</span>"+ + "</a>"+ + "</dd>"+ + "</dl>"; + return rl; + } + + function makeDeleteLink(id) + { + var dl, delurl; + delurl = _deleteurl.replace("0000000000", id); + + dl = "<dl class=\"notice_delete\">"+ + "<dt>Delete this notice</dt>"+ + "<dd>"+ + "<a href=\""+delurl+"\" title=\"Delete this notice\">Delete</a>"+ + "</dd>"+ + "</dl>"; + + return dl; + } +}(); + diff --git a/plugins/WikiHashtagsPlugin.php b/plugins/WikiHashtagsPlugin.php new file mode 100644 index 000000000..6d186a5fe --- /dev/null +++ b/plugins/WikiHashtagsPlugin.php @@ -0,0 +1,109 @@ +<?php +/** + * Laconica, the distributed open-source microblogging tool + * + * Plugin to show WikiHashtags content in the sidebar + * + * PHP version 5 + * + * LICENCE: 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 <http://www.gnu.org/licenses/>. + * + * @category Plugin + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @copyright 2008 Control Yourself, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + */ + +if (!defined('LACONICA')) { + exit(1); +} + +define('WIKIHASHTAGSPLUGIN_VERSION', '0.1'); + +/** + * Plugin to use WikiHashtags + * + * @category Plugin + * @package Laconica + * @author Evan Prodromou <evan@controlyourself.ca> + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 + * @link http://laconi.ca/ + * + * @see Event + */ + +class WikiHashtagsPlugin extends Plugin +{ + function __construct($code=null) + { + parent::__construct(); + } + + function onStartShowSections($action) + { + $name = $action->trimmed('action'); + + if ($name == 'tag') { + + $taginput = $action->trimmed('tag'); + $tag = common_canonical_tag($taginput); + + if (!empty($tag)) { + + $url = sprintf('http://hashtags.wikia.com/index.php?title=%s&action=render', + urlencode($tag)); + $editurl = sprintf('http://hashtags.wikia.com/index.php?title=%s&action=edit', + urlencode($tag)); + + $context = stream_context_create(array('http' => array('method' => "GET", + 'header' => + "User-Agent: " . $this->userAgent()))); + $html = @file_get_contents($url, false, $context); + + $action->elementStart('div', array('id' => 'wikihashtags', 'class' => 'section')); + + if (!empty($html)) { + $action->element('style', null, + "span.editsection { display: none }\n". + "table.toc { display: none }"); + $action->raw($html); + $action->elementStart('p'); + $action->element('a', array('href' => $editurl, + 'title' => sprintf(_('Edit the article for #%s on WikiHashtags'), $tag)), + _('Edit')); + $action->element('a', array('href' => 'http://www.gnu.org/copyleft/fdl.html', + 'title' => _('Shared under the terms of the GNU Free Documentation License'), + 'rel' => 'license'), + 'GNU FDL'); + $action->elementEnd('p'); + } else { + $action->element('a', array('href' => $editurl), + sprintf(_('Start the article for #%s on WikiHashtags'), $tag)); + } + + $action->elementEnd('div'); + } + } + + return true; + } + + function userAgent() + { + return 'WikiHashtagsPlugin/'.WIKIHASHTAGSPLUGIN_VERSION . + ' Laconica/' . LACONICA_VERSION; + } +} diff --git a/scripts/getvaliddaemons.php b/scripts/getvaliddaemons.php new file mode 100755 index 000000000..482e63af7 --- /dev/null +++ b/scripts/getvaliddaemons.php @@ -0,0 +1,52 @@ +#!/usr/bin/env php +<?php +/* + * Laconica - a distributed open-source microblogging tool + * Copyright (C) 2008, Controlez-Vous, 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 <http://www.gnu.org/licenses/>. + */ + +/** + * Utility script to get a list of daemons that should run, based on the + * current configuration. This is used by startdaemons.sh to determine what + * it should and shouldn't start up. The output is a list of space-separated + * daemon names. + */ + + +# 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__) . '/..')); +define('LACONICA', true); + +require_once(INSTALLDIR . '/lib/common.php'); + +if(common_config('xmpp','enabled')) { + echo "xmppdaemon.php jabberqueuehandler.php publicqueuehandler.php "; + echo "xmppconfirmhandler.php "; +} +if(common_config('memcached','enabled')) { + echo "memcachedqueuehandler.php "; +} +echo "ombqueuehandler.php "; +echo "twitterqueuehandler.php "; +echo "facebookqueuehandler.php "; +echo "pingqueuehandler.php "; +echo "inboxqueuehandler.php "; +echo "smsqueuehandler.php "; diff --git a/scripts/inboxqueuehandler.php b/scripts/inboxqueuehandler.php new file mode 100755 index 000000000..73d31e854 --- /dev/null +++ b/scripts/inboxqueuehandler.php @@ -0,0 +1,69 @@ +#!/usr/bin/env php +<?php +/* + * Laconica - a distributed open-source microblogging tool + * Copyright (C) 2008,2009 Control Yourself, 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 <http://www.gnu.org/licenses/>. + */ + +// 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__) . '/..')); +define('LACONICA', true); + +require_once(INSTALLDIR . '/lib/common.php'); +require_once(INSTALLDIR . '/lib/queuehandler.php'); + +set_error_handler('common_error_handler'); + +class InboxQueueHandler extends QueueHandler +{ + function transport() + { + return 'inbox'; + } + + function start() { + $this->log(LOG_INFO, "INITIALIZE"); + return true; + } + + function handle_notice($notice) + { + $this->log(LOG_INFO, "Distributing notice to inboxes for $notice->id"); + $notice->addToInboxes(); + $notice->blowSubsCache(); + return true; + } + + function finish() { + } +} + +ini_set("max_execution_time", "0"); +ini_set("max_input_time", "0"); +set_time_limit(0); +mb_internal_encoding('UTF-8'); + +$id = ($argc > 1) ? $argv[1] : null; + +$handler = new InboxQueueHandler($id); + +$handler->runOnce(); diff --git a/scripts/jabberqueuehandler.php b/scripts/jabberqueuehandler.php index 924fc4545..8b6e974c0 100755 --- a/scripts/jabberqueuehandler.php +++ b/scripts/jabberqueuehandler.php @@ -54,6 +54,13 @@ class JabberQueueHandler extends XmppQueueHandler } } +// Abort immediately if xmpp is not enabled, otherwise the daemon chews up +// lots of CPU trying to connect to unconfigured servers +if (common_config('xmpp','enabled')==false) { + print "Aborting daemon - xmpp is disabled\n"; + exit(); +} + ini_set("max_execution_time", "0"); ini_set("max_input_time", "0"); set_time_limit(0); @@ -63,4 +70,4 @@ $resource = ($argc > 1) ? $argv[1] : (common_config('xmpp','resource') . '-queue $handler = new JabberQueueHandler($resource); -$handler->runOnce();
\ No newline at end of file +$handler->runOnce(); diff --git a/scripts/memcachedqueuehandler.php b/scripts/memcachedqueuehandler.php new file mode 100755 index 000000000..185b781f7 --- /dev/null +++ b/scripts/memcachedqueuehandler.php @@ -0,0 +1,70 @@ +#!/usr/bin/env php +<?php +/* + * Laconica - a distributed open-source microblogging tool + * Copyright (C) 2008,2009 Control Yourself, 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 <http://www.gnu.org/licenses/>. + */ + +// 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__) . '/..')); +define('LACONICA', true); + +require_once(INSTALLDIR . '/lib/common.php'); +require_once(INSTALLDIR . '/lib/queuehandler.php'); + +set_error_handler('common_error_handler'); + +class MemcachedQueueHandler extends QueueHandler +{ + function transport() + { + return 'memcache'; + } + + function start() { + $this->log(LOG_INFO, "INITIALIZE"); + return true; + } + + function handle_notice($notice) + { + // XXX: fork here + $this->log(LOG_INFO, "Blowing memcached for $notice->id"); + $notice->blowCaches(); + return true; + } + + function finish() { + } + +} + +ini_set("max_execution_time", "0"); +ini_set("max_input_time", "0"); +set_time_limit(0); +mb_internal_encoding('UTF-8'); + +$id = ($argc > 1) ? $argv[1] : null; + +$handler = new MemcachedQueueHandler($id); + +$handler->runOnce(); diff --git a/scripts/publicqueuehandler.php b/scripts/publicqueuehandler.php index 5075c12df..b0fa22d43 100755 --- a/scripts/publicqueuehandler.php +++ b/scripts/publicqueuehandler.php @@ -52,6 +52,13 @@ class PublicQueueHandler extends XmppQueueHandler } } +// Abort immediately if xmpp is not enabled, otherwise the daemon chews up +// lots of CPU trying to connect to unconfigured servers +if (common_config('xmpp','enabled')==false) { + print "Aborting daemon - xmpp is disabled\n"; + exit(); +} + ini_set("max_execution_time", "0"); ini_set("max_input_time", "0"); set_time_limit(0); diff --git a/scripts/startdaemons.sh b/scripts/startdaemons.sh index c3729761d..3869e95c4 100755 --- a/scripts/startdaemons.sh +++ b/scripts/startdaemons.sh @@ -21,10 +21,9 @@ # Note that the 'maildaemon' needs to run as a mail filter. DIR=`dirname $0` +DAEMONS=`php $DIR/getvaliddaemons.php` -for f in xmppdaemon.php jabberqueuehandler.php publicqueuehandler.php \ - xmppconfirmhandler.php smsqueuehandler.php ombqueuehandler.php \ - twitterqueuehandler.php facebookqueuehandler.php pingqueuehandler.php; do +for f in $DAEMONS; do echo -n "Starting $f..."; php $DIR/$f diff --git a/scripts/stopdaemons.sh b/scripts/stopdaemons.sh index 2bb8f9ecb..f6d71eddf 100755 --- a/scripts/stopdaemons.sh +++ b/scripts/stopdaemons.sh @@ -24,7 +24,8 @@ SDIR=`dirname $0` DIR=`php $SDIR/getpiddir.php` for f in jabberhandler ombhandler publichandler smshandler pinghandler \ - xmppconfirmhandler xmppdaemon twitterhandler facebookhandler ; do + xmppconfirmhandler xmppdaemon twitterhandler facebookhandler \ + memcachehandler inboxhandler; do FILES="$DIR/$f.*.pid" for ff in "$FILES" ; do diff --git a/scripts/synctwitterfriends.php b/scripts/synctwitterfriends.php index 794301f0f..bd08ba58d 100755 --- a/scripts/synctwitterfriends.php +++ b/scripts/synctwitterfriends.php @@ -32,8 +32,25 @@ define('LACONICA', true); require_once(INSTALLDIR . '/lib/common.php'); +// Make a lockfile +$lockfilename = lockFilename(); +if (!($lockfile = @fopen($lockfilename, "w"))) { + print "Already running... exiting.\n"; + exit(1); +} + +// Obtain an exlcusive lock on file (will fail if script is already going) +if (!@flock( $lockfile, LOCK_EX | LOCK_NB, &$wouldblock) || $wouldblock) { + // Script already running - abort + @fclose($lockfile); + print "Already running... exiting.\n"; + exit(1); +} + $flink = new Foreign_link(); $flink->service = 1; // Twitter +$flink->orderBy('last_friendsync'); +$flink->limit(25); // sync this many users during this run $cnt = $flink->find(); print "Updating Twitter friends subscriptions for $cnt users.\n"; @@ -60,8 +77,11 @@ while ($flink->fetch()) { continue; } - $result = save_twitter_friends($user, $fuser->id, - $fuser->nickname, $flink->credentials); + save_twitter_friends($user, $fuser->id, $fuser->nickname, $flink->credentials); + + $flink->last_friendsync = common_sql_now(); + $flink->update(); + if (defined('SCRIPT_DEBUG')) { print "\nDONE\n"; } else { @@ -70,4 +90,18 @@ while ($flink->fetch()) { } } +function lockFilename() +{ + $piddir = common_config('daemon', 'piddir'); + if (!$piddir) { + $piddir = '/var/run'; + } + + return $piddir . '/synctwitterfriends.lock'; +} + +// Cleanup +fclose($lockfile); +unlink($lockfilename); + exit(0); diff --git a/scripts/triminboxes.php b/scripts/triminboxes.php new file mode 100644 index 000000000..0d2eaeaf0 --- /dev/null +++ b/scripts/triminboxes.php @@ -0,0 +1,83 @@ +#!/usr/bin/env php +<?php +/* + * Laconica - a distributed open-source microblogging tool + * Copyright (C) 2009, Control Yourself, 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 <http://www.gnu.org/licenses/>. + */ + +# 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(1); +} + +ini_set("max_execution_time", "0"); +ini_set("max_input_time", "0"); +set_time_limit(0); +mb_internal_encoding('UTF-8'); + +define('INSTALLDIR', realpath(dirname(__FILE__) . '/..')); +define('LACONICA', true); + +require_once(INSTALLDIR . '/lib/common.php'); + +$user = new User(); +if ($argc > 1) { + $user->whereAdd('id > ' . $argv[1]); +} +$cnt = $user->find(); + +while ($user->fetch()) { + + $inbox_entry = new Notice_inbox(); + $inbox_entry->user_id = $user->id; + $inbox_entry->orderBy('created DESC'); + $inbox_entry->limit(1000, 1); + + $id = null; + + if ($inbox_entry->find(true)) { + $id = $inbox_entry->notice_id; + } + + $inbox_entry->free(); + unset($inbox_entry); + + if (is_null($id)) { + continue; + } + + $start = microtime(true); + + $old_inbox = new Notice_inbox(); + $cnt = $old_inbox->query('DELETE from notice_inbox WHERE user_id = ' . $user->id . ' AND notice_id < ' . $id); + $old_inbox->free(); + unset($old_inbox); + + print "Deleted $cnt notices for $user->nickname ($user->id).\n"; + + $finish = microtime(true); + + $delay = 3.0 * ($finish - $start); + + print "Delaying $delay seconds..."; + + // Wait to let slaves catch up + + usleep($delay * 1000000); + + print "DONE.\n"; +} diff --git a/scripts/xmppconfirmhandler.php b/scripts/xmppconfirmhandler.php index 2b8b085ce..7f39235fe 100755 --- a/scripts/xmppconfirmhandler.php +++ b/scripts/xmppconfirmhandler.php @@ -140,6 +140,13 @@ class XmppConfirmHandler extends XmppQueueHandler } } +// Abort immediately if xmpp is not enabled, otherwise the daemon chews up +// lots of CPU trying to connect to unconfigured servers +if (common_config('xmpp','enabled')==false) { + print "Aborting daemon - xmpp is disabled\n"; + exit(); +} + ini_set("max_execution_time", "0"); ini_set("max_input_time", "0"); set_time_limit(0); diff --git a/scripts/xmppdaemon.php b/scripts/xmppdaemon.php index ef3f8c63d..b79fa1b3b 100755 --- a/scripts/xmppdaemon.php +++ b/scripts/xmppdaemon.php @@ -152,11 +152,6 @@ class XMPPDaemon extends Daemon $body = preg_replace('/d[\ ]*('. $to .')[\ ]*/', '', $pl['body']); $this->add_direct($user, $body, $to, $from); } else { - $len = mb_strlen($pl['body']); - if($len > 140) { - $this->from_site($from, 'Message too long - maximum is 140 characters, you sent ' . $len); - return; - } $this->add_notice($user, $pl); } @@ -255,15 +250,13 @@ class XMPPDaemon extends Daemon function add_notice(&$user, &$pl) { $body = trim($pl['body']); - $content_shortened = common_shorten_link($body); + $content_shortened = common_shorten_links($body); if (mb_strlen($content_shortened) > 140) { - $content = trim(mb_substr($body, 0, 140)); - $content_shortened = common_shorten_link($content); - } - else { - $content = $body; + $from = jabber_normalize_jid($pl['from']); + $this->from_site($from, "Message too long - maximum is 140 characters, you sent ".mb_strlen($content_shortened)); + return; } - $notice = Notice::saveNew($user->id, $content, 'xmpp'); + $notice = Notice::saveNew($user->id, $content_shortened, 'xmpp'); if (is_string($notice)) { $this->log(LOG_ERR, $notice); return; @@ -321,6 +314,13 @@ class XMPPDaemon extends Daemon } } +// Abort immediately if xmpp is not enabled, otherwise the daemon chews up +// lots of CPU trying to connect to unconfigured servers +if (common_config('xmpp','enabled')==false) { + print "Aborting daemon - xmpp is disabled\n"; + exit(); +} + ini_set("max_execution_time", "0"); ini_set("max_input_time", "0"); set_time_limit(0); diff --git a/theme/base/css/display.css b/theme/base/css/display.css index 3b4a2a4b3..8029a5eee 100644 --- a/theme/base/css/display.css +++ b/theme/base/css/display.css @@ -29,6 +29,7 @@ h1 { font-size:1.4em; margin-bottom:18px; } +#showstream h1 { display:none; } h2 { font-size:1.3em; } h3 { font-size:1.2em; } h4 { font-size:1.1em; } @@ -85,7 +86,7 @@ border:0; .error, .success { -padding:4px 7px; +padding:4px 1.55%; border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; @@ -425,6 +426,7 @@ line-height:1; #form_notice fieldset { border:0; padding:0; +position:relative; } #form_notice legend { display:none; @@ -479,12 +481,18 @@ margin-bottom:7px; margin-left:18px; float:left; } - +#form_notice .error { +float:left; +clear:both; +width:96.9%; +margin-bottom:0; +line-height:1.618; +} /* entity_profile */ .entity_profile { position:relative; -width:67.702%; +width:74.702%; min-height:123px; float:left; margin-bottom:18px; @@ -520,12 +528,15 @@ margin-bottom:4px; .entity_profile .entity_nickname { margin-left:11px; display:inline; -font-weight:bold; } .entity_profile .entity_nickname { margin-left:0; } - +.entity_profile .fn, +.entity_profile .nickname { +font-size:1.1em; +font-weight:bold; +} .entity_profile .entity_fn dd:before { content: "("; font-weight:normal; @@ -547,7 +558,7 @@ display:none; /*entity_actions*/ .entity_actions { float:right; -margin-left:4.35%; +margin-left:2.35%; max-width:25%; } .entity_actions h2 { @@ -607,7 +618,9 @@ border-radius:4px; -moz-border-radius:4px; -webkit-border-radius:4px; } - +.entity_actions .accept { +margin-bottom:18px; +} .entity_tags ul { list-style-type:none; @@ -832,23 +845,6 @@ text-transform:lowercase; } - -.notice-data { -position:absolute; -top:18px; -right:0; -min-height:50px; -margin-bottom:4px; -} -.notice .entry-content .notice-data dt { -display:none; -} - -.notice-data a { -display:block; -outline:none; -} - .notice-options { padding-left:2%; float:left; @@ -918,6 +914,10 @@ padding:0; } +#usergroups #new_group { +float: left; +margin-right: 2em; +} #new_group, #group_search { margin-bottom:18px; } @@ -1022,6 +1022,8 @@ padding-right:30px; .hentry .entry-content p { margin-bottom:18px; } +.system_notice ul, +.instructions ul, .hentry entry-content ol, .hentry .entry-content ul { list-style-position:inside; @@ -1146,9 +1148,6 @@ clear:both; margin-bottom:0; } -.instructions ul { -list-style-position:inside; -} .instructions p, .instructions ul { margin-bottom:18px; @@ -1158,4 +1157,4 @@ display:none; } .guide { clear:both; -}
\ No newline at end of file +} diff --git a/theme/default/css/display.css b/theme/default/css/display.css index 42e29374f..69a600cc2 100644 --- a/theme/default/css/display.css +++ b/theme/default/css/display.css @@ -7,6 +7,8 @@ * @link http://laconi.ca/ */ +@import url(../../base/css/display.css); + html, body, a:active { @@ -70,7 +72,6 @@ border-top-color:#D1D9E4; border-top-color:#97BFD1; } - #content .notice p.entry-content a:visited { background-color:#fcfcfc; } @@ -82,7 +83,6 @@ background-color:#fcfffc; background-color:#CEE1E9; } - #notice_text-count { color:#333; } @@ -112,7 +112,6 @@ background-color:rgba(255, 255, 255, 0.2); background-color:rgba(255, 255, 255, 0.7); } - .error { background-color:#F7E8E8; } @@ -120,7 +119,6 @@ background-color:#F7E8E8; background-color:#EFF3DC; } - #anon_notice { background-color:#97BFD1; color:#fff; @@ -131,7 +129,6 @@ border-color:#fff; background-color:#A9BF4F; } - #export_data li a { background-repeat:no-repeat; background-position:0 45%; @@ -164,7 +161,8 @@ background-color:#A9BF4F; color:#fff; } .form_user_unsubscribe input.submit, -.form_group_leave input.submit { +.form_group_leave input.submit, +.form_user_authorization input.reject { background-color:#97BFD1; } @@ -183,8 +181,6 @@ background-image:url(../images/icons/twotone/green/mail.gif); background-image:url(../images/icons/twotone/green/shield.gif); } - - /* NOTICES */ .notices li.over { background-color:#fcfcfc; @@ -227,14 +223,9 @@ background-color:#fcfcfc; } /*END: NOTICES */ - #new_group a { background:transparent url(../images/icons/twotone/green/news.gif) no-repeat 0 45%; } -#usergroups #new_group { -float: left; -margin-right: 2em; -} .pagination .nav_prev a, .pagination .nav_next a { diff --git a/theme/identica/css/display.css b/theme/identica/css/display.css index 8edb005a6..d05578d43 100644 --- a/theme/identica/css/display.css +++ b/theme/identica/css/display.css @@ -7,6 +7,8 @@ * @link http://laconi.ca/ */ +@import url(../../base/css/display.css); + html, body, a:active { @@ -70,7 +72,6 @@ border-top-color:#CEE1E9; border-top-color:#87B4C8; } - #content .notice p.entry-content a:visited { background-color:#fcfcfc; } @@ -82,7 +83,6 @@ background-color:#fcfffc; background-color:#CEE1E9; } - #notice_text-count { color:#333; } @@ -112,7 +112,6 @@ background-color:rgba(135, 180, 200, 0.3); background-color:rgba(255, 255, 255, 0.7); } - .error { background-color:#F7E8E8; } @@ -120,7 +119,6 @@ background-color:#F7E8E8; background-color:#EFF3DC; } - #anon_notice { background-color:#87B4C8; color:#fff; @@ -131,7 +129,6 @@ border-color:#fff; background-color:#9BB43E; } - #export_data li a { background-repeat:no-repeat; background-position:0 45%; @@ -164,7 +161,8 @@ background-color:#9BB43E; color:#fff; } .form_user_unsubscribe input.submit, -.form_group_leave input.submit { +.form_group_leave input.submit, +.form_user_authorization input.reject { background-color:#87B4C8; } @@ -183,8 +181,6 @@ background-image:url(../images/icons/twotone/green/mail.gif); background-image:url(../images/icons/twotone/green/shield.gif); } - - /* NOTICES */ .notices li.over { background-color:#fcfcfc; @@ -227,14 +223,9 @@ background-color:#fcfcfc; } /*END: NOTICES */ - #new_group a { background:transparent url(../images/icons/twotone/green/news.gif) no-repeat 0 45%; } -#usergroups #new_group { -float: left; -margin-right: 2em; -} .pagination .nav_prev a, .pagination .nav_next a { diff --git a/theme/iphone/display.css b/theme/iphone/display.css index 6ac471c1e..1838a8e86 100644 --- a/theme/iphone/display.css +++ b/theme/iphone/display.css @@ -2,6 +2,8 @@ /* Design & CSS by Marie-Claude Doyon http://www.marieclaudedoyon.com */ /* Simplified for mobile by Ken Sheppardson http://identi.ca/kshep */ +@import url(../../base/css/display.css); + html {} body { width: 100%; @@ -28,7 +30,6 @@ h1 { font-size: 1.2em; } - #wrap { margin: 0; } @@ -196,7 +197,7 @@ p#branding a { } .instructions a:hover, .success a:hover, .error a:hover { color: #FCFFF5; -} +} .success { clear: both; float: left; @@ -210,7 +211,6 @@ p#branding a { background-color: #ce3728; } - /* ----- Stream -----*/ #notices { @@ -273,7 +273,7 @@ p.time { p.time a { color: #91AA9D; } - + /* ----- Profile -----*/ #profile { clear: both; @@ -356,7 +356,7 @@ dl.statistics { clear: left; float: left; width: 200px; -} +} .statistics dd { float: left; } @@ -402,8 +402,6 @@ ul.subscriptions li, ul.subscribers li { } /* ----- End Subscriptions & Subscribers -----*/ - - #pagination { margin: 18px auto; } @@ -488,7 +486,7 @@ input#submit:hover, input.submit:hover { input.checkbox { width: auto; border: 0; -} +} textarea, input { font-family: Verdana, Arial, Helvetica, sans-serif; font-size: 1em; @@ -629,7 +627,7 @@ input#openid_url { #profiles a:hover { text-decoration: underline; } - + .profile_single { clear: both; display: block; |