Merge commit 'mainline/0.9.x' into 0.9.x
This commit is contained in:
commit
ef3b849db0
12
EVENTS.txt
12
EVENTS.txt
@ -150,6 +150,12 @@ StartAddressData: Allows the site owner to provide additional information about
|
||||
EndAddressData: At the end of <address>
|
||||
- $action: the current action
|
||||
|
||||
StartShowSiteNotice: Before showing site notice
|
||||
- $action: the current action
|
||||
|
||||
EndShowSiteNotice: After showing site notice
|
||||
- $action: the current action
|
||||
|
||||
StartLoginGroupNav: Before showing the login and register navigation menu
|
||||
- $action: the current action
|
||||
|
||||
@ -687,3 +693,9 @@ StartLeaveGroup: when a user is leaving a group
|
||||
EndLeaveGroup: when a user has left a group
|
||||
- $group: the group being left
|
||||
- $user: the user leaving
|
||||
|
||||
StartShowContentLicense: Showing the default license for content
|
||||
- $action: the current action
|
||||
|
||||
EndShowContentLicense: Showing the default license for content
|
||||
- $action: the current action
|
||||
|
41
README
41
README
@ -2,8 +2,8 @@
|
||||
README
|
||||
------
|
||||
|
||||
StatusNet 0.9.0 ("Stand") Release Candidate 2
|
||||
22 Dec 2009
|
||||
StatusNet 0.9.0 ("Stand") Beta 3
|
||||
20 Jan 2010
|
||||
|
||||
This is the README file for StatusNet (formerly Laconica), the Open
|
||||
Source microblogging platform. It includes installation instructions,
|
||||
@ -167,6 +167,37 @@ Notable changes this version:
|
||||
- Add support for "repeats" (similar to Twitter's "retweets").
|
||||
- Support for repeats in Twitter API.
|
||||
- Better notification of direct messages.
|
||||
- New plugin to add "powered by StatusNet" to logo.
|
||||
- Returnto works for private sites.
|
||||
- Localisation updates, including new Persian translation.
|
||||
- CAS authentication plugin
|
||||
- Get rid of DB_DataObject native cache (big memory leaker)
|
||||
- setconfig.php script to set configuration variables
|
||||
- Blacklist plugin, to blacklist URLs and nicknames
|
||||
- Users can set flag whether they want to share location
|
||||
both in notice form (for one notice) and profile settings
|
||||
(any notice)
|
||||
- notice inboxes moved from normalized notice_inbox table to
|
||||
denormalized inbox table
|
||||
- Automatic compression of Memcache
|
||||
- Memory caching pluginized
|
||||
- Memcache, XCache, APC and Diskcache plugins
|
||||
- A script to update user locations
|
||||
- cache empty query results
|
||||
- A sample plugin to show best plugin practices
|
||||
- CacheLog plugin to debug cache accesses
|
||||
- Require users to login to view attachments on private sites
|
||||
- Plugin to use Mollom spam detection service
|
||||
- Plugin for RSSCloud
|
||||
- Add an array of default plugins
|
||||
- A version action to give credit to contributors and plugin
|
||||
developers
|
||||
- Daemon to read IMAP mailbox instead of using a mailbox script
|
||||
- Pass session information between SSL and non-SSL server
|
||||
when SSL set to 'sometimes'
|
||||
- Major refactoring of queue handlers to manage very
|
||||
large hosting site (like status.net)
|
||||
- SubscriptionThrottle plugin to prevent subscription spamming
|
||||
|
||||
Prerequisites
|
||||
=============
|
||||
@ -1035,6 +1066,12 @@ Creative Commons Attribution 3.0 license, which is probably the right
|
||||
choice for any public site. Note that some other servers will not
|
||||
accept notices if you apply a stricter license than this.
|
||||
|
||||
type: one of 'cc' (for Creative Commons licenses), 'allrightsreserved'
|
||||
(default copyright), or 'private' (for private and confidential
|
||||
information).
|
||||
owner: for 'allrightsreserved' or 'private', an assigned copyright
|
||||
holder (for example, an employer for a private site). If
|
||||
not specified, will be attributed to 'contributors'.
|
||||
url: URL of the license, used for links.
|
||||
title: Title for the license, like 'Creative Commons Attribution 3.0'.
|
||||
image: A button shown on each page for the license.
|
||||
|
@ -45,6 +45,7 @@ require_once INSTALLDIR . '/lib/apiprivateauth.php';
|
||||
* @author Evan Prodromou <evan@status.net>
|
||||
* @author Jeffery To <jeffery.to@gmail.com>
|
||||
* @author Zach Copley <zach@status.net>
|
||||
* @author Michele <macno@macno.org>
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||
* @link http://status.net/
|
||||
*/
|
||||
@ -68,6 +69,24 @@ class ApiGroupShowAction extends ApiPrivateAuthAction
|
||||
|
||||
$this->group = $this->getTargetGroup($this->arg('id'));
|
||||
|
||||
if (empty($this->group)) {
|
||||
$alias = Group_alias::staticGet(
|
||||
'alias',
|
||||
common_canonical_nickname($this->arg('id'))
|
||||
);
|
||||
if (!empty($alias)) {
|
||||
$args = array('id' => $alias->group_id, 'format' => $this->format);
|
||||
common_redirect(common_local_url('ApiGroupShow', $args), 301);
|
||||
} else {
|
||||
$this->clientError(
|
||||
_('Group not found!'),
|
||||
404,
|
||||
$this->format
|
||||
);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -85,15 +104,6 @@ class ApiGroupShowAction extends ApiPrivateAuthAction
|
||||
{
|
||||
parent::handle($args);
|
||||
|
||||
if (empty($this->group)) {
|
||||
$this->clientError(
|
||||
_('Group not found!'),
|
||||
404,
|
||||
$this->format
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
switch($this->format) {
|
||||
case 'xml':
|
||||
$this->showSingleXmlGroup($this->group);
|
||||
@ -105,7 +115,6 @@ class ApiGroupShowAction extends ApiPrivateAuthAction
|
||||
$this->clientError(_('API method not found.'), 404, $this->format);
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -113,4 +113,19 @@ class ApiStatusesRetweetsAction extends ApiAuthAction
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if read only.
|
||||
*
|
||||
* MAY override
|
||||
*
|
||||
* @param array $args other arguments
|
||||
*
|
||||
* @return boolean is read only action?
|
||||
*/
|
||||
|
||||
function isReadOnly($args)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -69,58 +69,21 @@ class ApiTimelineRetweetedByMeAction extends ApiAuthAction
|
||||
{
|
||||
parent::prepare($args);
|
||||
|
||||
$cnt = $this->int('count', self::DEFAULTCOUNT, self::MAXCOUNT, 1);
|
||||
$this->serverError('Unimplemented', 503);
|
||||
|
||||
$page = $this->int('page', 1, (self::MAXNOTICES/$this->cnt));
|
||||
|
||||
$since_id = $this->int('since_id');
|
||||
|
||||
$max_id = $this->int('max_id');
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle the request
|
||||
* Return true if read only.
|
||||
*
|
||||
* show a timeline of the user's repeated notices
|
||||
* @param array $args other arguments
|
||||
*
|
||||
* @param array $args $_REQUEST data (unused)
|
||||
*
|
||||
* @return void
|
||||
* @return boolean is read only action?
|
||||
*/
|
||||
|
||||
function handle($args)
|
||||
function isReadOnly($args)
|
||||
{
|
||||
parent::handle($args);
|
||||
|
||||
$offset = ($this->page-1) * $this->cnt;
|
||||
$limit = $this->cnt;
|
||||
|
||||
$strm = $this->auth_user->repeatedByMe($offset, $limit, $this->since_id, $this->max_id);
|
||||
|
||||
switch ($this->format) {
|
||||
case 'xml':
|
||||
$this->showXmlTimeline($strm);
|
||||
break;
|
||||
case 'json':
|
||||
$this->showJsonTimeline($strm);
|
||||
break;
|
||||
case 'atom':
|
||||
$profile = $this->auth_user->getProfile();
|
||||
|
||||
$title = sprintf(_("Repeated by %s"), $this->auth_user->nickname);
|
||||
$taguribase = common_config('integration', 'taguri');
|
||||
$id = "tag:$taguribase:RepeatedByMe:" . $this->auth_user->id;
|
||||
$link = common_local_url('showstream',
|
||||
array('nickname' => $this->auth_user->nickname));
|
||||
|
||||
$this->showAtomTimeline($strm, $title, $id, $link);
|
||||
break;
|
||||
|
||||
default:
|
||||
$this->clientError(_('API method not found.'), $code = 404);
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -122,4 +122,19 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if read only.
|
||||
*
|
||||
* MAY override
|
||||
*
|
||||
* @param array $args other arguments
|
||||
*
|
||||
* @return boolean is read only action?
|
||||
*/
|
||||
|
||||
function isReadOnly($args)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -123,4 +123,19 @@ class ApiTimelineRetweetsOfMeAction extends ApiAuthAction
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return true if read only.
|
||||
*
|
||||
* MAY override
|
||||
*
|
||||
* @param array $args other arguments
|
||||
*
|
||||
* @return boolean is read only action?
|
||||
*/
|
||||
|
||||
function isReadOnly($args)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -289,7 +289,7 @@ class DesignadminpanelAction extends AdminPanelAction
|
||||
function showStylesheets()
|
||||
{
|
||||
parent::showStylesheets();
|
||||
$this->cssLink('css/farbtastic.css','base','screen, projection, tv');
|
||||
$this->cssLink('js/farbtastic/farbtastic.css',null,'screen, projection, tv');
|
||||
}
|
||||
|
||||
/**
|
||||
|
152
actions/doc.php
152
actions/doc.php
@ -45,11 +45,23 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
|
||||
*/
|
||||
class DocAction extends Action
|
||||
{
|
||||
var $filename;
|
||||
var $title;
|
||||
var $output = null;
|
||||
var $filename = null;
|
||||
var $title = null;
|
||||
|
||||
function prepare($args)
|
||||
{
|
||||
parent::prepare($args);
|
||||
|
||||
$this->title = $this->trimmed('title');
|
||||
$this->output = null;
|
||||
|
||||
$this->loadDoc();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Class handler.
|
||||
* Handle a request
|
||||
*
|
||||
* @param array $args array of arguments
|
||||
*
|
||||
@ -58,51 +70,51 @@ class DocAction extends Action
|
||||
function handle($args)
|
||||
{
|
||||
parent::handle($args);
|
||||
|
||||
$this->title = $this->trimmed('title');
|
||||
$this->output = null;
|
||||
|
||||
if (Event::handle('StartLoadDoc', array(&$this->title, &$this->output))) {
|
||||
|
||||
$this->filename = INSTALLDIR.'/doc-src/'.$this->title;
|
||||
if (!file_exists($this->filename)) {
|
||||
$this->clientError(_('No such document.'));
|
||||
return;
|
||||
}
|
||||
|
||||
$c = file_get_contents($this->filename);
|
||||
$this->output = common_markup_to_html($c);
|
||||
|
||||
Event::handle('EndLoadDoc', array($this->title, &$this->output));
|
||||
}
|
||||
|
||||
$this->showPage();
|
||||
}
|
||||
|
||||
// overrrided to add entry-title class
|
||||
function showPageTitle() {
|
||||
/**
|
||||
* Page title
|
||||
*
|
||||
* Gives the page title of the document. Override default for hAtom entry.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function showPageTitle()
|
||||
{
|
||||
$this->element('h1', array('class' => 'entry-title'), $this->title());
|
||||
}
|
||||
|
||||
// overrided to add hentry, and content-inner classes
|
||||
/**
|
||||
* Block for content.
|
||||
*
|
||||
* Overrides default from Action to wrap everything in an hAtom entry.
|
||||
*
|
||||
* @return void.
|
||||
*/
|
||||
|
||||
function showContentBlock()
|
||||
{
|
||||
$this->elementStart('div', array('id' => 'content', 'class' => 'hentry'));
|
||||
$this->showPageTitle();
|
||||
$this->showPageNoticeBlock();
|
||||
$this->elementStart('div', array('id' => 'content_inner',
|
||||
'class' => 'entry-content'));
|
||||
// show the actual content (forms, lists, whatever)
|
||||
$this->showContent();
|
||||
$this->elementEnd('div');
|
||||
$this->elementEnd('div');
|
||||
}
|
||||
{
|
||||
$this->elementStart('div', array('id' => 'content', 'class' => 'hentry'));
|
||||
$this->showPageTitle();
|
||||
$this->showPageNoticeBlock();
|
||||
$this->elementStart('div', array('id' => 'content_inner',
|
||||
'class' => 'entry-content'));
|
||||
// show the actual content (forms, lists, whatever)
|
||||
$this->showContent();
|
||||
$this->elementEnd('div');
|
||||
$this->elementEnd('div');
|
||||
}
|
||||
|
||||
/**
|
||||
* Display content.
|
||||
*
|
||||
* @return nothing
|
||||
* Shows the content of the document.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function showContent()
|
||||
{
|
||||
$this->raw($this->output);
|
||||
@ -111,6 +123,8 @@ class DocAction extends Action
|
||||
/**
|
||||
* Page title.
|
||||
*
|
||||
* Uses the title of the document.
|
||||
*
|
||||
* @return page title
|
||||
*/
|
||||
function title()
|
||||
@ -118,8 +132,74 @@ class DocAction extends Action
|
||||
return ucfirst($this->title);
|
||||
}
|
||||
|
||||
/**
|
||||
* These pages are read-only.
|
||||
*
|
||||
* @param array $args unused.
|
||||
*
|
||||
* @return boolean read-only flag (false)
|
||||
*/
|
||||
|
||||
function isReadOnly($args)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
function loadDoc()
|
||||
{
|
||||
if (Event::handle('StartLoadDoc', array(&$this->title, &$this->output))) {
|
||||
|
||||
$this->filename = $this->getFilename();
|
||||
|
||||
if (empty($this->filename)) {
|
||||
throw new ClientException(sprintf(_('No such document "%s"'), $this->title), 404);
|
||||
}
|
||||
|
||||
$c = file_get_contents($this->filename);
|
||||
|
||||
$this->output = common_markup_to_html($c);
|
||||
|
||||
Event::handle('EndLoadDoc', array($this->title, &$this->output));
|
||||
}
|
||||
}
|
||||
|
||||
function getFilename()
|
||||
{
|
||||
if (file_exists(INSTALLDIR.'/local/doc-src/'.$this->title)) {
|
||||
$localDef = INSTALLDIR.'/local/doc-src/'.$this->title;
|
||||
}
|
||||
|
||||
$local = glob(INSTALLDIR.'/local/doc-src/'.$this->title.'.*');
|
||||
|
||||
if (count($local) || isset($localDef)) {
|
||||
return $this->negotiateLanguage($local, $localDef);
|
||||
}
|
||||
|
||||
if (file_exists(INSTALLDIR.'/doc-src/'.$this->title)) {
|
||||
$distDef = INSTALLDIR.'/doc-src/'.$this->title;
|
||||
}
|
||||
|
||||
$dist = glob(INSTALLDIR.'/doc-src/'.$this->title.'.*');
|
||||
|
||||
if (count($dist) || isset($distDef)) {
|
||||
return $this->negotiateLanguage($dist, $distDef);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
function negotiateLanguage($filenames, $defaultFilename=null)
|
||||
{
|
||||
// XXX: do this better
|
||||
|
||||
$langcode = common_language();
|
||||
|
||||
foreach ($filenames as $filename) {
|
||||
if (preg_match('/\.'.$langcode.'$/', $filename)) {
|
||||
return $filename;
|
||||
}
|
||||
}
|
||||
|
||||
return $defaultFilename;
|
||||
}
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ class EmailsettingsAction extends AccountSettingsAction
|
||||
|
||||
if (common_config('emailpost', 'enabled') && $user->email) {
|
||||
$this->elementStart('fieldset', array('id' => 'settings_email_incoming'));
|
||||
$this->element('legend',_('Incoming email'));
|
||||
$this->element('legend', null, _('Incoming email'));
|
||||
if ($user->incomingemail) {
|
||||
$this->elementStart('p');
|
||||
$this->element('span', 'address', $user->incomingemail);
|
||||
|
@ -309,6 +309,8 @@ class ImsettingsAction extends ConnectSettingsAction
|
||||
$confirm->address_type = 'jabber';
|
||||
$confirm->user_id = $user->id;
|
||||
$confirm->code = common_confirmation_code(64);
|
||||
$confirm->sent = common_sql_now();
|
||||
$confirm->claimed = common_sql_now();
|
||||
|
||||
$result = $confirm->insert();
|
||||
|
||||
@ -318,11 +320,9 @@ class ImsettingsAction extends ConnectSettingsAction
|
||||
return;
|
||||
}
|
||||
|
||||
if (!common_config('queue', 'enabled')) {
|
||||
jabber_confirm_address($confirm->code,
|
||||
$user->nickname,
|
||||
$jabber);
|
||||
}
|
||||
jabber_confirm_address($confirm->code,
|
||||
$user->nickname,
|
||||
$jabber);
|
||||
|
||||
$msg = sprintf(_('A confirmation code was sent '.
|
||||
'to the IM address you added. '.
|
||||
|
@ -251,6 +251,8 @@ class File extends Memcached_DataObject
|
||||
if($oembed->modified) $enclosure->modified=$oembed->modified;
|
||||
unset($oembed->size);
|
||||
}
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,8 +19,6 @@
|
||||
|
||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
||||
|
||||
require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
|
||||
|
||||
class Memcached_DataObject extends DB_DataObject
|
||||
{
|
||||
/**
|
||||
@ -315,6 +313,39 @@ class Memcached_DataObject extends DB_DataObject
|
||||
return new ArrayWrapper($cached);
|
||||
}
|
||||
|
||||
/**
|
||||
* sends query to database - this is the private one that must work
|
||||
* - internal functions use this rather than $this->query()
|
||||
*
|
||||
* Overridden to do logging.
|
||||
*
|
||||
* @param string $string
|
||||
* @access private
|
||||
* @return mixed none or PEAR_Error
|
||||
*/
|
||||
function _query($string)
|
||||
{
|
||||
$start = microtime(true);
|
||||
$result = parent::_query($string);
|
||||
$delta = microtime(true) - $start;
|
||||
|
||||
$limit = common_config('db', 'log_slow_queries');
|
||||
if (($limit > 0 && $delta >= $limit) || common_config('db', 'log_queries')) {
|
||||
$clean = $this->sanitizeQuery($string);
|
||||
common_log(LOG_DEBUG, sprintf("DB query (%0.3fs): %s", $delta, $clean));
|
||||
}
|
||||
return $result;
|
||||
}
|
||||
|
||||
// Sanitize a query for logging
|
||||
// @fixme don't trim spaces in string literals
|
||||
function sanitizeQuery($string)
|
||||
{
|
||||
$string = preg_replace('/\s+/', ' ', $string);
|
||||
$string = trim($string);
|
||||
return $string;
|
||||
}
|
||||
|
||||
// We overload so that 'SET NAMES "utf8"' is called for
|
||||
// each connection
|
||||
|
||||
|
@ -10,8 +10,8 @@ class Queue_item extends Memcached_DataObject
|
||||
/* the code below is auto generated do not remove the above tag */
|
||||
|
||||
public $__table = 'queue_item'; // table name
|
||||
public $notice_id; // int(4) primary_key not_null
|
||||
public $transport; // varchar(8) primary_key not_null
|
||||
public $id; // int(4) primary_key not_null
|
||||
public $frame; // blob not_null
|
||||
public $created; // datetime() not_null
|
||||
public $claimed; // datetime()
|
||||
|
||||
@ -22,14 +22,21 @@ class Queue_item extends Memcached_DataObject
|
||||
/* the code above is auto generated do not remove the tag below */
|
||||
###END_AUTOCODE
|
||||
|
||||
function sequenceKey()
|
||||
{ return array(false, false); }
|
||||
|
||||
static function top($transport=null) {
|
||||
/**
|
||||
* @param mixed $transports name of a single queue or array of queues to pull from
|
||||
* If not specified, checks all queues in the system.
|
||||
*/
|
||||
static function top($transports=null) {
|
||||
|
||||
$qi = new Queue_item();
|
||||
if ($transport) {
|
||||
$qi->transport = $transport;
|
||||
if ($transports) {
|
||||
if (is_array($transports)) {
|
||||
// @fixme use safer escaping
|
||||
$list = implode("','", array_map('addslashes', $transports));
|
||||
$qi->whereAdd("transport in ('$list')");
|
||||
} else {
|
||||
$qi->transport = $transports;
|
||||
}
|
||||
}
|
||||
$qi->orderBy('created');
|
||||
$qi->whereAdd('claimed is null');
|
||||
@ -42,7 +49,7 @@ class Queue_item extends Memcached_DataObject
|
||||
# XXX: potential race condition
|
||||
# can we force it to only update if claimed is still null
|
||||
# (or old)?
|
||||
common_log(LOG_INFO, 'claiming queue item = ' . $qi->notice_id .
|
||||
common_log(LOG_INFO, 'claiming queue item id = ' . $qi->id .
|
||||
' for transport ' . $qi->transport);
|
||||
$orig = clone($qi);
|
||||
$qi->claimed = common_sql_now();
|
||||
@ -57,9 +64,4 @@ class Queue_item extends Memcached_DataObject
|
||||
$qi = null;
|
||||
return null;
|
||||
}
|
||||
|
||||
function pkeyGet($kv)
|
||||
{
|
||||
return Memcached_DataObject::pkeyGet('Queue_item', $kv);
|
||||
}
|
||||
}
|
||||
|
@ -428,14 +428,14 @@ tagged = K
|
||||
tag = K
|
||||
|
||||
[queue_item]
|
||||
notice_id = 129
|
||||
id = 129
|
||||
frame = 66
|
||||
transport = 130
|
||||
created = 142
|
||||
claimed = 14
|
||||
|
||||
[queue_item__keys]
|
||||
notice_id = K
|
||||
transport = K
|
||||
id = K
|
||||
|
||||
[related_group]
|
||||
group_id = 129
|
||||
|
@ -94,3 +94,19 @@ create table user_location_prefs (
|
||||
constraint primary key (user_id)
|
||||
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
|
||||
|
||||
create table queue_item_new (
|
||||
id integer auto_increment primary key comment 'unique identifier',
|
||||
frame blob not null comment 'data: object reference or opaque string',
|
||||
transport varchar(8) not null comment 'queue for what? "email", "jabber", "sms", "irc", ...',
|
||||
created datetime not null comment 'date this record was created',
|
||||
claimed datetime comment 'date this item was claimed',
|
||||
|
||||
index queue_item_created_idx (created)
|
||||
|
||||
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
|
||||
|
||||
insert into queue_item_new (frame,transport,created,claimed)
|
||||
select notice_id,transport,created,claimed from queue_item;
|
||||
alter table queue_item rename to queue_item_old;
|
||||
alter table queue_item_new rename to queue_item;
|
||||
|
||||
|
16
db/rc3to09.sql
Normal file
16
db/rc3to09.sql
Normal file
@ -0,0 +1,16 @@
|
||||
create table queue_item_new (
|
||||
id integer auto_increment primary key comment 'unique identifier',
|
||||
frame blob not null comment 'data: object reference or opaque string',
|
||||
transport varchar(8) not null comment 'queue for what? "email", "jabber", "sms", "irc", ...',
|
||||
created datetime not null comment 'date this record was created',
|
||||
claimed datetime comment 'date this item was claimed',
|
||||
|
||||
index queue_item_created_idx (created)
|
||||
|
||||
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
|
||||
|
||||
insert into queue_item_new (frame,transport,created,claimed)
|
||||
select notice_id,transport,created,claimed from queue_item;
|
||||
alter table queue_item rename to queue_item_old;
|
||||
alter table queue_item_new rename to queue_item;
|
||||
|
@ -274,13 +274,12 @@ create table remember_me (
|
||||
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
|
||||
|
||||
create table queue_item (
|
||||
|
||||
notice_id integer not null comment 'notice queued' references notice (id),
|
||||
id integer auto_increment primary key comment 'unique identifier',
|
||||
frame blob not null comment 'data: object reference or opaque string',
|
||||
transport varchar(8) not null comment 'queue for what? "email", "jabber", "sms", "irc", ...',
|
||||
created datetime not null comment 'date this record was created',
|
||||
claimed datetime comment 'date this item was claimed',
|
||||
|
||||
constraint primary key (notice_id, transport),
|
||||
index queue_item_created_idx (created)
|
||||
|
||||
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_bin;
|
||||
|
@ -16,17 +16,17 @@
|
||||
height: 101px;
|
||||
}
|
||||
.farbtastic .wheel {
|
||||
background: url(../../../js/farbtastic/wheel.png) no-repeat;
|
||||
background: url(wheel.png) no-repeat;
|
||||
width: 195px;
|
||||
height: 195px;
|
||||
}
|
||||
.farbtastic .overlay {
|
||||
background: url(../../../js/farbtastic/mask.png) no-repeat;
|
||||
background: url(mask.png) no-repeat;
|
||||
}
|
||||
.farbtastic .marker {
|
||||
width: 17px;
|
||||
height: 17px;
|
||||
margin: -8px 0 0 -8px;
|
||||
overflow: hidden;
|
||||
background: url(../../../js/farbtastic/marker.png) no-repeat;
|
||||
background: url(marker.png) no-repeat;
|
||||
}
|
@ -223,7 +223,7 @@ function markupPost(raw, server) {
|
||||
},
|
||||
changeUserTo : function(el) {
|
||||
$.a.user = el.rel;
|
||||
$.s.h.a.innerHTML = el.rev + $.a.headerText;
|
||||
$.s.h.a.appendChild(document.createTextNode(el.rev + $.a.headerText));
|
||||
$.s.h.a.href = 'http://' + $.a.server + '/' + el.id;
|
||||
$.f.runSearch();
|
||||
},
|
||||
|
26
js/util.js
26
js/util.js
@ -205,8 +205,10 @@ var SN = { // StatusNet
|
||||
cookieValue = JSON.parse(cookieValue);
|
||||
NLat = $('#'+SN.C.S.NoticeLat).val(cookieValue.NLat).val();
|
||||
NLon = $('#'+SN.C.S.NoticeLon).val(cookieValue.NLon).val();
|
||||
NLNS = $('#'+SN.C.S.NoticeLocationNs).val(cookieValue.NLNS).val();
|
||||
NLID = $('#'+SN.C.S.NoticeLocationId).val(cookieValue.NLID).val();
|
||||
if ($('#'+SN.C.S.NoticeLocationNs).val(cookieValue.NLNS)) {
|
||||
NLNS = $('#'+SN.C.S.NoticeLocationNs).val(cookieValue.NLNS).val();
|
||||
NLID = $('#'+SN.C.S.NoticeLocationId).val(cookieValue.NLID).val();
|
||||
}
|
||||
}
|
||||
if (cookieValue == 'disabled') {
|
||||
NDG = $('#'+SN.C.S.NoticeDataGeo).attr('checked', false).attr('checked');
|
||||
@ -301,8 +303,10 @@ var SN = { // StatusNet
|
||||
|
||||
$('#'+SN.C.S.NoticeLat).val(NLat);
|
||||
$('#'+SN.C.S.NoticeLon).val(NLon);
|
||||
$('#'+SN.C.S.NoticeLocationNs).val(NLNS);
|
||||
$('#'+SN.C.S.NoticeLocationId).val(NLID);
|
||||
if ($('#'+SN.C.S.NoticeLocationNs)) {
|
||||
$('#'+SN.C.S.NoticeLocationNs).val(NLNS);
|
||||
$('#'+SN.C.S.NoticeLocationId).val(NLID);
|
||||
}
|
||||
$('#'+SN.C.S.NoticeDataGeo).attr('checked', NDG);
|
||||
}
|
||||
});
|
||||
@ -494,7 +498,7 @@ var SN = { // StatusNet
|
||||
$.cookie(SN.C.S.NoticeDataGeoCookie, 'disabled');
|
||||
}
|
||||
|
||||
function getJSONgeocodeURL(geocodeURL, data, position) {
|
||||
function getJSONgeocodeURL(geocodeURL, data) {
|
||||
$.getJSON(geocodeURL, data, function(location) {
|
||||
var lns, lid;
|
||||
|
||||
@ -509,7 +513,7 @@ var SN = { // StatusNet
|
||||
}
|
||||
|
||||
if (typeof(location.name) == 'undefined') {
|
||||
NLN_text = position.coords.latitude + ';' + position.coords.longitude;
|
||||
NLN_text = data.lat + ';' + data.lon;
|
||||
}
|
||||
else {
|
||||
NLN_text = location.name;
|
||||
@ -571,7 +575,7 @@ var SN = { // StatusNet
|
||||
token: $('#token').val()
|
||||
};
|
||||
|
||||
getJSONgeocodeURL(geocodeURL, data, position);
|
||||
getJSONgeocodeURL(geocodeURL, data);
|
||||
},
|
||||
|
||||
function(error) {
|
||||
@ -593,12 +597,12 @@ var SN = { // StatusNet
|
||||
else {
|
||||
if (NLat.length > 0 && NLon.length > 0) {
|
||||
var data = {
|
||||
'lat': NLat,
|
||||
'lon': NLon,
|
||||
'token': $('#token').val()
|
||||
lat: NLat,
|
||||
lon: NLon,
|
||||
token: $('#token').val()
|
||||
};
|
||||
|
||||
getJSONgeocodeURL(geocodeURL, data, position);
|
||||
getJSONgeocodeURL(geocodeURL, data);
|
||||
}
|
||||
else {
|
||||
removeNoticeDataGeo();
|
||||
|
@ -199,10 +199,6 @@ class Action extends HTMLOutputter // lawsuit
|
||||
if (Event::handle('StartShowStatusNetStyles', array($this)) &&
|
||||
Event::handle('StartShowLaconicaStyles', array($this))) {
|
||||
$this->cssLink('css/display.css',null,'screen, projection, tv');
|
||||
if (common_config('site', 'mobile')) {
|
||||
// TODO: "handheld" CSS for other mobile devices
|
||||
$this->cssLink('css/mobile.css','base','only screen and (max-device-width: 480px)'); // Mobile WebKit
|
||||
}
|
||||
$this->cssLink('css/print.css','base','print');
|
||||
Event::handle('EndShowStatusNetStyles', array($this));
|
||||
Event::handle('EndShowLaconicaStyles', array($this));
|
||||
@ -373,7 +369,11 @@ class Action extends HTMLOutputter // lawsuit
|
||||
$this->elementStart('div', array('id' => 'header'));
|
||||
$this->showLogo();
|
||||
$this->showPrimaryNav();
|
||||
$this->showSiteNotice();
|
||||
if (Event::handle('StartShowSiteNotice', array($this))) {
|
||||
$this->showSiteNotice();
|
||||
|
||||
Event::handle('EndShowSiteNotice', array($this));
|
||||
}
|
||||
if (common_logged_in()) {
|
||||
$this->showNoticeForm();
|
||||
} else {
|
||||
@ -791,23 +791,45 @@ class Action extends HTMLOutputter // lawsuit
|
||||
*/
|
||||
function showContentLicense()
|
||||
{
|
||||
$this->element('dt', array('id' => 'site_content_license'), _('Site content license'));
|
||||
$this->elementStart('dd', array('id' => 'site_content_license_cc'));
|
||||
$this->elementStart('p');
|
||||
$this->element('img', array('id' => 'license_cc',
|
||||
'src' => common_config('license', 'image'),
|
||||
'alt' => common_config('license', 'title'),
|
||||
'width' => '80',
|
||||
'height' => '15'));
|
||||
//TODO: This is dirty: i18n
|
||||
$this->text(_('All '.common_config('site', 'name').' content and data are available under the '));
|
||||
$this->element('a', array('class' => 'license',
|
||||
'rel' => 'external license',
|
||||
'href' => common_config('license', 'url')),
|
||||
common_config('license', 'title'));
|
||||
$this->text(_('license.'));
|
||||
$this->elementEnd('p');
|
||||
$this->elementEnd('dd');
|
||||
if (Event::handle('StartShowContentLicense', array($this))) {
|
||||
$this->element('dt', array('id' => 'site_content_license'), _('Site content license'));
|
||||
$this->elementStart('dd', array('id' => 'site_content_license_cc'));
|
||||
|
||||
switch (common_config('license', 'type')) {
|
||||
case 'private':
|
||||
$this->element('p', null, sprintf(_('Content and data of %1$s are private and confidential.'),
|
||||
common_config('site', 'name')));
|
||||
// fall through
|
||||
case 'allrightsreserved':
|
||||
if (common_config('license', 'owner')) {
|
||||
$this->element('p', null, sprintf(_('Content and data copyright by %1$s. All rights reserved.'),
|
||||
common_config('license', 'owner')));
|
||||
} else {
|
||||
$this->element('p', null, _('Content and data copyright by contributors. All rights reserved.'));
|
||||
}
|
||||
break;
|
||||
case 'cc': // fall through
|
||||
default:
|
||||
$this->elementStart('p');
|
||||
$this->element('img', array('id' => 'license_cc',
|
||||
'src' => common_config('license', 'image'),
|
||||
'alt' => common_config('license', 'title'),
|
||||
'width' => '80',
|
||||
'height' => '15'));
|
||||
//TODO: This is dirty: i18n
|
||||
$this->text(_('All '.common_config('site', 'name').' content and data are available under the '));
|
||||
$this->element('a', array('class' => 'license',
|
||||
'rel' => 'external license',
|
||||
'href' => common_config('license', 'url')),
|
||||
common_config('license', 'title'));
|
||||
$this->text(_('license.'));
|
||||
$this->elementEnd('p');
|
||||
break;
|
||||
}
|
||||
|
||||
$this->elementEnd('dd');
|
||||
Event::handle('EndShowContentLicense', array($this));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -288,11 +288,12 @@ class ApiAction extends Action
|
||||
$twitter_status['attachments'] = array();
|
||||
|
||||
foreach ($attachments as $attachment) {
|
||||
if ($attachment->isEnclosure()) {
|
||||
$enclosure_o=$attachment->getEnclosure();
|
||||
if ($enclosure_o) {
|
||||
$enclosure = array();
|
||||
$enclosure['url'] = $attachment->url;
|
||||
$enclosure['mimetype'] = $attachment->mimetype;
|
||||
$enclosure['size'] = $attachment->size;
|
||||
$enclosure['url'] = $enclosure_o->url;
|
||||
$enclosure['mimetype'] = $enclosure_o->mimetype;
|
||||
$enclosure['size'] = $enclosure_o->size;
|
||||
$twitter_status['attachments'][] = $enclosure;
|
||||
}
|
||||
}
|
||||
|
@ -79,10 +79,13 @@ class ApiAuthAction extends ApiAction
|
||||
$this->checkOAuthRequest();
|
||||
} else {
|
||||
$this->checkBasicAuthUser();
|
||||
// By default, all basic auth users have read and write access
|
||||
|
||||
$this->access = self::READ_WRITE;
|
||||
}
|
||||
} else {
|
||||
|
||||
// Check to see if a basic auth user is there even
|
||||
// if one's not required
|
||||
|
||||
$this->checkBasicAuthUser(false);
|
||||
}
|
||||
|
||||
return true;
|
||||
@ -145,7 +148,10 @@ class ApiAuthAction extends ApiAction
|
||||
$this->access = ($appUser->access_type & Oauth_application::$writeAccess)
|
||||
? self::READ_WRITE : self::READ_ONLY;
|
||||
|
||||
$this->auth_user = User::staticGet('id', $appUser->profile_id);
|
||||
if (Event::handle('StartSetApiUser', array(&$user))) {
|
||||
$this->auth_user = User::staticGet('id', $appUser->profile_id);
|
||||
Event::handle('EndSetApiUser', array($user));
|
||||
}
|
||||
|
||||
$msg = "API OAuth authentication for user '%s' (id: %d) on behalf of " .
|
||||
"application '%s' (id: %d).";
|
||||
@ -198,13 +204,13 @@ class ApiAuthAction extends ApiAction
|
||||
* @return boolean true or false
|
||||
*/
|
||||
|
||||
function checkBasicAuthUser()
|
||||
function checkBasicAuthUser($required = true)
|
||||
{
|
||||
$this->basicAuthProcessHeader();
|
||||
|
||||
$realm = common_config('site', 'name') . ' API';
|
||||
|
||||
if (!isset($this->auth_user)) {
|
||||
if (!isset($this->auth_user) && $required) {
|
||||
header('WWW-Authenticate: Basic realm="' . $realm . '"');
|
||||
|
||||
// show error if the user clicks 'cancel'
|
||||
@ -212,12 +218,16 @@ class ApiAuthAction extends ApiAction
|
||||
$this->showBasicAuthError();
|
||||
exit;
|
||||
|
||||
} else {
|
||||
} else if (isset($this->auth_user)) {
|
||||
$nickname = $this->auth_user;
|
||||
$password = $this->auth_pw;
|
||||
$user = common_check_user($nickname, $password);
|
||||
if (Event::handle('StartSetApiUser', array(&$user))) {
|
||||
$this->auth_user = $user;
|
||||
|
||||
// By default, all basic auth users have read and write access
|
||||
$this->access = self::READ_WRITE;
|
||||
|
||||
Event::handle('EndSetApiUser', array($user));
|
||||
}
|
||||
|
||||
|
@ -31,19 +31,17 @@
|
||||
class DBQueueManager extends QueueManager
|
||||
{
|
||||
/**
|
||||
* Saves a notice object reference into the queue item table.
|
||||
* Saves an object reference into the queue item table.
|
||||
* @return boolean true on success
|
||||
* @throws ServerException on failure
|
||||
*/
|
||||
public function enqueue($object, $queue)
|
||||
{
|
||||
$notice = $object;
|
||||
|
||||
$qi = new Queue_item();
|
||||
|
||||
$qi->notice_id = $notice->id;
|
||||
$qi->frame = $this->encode($object);
|
||||
$qi->transport = $queue;
|
||||
$qi->created = $notice->created;
|
||||
$qi->created = common_sql_now();
|
||||
$result = $qi->insert();
|
||||
|
||||
if (!$result) {
|
||||
@ -57,146 +55,92 @@ class DBQueueManager extends QueueManager
|
||||
}
|
||||
|
||||
/**
|
||||
* Poll every minute for new events during idle periods.
|
||||
* Poll every 10 seconds for new events during idle periods.
|
||||
* We'll look in more often when there's data available.
|
||||
*
|
||||
* @return int seconds
|
||||
*/
|
||||
public function pollInterval()
|
||||
{
|
||||
return 60;
|
||||
return 10;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run a polling cycle during idle processing in the input loop.
|
||||
* @return boolean true if we had a hit
|
||||
* @return boolean true if we should poll again for more data immediately
|
||||
*/
|
||||
public function poll()
|
||||
{
|
||||
$this->_log(LOG_DEBUG, 'Checking for notices...');
|
||||
$item = $this->_nextItem();
|
||||
if ($item === false) {
|
||||
$qi = Queue_item::top($this->getQueues());
|
||||
if (empty($qi)) {
|
||||
$this->_log(LOG_DEBUG, 'No notices waiting; idling.');
|
||||
return false;
|
||||
}
|
||||
if ($item === true) {
|
||||
// We dequeued an entry for a deleted or invalid notice.
|
||||
// Consider it a hit for poll rate purposes.
|
||||
return true;
|
||||
}
|
||||
|
||||
list($queue, $notice) = $item;
|
||||
$this->_log(LOG_INFO, 'Got notice '. $notice->id . ' for transport ' . $queue);
|
||||
$queue = $qi->transport;
|
||||
$item = $this->decode($qi->frame);
|
||||
|
||||
// Yay! Got one!
|
||||
$handler = $this->getHandler($queue);
|
||||
if ($handler) {
|
||||
if ($handler->handle_notice($notice)) {
|
||||
$this->_log(LOG_INFO, "[$queue:notice $notice->id] Successfully handled notice");
|
||||
$this->_done($notice, $queue);
|
||||
if ($item) {
|
||||
$rep = $this->logrep($item);
|
||||
$this->_log(LOG_INFO, "Got $rep for transport $queue");
|
||||
|
||||
$handler = $this->getHandler($queue);
|
||||
if ($handler) {
|
||||
if ($handler->handle($item)) {
|
||||
$this->_log(LOG_INFO, "[$queue:$rep] Successfully handled item");
|
||||
$this->_done($qi);
|
||||
} else {
|
||||
$this->_log(LOG_INFO, "[$queue:$rep] Failed to handle item");
|
||||
$this->_fail($qi);
|
||||
}
|
||||
} else {
|
||||
$this->_log(LOG_INFO, "[$queue:notice $notice->id] Failed to handle notice");
|
||||
$this->_fail($notice, $queue);
|
||||
$this->_log(LOG_INFO, "[$queue:$rep] No handler for queue $queue; discarding.");
|
||||
$this->_done($qi);
|
||||
}
|
||||
} else {
|
||||
$this->_log(LOG_INFO, "[$queue:notice $notice->id] No handler for queue $queue; discarding.");
|
||||
$this->_done($notice, $queue);
|
||||
$this->_log(LOG_INFO, "[$queue] Got empty/deleted item, discarding");
|
||||
$this->_fail($qi);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pop the oldest unclaimed item off the queue set and claim it.
|
||||
*
|
||||
* @return mixed false if no items; true if bogus hit; otherwise array(string, Notice)
|
||||
* giving the queue transport name.
|
||||
*/
|
||||
protected function _nextItem()
|
||||
{
|
||||
$start = time();
|
||||
$result = null;
|
||||
|
||||
$qi = Queue_item::top();
|
||||
if (empty($qi)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$queue = $qi->transport;
|
||||
$notice = Notice::staticGet('id', $qi->notice_id);
|
||||
if (empty($notice)) {
|
||||
$this->_log(LOG_INFO, "[$queue:notice $notice->id] dequeued non-existent notice");
|
||||
$qi->delete();
|
||||
return true;
|
||||
}
|
||||
|
||||
$result = $notice;
|
||||
return array($queue, $notice);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete our claimed item from the queue after successful processing.
|
||||
*
|
||||
* @param Notice $object
|
||||
* @param string $queue
|
||||
* @param QueueItem $qi
|
||||
*/
|
||||
protected function _done($object, $queue)
|
||||
protected function _done($qi)
|
||||
{
|
||||
// XXX: right now, we only handle notices
|
||||
$queue = $qi->transport;
|
||||
|
||||
$notice = $object;
|
||||
|
||||
$qi = Queue_item::pkeyGet(array('notice_id' => $notice->id,
|
||||
'transport' => $queue));
|
||||
|
||||
if (empty($qi)) {
|
||||
$this->_log(LOG_INFO, "[$queue:notice $notice->id] Cannot find queue item");
|
||||
} else {
|
||||
if (empty($qi->claimed)) {
|
||||
$this->_log(LOG_WARNING, "[$queue:notice $notice->id] Reluctantly releasing unclaimed queue item");
|
||||
}
|
||||
$qi->delete();
|
||||
$qi->free();
|
||||
if (empty($qi->claimed)) {
|
||||
$this->_log(LOG_WARNING, "Reluctantly releasing unclaimed queue item $qi->id from $qi->queue");
|
||||
}
|
||||
$qi->delete();
|
||||
|
||||
$this->_log(LOG_INFO, "[$queue:notice $notice->id] done with item");
|
||||
$this->stats('handled', $queue);
|
||||
|
||||
$notice->free();
|
||||
}
|
||||
|
||||
/**
|
||||
* Free our claimed queue item for later reprocessing in case of
|
||||
* temporary failure.
|
||||
*
|
||||
* @param Notice $object
|
||||
* @param string $queue
|
||||
* @param QueueItem $qi
|
||||
*/
|
||||
protected function _fail($object, $queue)
|
||||
protected function _fail($qi)
|
||||
{
|
||||
// XXX: right now, we only handle notices
|
||||
$queue = $qi->transport;
|
||||
|
||||
$notice = $object;
|
||||
|
||||
$qi = Queue_item::pkeyGet(array('notice_id' => $notice->id,
|
||||
'transport' => $queue));
|
||||
|
||||
if (empty($qi)) {
|
||||
$this->_log(LOG_INFO, "[$queue:notice $notice->id] Cannot find queue item");
|
||||
if (empty($qi->claimed)) {
|
||||
$this->_log(LOG_WARNING, "[$queue:item $qi->id] Ignoring failure for unclaimed queue item");
|
||||
} else {
|
||||
if (empty($qi->claimed)) {
|
||||
$this->_log(LOG_WARNING, "[$queue:notice $notice->id] Ignoring failure for unclaimed queue item");
|
||||
} else {
|
||||
$orig = clone($qi);
|
||||
$qi->claimed = null;
|
||||
$qi->update($orig);
|
||||
$qi = null;
|
||||
}
|
||||
$orig = clone($qi);
|
||||
$qi->claimed = null;
|
||||
$qi->update($orig);
|
||||
}
|
||||
|
||||
$this->_log(LOG_INFO, "[$queue:notice $notice->id] done with queue item");
|
||||
$this->stats('error', $queue);
|
||||
|
||||
$notice->free();
|
||||
}
|
||||
|
||||
protected function _log($level, $msg)
|
||||
|
@ -67,7 +67,9 @@ $default =
|
||||
'db_driver' => 'DB', # XXX: JanRain libs only work with DB
|
||||
'quote_identifiers' => false,
|
||||
'type' => 'mysql',
|
||||
'schemacheck' => 'runtime'), // 'runtime' or 'script'
|
||||
'schemacheck' => 'runtime', // 'runtime' or 'script'
|
||||
'log_queries' => false, // true to log all DB queries
|
||||
'log_slow_queries' => 0), // if set, log queries taking over N seconds
|
||||
'syslog' =>
|
||||
array('appname' => 'statusnet', # for syslog
|
||||
'priority' => 'debug', # XXX: currently ignored
|
||||
@ -81,9 +83,12 @@ $default =
|
||||
'stomp_password' => null,
|
||||
'monitor' => null, // URL to monitor ping endpoint (work in progress)
|
||||
'softlimit' => '90%', // total size or % of memory_limit at which to restart queue threads gracefully
|
||||
'debug_memory' => false, // true to spit memory usage to log
|
||||
),
|
||||
'license' =>
|
||||
array('url' => 'http://creativecommons.org/licenses/by/3.0/',
|
||||
array('type' => 'cc', # can be 'cc', 'allrightsreserved', 'private'
|
||||
'owner' => null, # can be name of content owner e.g. for enterprise
|
||||
'url' => 'http://creativecommons.org/licenses/by/3.0/',
|
||||
'title' => 'Creative Commons Attribution 3.0',
|
||||
'image' => 'http://i.creativecommons.org/l/by/3.0/80x15.png'),
|
||||
'mail' =>
|
||||
@ -249,6 +254,8 @@ $default =
|
||||
'Mapstraction' => null,
|
||||
'Linkback' => null,
|
||||
'WikiHashtags' => null,
|
||||
'PubSubHubBub' => null,
|
||||
'RSSCloud' => null,
|
||||
'OpenID' => null),
|
||||
),
|
||||
'admin' =>
|
||||
|
@ -314,7 +314,7 @@ class DesignSettingsAction extends AccountSettingsAction
|
||||
function showStylesheets()
|
||||
{
|
||||
parent::showStylesheets();
|
||||
$this->cssLink('css/farbtastic.css','base','screen, projection, tv');
|
||||
$this->cssLink('js/farbtastic/farbtastic.css',null,'screen, projection, tv');
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -27,7 +27,7 @@
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
class IoMaster
|
||||
abstract class IoMaster
|
||||
{
|
||||
public $id;
|
||||
|
||||
@ -66,23 +66,18 @@ class IoMaster
|
||||
if ($site != common_config('site', 'server')) {
|
||||
StatusNet::init($site);
|
||||
}
|
||||
|
||||
$classes = array();
|
||||
if (Event::handle('StartIoManagerClasses', array(&$classes))) {
|
||||
$classes[] = 'QueueManager';
|
||||
if (common_config('xmpp', 'enabled') && !defined('XMPP_EMERGENCY_FLAG')) {
|
||||
$classes[] = 'XmppManager'; // handles pings/reconnects
|
||||
$classes[] = 'XmppConfirmManager'; // polls for outgoing confirmations
|
||||
}
|
||||
}
|
||||
Event::handle('EndIoManagerClasses', array(&$classes));
|
||||
|
||||
foreach ($classes as $class) {
|
||||
$this->instantiate($class);
|
||||
}
|
||||
$this->initManagers();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize IoManagers for the currently configured site
|
||||
* which are appropriate to this instance.
|
||||
*
|
||||
* Pass class names into $this->instantiate()
|
||||
*/
|
||||
abstract function initManagers();
|
||||
|
||||
/**
|
||||
* Pull all local sites from status_network table.
|
||||
* @return array of hostnames
|
||||
@ -107,7 +102,7 @@ class IoMaster
|
||||
*/
|
||||
protected function instantiate($class)
|
||||
{
|
||||
if (isset($this->singletons[$class])) {
|
||||
if (is_string($class) && isset($this->singletons[$class])) {
|
||||
// Already instantiated a multi-site-capable handler.
|
||||
// Just let it know it should listen to this site too!
|
||||
$this->singletons[$class]->addSite(common_config('site', 'server'));
|
||||
@ -134,7 +129,11 @@ class IoMaster
|
||||
|
||||
protected function getManager($class)
|
||||
{
|
||||
return call_user_func(array($class, 'get'));
|
||||
if(is_object($class)){
|
||||
return $class;
|
||||
} else {
|
||||
return call_user_func(array($class, 'get'));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@ -170,7 +169,7 @@ class IoMaster
|
||||
$write = array();
|
||||
$except = array();
|
||||
$this->logState('listening');
|
||||
common_log(LOG_INFO, "Waiting up to $timeout seconds for socket data...");
|
||||
common_log(LOG_DEBUG, "Waiting up to $timeout seconds for socket data...");
|
||||
$ready = stream_select($read, $write, $except, $timeout, 0);
|
||||
|
||||
if ($ready === false) {
|
||||
@ -190,7 +189,7 @@ class IoMaster
|
||||
|
||||
if ($timeout > 0 && empty($sockets)) {
|
||||
// If we had no listeners, sleep until the pollers' next requested wakeup.
|
||||
common_log(LOG_INFO, "Sleeping $timeout seconds until next poll cycle...");
|
||||
common_log(LOG_DEBUG, "Sleeping $timeout seconds until next poll cycle...");
|
||||
$this->logState('sleep');
|
||||
sleep($timeout);
|
||||
}
|
||||
@ -207,6 +206,8 @@ class IoMaster
|
||||
if ($usage > $memoryLimit) {
|
||||
common_log(LOG_INFO, "Queue thread hit soft memory limit ($usage > $memoryLimit); gracefully restarting.");
|
||||
break;
|
||||
} else if (common_config('queue', 'debug_memory')) {
|
||||
common_log(LOG_DEBUG, "Memory usage $usage");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -223,8 +224,7 @@ class IoMaster
|
||||
{
|
||||
$softLimit = trim(common_config('queue', 'softlimit'));
|
||||
if (substr($softLimit, -1) == '%') {
|
||||
$limit = trim(ini_get('memory_limit'));
|
||||
$limit = $this->parseMemoryLimit($limit);
|
||||
$limit = $this->parseMemoryLimit(ini_get('memory_limit'));
|
||||
if ($limit > 0) {
|
||||
return intval(substr($softLimit, 0, -1) * $limit / 100);
|
||||
} else {
|
||||
@ -242,9 +242,10 @@ class IoMaster
|
||||
* @param string $mem
|
||||
* @return int
|
||||
*/
|
||||
protected function parseMemoryLimit($mem)
|
||||
public function parseMemoryLimit($mem)
|
||||
{
|
||||
// http://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes
|
||||
$mem = strtolower(trim($mem));
|
||||
$size = array('k' => 1024,
|
||||
'm' => 1024*1024,
|
||||
'g' => 1024*1024*1024);
|
||||
@ -253,7 +254,7 @@ class IoMaster
|
||||
} else if (is_numeric($mem)) {
|
||||
return intval($mem);
|
||||
} else {
|
||||
$mult = strtolower(substr($mem, -1));
|
||||
$mult = substr($mem, -1);
|
||||
if (isset($size[$mult])) {
|
||||
return substr($mem, 0, -1) * $size[$mult];
|
||||
} else {
|
||||
@ -350,7 +351,7 @@ class IoMaster
|
||||
* for per-queue and per-site records.
|
||||
*
|
||||
* @param string $key counter name
|
||||
* @param array $owners list of owner keys like 'queue:jabber' or 'site:stat01'
|
||||
* @param array $owners list of owner keys like 'queue:xmpp' or 'site:stat01'
|
||||
*/
|
||||
public function stats($key, $owners=array())
|
||||
{
|
||||
|
@ -85,6 +85,27 @@ class Sharing_XMPP extends XMPPHP_XMPP
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Build an XMPP proxy connection that'll save outgoing messages
|
||||
* to the 'xmppout' queue to be picked up by xmppdaemon later.
|
||||
*/
|
||||
function jabber_proxy()
|
||||
{
|
||||
$proxy = new Queued_XMPP(common_config('xmpp', 'host') ?
|
||||
common_config('xmpp', 'host') :
|
||||
common_config('xmpp', 'server'),
|
||||
common_config('xmpp', 'port'),
|
||||
common_config('xmpp', 'user'),
|
||||
common_config('xmpp', 'password'),
|
||||
common_config('xmpp', 'resource') . 'daemon',
|
||||
common_config('xmpp', 'server'),
|
||||
common_config('xmpp', 'debug') ?
|
||||
true : false,
|
||||
common_config('xmpp', 'debug') ?
|
||||
XMPPHP_Log::LEVEL_VERBOSE : null);
|
||||
return $proxy;
|
||||
}
|
||||
|
||||
/**
|
||||
* Lazy-connect the configured Jabber account to the configured server;
|
||||
* if already opened, the same connection will be returned.
|
||||
@ -143,7 +164,7 @@ function jabber_connect($resource=null)
|
||||
}
|
||||
|
||||
/**
|
||||
* send a single notice to a given Jabber address
|
||||
* Queue send for a single notice to a given Jabber address
|
||||
*
|
||||
* @param string $to JID to send the notice to
|
||||
* @param Notice $notice notice to send
|
||||
@ -153,10 +174,7 @@ function jabber_connect($resource=null)
|
||||
|
||||
function jabber_send_notice($to, $notice)
|
||||
{
|
||||
$conn = jabber_connect();
|
||||
if (!$conn) {
|
||||
return false;
|
||||
}
|
||||
$conn = jabber_proxy();
|
||||
$profile = Profile::staticGet($notice->profile_id);
|
||||
if (!$profile) {
|
||||
common_log(LOG_WARNING, 'Refusing to send notice with ' .
|
||||
@ -221,10 +239,7 @@ function jabber_format_entry($profile, $notice)
|
||||
|
||||
function jabber_send_message($to, $body, $type='chat', $subject=null)
|
||||
{
|
||||
$conn = jabber_connect();
|
||||
if (!$conn) {
|
||||
return false;
|
||||
}
|
||||
$conn = jabber_proxy();
|
||||
$conn->message($to, $body, $type, $subject);
|
||||
return true;
|
||||
}
|
||||
@ -319,7 +334,7 @@ function jabber_special_presence($type, $to=null, $show=null, $status=null)
|
||||
}
|
||||
|
||||
/**
|
||||
* broadcast a notice to all subscribers and reply recipients
|
||||
* Queue broadcast of a notice to all subscribers and reply recipients
|
||||
*
|
||||
* This function will send a notice to all subscribers on the local server
|
||||
* who have Jabber addresses, and have Jabber notification enabled, and
|
||||
@ -354,7 +369,7 @@ function jabber_broadcast_notice($notice)
|
||||
|
||||
$sent_to = array();
|
||||
|
||||
$conn = jabber_connect();
|
||||
$conn = jabber_proxy();
|
||||
|
||||
$ni = $notice->whoGets();
|
||||
|
||||
@ -389,14 +404,13 @@ function jabber_broadcast_notice($notice)
|
||||
'Sending notice ' . $notice->id . ' to ' . $user->jabber,
|
||||
__FILE__);
|
||||
$conn->message($user->jabber, $msg, 'chat', null, $entry);
|
||||
$conn->processTime(0);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* send a notice to all public listeners
|
||||
* Queue send of a notice to all public listeners
|
||||
*
|
||||
* For notices that are generated on the local system (by users), we can optionally
|
||||
* forward them to remote listeners by XMPP.
|
||||
@ -429,7 +443,7 @@ function jabber_public_notice($notice)
|
||||
$msg = jabber_format_notice($profile, $notice);
|
||||
$entry = jabber_format_entry($profile, $notice);
|
||||
|
||||
$conn = jabber_connect();
|
||||
$conn = jabber_proxy();
|
||||
|
||||
foreach ($public as $address) {
|
||||
common_log(LOG_INFO,
|
||||
@ -437,7 +451,6 @@ function jabber_public_notice($notice)
|
||||
' to public listener ' . $address,
|
||||
__FILE__);
|
||||
$conn->message($address, $msg, 'chat', null, $entry);
|
||||
$conn->processTime(0);
|
||||
}
|
||||
$profile->free();
|
||||
}
|
||||
|
@ -34,14 +34,14 @@ class JabberQueueHandler extends QueueHandler
|
||||
return 'jabber';
|
||||
}
|
||||
|
||||
function handle_notice($notice)
|
||||
function handle($notice)
|
||||
{
|
||||
require_once(INSTALLDIR.'/lib/jabber.php');
|
||||
try {
|
||||
return jabber_broadcast_notice($notice);
|
||||
} catch (XMPPHP_Exception $e) {
|
||||
$this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
|
||||
exit(1);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -36,7 +36,7 @@ class OmbQueueHandler extends QueueHandler
|
||||
* @fixme doesn't currently report failure back to the queue manager
|
||||
* because omb_broadcast_notice() doesn't report it to us
|
||||
*/
|
||||
function handle_notice($notice)
|
||||
function handle($notice)
|
||||
{
|
||||
if ($this->is_remote($notice)) {
|
||||
$this->log(LOG_DEBUG, 'Ignoring remote notice ' . $notice->id);
|
||||
|
@ -30,7 +30,7 @@ class PingQueueHandler extends QueueHandler {
|
||||
return 'ping';
|
||||
}
|
||||
|
||||
function handle_notice($notice) {
|
||||
function handle($notice) {
|
||||
require_once INSTALLDIR . '/lib/ping.php';
|
||||
return ping_broadcast_notice($notice);
|
||||
}
|
||||
|
@ -42,7 +42,7 @@ class PluginQueueHandler extends QueueHandler
|
||||
return 'plugin';
|
||||
}
|
||||
|
||||
function handle_notice($notice)
|
||||
function handle($notice)
|
||||
{
|
||||
Event::handle('HandleQueuedNotice', array(&$notice));
|
||||
return true;
|
||||
|
@ -23,7 +23,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
|
||||
|
||||
/**
|
||||
* Queue handler for pushing new notices to public XMPP subscribers.
|
||||
* @fixme correct this exception handling
|
||||
*/
|
||||
class PublicQueueHandler extends QueueHandler
|
||||
{
|
||||
@ -33,15 +32,14 @@ class PublicQueueHandler extends QueueHandler
|
||||
return 'public';
|
||||
}
|
||||
|
||||
function handle_notice($notice)
|
||||
function handle($notice)
|
||||
{
|
||||
require_once(INSTALLDIR.'/lib/jabber.php');
|
||||
try {
|
||||
return jabber_public_notice($notice);
|
||||
} catch (XMPPHP_Exception $e) {
|
||||
$this->log(LOG_ERR, "Got an XMPPHP_Exception: " . $e->getMessage());
|
||||
die($e->getMessage());
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
117
lib/queued_xmpp.php
Normal file
117
lib/queued_xmpp.php
Normal file
@ -0,0 +1,117 @@
|
||||
<?php
|
||||
/**
|
||||
* StatusNet, the distributed open-source microblogging tool
|
||||
*
|
||||
* Queue-mediated proxy class for outgoing XMPP messages.
|
||||
*
|
||||
* 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 Network
|
||||
* @package StatusNet
|
||||
* @author Brion Vibber <brion@status.net>
|
||||
* @copyright 2010 StatusNet, Inc.
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
require_once INSTALLDIR . '/lib/jabber.php';
|
||||
|
||||
class Queued_XMPP extends XMPPHP_XMPP
|
||||
{
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $host
|
||||
* @param integer $port
|
||||
* @param string $user
|
||||
* @param string $password
|
||||
* @param string $resource
|
||||
* @param string $server
|
||||
* @param boolean $printlog
|
||||
* @param string $loglevel
|
||||
*/
|
||||
public function __construct($host, $port, $user, $password, $resource, $server = null, $printlog = false, $loglevel = null)
|
||||
{
|
||||
parent::__construct($host, $port, $user, $password, $resource, $server, $printlog, $loglevel);
|
||||
// Normally the fulljid isn't filled out until resource binding time;
|
||||
// we need to save it here since we're not talking to a real server.
|
||||
$this->fulljid = "{$this->basejid}/{$this->resource}";
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a formatted message to the outgoing queue for later forwarding
|
||||
* to a real XMPP connection.
|
||||
*
|
||||
* @param string $msg
|
||||
*/
|
||||
public function send($msg, $timeout=NULL)
|
||||
{
|
||||
$qm = QueueManager::get();
|
||||
$qm->enqueue(strval($msg), 'xmppout');
|
||||
}
|
||||
|
||||
/**
|
||||
* Since we'll be getting input through a queue system's run loop,
|
||||
* we'll process one standalone message at a time rather than our
|
||||
* own XMPP message pump.
|
||||
*
|
||||
* @param string $message
|
||||
*/
|
||||
public function processMessage($message) {
|
||||
$frame = array_shift($this->frames);
|
||||
xml_parse($this->parser, $frame->body, false);
|
||||
}
|
||||
|
||||
//@{
|
||||
/**
|
||||
* Stream i/o functions disabled; push input through processMessage()
|
||||
*/
|
||||
public function connect($timeout = 30, $persistent = false, $sendinit = true)
|
||||
{
|
||||
throw new Exception("Can't connect to server from XMPP queue proxy.");
|
||||
}
|
||||
|
||||
public function disconnect()
|
||||
{
|
||||
throw new Exception("Can't connect to server from XMPP queue proxy.");
|
||||
}
|
||||
|
||||
public function process()
|
||||
{
|
||||
throw new Exception("Can't read stream from XMPP queue proxy.");
|
||||
}
|
||||
|
||||
public function processUntil($event, $timeout=-1)
|
||||
{
|
||||
throw new Exception("Can't read stream from XMPP queue proxy.");
|
||||
}
|
||||
|
||||
public function read()
|
||||
{
|
||||
throw new Exception("Can't read stream from XMPP queue proxy.");
|
||||
}
|
||||
|
||||
public function readyToProcess()
|
||||
{
|
||||
throw new Exception("Can't read stream from XMPP queue proxy.");
|
||||
}
|
||||
//@}
|
||||
}
|
||||
|
@ -22,51 +22,20 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
||||
/**
|
||||
* Base class for queue handlers.
|
||||
*
|
||||
* As extensions of the Daemon class, each queue handler has the ability
|
||||
* to launch itself in the background, at which point it'll pass control
|
||||
* to the configured QueueManager class to poll for updates.
|
||||
* As of 0.9, queue handlers are short-lived for items as they are
|
||||
* dequeued by a QueueManager running in an IoMaster in a daemon
|
||||
* such as queuedaemon.php.
|
||||
*
|
||||
* Extensions requiring long-running maintenance or polling should
|
||||
* register an IoManager.
|
||||
*
|
||||
* Subclasses must override at least the following methods:
|
||||
* - transport
|
||||
* - handle_notice
|
||||
* - handle
|
||||
*/
|
||||
#class QueueHandler extends Daemon
|
||||
class QueueHandler
|
||||
{
|
||||
|
||||
# function __construct($id=null, $daemonize=true)
|
||||
# {
|
||||
# parent::__construct($daemonize);
|
||||
#
|
||||
# if ($id) {
|
||||
# $this->set_id($id);
|
||||
# }
|
||||
# }
|
||||
|
||||
/**
|
||||
* How many seconds a polling-based queue manager should wait between
|
||||
* checks for new items to handle.
|
||||
*
|
||||
* Defaults to 60 seconds; override to speed up or slow down.
|
||||
*
|
||||
* @fixme not really compatible with global queue manager
|
||||
* @return int timeout in seconds
|
||||
*/
|
||||
# function timeout()
|
||||
# {
|
||||
# return 60;
|
||||
# }
|
||||
|
||||
# function class_name()
|
||||
# {
|
||||
# return ucfirst($this->transport()) . 'Handler';
|
||||
# }
|
||||
|
||||
# function name()
|
||||
# {
|
||||
# return strtolower($this->class_name().'.'.$this->get_id());
|
||||
# }
|
||||
|
||||
/**
|
||||
* Return transport keyword which identifies items this queue handler
|
||||
* services; must be defined for all subclasses.
|
||||
@ -83,61 +52,17 @@ class QueueHandler
|
||||
|
||||
/**
|
||||
* Here's the meat of your queue handler -- you're handed a Notice
|
||||
* object, which you may do as you will with.
|
||||
* or other object, which you may do as you will with.
|
||||
*
|
||||
* If this function indicates failure, a warning will be logged
|
||||
* and the item is placed back in the queue to be re-run.
|
||||
*
|
||||
* @param Notice $notice
|
||||
* @param mixed $object
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
function handle_notice($notice)
|
||||
function handle($object)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup and start of run loop for this queue handler as a daemon.
|
||||
* Most of the heavy lifting is passed on to the QueueManager's service()
|
||||
* method, which passes control back to our handle_notice() method for
|
||||
* each notice that comes in on the queue.
|
||||
*
|
||||
* Most of the time this won't need to be overridden in a subclass.
|
||||
*
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
function run()
|
||||
{
|
||||
if (!$this->start()) {
|
||||
$this->log(LOG_WARNING, 'failed to start');
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->log(LOG_INFO, 'checking for queued notices');
|
||||
|
||||
$queue = $this->transport();
|
||||
$timeout = $this->timeout();
|
||||
|
||||
$qm = QueueManager::get();
|
||||
|
||||
$qm->service($queue, $this);
|
||||
|
||||
$this->log(LOG_INFO, 'finished servicing the queue');
|
||||
|
||||
if (!$this->finish()) {
|
||||
$this->log(LOG_WARNING, 'failed to clean up');
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->log(LOG_INFO, 'terminating normally');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
function log($level, $msg)
|
||||
{
|
||||
common_log($level, $this->class_name() . ' ('. $this->get_id() .'): '.$msg);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -39,6 +39,10 @@ abstract class QueueManager extends IoManager
|
||||
{
|
||||
static $qm = null;
|
||||
|
||||
public $master = null;
|
||||
public $handlers = array();
|
||||
public $groups = array();
|
||||
|
||||
/**
|
||||
* Factory function to pull the appropriate QueueManager object
|
||||
* for this site's configuration. It can then be used to queue
|
||||
@ -109,6 +113,64 @@ abstract class QueueManager extends IoManager
|
||||
*/
|
||||
abstract function enqueue($object, $queue);
|
||||
|
||||
/**
|
||||
* Build a representation for an object for logging
|
||||
* @param mixed
|
||||
* @return string
|
||||
*/
|
||||
function logrep($object) {
|
||||
if (is_object($object)) {
|
||||
$class = get_class($object);
|
||||
if (isset($object->id)) {
|
||||
return "$class $object->id";
|
||||
}
|
||||
return $class;
|
||||
}
|
||||
if (is_string($object)) {
|
||||
$len = strlen($object);
|
||||
$fragment = mb_substr($object, 0, 32);
|
||||
if (mb_strlen($object) > 32) {
|
||||
$fragment .= '...';
|
||||
}
|
||||
return "string '$fragment' ($len bytes)";
|
||||
}
|
||||
return strval($object);
|
||||
}
|
||||
|
||||
/**
|
||||
* Encode an object for queued storage.
|
||||
* Next gen may use serialization.
|
||||
*
|
||||
* @param mixed $object
|
||||
* @return string
|
||||
*/
|
||||
protected function encode($object)
|
||||
{
|
||||
if ($object instanceof Notice) {
|
||||
return $object->id;
|
||||
} else if (is_string($object)) {
|
||||
return $object;
|
||||
} else {
|
||||
throw new ServerException("Can't queue this type", 500);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decode an object from queued storage.
|
||||
* Accepts back-compat notice reference entries and strings for now.
|
||||
*
|
||||
* @param string
|
||||
* @return mixed
|
||||
*/
|
||||
protected function decode($frame)
|
||||
{
|
||||
if (is_numeric($frame)) {
|
||||
return Notice::staticGet(intval($frame));
|
||||
} else {
|
||||
return $frame;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Instantiate the appropriate QueueHandler class for the given queue.
|
||||
*
|
||||
@ -119,7 +181,9 @@ abstract class QueueManager extends IoManager
|
||||
{
|
||||
if (isset($this->handlers[$queue])) {
|
||||
$class = $this->handlers[$queue];
|
||||
if (class_exists($class)) {
|
||||
if(is_object($class)) {
|
||||
return $class;
|
||||
} else if (class_exists($class)) {
|
||||
return new $class();
|
||||
} else {
|
||||
common_log(LOG_ERR, "Nonexistent handler class '$class' for queue '$queue'");
|
||||
@ -131,13 +195,15 @@ abstract class QueueManager extends IoManager
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of all registered queue transport names.
|
||||
* Get a list of registered queue transport names to be used
|
||||
* for this daemon.
|
||||
*
|
||||
* @return array of strings
|
||||
*/
|
||||
function getQueues()
|
||||
{
|
||||
return array_keys($this->handlers);
|
||||
$group = $this->activeGroup();
|
||||
return array_keys($this->groups[$group]);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -148,33 +214,29 @@ abstract class QueueManager extends IoManager
|
||||
*/
|
||||
function initialize()
|
||||
{
|
||||
// @fixme we'll want to be able to listen to particular queues...
|
||||
if (Event::handle('StartInitializeQueueManager', array($this))) {
|
||||
if (!defined('XMPP_ONLY_FLAG')) { // hack!
|
||||
$this->connect('plugin', 'PluginQueueHandler');
|
||||
$this->connect('omb', 'OmbQueueHandler');
|
||||
$this->connect('ping', 'PingQueueHandler');
|
||||
if (common_config('sms', 'enabled')) {
|
||||
$this->connect('sms', 'SmsQueueHandler');
|
||||
}
|
||||
$this->connect('plugin', 'PluginQueueHandler');
|
||||
$this->connect('omb', 'OmbQueueHandler');
|
||||
$this->connect('ping', 'PingQueueHandler');
|
||||
if (common_config('sms', 'enabled')) {
|
||||
$this->connect('sms', 'SmsQueueHandler');
|
||||
}
|
||||
|
||||
// XMPP output handlers...
|
||||
if (common_config('xmpp', 'enabled') && !defined('XMPP_EMERGENCY_FLAG')) {
|
||||
$this->connect('jabber', 'JabberQueueHandler');
|
||||
$this->connect('public', 'PublicQueueHandler');
|
||||
$this->connect('jabber', 'JabberQueueHandler');
|
||||
$this->connect('public', 'PublicQueueHandler');
|
||||
|
||||
// @fixme this should move up a level or should get an actual queue
|
||||
$this->connect('confirm', 'XmppConfirmHandler');
|
||||
}
|
||||
// @fixme this should get an actual queue
|
||||
//$this->connect('confirm', 'XmppConfirmHandler');
|
||||
|
||||
// For compat with old plugins not registering their own handlers.
|
||||
$this->connect('plugin', 'PluginQueueHandler');
|
||||
|
||||
$this->connect('xmppout', 'XmppOutQueueHandler', 'xmppdaemon');
|
||||
|
||||
if (!defined('XMPP_ONLY_FLAG')) { // hack!
|
||||
// For compat with old plugins not registering their own handlers.
|
||||
$this->connect('plugin', 'PluginQueueHandler');
|
||||
}
|
||||
}
|
||||
if (!defined('XMPP_ONLY_FLAG')) { // hack!
|
||||
Event::handle('EndInitializeQueueManager', array($this));
|
||||
}
|
||||
Event::handle('EndInitializeQueueManager', array($this));
|
||||
}
|
||||
|
||||
/**
|
||||
@ -182,11 +244,28 @@ abstract class QueueManager extends IoManager
|
||||
* Only registered transports will be reliably picked up!
|
||||
*
|
||||
* @param string $transport
|
||||
* @param string $class
|
||||
* @param string $class class name or object instance
|
||||
* @param string $group
|
||||
*/
|
||||
public function connect($transport, $class)
|
||||
public function connect($transport, $class, $group='queuedaemon')
|
||||
{
|
||||
$this->handlers[$transport] = $class;
|
||||
$this->groups[$group][$transport] = $class;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string queue group to use for this request
|
||||
*/
|
||||
function activeGroup()
|
||||
{
|
||||
$group = 'queuedaemon';
|
||||
if ($this->master) {
|
||||
// hack hack
|
||||
if ($this->master instanceof XmppMaster) {
|
||||
return 'xmppdaemon';
|
||||
}
|
||||
}
|
||||
return $group;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -31,7 +31,7 @@ class SmsQueueHandler extends QueueHandler
|
||||
return 'sms';
|
||||
}
|
||||
|
||||
function handle_notice($notice)
|
||||
function handle($notice)
|
||||
{
|
||||
require_once(INSTALLDIR.'/lib/mail.php');
|
||||
return mail_broadcast_notice_sms($notice);
|
||||
|
159
lib/spawningdaemon.php
Normal file
159
lib/spawningdaemon.php
Normal file
@ -0,0 +1,159 @@
|
||||
<?php
|
||||
/*
|
||||
* StatusNet - the distributed open-source microblogging tool
|
||||
* Copyright (C) 2010, StatusNet, Inc.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Base class for daemon that can launch one or more processing threads,
|
||||
* respawning them if they exit.
|
||||
*
|
||||
* This is mainly intended for indefinite workloads such as monitoring
|
||||
* a queue or maintaining an IM channel.
|
||||
*
|
||||
* Child classes should implement the
|
||||
*
|
||||
* We can then pass individual items through the QueueHandler subclasses
|
||||
* they belong to. We additionally can handle queues for multiple sites.
|
||||
*
|
||||
* @package QueueHandler
|
||||
* @author Brion Vibber <brion@status.net>
|
||||
*/
|
||||
abstract class SpawningDaemon extends Daemon
|
||||
{
|
||||
protected $threads=1;
|
||||
|
||||
function __construct($id=null, $daemonize=true, $threads=1)
|
||||
{
|
||||
parent::__construct($daemonize);
|
||||
|
||||
if ($id) {
|
||||
$this->set_id($id);
|
||||
}
|
||||
$this->threads = $threads;
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform some actual work!
|
||||
*
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
public abstract function runThread();
|
||||
|
||||
/**
|
||||
* Spawn one or more background processes and let them start running.
|
||||
* Each individual process will execute whatever's in the runThread()
|
||||
* method, which should be overridden.
|
||||
*
|
||||
* Child processes will be automatically respawned when they exit.
|
||||
*
|
||||
* @todo possibly allow for not respawning on "normal" exits...
|
||||
* though ParallelizingDaemon is probably better for workloads
|
||||
* that have forseeable endpoints.
|
||||
*/
|
||||
function run()
|
||||
{
|
||||
$children = array();
|
||||
for ($i = 1; $i <= $this->threads; $i++) {
|
||||
$pid = pcntl_fork();
|
||||
if ($pid < 0) {
|
||||
$this->log(LOG_ERROR, "Couldn't fork for thread $i; aborting\n");
|
||||
exit(1);
|
||||
} else if ($pid == 0) {
|
||||
$this->initAndRunChild($i);
|
||||
} else {
|
||||
$this->log(LOG_INFO, "Spawned thread $i as pid $pid");
|
||||
$children[$i] = $pid;
|
||||
}
|
||||
}
|
||||
|
||||
$this->log(LOG_INFO, "Waiting for children to complete.");
|
||||
while (count($children) > 0) {
|
||||
$status = null;
|
||||
$pid = pcntl_wait($status);
|
||||
if ($pid > 0) {
|
||||
$i = array_search($pid, $children);
|
||||
if ($i === false) {
|
||||
$this->log(LOG_ERR, "Unrecognized child pid $pid exited!");
|
||||
continue;
|
||||
}
|
||||
unset($children[$i]);
|
||||
$this->log(LOG_INFO, "Thread $i pid $pid exited.");
|
||||
|
||||
$pid = pcntl_fork();
|
||||
if ($pid < 0) {
|
||||
$this->log(LOG_ERROR, "Couldn't fork to respawn thread $i; aborting thread.\n");
|
||||
} else if ($pid == 0) {
|
||||
$this->initAndRunChild($i);
|
||||
} else {
|
||||
$this->log(LOG_INFO, "Respawned thread $i as pid $pid");
|
||||
$children[$i] = $pid;
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->log(LOG_INFO, "All child processes complete.");
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize things for a fresh thread, call runThread(), and
|
||||
* exit at completion with appropriate return value.
|
||||
*/
|
||||
protected function initAndRunChild($thread)
|
||||
{
|
||||
$this->set_id($this->get_id() . "." . $thread);
|
||||
$this->resetDb();
|
||||
$ok = $this->runThread();
|
||||
exit($ok ? 0 : 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reconnect to the database for each child process,
|
||||
* or they'll get very confused trying to use the
|
||||
* same socket.
|
||||
*/
|
||||
protected function resetDb()
|
||||
{
|
||||
// @fixme do we need to explicitly open the db too
|
||||
// or is this implied?
|
||||
global $_DB_DATAOBJECT;
|
||||
unset($_DB_DATAOBJECT['CONNECTIONS']);
|
||||
|
||||
// Reconnect main memcached, or threads will stomp on
|
||||
// each other and corrupt their requests.
|
||||
$cache = common_memcache();
|
||||
if ($cache) {
|
||||
$cache->reconnect();
|
||||
}
|
||||
|
||||
// Also reconnect memcached for status_network table.
|
||||
if (!empty(Status_network::$cache)) {
|
||||
Status_network::$cache->close();
|
||||
Status_network::$cache = null;
|
||||
}
|
||||
}
|
||||
|
||||
function log($level, $msg)
|
||||
{
|
||||
common_log($level, get_class($this) . ' ('. $this->get_id() .'): '.$msg);
|
||||
}
|
||||
|
||||
function name()
|
||||
{
|
||||
return strtolower(get_class($this).'.'.$this->get_id());
|
||||
}
|
||||
}
|
||||
|
@ -63,7 +63,7 @@ class StatusNet
|
||||
}
|
||||
}
|
||||
if (!class_exists($pluginclass)) {
|
||||
throw new ServerException(500, "Plugin $name not found.");
|
||||
throw new ServerException("Plugin $name not found.", 500);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -39,9 +39,12 @@ class StompQueueManager extends QueueManager
|
||||
var $base = null;
|
||||
var $con = null;
|
||||
|
||||
protected $master = null;
|
||||
protected $sites = array();
|
||||
|
||||
protected $useTransactions = true;
|
||||
protected $transaction = null;
|
||||
protected $transactionCount = 0;
|
||||
|
||||
function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
@ -104,11 +107,12 @@ class StompQueueManager extends QueueManager
|
||||
*/
|
||||
function getQueues()
|
||||
{
|
||||
$group = $this->activeGroup();
|
||||
$site = common_config('site', 'server');
|
||||
if (empty($this->handlers[$site])) {
|
||||
if (empty($this->groups[$site][$group])) {
|
||||
return array();
|
||||
} else {
|
||||
return array_keys($this->handlers[$site]);
|
||||
return array_keys($this->groups[$site][$group]);
|
||||
}
|
||||
}
|
||||
|
||||
@ -118,10 +122,12 @@ class StompQueueManager extends QueueManager
|
||||
*
|
||||
* @param string $transport
|
||||
* @param string $class
|
||||
* @param string $group
|
||||
*/
|
||||
public function connect($transport, $class)
|
||||
public function connect($transport, $class, $group='queuedaemon')
|
||||
{
|
||||
$this->handlers[common_config('site', 'server')][$transport] = $class;
|
||||
$this->groups[common_config('site', 'server')][$group][$transport] = $class;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -130,23 +136,23 @@ class StompQueueManager extends QueueManager
|
||||
*/
|
||||
public function enqueue($object, $queue)
|
||||
{
|
||||
$notice = $object;
|
||||
$msg = $this->encode($object);
|
||||
$rep = $this->logrep($object);
|
||||
|
||||
$this->_connect();
|
||||
|
||||
// XXX: serialize and send entire notice
|
||||
|
||||
$result = $this->con->send($this->queueName($queue),
|
||||
$notice->id, // BODY of the message
|
||||
array ('created' => $notice->created));
|
||||
$msg, // BODY of the message
|
||||
array ('created' => common_sql_now()));
|
||||
|
||||
if (!$result) {
|
||||
common_log(LOG_ERR, 'Error sending to '.$queue.' queue');
|
||||
common_log(LOG_ERR, "Error sending $rep to $queue queue");
|
||||
return false;
|
||||
}
|
||||
|
||||
common_log(LOG_DEBUG, 'complete remote queueing notice ID = '
|
||||
. $notice->id . ' for ' . $queue);
|
||||
common_log(LOG_DEBUG, "complete remote queueing $rep for $queue");
|
||||
$this->stats('enqueued', $queue);
|
||||
}
|
||||
|
||||
@ -174,7 +180,7 @@ class StompQueueManager extends QueueManager
|
||||
$ok = true;
|
||||
$frames = $this->con->readFrames();
|
||||
foreach ($frames as $frame) {
|
||||
$ok = $ok && $this->_handleNotice($frame);
|
||||
$ok = $ok && $this->_handleItem($frame);
|
||||
}
|
||||
return $ok;
|
||||
}
|
||||
@ -199,6 +205,7 @@ class StompQueueManager extends QueueManager
|
||||
} else {
|
||||
$this->doSubscribe();
|
||||
}
|
||||
$this->begin();
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -211,6 +218,9 @@ class StompQueueManager extends QueueManager
|
||||
*/
|
||||
public function finish()
|
||||
{
|
||||
// If there are any outstanding delivered messages we haven't processed,
|
||||
// free them for another thread to take.
|
||||
$this->rollback();
|
||||
if ($this->sites) {
|
||||
foreach ($this->sites as $server) {
|
||||
StatusNet::init($server);
|
||||
@ -265,7 +275,7 @@ class StompQueueManager extends QueueManager
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle and acknowledge a notice event that's come in through a queue.
|
||||
* Handle and acknowledge an event that's come in through a queue.
|
||||
*
|
||||
* If the queue handler reports failure, the message is requeued for later.
|
||||
* Missing notices or handler classes will drop the message.
|
||||
@ -276,7 +286,7 @@ class StompQueueManager extends QueueManager
|
||||
* @param StompFrame $frame
|
||||
* @return bool
|
||||
*/
|
||||
protected function _handleNotice($frame)
|
||||
protected function _handleItem($frame)
|
||||
{
|
||||
list($site, $queue) = $this->parseDestination($frame->headers['destination']);
|
||||
if ($site != common_config('site', 'server')) {
|
||||
@ -284,40 +294,37 @@ class StompQueueManager extends QueueManager
|
||||
StatusNet::init($site);
|
||||
}
|
||||
|
||||
$id = intval($frame->body);
|
||||
$info = "notice $id posted at {$frame->headers['created']} in queue $queue";
|
||||
|
||||
$notice = Notice::staticGet('id', $id);
|
||||
if (empty($notice)) {
|
||||
$this->_log(LOG_WARNING, "Skipping missing $info");
|
||||
$this->con->ack($frame);
|
||||
$this->stats('badnotice', $queue);
|
||||
return false;
|
||||
}
|
||||
$item = $this->decode($frame->body);
|
||||
|
||||
$handler = $this->getHandler($queue);
|
||||
if (!$handler) {
|
||||
$this->_log(LOG_ERROR, "Missing handler class; skipping $info");
|
||||
$this->con->ack($frame);
|
||||
$this->ack($frame);
|
||||
$this->commit();
|
||||
$this->begin();
|
||||
$this->stats('badhandler', $queue);
|
||||
return false;
|
||||
}
|
||||
|
||||
$ok = $handler->handle_notice($notice);
|
||||
$ok = $handler->handle($item);
|
||||
|
||||
if (!$ok) {
|
||||
$this->_log(LOG_WARNING, "Failed handling $info");
|
||||
// FIXME we probably shouldn't have to do
|
||||
// this kind of queue management ourselves;
|
||||
// if we don't ack, it should resend...
|
||||
$this->con->ack($frame);
|
||||
$this->enqueue($notice, $queue);
|
||||
$this->ack($frame);
|
||||
$this->enqueue($item, $queue);
|
||||
$this->commit();
|
||||
$this->begin();
|
||||
$this->stats('requeued', $queue);
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->_log(LOG_INFO, "Successfully handled $info");
|
||||
$this->con->ack($frame);
|
||||
$this->ack($frame);
|
||||
$this->commit();
|
||||
$this->begin();
|
||||
$this->stats('handled', $queue);
|
||||
return true;
|
||||
}
|
||||
@ -359,5 +366,49 @@ class StompQueueManager extends QueueManager
|
||||
{
|
||||
common_log($level, 'StompQueueManager: '.$msg);
|
||||
}
|
||||
|
||||
protected function begin()
|
||||
{
|
||||
if ($this->useTransactions) {
|
||||
if ($this->transaction) {
|
||||
throw new Exception("Tried to start transaction in the middle of a transaction");
|
||||
}
|
||||
$this->transactionCount++;
|
||||
$this->transaction = $this->master->id . '-' . $this->transactionCount . '-' . time();
|
||||
$this->con->begin($this->transaction);
|
||||
}
|
||||
}
|
||||
|
||||
protected function ack($frame)
|
||||
{
|
||||
if ($this->useTransactions) {
|
||||
if (!$this->transaction) {
|
||||
throw new Exception("Tried to ack but not in a transaction");
|
||||
}
|
||||
}
|
||||
$this->con->ack($frame, $this->transaction);
|
||||
}
|
||||
|
||||
protected function commit()
|
||||
{
|
||||
if ($this->useTransactions) {
|
||||
if (!$this->transaction) {
|
||||
throw new Exception("Tried to commit but not in a transaction");
|
||||
}
|
||||
$this->con->commit($this->transaction);
|
||||
$this->transaction = null;
|
||||
}
|
||||
}
|
||||
|
||||
protected function rollback()
|
||||
{
|
||||
if ($this->useTransactions) {
|
||||
if (!$this->transaction) {
|
||||
throw new Exception("Tried to rollback but not in a transaction");
|
||||
}
|
||||
$this->con->commit($this->transaction);
|
||||
$this->transaction = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,7 @@ class UnQueueManager extends QueueManager
|
||||
|
||||
$handler = $this->getHandler($queue);
|
||||
if ($handler) {
|
||||
$handler->handle_notice($notice);
|
||||
$handler->handle($notice);
|
||||
} else {
|
||||
if (Event::handle('UnqueueHandleNotice', array(&$notice, $queue))) {
|
||||
throw new ServerException("UnQueueManager: Unknown queue: $queue");
|
||||
|
18
lib/util.php
18
lib/util.php
@ -596,20 +596,13 @@ function common_linkify($url) {
|
||||
}
|
||||
|
||||
if (!empty($f)) {
|
||||
if ($f->isEnclosure()) {
|
||||
if ($f->getEnclosure()) {
|
||||
$is_attachment = true;
|
||||
$attachment_id = $f->id;
|
||||
} else {
|
||||
$foe = File_oembed::staticGet('file_id', $f->id);
|
||||
if (!empty($foe)) {
|
||||
// if it has OEmbed info, it's an attachment, too
|
||||
$is_attachment = true;
|
||||
$attachment_id = $f->id;
|
||||
|
||||
$thumb = File_thumbnail::staticGet('file_id', $f->id);
|
||||
if (!empty($thumb)) {
|
||||
$has_thumb = true;
|
||||
}
|
||||
$thumb = File_thumbnail::staticGet('file_id', $f->id);
|
||||
if (!empty($thumb)) {
|
||||
$has_thumb = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1130,7 +1123,8 @@ function common_request_id()
|
||||
$pid = getmypid();
|
||||
$server = common_config('site', 'server');
|
||||
if (php_sapi_name() == 'cli') {
|
||||
return "$server:$pid";
|
||||
$script = basename($_SERVER['PHP_SELF']);
|
||||
return "$server:$script:$pid";
|
||||
} else {
|
||||
static $req_id = null;
|
||||
if (!isset($req_id)) {
|
||||
|
@ -1,168 +0,0 @@
|
||||
<?php
|
||||
/*
|
||||
* StatusNet - the distributed open-source microblogging tool
|
||||
* Copyright (C) 2008-2010 StatusNet, Inc.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Event handler for pushing new confirmations to Jabber users.
|
||||
* @fixme recommend redoing this on a queue-trigger model
|
||||
* @fixme expiration of old items got dropped in the past, put it back?
|
||||
*/
|
||||
class XmppConfirmManager extends IoManager
|
||||
{
|
||||
|
||||
/**
|
||||
* @return mixed XmppConfirmManager, or false if unneeded
|
||||
*/
|
||||
public static function get()
|
||||
{
|
||||
if (common_config('xmpp', 'enabled')) {
|
||||
$site = common_config('site', 'server');
|
||||
return new XmppConfirmManager();
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tell the i/o master we need one instance for each supporting site
|
||||
* being handled in this process.
|
||||
*/
|
||||
public static function multiSite()
|
||||
{
|
||||
return IoManager::INSTANCE_PER_SITE;
|
||||
}
|
||||
|
||||
function __construct()
|
||||
{
|
||||
$this->site = common_config('site', 'server');
|
||||
}
|
||||
|
||||
/**
|
||||
* 10 seconds? Really? That seems a bit frequent.
|
||||
*/
|
||||
function pollInterval()
|
||||
{
|
||||
return 10;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ping!
|
||||
* @return boolean true if we found something
|
||||
*/
|
||||
function poll()
|
||||
{
|
||||
$this->switchSite();
|
||||
$confirm = $this->next_confirm();
|
||||
if ($confirm) {
|
||||
$this->handle_confirm($confirm);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
protected function handle_confirm($confirm)
|
||||
{
|
||||
require_once INSTALLDIR . '/lib/jabber.php';
|
||||
|
||||
common_log(LOG_INFO, 'Sending confirmation for ' . $confirm->address);
|
||||
$user = User::staticGet($confirm->user_id);
|
||||
if (!$user) {
|
||||
common_log(LOG_WARNING, 'Confirmation for unknown user ' . $confirm->user_id);
|
||||
return;
|
||||
}
|
||||
$success = jabber_confirm_address($confirm->code,
|
||||
$user->nickname,
|
||||
$confirm->address);
|
||||
if (!$success) {
|
||||
common_log(LOG_ERR, 'Confirmation failed for ' . $confirm->address);
|
||||
# Just let the claim age out; hopefully things work then
|
||||
return;
|
||||
} else {
|
||||
common_log(LOG_INFO, 'Confirmation sent for ' . $confirm->address);
|
||||
# Mark confirmation sent; need a dupe so we don't have the WHERE clause
|
||||
$dupe = Confirm_address::staticGet('code', $confirm->code);
|
||||
if (!$dupe) {
|
||||
common_log(LOG_WARNING, 'Could not refetch confirm', __FILE__);
|
||||
return;
|
||||
}
|
||||
$orig = clone($dupe);
|
||||
$dupe->sent = $dupe->claimed;
|
||||
$result = $dupe->update($orig);
|
||||
if (!$result) {
|
||||
common_log_db_error($dupe, 'UPDATE', __FILE__);
|
||||
# Just let the claim age out; hopefully things work then
|
||||
return;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
protected function next_confirm()
|
||||
{
|
||||
$confirm = new Confirm_address();
|
||||
$confirm->whereAdd('claimed IS null');
|
||||
$confirm->whereAdd('sent IS null');
|
||||
# XXX: eventually we could do other confirmations in the queue, too
|
||||
$confirm->address_type = 'jabber';
|
||||
$confirm->orderBy('modified DESC');
|
||||
$confirm->limit(1);
|
||||
if ($confirm->find(true)) {
|
||||
common_log(LOG_INFO, 'Claiming confirmation for ' . $confirm->address);
|
||||
# working around some weird DB_DataObject behaviour
|
||||
$confirm->whereAdd(''); # clears where stuff
|
||||
$original = clone($confirm);
|
||||
$confirm->claimed = common_sql_now();
|
||||
$result = $confirm->update($original);
|
||||
if ($result) {
|
||||
common_log(LOG_INFO, 'Succeeded in claim! '. $result);
|
||||
return $confirm;
|
||||
} else {
|
||||
common_log(LOG_INFO, 'Failed in claim!');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
protected function clear_old_confirm_claims()
|
||||
{
|
||||
$confirm = new Confirm();
|
||||
$confirm->claimed = null;
|
||||
$confirm->whereAdd('now() - claimed > '.CLAIM_TIMEOUT);
|
||||
$confirm->update(DB_DATAOBJECT_WHEREADD_ONLY);
|
||||
$confirm->free();
|
||||
unset($confirm);
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure we're on the right site configuration
|
||||
*/
|
||||
protected function switchSite()
|
||||
{
|
||||
if ($this->site != common_config('site', 'server')) {
|
||||
common_log(LOG_DEBUG, __METHOD__ . ": switching to site $this->site");
|
||||
$this->stats('switch');
|
||||
StatusNet::init($this->site);
|
||||
}
|
||||
}
|
||||
}
|
@ -70,6 +70,7 @@ class XmppManager extends IoManager
|
||||
function __construct()
|
||||
{
|
||||
$this->site = common_config('site', 'server');
|
||||
$this->resource = common_config('xmpp', 'resource') . 'daemon';
|
||||
}
|
||||
|
||||
/**
|
||||
@ -86,15 +87,19 @@ class XmppManager extends IoManager
|
||||
# Low priority; we don't want to receive messages
|
||||
|
||||
common_log(LOG_INFO, "INITIALIZE");
|
||||
$this->conn = jabber_connect($this->resource());
|
||||
$this->conn = jabber_connect($this->resource);
|
||||
|
||||
if (empty($this->conn)) {
|
||||
common_log(LOG_ERR, "Couldn't connect to server.");
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->conn->addEventHandler('message', 'forward_message', $this);
|
||||
$this->log(LOG_DEBUG, "Initializing stanza handlers.");
|
||||
|
||||
$this->conn->addEventHandler('message', 'handle_message', $this);
|
||||
$this->conn->addEventHandler('presence', 'handle_presence', $this);
|
||||
$this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
|
||||
|
||||
$this->conn->setReconnectTimeout(600);
|
||||
jabber_send_presence("Send me a message to post a notice", 'available', null, 'available', -1);
|
||||
|
||||
@ -175,12 +180,37 @@ class XmppManager extends IoManager
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* For queue handlers to pass us a message to push out,
|
||||
* if we're active.
|
||||
*
|
||||
* @fixme should this be blocking etc?
|
||||
*
|
||||
* @param string $msg XML stanza to send
|
||||
* @return boolean success
|
||||
*/
|
||||
public function send($msg)
|
||||
{
|
||||
if ($this->conn && !$this->conn->isDisconnected()) {
|
||||
$bytes = $this->conn->send($msg);
|
||||
if ($bytes > 0) {
|
||||
$this->conn->processTime(0);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
} else {
|
||||
// Can't send right now...
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a keepalive ping to the XMPP server.
|
||||
*/
|
||||
protected function sendPing()
|
||||
{
|
||||
$jid = jabber_daemon_address().'/'.$this->resource();
|
||||
$jid = jabber_daemon_address().'/'.$this->resource;
|
||||
$server = common_config('xmpp', 'server');
|
||||
|
||||
if (!isset($this->pingid)) {
|
||||
@ -206,61 +236,239 @@ class XmppManager extends IoManager
|
||||
$this->conn->presence(null, 'available', null, 'available', -1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for Jabber message event.
|
||||
*
|
||||
* This connection handles output; if we get a message straight to us,
|
||||
* forward it on to our XmppDaemon listener for processing.
|
||||
*
|
||||
* @param $pl
|
||||
*/
|
||||
function forward_message(&$pl)
|
||||
|
||||
function get_user($from)
|
||||
{
|
||||
$user = User::staticGet('jabber', jabber_normalize_jid($from));
|
||||
return $user;
|
||||
}
|
||||
|
||||
/**
|
||||
* XMPP callback for handling message input...
|
||||
* @param array $pl XMPP payload
|
||||
*/
|
||||
function handle_message(&$pl)
|
||||
{
|
||||
$from = jabber_normalize_jid($pl['from']);
|
||||
|
||||
if ($pl['type'] != 'chat') {
|
||||
common_log(LOG_DEBUG, 'Ignoring message of type ' . $pl['type'] . ' from ' . $pl['from']);
|
||||
$this->log(LOG_WARNING, "Ignoring message of type ".$pl['type']." from $from.");
|
||||
return;
|
||||
}
|
||||
$listener = $this->listener();
|
||||
if (strtolower($listener) == strtolower($pl['from'])) {
|
||||
common_log(LOG_WARNING, 'Ignoring loop message.');
|
||||
|
||||
if (mb_strlen($pl['body']) == 0) {
|
||||
$this->log(LOG_WARNING, "Ignoring message with empty body from $from.");
|
||||
return;
|
||||
}
|
||||
common_log(LOG_INFO, 'Forwarding message from ' . $pl['from'] . ' to ' . $listener);
|
||||
$this->conn->message($this->listener(), $pl['body'], 'chat', null, $this->ofrom($pl['from']));
|
||||
}
|
||||
|
||||
/**
|
||||
* Build an <addresses> block with an ofrom entry for forwarded messages
|
||||
*
|
||||
* @param string $from Jabber ID of original sender
|
||||
* @return string XML fragment
|
||||
*/
|
||||
protected function ofrom($from)
|
||||
{
|
||||
$address = "<addresses xmlns='http://jabber.org/protocol/address'>\n";
|
||||
$address .= "<address type='ofrom' jid='$from' />\n";
|
||||
$address .= "</addresses>\n";
|
||||
return $address;
|
||||
}
|
||||
// Forwarded from another daemon for us to handle; this shouldn't
|
||||
// happen any more but we might get some legacy items.
|
||||
if ($this->is_self($from)) {
|
||||
$this->log(LOG_INFO, "Got forwarded notice from self ($from).");
|
||||
$from = $this->get_ofrom($pl);
|
||||
$this->log(LOG_INFO, "Originally sent by $from.");
|
||||
if (is_null($from) || $this->is_self($from)) {
|
||||
$this->log(LOG_INFO, "Ignoring notice originally sent by $from.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Build the complete JID of the XmppDaemon process which
|
||||
* handles primary XMPP input for this site.
|
||||
*
|
||||
* @return string Jabber ID
|
||||
*/
|
||||
protected function listener()
|
||||
{
|
||||
if (common_config('xmpp', 'listener')) {
|
||||
return common_config('xmpp', 'listener');
|
||||
$user = $this->get_user($from);
|
||||
|
||||
// For common_current_user to work
|
||||
global $_cur;
|
||||
$_cur = $user;
|
||||
|
||||
if (!$user) {
|
||||
$this->from_site($from, 'Unknown user; go to ' .
|
||||
common_local_url('imsettings') .
|
||||
' to add your address to your account');
|
||||
$this->log(LOG_WARNING, 'Message from unknown user ' . $from);
|
||||
return;
|
||||
}
|
||||
if ($this->handle_command($user, $pl['body'])) {
|
||||
$this->log(LOG_INFO, "Command message by $from handled.");
|
||||
return;
|
||||
} else if ($this->is_autoreply($pl['body'])) {
|
||||
$this->log(LOG_INFO, 'Ignoring auto reply from ' . $from);
|
||||
return;
|
||||
} else if ($this->is_otr($pl['body'])) {
|
||||
$this->log(LOG_INFO, 'Ignoring OTR from ' . $from);
|
||||
return;
|
||||
} else {
|
||||
return jabber_daemon_address() . '/' . common_config('xmpp','resource') . 'daemon';
|
||||
|
||||
$this->log(LOG_INFO, 'Posting a notice from ' . $user->nickname);
|
||||
|
||||
$this->add_notice($user, $pl);
|
||||
}
|
||||
|
||||
$user->free();
|
||||
unset($user);
|
||||
unset($_cur);
|
||||
|
||||
unset($pl['xml']);
|
||||
$pl['xml'] = null;
|
||||
|
||||
$pl = null;
|
||||
unset($pl);
|
||||
}
|
||||
|
||||
|
||||
function is_self($from)
|
||||
{
|
||||
return preg_match('/^'.strtolower(jabber_daemon_address()).'/', strtolower($from));
|
||||
}
|
||||
|
||||
function get_ofrom($pl)
|
||||
{
|
||||
$xml = $pl['xml'];
|
||||
$addresses = $xml->sub('addresses');
|
||||
if (!$addresses) {
|
||||
$this->log(LOG_WARNING, 'Forwarded message without addresses');
|
||||
return null;
|
||||
}
|
||||
$address = $addresses->sub('address');
|
||||
if (!$address) {
|
||||
$this->log(LOG_WARNING, 'Forwarded message without address');
|
||||
return null;
|
||||
}
|
||||
if (!array_key_exists('type', $address->attrs)) {
|
||||
$this->log(LOG_WARNING, 'No type for forwarded message');
|
||||
return null;
|
||||
}
|
||||
$type = $address->attrs['type'];
|
||||
if ($type != 'ofrom') {
|
||||
$this->log(LOG_WARNING, 'Type of forwarded message is not ofrom');
|
||||
return null;
|
||||
}
|
||||
if (!array_key_exists('jid', $address->attrs)) {
|
||||
$this->log(LOG_WARNING, 'No jid for forwarded message');
|
||||
return null;
|
||||
}
|
||||
$jid = $address->attrs['jid'];
|
||||
if (!$jid) {
|
||||
$this->log(LOG_WARNING, 'Could not get jid from address');
|
||||
return null;
|
||||
}
|
||||
$this->log(LOG_DEBUG, 'Got message forwarded from jid ' . $jid);
|
||||
return $jid;
|
||||
}
|
||||
|
||||
function is_autoreply($txt)
|
||||
{
|
||||
if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) {
|
||||
return true;
|
||||
} else if (preg_match('/^System: Message wasn\'t delivered. Offline storage size was exceeded.$/', $txt)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
protected function resource()
|
||||
function is_otr($txt)
|
||||
{
|
||||
return 'queue' . posix_getpid(); // @fixme PIDs won't be host-unique
|
||||
if (preg_match('/^\?OTR/', $txt)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function from_site($address, $msg)
|
||||
{
|
||||
$text = '['.common_config('site', 'name') . '] ' . $msg;
|
||||
jabber_send_message($address, $text);
|
||||
}
|
||||
|
||||
function handle_command($user, $body)
|
||||
{
|
||||
$inter = new CommandInterpreter();
|
||||
$cmd = $inter->handle_command($user, $body);
|
||||
if ($cmd) {
|
||||
$chan = new XMPPChannel($this->conn);
|
||||
$cmd->execute($chan);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function add_notice(&$user, &$pl)
|
||||
{
|
||||
$body = trim($pl['body']);
|
||||
$content_shortened = common_shorten_links($body);
|
||||
if (Notice::contentTooLong($content_shortened)) {
|
||||
$from = jabber_normalize_jid($pl['from']);
|
||||
$this->from_site($from, sprintf(_('Message too long - maximum is %1$d characters, you sent %2$d.'),
|
||||
Notice::maxContent(),
|
||||
mb_strlen($content_shortened)));
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$notice = Notice::saveNew($user->id, $content_shortened, 'xmpp');
|
||||
} catch (Exception $e) {
|
||||
$this->log(LOG_ERR, $e->getMessage());
|
||||
$this->from_site($user->jabber, $e->getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
common_broadcast_notice($notice);
|
||||
$this->log(LOG_INFO,
|
||||
'Added notice ' . $notice->id . ' from user ' . $user->nickname);
|
||||
$notice->free();
|
||||
unset($notice);
|
||||
}
|
||||
|
||||
function handle_presence(&$pl)
|
||||
{
|
||||
$from = jabber_normalize_jid($pl['from']);
|
||||
switch ($pl['type']) {
|
||||
case 'subscribe':
|
||||
# We let anyone subscribe
|
||||
$this->subscribed($from);
|
||||
$this->log(LOG_INFO,
|
||||
'Accepted subscription from ' . $from);
|
||||
break;
|
||||
case 'subscribed':
|
||||
case 'unsubscribed':
|
||||
case 'unsubscribe':
|
||||
$this->log(LOG_INFO,
|
||||
'Ignoring "' . $pl['type'] . '" from ' . $from);
|
||||
break;
|
||||
default:
|
||||
if (!$pl['type']) {
|
||||
$user = User::staticGet('jabber', $from);
|
||||
if (!$user) {
|
||||
$this->log(LOG_WARNING, 'Presence from unknown user ' . $from);
|
||||
return;
|
||||
}
|
||||
if ($user->updatefrompresence) {
|
||||
$this->log(LOG_INFO, 'Updating ' . $user->nickname .
|
||||
' status from presence.');
|
||||
$this->add_notice($user, $pl);
|
||||
}
|
||||
$user->free();
|
||||
unset($user);
|
||||
}
|
||||
break;
|
||||
}
|
||||
unset($pl['xml']);
|
||||
$pl['xml'] = null;
|
||||
|
||||
$pl = null;
|
||||
unset($pl);
|
||||
}
|
||||
|
||||
function log($level, $msg)
|
||||
{
|
||||
$text = 'XMPPDaemon('.$this->resource.'): '.$msg;
|
||||
common_log($level, $text);
|
||||
}
|
||||
|
||||
function subscribed($to)
|
||||
{
|
||||
jabber_special_presence('subscribed', $to);
|
||||
}
|
||||
|
||||
/**
|
||||
|
55
lib/xmppoutqueuehandler.php
Normal file
55
lib/xmppoutqueuehandler.php
Normal file
@ -0,0 +1,55 @@
|
||||
<?php
|
||||
/*
|
||||
* StatusNet - the distributed open-source microblogging tool
|
||||
* Copyright (C) 2010, StatusNet, Inc.
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Queue handler for pre-processed outgoing XMPP messages.
|
||||
* Formatted XML stanzas will have been pushed into the queue
|
||||
* via the Queued_XMPP connection proxy, probably from some
|
||||
* other queue processor.
|
||||
*
|
||||
* Here, the XML stanzas are simply pulled out of the queue and
|
||||
* pushed out over the wire; an XmppManager is needed to set up
|
||||
* and maintain the actual server connection.
|
||||
*
|
||||
* This queue will be run via XmppDaemon rather than QueueDaemon.
|
||||
*
|
||||
* @author Brion Vibber <brion@status.net>
|
||||
*/
|
||||
class XmppOutQueueHandler extends QueueHandler
|
||||
{
|
||||
function transport() {
|
||||
return 'xmppout';
|
||||
}
|
||||
|
||||
/**
|
||||
* Take a previously-queued XMPP stanza and send it out ot the server.
|
||||
* @param string $msg
|
||||
* @return boolean true on success
|
||||
*/
|
||||
function handle($msg)
|
||||
{
|
||||
assert(is_string($msg));
|
||||
|
||||
$xmpp = XmppManager::get();
|
||||
$ok = $xmpp->send($msg);
|
||||
|
||||
return $ok;
|
||||
}
|
||||
}
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-16 17:51:26+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:00+0000\n"
|
||||
"Language-Team: Arabic\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61138); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ar\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -127,7 +127,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -372,7 +372,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "لم توجد المجموعة!"
|
||||
|
||||
@ -415,7 +415,7 @@ msgstr "مجموعات %s"
|
||||
|
||||
#: actions/apioauthauthorize.php:108 actions/apioauthauthorize.php:114
|
||||
msgid "Bad request."
|
||||
msgstr ""
|
||||
msgstr "طلب سيء."
|
||||
|
||||
#: actions/apioauthauthorize.php:134 actions/avatarsettings.php:268
|
||||
#: actions/deletenotice.php:157 actions/disfavor.php:74
|
||||
@ -531,7 +531,7 @@ msgstr "حُذِفت الحالة."
|
||||
|
||||
#: actions/apistatusesshow.php:144
|
||||
msgid "No status with that ID found."
|
||||
msgstr ""
|
||||
msgstr "لا حالة وُجدت بهذه الهوية."
|
||||
|
||||
#: actions/apistatusesupdate.php:162 actions/newnotice.php:155
|
||||
#: lib/mailhandler.php:60
|
||||
@ -597,7 +597,7 @@ msgstr ""
|
||||
#: actions/apitimelineretweetedbyme.php:112
|
||||
#, php-format
|
||||
msgid "Repeated by %s"
|
||||
msgstr ""
|
||||
msgstr "كرّره %s"
|
||||
|
||||
#: actions/apitimelineretweetedtome.php:111
|
||||
#, php-format
|
||||
@ -1026,7 +1026,7 @@ msgstr "لا مستند كهذا."
|
||||
|
||||
#: actions/editapplication.php:54 lib/applicationeditform.php:136
|
||||
msgid "Edit application"
|
||||
msgstr ""
|
||||
msgstr "عدّل التطبيق"
|
||||
|
||||
#: actions/editapplication.php:66
|
||||
msgid "You must be logged in to edit an application."
|
||||
@ -1042,7 +1042,7 @@ msgid "No such application."
|
||||
msgstr "لا تطبيق كهذا."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -1072,7 +1072,7 @@ msgstr "مسار المصدر ليس صحيحا."
|
||||
|
||||
#: actions/editapplication.php:200 actions/newapplication.php:185
|
||||
msgid "Organization is required."
|
||||
msgstr ""
|
||||
msgstr "المنظمة مطلوبة."
|
||||
|
||||
#: actions/editapplication.php:203 actions/newapplication.php:188
|
||||
msgid "Organization is too long (max 255 chars)."
|
||||
@ -1080,7 +1080,7 @@ msgstr "المنظمة طويلة جدا (الأقصى 255 حرفا)."
|
||||
|
||||
#: actions/editapplication.php:206 actions/newapplication.php:191
|
||||
msgid "Organization homepage is required."
|
||||
msgstr ""
|
||||
msgstr "صفحة المنظمة الرئيسية مطلوبة."
|
||||
|
||||
#: actions/editapplication.php:215 actions/newapplication.php:203
|
||||
msgid "Callback is too long."
|
||||
@ -1289,7 +1289,7 @@ msgstr "أزيل هذا العنوان."
|
||||
|
||||
#: actions/emailsettings.php:446 actions/smssettings.php:518
|
||||
msgid "No incoming email address."
|
||||
msgstr ""
|
||||
msgstr "لا عنوان بريد إلكتروني وارد."
|
||||
|
||||
#: actions/emailsettings.php:456 actions/emailsettings.php:478
|
||||
#: actions/smssettings.php:528 actions/smssettings.php:552
|
||||
@ -1395,7 +1395,7 @@ msgstr "المستخدم الذي تستمع إليه غير موجود."
|
||||
|
||||
#: actions/finishremotesubscribe.php:87 actions/remotesubscribe.php:59
|
||||
msgid "You can use the local subscription!"
|
||||
msgstr ""
|
||||
msgstr "تستطيع استخدام الاشتراك المحلي!"
|
||||
|
||||
#: actions/finishremotesubscribe.php:99
|
||||
msgid "That user has blocked you from subscribing."
|
||||
@ -1838,7 +1838,7 @@ msgstr ""
|
||||
|
||||
#: actions/joingroup.php:60
|
||||
msgid "You must be logged in to join a group."
|
||||
msgstr ""
|
||||
msgstr "يجب أن تلج لتنضم إلى مجموعة."
|
||||
|
||||
#: actions/joingroup.php:131
|
||||
#, php-format
|
||||
@ -1847,7 +1847,7 @@ msgstr "%1$s انضم للمجموعة %2$s"
|
||||
|
||||
#: actions/leavegroup.php:60
|
||||
msgid "You must be logged in to leave a group."
|
||||
msgstr ""
|
||||
msgstr "يجب أن تلج لتغادر مجموعة."
|
||||
|
||||
#: actions/leavegroup.php:90 lib/command.php:265
|
||||
msgid "You are not a member of that group."
|
||||
@ -1929,7 +1929,7 @@ msgstr "لا حالة حالية"
|
||||
|
||||
#: actions/newapplication.php:52
|
||||
msgid "New application"
|
||||
msgstr ""
|
||||
msgstr "تطبيق جديد"
|
||||
|
||||
#: actions/newapplication.php:64
|
||||
msgid "You must be logged in to register an application."
|
||||
@ -1961,7 +1961,7 @@ msgstr "رسالة جديدة"
|
||||
|
||||
#: actions/newmessage.php:121 actions/newmessage.php:161 lib/command.php:358
|
||||
msgid "You can't send a message to this user."
|
||||
msgstr ""
|
||||
msgstr "لا يمكنك إرسال رسائل إلى هذا المستخدم."
|
||||
|
||||
#: actions/newmessage.php:144 actions/newnotice.php:136 lib/command.php:342
|
||||
#: lib/command.php:475
|
||||
@ -2004,6 +2004,8 @@ msgid ""
|
||||
"Search for notices on %%site.name%% by their contents. Separate search terms "
|
||||
"by spaces; they must be 3 characters or more."
|
||||
msgstr ""
|
||||
"ابحث عن إشعارات على %%site.name%% عبر محتوياتها. افصل عبارات البحث بمسافات؛ "
|
||||
"ويجب أن تتكون هذه العبارات من 3 أحرف أو أكثر."
|
||||
|
||||
#: actions/noticesearch.php:78
|
||||
msgid "Text search"
|
||||
@ -2078,7 +2080,7 @@ msgstr ""
|
||||
|
||||
#: actions/oauthconnectionssettings.php:170
|
||||
msgid "You are not a user of that application."
|
||||
msgstr "أنت لست مستخدما لهذا التطبيق."
|
||||
msgstr "لست مستخدما لهذا التطبيق."
|
||||
|
||||
#: actions/oauthconnectionssettings.php:180
|
||||
msgid "Unable to revoke access for app: "
|
||||
@ -2470,7 +2472,7 @@ msgstr ""
|
||||
|
||||
#: actions/profilesettings.php:138
|
||||
msgid "Share my current location when posting notices"
|
||||
msgstr ""
|
||||
msgstr "شارك مكاني الحالي عند إرسال إشعارات"
|
||||
|
||||
#: actions/profilesettings.php:145 actions/tagother.php:149
|
||||
#: actions/tagother.php:209 lib/subscriptionlist.php:106
|
||||
@ -2919,7 +2921,7 @@ msgstr ""
|
||||
|
||||
#: actions/repeat.php:57
|
||||
msgid "Only logged-in users can repeat notices."
|
||||
msgstr ""
|
||||
msgstr "يستطيع المستخدمون الوالجون وحدهم تكرار الإشعارات."
|
||||
|
||||
#: actions/repeat.php:64 actions/repeat.php:71
|
||||
msgid "No notice specified."
|
||||
@ -3006,7 +3008,7 @@ msgstr ""
|
||||
|
||||
#: actions/showapplication.php:160 lib/applicationeditform.php:182
|
||||
msgid "Icon"
|
||||
msgstr ""
|
||||
msgstr "أيقونة"
|
||||
|
||||
#: actions/showapplication.php:170 actions/version.php:195
|
||||
#: lib/applicationeditform.php:197
|
||||
@ -3296,7 +3298,7 @@ msgstr ""
|
||||
#: actions/showstream.php:313
|
||||
#, php-format
|
||||
msgid "Repeat of %s"
|
||||
msgstr "تكرارات %s"
|
||||
msgstr "تكرار ل%s"
|
||||
|
||||
#: actions/silence.php:65 actions/unsilence.php:65
|
||||
msgid "You cannot silence users on this site."
|
||||
@ -3971,7 +3973,7 @@ msgstr "استمتع بالنقانق!"
|
||||
|
||||
#: actions/usergroups.php:130
|
||||
msgid "Search for more groups"
|
||||
msgstr ""
|
||||
msgstr "ابحث عن المزيد من المجموعات"
|
||||
|
||||
#: actions/usergroups.php:153
|
||||
#, php-format
|
||||
@ -4028,7 +4030,7 @@ msgstr ""
|
||||
|
||||
#: actions/version.php:189
|
||||
msgid "Plugins"
|
||||
msgstr ""
|
||||
msgstr "ملحقات"
|
||||
|
||||
#: actions/version.php:196 lib/action.php:741
|
||||
msgid "Version"
|
||||
@ -4116,12 +4118,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr "مشكلة أثناء حفظ الإشعار."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "آر تي @%1$s %2$s"
|
||||
@ -4291,7 +4293,7 @@ msgstr ""
|
||||
|
||||
#: lib/action.php:773
|
||||
msgid "StatusNet software license"
|
||||
msgstr ""
|
||||
msgstr "رخصة برنامج StatusNet"
|
||||
|
||||
#: lib/action.php:776
|
||||
#, php-format
|
||||
@ -4318,27 +4320,41 @@ msgstr ""
|
||||
"المتوفر تحت [رخصة غنو أفيرو العمومية](http://www.fsf.org/licensing/licenses/"
|
||||
"agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "رخصة محتوى الموقع"
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "الرخصة."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "بعد"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "قبل"
|
||||
|
||||
@ -4898,7 +4914,7 @@ msgstr "أضف أو عدّل شعار %s"
|
||||
#: lib/groupnav.php:120
|
||||
#, php-format
|
||||
msgid "Add or edit %s design"
|
||||
msgstr ""
|
||||
msgstr "أضف أو عدل تصميم %s"
|
||||
|
||||
#: lib/groupsbymemberssection.php:71
|
||||
msgid "Groups with most members"
|
||||
@ -4911,7 +4927,7 @@ msgstr "المجموعات الأكثر مرسلات"
|
||||
#: lib/grouptagcloudsection.php:56
|
||||
#, php-format
|
||||
msgid "Tags in %s group's notices"
|
||||
msgstr ""
|
||||
msgstr "وسوم في إشعارات المجموعة %s"
|
||||
|
||||
#: lib/htmloutputter.php:103
|
||||
msgid "This page is not available in a media type you accept"
|
||||
@ -5004,7 +5020,7 @@ msgstr ""
|
||||
#: lib/mail.php:236
|
||||
#, php-format
|
||||
msgid "%1$s is now listening to your notices on %2$s."
|
||||
msgstr ""
|
||||
msgstr "%1$s يستمع الآن إلى إشعاراتك على %2$s."
|
||||
|
||||
#: lib/mail.php:241
|
||||
#, php-format
|
||||
@ -5020,6 +5036,16 @@ msgid ""
|
||||
"----\n"
|
||||
"Change your email address or notification options at %8$s\n"
|
||||
msgstr ""
|
||||
"%1$s يستمع الآن إلى إشعاراتك على %2$s.\n"
|
||||
"\n"
|
||||
"%3$s\n"
|
||||
"\n"
|
||||
"%4$s%5$s%6$s\n"
|
||||
"بوفاء،\n"
|
||||
"%7$s.\n"
|
||||
"\n"
|
||||
"----\n"
|
||||
"غيّر خيارات البريد الإلكتروني والإشعار في %8$s\n"
|
||||
|
||||
#: lib/mail.php:258
|
||||
#, php-format
|
||||
@ -5386,7 +5412,7 @@ msgstr "رسائلك المُرسلة"
|
||||
#: lib/personaltagcloudsection.php:56
|
||||
#, php-format
|
||||
msgid "Tags in %s's notices"
|
||||
msgstr ""
|
||||
msgstr "وسوم في إشعارات %s"
|
||||
|
||||
#: lib/plugin.php:114
|
||||
msgid "Unknown"
|
||||
@ -5450,11 +5476,11 @@ msgstr "مشهورة"
|
||||
|
||||
#: lib/repeatform.php:107
|
||||
msgid "Repeat this notice?"
|
||||
msgstr "كرر هذا الإشعار؟"
|
||||
msgstr "أأكرّر هذا الإشعار؟ّ"
|
||||
|
||||
#: lib/repeatform.php:132
|
||||
msgid "Repeat this notice"
|
||||
msgstr "كرر هذا الإشعار"
|
||||
msgstr "كرّر هذا الإشعار"
|
||||
|
||||
#: lib/sandboxform.php:67
|
||||
msgid "Sandbox"
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-16 17:51:30+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:03+0000\n"
|
||||
"Language-Team: Egyptian Spoken Arabic\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61138); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: arz\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -127,7 +127,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -372,7 +372,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "لم توجد المجموعة!"
|
||||
|
||||
@ -1042,7 +1042,7 @@ msgid "No such application."
|
||||
msgstr "لا تطبيق كهذا."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4116,12 +4116,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr "مشكله أثناء حفظ الإشعار."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "آر تى @%1$s %2$s"
|
||||
@ -4318,27 +4318,41 @@ msgstr ""
|
||||
"المتوفر تحت [رخصه غنو أفيرو العمومية](http://www.fsf.org/licensing/licenses/"
|
||||
"agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "رخصه محتوى الموقع"
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "الرخصه."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "بعد"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "قبل"
|
||||
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:16:04+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:06+0000\n"
|
||||
"Language-Team: Bulgarian\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: bg\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -126,7 +126,7 @@ msgstr "Бележки от %1$s и приятели в %2$s."
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -381,7 +381,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Групата не е открита."
|
||||
|
||||
@ -1068,7 +1068,7 @@ msgid "No such application."
|
||||
msgstr "Няма такава бележка."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Имаше проблем със сесията ви в сайта."
|
||||
|
||||
@ -4323,12 +4323,12 @@ msgstr "Забранено ви е да публикувате бележки в
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Проблем при записване на бележката."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Грешка в базата от данни — отговор при вмъкването: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4531,27 +4531,41 @@ msgstr ""
|
||||
"достъпна под [GNU Affero General Public License](http://www.fsf.org/"
|
||||
"licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Лиценз на съдържанието"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Всички "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "лиценз."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Страниране"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "След"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Преди"
|
||||
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:16:11+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:10+0000\n"
|
||||
"Language-Team: Catalan\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ca\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -128,7 +128,7 @@ msgstr "Actualitzacions de %1$s i amics a %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -389,7 +389,7 @@ msgstr "L'àlies no pot ser el mateix que el sobrenom."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "No s'ha trobat el grup!"
|
||||
|
||||
@ -1081,7 +1081,7 @@ msgid "No such application."
|
||||
msgstr "No existeix aquest avís."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Ha ocorregut algun problema amb la teva sessió."
|
||||
|
||||
@ -4377,12 +4377,12 @@ msgstr "Ha estat bandejat de publicar notificacions en aquest lloc."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Problema en guardar l'avís."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Error de BD en inserir resposta: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
@ -4581,27 +4581,41 @@ msgstr ""
|
||||
"%s, disponible sota la [GNU Affero General Public License](http://www.fsf."
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Llicència de contingut del lloc"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Tot "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "llicència."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Paginació"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Posteriors"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Anteriors"
|
||||
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:16:21+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:13+0000\n"
|
||||
"Language-Team: Czech\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: cs\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -128,7 +128,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -383,7 +383,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "Žádný požadavek nebyl nalezen!"
|
||||
@ -1087,7 +1087,7 @@ msgid "No such application."
|
||||
msgstr "Žádné takové oznámení."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4319,12 +4319,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Problém při ukládání sdělení"
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Chyba v DB při vkládání odpovědi: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4531,29 +4531,43 @@ msgstr ""
|
||||
"dostupná pod [GNU Affero General Public License](http://www.fsf.org/"
|
||||
"licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "Nové sdělení"
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
#, fuzzy
|
||||
msgid "After"
|
||||
msgstr "« Novější"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
#, fuzzy
|
||||
msgid "Before"
|
||||
msgstr "Starší »"
|
||||
|
@ -12,12 +12,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:16:32+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:16+0000\n"
|
||||
"Language-Team: German\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: de\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -139,7 +139,7 @@ msgstr "Aktualisierungen von %1$s und Freunden auf %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -390,7 +390,7 @@ msgstr "Alias kann nicht das gleiche wie der Spitznamen sein."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Gruppe nicht gefunden!"
|
||||
|
||||
@ -1077,7 +1077,7 @@ msgid "No such application."
|
||||
msgstr "Unbekannte Nachricht."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Es gab ein Problem mit deinem Sessiontoken."
|
||||
|
||||
@ -4396,12 +4396,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Problem bei Speichern der Nachricht."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Datenbankfehler beim Einfügen der Antwort: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
@ -4602,28 +4602,42 @@ msgstr ""
|
||||
"(Version %s) betrieben, die unter der [GNU Affero General Public License]"
|
||||
"(http://www.fsf.org/licensing/licenses/agpl-3.0.html) erhältlich ist."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "StatusNet-Software-Lizenz"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
#, fuzzy
|
||||
msgid "All "
|
||||
msgstr "Alle "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "Lizenz."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Seitenerstellung"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Später"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Vorher"
|
||||
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:16:35+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:20+0000\n"
|
||||
"Language-Team: Greek\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: el\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -126,7 +126,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -380,7 +380,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Ομάδα δεν βρέθηκε!"
|
||||
|
||||
@ -1067,7 +1067,7 @@ msgid "No such application."
|
||||
msgstr "Δεν υπάρχει τέτοιο σελίδα."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4247,12 +4247,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Σφάλμα βάσης δεδομένων κατά την εισαγωγή απάντησης: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4449,27 +4449,41 @@ msgid ""
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr ""
|
||||
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:16:41+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:23+0000\n"
|
||||
"Language-Team: British English\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: en-gb\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -134,7 +134,7 @@ msgstr "Updates from %1$s and friends on %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -388,7 +388,7 @@ msgstr "Alias can't be the same as nickname."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Group not found!"
|
||||
|
||||
@ -1078,7 +1078,7 @@ msgid "No such application."
|
||||
msgstr "No such notice."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "There was a problem with your session token."
|
||||
|
||||
@ -4377,12 +4377,12 @@ msgstr "You are banned from posting notices on this site."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Problem saving notice."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "DB error inserting reply: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
@ -4581,27 +4581,41 @@ msgstr ""
|
||||
"s, available under the [GNU Affero General Public Licence](http://www.fsf."
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Site content license"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "All "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "licence."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Pagination"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "After"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Before"
|
||||
|
||||
|
@ -12,12 +12,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:16:44+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:27+0000\n"
|
||||
"Language-Team: Spanish\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: es\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -129,7 +129,7 @@ msgstr "¡Actualizaciones de %1$s y amigos en %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -383,7 +383,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "¡No se encontró el método de la API!"
|
||||
@ -1082,7 +1082,7 @@ msgid "No such application."
|
||||
msgstr "No existe ese aviso."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Hubo problemas con tu clave de sesión."
|
||||
|
||||
@ -4426,12 +4426,12 @@ msgstr "Tienes prohibido publicar avisos en este sitio."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Hubo un problema al guardar el aviso."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Error de BD al insertar respuesta: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4630,27 +4630,41 @@ msgstr ""
|
||||
"disponible bajo la [GNU Affero General Public License](http://www.fsf.org/"
|
||||
"licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Licencia de contenido del sitio"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Todo"
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "Licencia."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Paginación"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Después"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Antes"
|
||||
|
||||
|
@ -10,8 +10,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:16:52+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:33+0000\n"
|
||||
"Last-Translator: Ahmad Sufi Mahmudi\n"
|
||||
"Language-Team: Persian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -20,7 +20,7 @@ msgstr ""
|
||||
"X-Language-Code: fa\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
|
||||
#: actions/all.php:63 actions/public.php:97 actions/replies.php:92
|
||||
@ -135,7 +135,7 @@ msgstr "به روز رسانی از %1$ و دوستان در %2$"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -384,7 +384,7 @@ msgstr "نام و نام مستعار شما نمی تواند یکی باشد .
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "گروه یافت نشد!"
|
||||
|
||||
@ -1072,7 +1072,7 @@ msgid "No such application."
|
||||
msgstr "چنین پیامی وجود ندارد."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4239,12 +4239,12 @@ msgstr "شما از فرستادن پست در این سایت مردود شدی
|
||||
msgid "Problem saving notice."
|
||||
msgstr "مشکل در ذخیره کردن آگهی."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4436,27 +4436,41 @@ msgid ""
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "مجوز محتویات سایت"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "همه "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "مجوز."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "صفحه بندى"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "بعد از"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "قبل از"
|
||||
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:16:48+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:30+0000\n"
|
||||
"Language-Team: Finnish\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: fi\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -133,7 +133,7 @@ msgstr "Käyttäjän %1$s ja kavereiden päivitykset palvelussa %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -392,7 +392,7 @@ msgstr "Alias ei voi olla sama kuin ryhmätunnus."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Ryhmää ei löytynyt!"
|
||||
|
||||
@ -1090,7 +1090,7 @@ msgid "No such application."
|
||||
msgstr "Päivitystä ei ole."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Istuntoavaimesi kanssa oli ongelma."
|
||||
|
||||
@ -4415,12 +4415,12 @@ msgstr "Päivityksesi tähän palveluun on estetty."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Ongelma päivityksen tallentamisessa."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Tietokantavirhe tallennettaessa vastausta: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
@ -4621,28 +4621,42 @@ msgstr ""
|
||||
"versio %s, saatavilla lisenssillä [GNU Affero General Public License](http://"
|
||||
"www.fsf.org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "StatusNet-ohjelmiston lisenssi"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Kaikki "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "lisenssi."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Sivutus"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Myöhemmin"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Aiemmin"
|
||||
|
||||
|
@ -13,12 +13,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-16 17:52:07+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:36+0000\n"
|
||||
"Language-Team: French\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61138); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: fr\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -139,7 +139,7 @@ msgstr "Statuts de %1$s et ses amis dans %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -392,7 +392,7 @@ msgstr "L’alias ne peut pas être le même que le pseudo."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Groupe non trouvé !"
|
||||
|
||||
@ -1084,7 +1084,7 @@ msgid "No such application."
|
||||
msgstr "Avis non trouvé."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Un problème est survenu avec votre jeton de session."
|
||||
|
||||
@ -4441,12 +4441,12 @@ msgstr "Il vous est interdit de poster des avis sur ce site."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Problème lors de l’enregistrement de l’avis."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Erreur de base de donnée en insérant la réponse :%s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4643,27 +4643,41 @@ msgstr ""
|
||||
"version %s, disponible sous la licence [GNU Affero General Public License] "
|
||||
"(http://www.fsf.org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Licence du contenu du site"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Tous "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "licence."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Pagination"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Après"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Avant"
|
||||
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:16:59+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:39+0000\n"
|
||||
"Language-Team: Irish\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ga\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -128,7 +128,7 @@ msgstr "Actualizacións dende %1$s e amigos en %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -389,7 +389,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "Método da API non atopado"
|
||||
@ -1107,7 +1107,7 @@ msgid "No such application."
|
||||
msgstr "Ningún chío."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
#, fuzzy
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Houbo un problema co teu token de sesión. Tentao de novo, anda..."
|
||||
@ -4473,12 +4473,12 @@ msgstr "Tes restrinxido o envio de chíos neste sitio."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Aconteceu un erro ó gardar o chío."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Erro ó inserir a contestación na BD: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
@ -4689,30 +4689,44 @@ msgstr ""
|
||||
"%s, dispoñible baixo licenza [GNU Affero General Public License](http://www."
|
||||
"fsf.org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "Atopar no contido dos chíos"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
#, fuzzy
|
||||
msgid "All "
|
||||
msgstr "Todos"
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
#, fuzzy
|
||||
msgid "After"
|
||||
msgstr "« Despois"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
#, fuzzy
|
||||
msgid "Before"
|
||||
msgstr "Antes »"
|
||||
|
@ -7,12 +7,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:17:03+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:42+0000\n"
|
||||
"Language-Team: Hebrew\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: he\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -126,7 +126,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -381,7 +381,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "לא נמצא"
|
||||
@ -1093,7 +1093,7 @@ msgid "No such application."
|
||||
msgstr "אין הודעה כזו."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4319,12 +4319,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr "בעיה בשמירת ההודעה."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "שגיאת מסד נתונים בהכנסת התגובה: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4532,29 +4532,43 @@ msgstr ""
|
||||
"s, המופצת תחת רשיון [GNU Affero General Public License](http://www.fsf.org/"
|
||||
"licensing/licenses/agpl-3.0.html)"
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "הודעה חדשה"
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
#, fuzzy
|
||||
msgid "After"
|
||||
msgstr "<< אחרי"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
#, fuzzy
|
||||
msgid "Before"
|
||||
msgstr "לפני >>"
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-16 17:52:17+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:44+0000\n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61138); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: hsb\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -127,7 +127,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -372,7 +372,7 @@ msgstr "Alias njemóže samsny kaž přimjeno być."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Skupina njenamakana!"
|
||||
|
||||
@ -1044,7 +1044,7 @@ msgid "No such application."
|
||||
msgstr "Aplikacija njeeksistuje."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4113,12 +4113,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4310,27 +4310,41 @@ msgid ""
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr ""
|
||||
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:17:11+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:47+0000\n"
|
||||
"Language-Team: Interlingua\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ia\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -133,7 +133,7 @@ msgstr "Actualisationes de %1$s e su amicos in %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -385,7 +385,7 @@ msgstr "Le alias non pote esser identic al pseudonymo."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Gruppo non trovate!"
|
||||
|
||||
@ -1076,7 +1076,7 @@ msgid "No such application."
|
||||
msgstr "Nota non trovate."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4366,12 +4366,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4563,27 +4563,41 @@ msgid ""
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr ""
|
||||
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:17:14+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:50+0000\n"
|
||||
"Language-Team: Icelandic\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: is\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -128,7 +128,7 @@ msgstr "Færslur frá %1$s og vinum á %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -383,7 +383,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "Aðferð í forritsskilum fannst ekki!"
|
||||
@ -1082,7 +1082,7 @@ msgid "No such application."
|
||||
msgstr "Ekkert svoleiðis babl."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Það komu upp vandamál varðandi setutókann þinn."
|
||||
|
||||
@ -4367,12 +4367,12 @@ msgstr "Það hefur verið lagt bann við babli frá þér á þessari síðu."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Vandamál komu upp við að vista babl."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Gagnagrunnsvilla við innsetningu svars: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
@ -4573,28 +4573,42 @@ msgstr ""
|
||||
"sem er gefinn út undir [GNU Affero almenningsleyfinu](http://www.fsf.org/"
|
||||
"licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "Hugbúnaðarleyfi StatusNet"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Allt "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "leyfi."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Uppröðun"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Eftir"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Áður"
|
||||
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:17:18+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:54+0000\n"
|
||||
"Language-Team: Italian\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: it\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -135,7 +135,7 @@ msgstr "Messaggi da %1$s e amici su %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -386,7 +386,7 @@ msgstr "L'alias non può essere lo stesso del soprannome."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Gruppo non trovato!"
|
||||
|
||||
@ -1077,7 +1077,7 @@ msgid "No such application."
|
||||
msgstr "Nessun messaggio."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Si è verificato un problema con il tuo token di sessione."
|
||||
|
||||
@ -4406,12 +4406,12 @@ msgstr "Ti è proibito inviare messaggi su questo sito."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Problema nel salvare il messaggio."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Errore del DB nell'inserire la risposta: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4608,27 +4608,41 @@ msgstr ""
|
||||
"s, disponibile nei termini della licenza [GNU Affero General Public License]"
|
||||
"(http://www.fsf.org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Licenza del contenuto del sito"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Tutti "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "licenza."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Paginazione"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Successivi"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Precedenti"
|
||||
|
||||
|
@ -11,12 +11,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:17:22+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:37:57+0000\n"
|
||||
"Language-Team: Japanese\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ja\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -54,9 +54,9 @@ msgid "No such user."
|
||||
msgstr "そのような利用者はいません。"
|
||||
|
||||
#: actions/all.php:84
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid "%1$s and friends, page %2$d"
|
||||
msgstr "%1$s ブロックされたプロファイル、ページ %2$d"
|
||||
msgstr "%1$s と友人、ページ %2$d"
|
||||
|
||||
#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
|
||||
#: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
|
||||
@ -134,7 +134,7 @@ msgstr "%2$s に %1$s と友人からの更新があります!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -386,7 +386,7 @@ msgstr "別名はニックネームと同じではいけません。"
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "グループが見つかりません!"
|
||||
|
||||
@ -876,7 +876,7 @@ msgid ""
|
||||
"You are about to permanently delete a notice. Once this is done, it cannot "
|
||||
"be undone."
|
||||
msgstr ""
|
||||
"あなたは永久につぶやきを削除しようとしています。 これが完了するとそれを元に戻"
|
||||
"あなたはつぶやきを永久に削除しようとしています。 これが完了するとそれを元に戻"
|
||||
"すことはできません。"
|
||||
|
||||
#: actions/deletenotice.php:109 actions/deletenotice.php:141
|
||||
@ -1068,7 +1068,7 @@ msgid "No such application."
|
||||
msgstr "そのようなアプリケーションはありません。"
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "あなたのセッショントークンに関する問題がありました。"
|
||||
|
||||
@ -1184,7 +1184,7 @@ msgid ""
|
||||
"Awaiting confirmation on this address. Check your inbox (and spam box!) for "
|
||||
"a message with further instructions."
|
||||
msgstr ""
|
||||
"このアドレスは確認待ちです。受信ボックス(とスパムボックス)に追加の指示が書"
|
||||
"このアドレスは承認待ちです。受信ボックス(とスパムボックス)に追加の指示が書"
|
||||
"かれたメッセージが届いていないか確認してください。"
|
||||
|
||||
#: actions/emailsettings.php:117 actions/imsettings.php:120
|
||||
@ -1234,17 +1234,17 @@ msgstr "メールで新規フォローの通知を私に送ってください。
|
||||
#: actions/emailsettings.php:163
|
||||
msgid "Send me email when someone adds my notice as a favorite."
|
||||
msgstr ""
|
||||
"だれかがお気に入りとして私のつぶやきを加えたらメールを私に送ってください。"
|
||||
"だれかがお気に入りとして私のつぶやきを加えたら、メールを私に送ってください。"
|
||||
|
||||
#: actions/emailsettings.php:169
|
||||
msgid "Send me email when someone sends me a private message."
|
||||
msgstr ""
|
||||
"だれかがプライベート・メッセージを私に送るときにはメールを私に送ってくださ"
|
||||
"だれかがプライベート・メッセージを私に送るときには、メールを私に送ってくださ"
|
||||
"い。"
|
||||
|
||||
#: actions/emailsettings.php:174
|
||||
msgid "Send me email when someone sends me an \"@-reply\"."
|
||||
msgstr "だれかが\"@-返信\"を私を送るときにはメールを私に送ってください、"
|
||||
msgstr "だれかが\"@-返信\"を私を送るときには、メールを私に送ってください、"
|
||||
|
||||
#: actions/emailsettings.php:179
|
||||
msgid "Allow friends to nudge me and send me an email."
|
||||
@ -1287,21 +1287,21 @@ msgstr "このメールアドレスは既に他の人が使っています。"
|
||||
#: actions/emailsettings.php:353 actions/imsettings.php:317
|
||||
#: actions/smssettings.php:337
|
||||
msgid "Couldn't insert confirmation code."
|
||||
msgstr "確認コードを追加できません"
|
||||
msgstr "承認コードを追加できません"
|
||||
|
||||
#: actions/emailsettings.php:359
|
||||
msgid ""
|
||||
"A confirmation code was sent to the email address you added. Check your "
|
||||
"inbox (and spam box!) for the code and instructions on how to use it."
|
||||
msgstr ""
|
||||
"確認用コードを入力された電子メールアドレスに送信しました。受信ボックス(とス"
|
||||
"パムボックス)にコードとそれをどう使うのかという指示が届いていないか確認して"
|
||||
"ください。"
|
||||
"承認コードを入力された電子メールアドレスに送信しました。受信ボックス(とスパ"
|
||||
"ムボックス)にコードとそれをどう使うのかという指示が届いていないか確認してく"
|
||||
"ださい。"
|
||||
|
||||
#: actions/emailsettings.php:379 actions/imsettings.php:351
|
||||
#: actions/smssettings.php:370
|
||||
msgid "No pending confirmation to cancel."
|
||||
msgstr "認証待ちのものはありません。"
|
||||
msgstr "承認待ちのものはありません。"
|
||||
|
||||
#: actions/emailsettings.php:383 actions/imsettings.php:355
|
||||
msgid "That is the wrong IM address."
|
||||
@ -1310,7 +1310,7 @@ msgstr "その IM アドレスは不正です。"
|
||||
#: actions/emailsettings.php:395 actions/imsettings.php:367
|
||||
#: actions/smssettings.php:386
|
||||
msgid "Confirmation cancelled."
|
||||
msgstr "確認作業が中止されました。"
|
||||
msgstr "承認作業が中止されました。"
|
||||
|
||||
#: actions/emailsettings.php:413
|
||||
msgid "That is not your email address."
|
||||
@ -1721,7 +1721,7 @@ 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 ""
|
||||
"このアドレスは確認待ちです。Jabber か Gtalk のアカウントで追加の指示が書かれ"
|
||||
"このアドレスは承認待ちです。Jabber か Gtalk のアカウントで追加の指示が書かれ"
|
||||
"たメッセージを確認してください。(%s を友人リストに追加しましたか?)"
|
||||
|
||||
#: actions/imsettings.php:124
|
||||
@ -1781,8 +1781,8 @@ msgid ""
|
||||
"A confirmation code was sent to the IM address you added. You must approve %"
|
||||
"s for sending messages to you."
|
||||
msgstr ""
|
||||
"確認用コードを入力された IM アドレスに送信しました。あなたにメッセージを送れ"
|
||||
"るようにするには%sを承認してください。"
|
||||
"承認コードを入力された IM アドレスに送信しました。あなたにメッセージを送れる"
|
||||
"ようにするには%sを承認してください。"
|
||||
|
||||
#: actions/imsettings.php:387
|
||||
msgid "That is not your Jabber ID."
|
||||
@ -3014,7 +3014,7 @@ msgid ""
|
||||
"(You should receive a message by email momentarily, with instructions on how "
|
||||
"to confirm your email address.)"
|
||||
msgstr ""
|
||||
"(メールアドレスを確認する方法を読んで、すぐにメールによるメッセージを受け取る"
|
||||
"(メールアドレスを承認する方法を読んで、すぐにメールによるメッセージを受け取る"
|
||||
"ようにしてください)"
|
||||
|
||||
#: actions/remotesubscribe.php:98
|
||||
@ -4358,12 +4358,12 @@ msgstr "あなたはこのサイトでつぶやきを投稿するのが禁止さ
|
||||
msgid "Problem saving notice."
|
||||
msgstr "つぶやきを保存する際に問題が発生しました。"
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "返信を追加する際にデータベースエラー : %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4560,27 +4560,41 @@ msgstr ""
|
||||
"いています。 ライセンス [GNU Affero General Public License](http://www.fsf."
|
||||
"org/licensing/licenses/agpl-3.0.html)。"
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "サイト内容ライセンス"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "全て "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "ライセンス。"
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "ページ化"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "<<後"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "前>>"
|
||||
|
||||
@ -5240,7 +5254,7 @@ msgstr ""
|
||||
"\n"
|
||||
"だれかがこのメールアドレスを %s に入力しました。\n"
|
||||
"\n"
|
||||
"もしエントリーを確認したいなら、以下のURLを使用してください:\n"
|
||||
"もし登録を承認したいなら、以下のURLを使用してください:\n"
|
||||
"\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
|
@ -7,12 +7,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:17:27+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:00+0000\n"
|
||||
"Language-Team: Korean\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ko\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -126,7 +126,7 @@ msgstr "%1$s 및 %2$s에 있는 친구들의 업데이트!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -385,7 +385,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "API 메서드를 찾을 수 없습니다."
|
||||
@ -1095,7 +1095,7 @@ msgid "No such application."
|
||||
msgstr "그러한 통지는 없습니다."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "당신의 세션토큰관련 문제가 있습니다."
|
||||
|
||||
@ -4392,12 +4392,12 @@ msgstr "이 사이트에 게시글 포스팅으로부터 당신은 금지되었
|
||||
msgid "Problem saving notice."
|
||||
msgstr "통지를 저장하는데 문제가 발생했습니다."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "답신을 추가 할 때에 데이타베이스 에러 : %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
@ -4598,28 +4598,42 @@ msgstr ""
|
||||
"을 사용합니다. StatusNet는 [GNU Affero General Public License](http://www."
|
||||
"fsf.org/licensing/licenses/agpl-3.0.html) 라이선스에 따라 사용할 수 있습니다."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "라코니카 소프트웨어 라이선스"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "모든 것"
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "라이선스"
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "페이지수"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "뒷 페이지"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "앞 페이지"
|
||||
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-16 17:52:38+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:03+0000\n"
|
||||
"Language-Team: Macedonian\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61138); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: mk\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -135,7 +135,7 @@ msgstr "Подновувања од %1$s и пријатели на %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -387,7 +387,7 @@ msgstr "Алијасот не може да биде ист како прека
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Групата не е пронајдена!"
|
||||
|
||||
@ -1073,7 +1073,7 @@ msgid "No such application."
|
||||
msgstr "Нема таков програм."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Се појави проблем со Вашиот сесиски жетон."
|
||||
|
||||
@ -4394,12 +4394,12 @@ msgstr "Забрането Ви е да објавувате забелешки
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Проблем во зачувувањето на белешката."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Одговор од внесот во базата: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4596,27 +4596,41 @@ msgstr ""
|
||||
"верзија %s, достапен пд [GNU Affero General Public License](http://www.fsf."
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Лиценца на содржините на веб-страницата"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Сите "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "лиценца."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Прелом на страници"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "По"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Пред"
|
||||
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:17:35+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:06+0000\n"
|
||||
"Language-Team: Norwegian (bokmål)\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: no\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -132,7 +132,7 @@ msgstr "Oppdateringer fra %1$s og venner på %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -388,7 +388,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "API-metode ikke funnet!"
|
||||
@ -1087,7 +1087,7 @@ msgid "No such application."
|
||||
msgstr "Ingen slik side"
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4295,12 +4295,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4499,27 +4499,41 @@ msgid ""
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
#, fuzzy
|
||||
msgid "Before"
|
||||
msgstr "Tidligere »"
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-16 17:52:50+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:12+0000\n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61138); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: nl\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -136,7 +136,7 @@ msgstr "Updates van %1$s en vrienden op %2$s."
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -393,7 +393,7 @@ msgstr "Een alias kan niet hetzelfde zijn als de gebruikersnaam."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "De groep is niet aangetroffen!"
|
||||
|
||||
@ -1085,7 +1085,7 @@ msgid "No such application."
|
||||
msgstr "De applicatie bestaat niet."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Er is een probleem met uw sessietoken."
|
||||
|
||||
@ -4429,13 +4429,13 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Er is een probleem opgetreden bij het opslaan van de mededeling."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr ""
|
||||
"Er is een databasefout opgetreden bij het invoegen van het antwoord: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4632,27 +4632,41 @@ msgstr ""
|
||||
"versie %s, beschikbaar onder de [GNU Affero General Public License](http://"
|
||||
"www.fsf.org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Licentie voor siteinhoud"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Alle "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "licentie."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Paginering"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Later"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Eerder"
|
||||
|
||||
|
@ -7,12 +7,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:17:38+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:09+0000\n"
|
||||
"Language-Team: Norwegian Nynorsk\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: nn\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -126,7 +126,7 @@ msgstr "Oppdateringar frå %1$s og vener på %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -383,7 +383,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "Fann ikkje API-metode."
|
||||
@ -1094,7 +1094,7 @@ msgid "No such application."
|
||||
msgstr "Denne notisen finst ikkje."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Det var eit problem med sesjons billetten din."
|
||||
|
||||
@ -4409,12 +4409,12 @@ msgstr "Du kan ikkje lengre legge inn notisar på denne sida."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Eit problem oppstod ved lagring av notis."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Databasefeil, kan ikkje lagra svar: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
@ -4615,28 +4615,42 @@ msgstr ""
|
||||
"%s, tilgjengeleg under [GNU Affero General Public License](http://www.fsf."
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "StatusNets programvarelisens"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Alle"
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "lisens."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Paginering"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "« Etter"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Før »"
|
||||
|
||||
|
@ -10,8 +10,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-16 17:52:53+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:15+0000\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish <pl@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -19,7 +19,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61138); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: pl\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -139,7 +139,7 @@ msgstr "Aktualizacje z %1$s i przyjaciół na %2$s."
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -390,7 +390,7 @@ msgstr "Alias nie może być taki sam jak pseudonim."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Nie odnaleziono grupy."
|
||||
|
||||
@ -1068,7 +1068,7 @@ msgid "No such application."
|
||||
msgstr "Nie ma takiej aplikacji."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Wystąpił problem z tokenem sesji."
|
||||
|
||||
@ -4367,12 +4367,12 @@ msgstr "Zabroniono ci wysyłania wpisów na tej stronie."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Problem podczas zapisywania wpisu."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Błąd bazy danych podczas wprowadzania odpowiedzi: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4569,27 +4569,41 @@ msgstr ""
|
||||
"status.net/) w wersji %s, dostępnego na [Powszechnej Licencji Publicznej GNU "
|
||||
"Affero](http://www.fsf.org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Licencja zawartości strony"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Wszystko "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "licencja."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Paginacja"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Później"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Wcześniej"
|
||||
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:17:49+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:17+0000\n"
|
||||
"Language-Team: Portuguese\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: pt\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -133,7 +133,7 @@ msgstr "Actualizações de %1$s e amigos no %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -383,7 +383,7 @@ msgstr "Os sinónimos não podem ser iguais ao nome do utilizador."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Grupo não foi encontrado!"
|
||||
|
||||
@ -1071,7 +1071,7 @@ msgid "No such application."
|
||||
msgstr "Nota não encontrada."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Ocorreu um problema com a sua sessão."
|
||||
|
||||
@ -4400,12 +4400,12 @@ msgstr "Está proibido de publicar notas neste site."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Problema na gravação da nota."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Ocorreu um erro na base de dados ao inserir a resposta: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4602,27 +4602,41 @@ msgstr ""
|
||||
"disponibilizado nos termos da [GNU Affero General Public License](http://www."
|
||||
"fsf.org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Licença de conteúdos do site"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Tudo "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "licença."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Paginação"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Posteriores"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Anteriores"
|
||||
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-16 17:53:00+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:21+0000\n"
|
||||
"Language-Team: Brazilian Portuguese\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61138); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: pt-br\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -53,9 +53,9 @@ msgid "No such user."
|
||||
msgstr "Este usuário não existe."
|
||||
|
||||
#: actions/all.php:84
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid "%1$s and friends, page %2$d"
|
||||
msgstr "Perfis bloqueados no %1$s, pág. %2$d"
|
||||
msgstr "%1$s e amigos, pág. %2$d"
|
||||
|
||||
#: actions/all.php:86 actions/all.php:167 actions/allrss.php:115
|
||||
#: actions/apitimelinefriends.php:114 actions/apitimelinehome.php:115
|
||||
@ -136,7 +136,7 @@ msgstr "Atualizações de %1$s e amigos no %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -389,7 +389,7 @@ msgstr "O apelido não pode ser igual à identificação."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "O grupo não foi encontrado!"
|
||||
|
||||
@ -1075,7 +1075,7 @@ msgid "No such application."
|
||||
msgstr "Essa aplicação não existe."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Ocorreu um problema com o seu token de sessão."
|
||||
|
||||
@ -4397,12 +4397,12 @@ msgstr "Você está proibido de publicar mensagens neste site."
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Problema no salvamento da mensagem."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Erro no banco de dados na inserção da reposta: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4599,27 +4599,41 @@ msgstr ""
|
||||
"versão %s, disponível sob a [GNU Affero General Public License] (http://www."
|
||||
"fsf.org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Licença do conteúdo do site"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Todas "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "licença."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Paginação"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Próximo"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Anterior"
|
||||
|
||||
|
@ -2,6 +2,7 @@
|
||||
#
|
||||
# Author@translatewiki.net: Brion
|
||||
# Author@translatewiki.net: Lockal
|
||||
# Author@translatewiki.net: Rubin
|
||||
# Author@translatewiki.net: Александр Сигачёв
|
||||
# --
|
||||
# This file is distributed under the same license as the StatusNet package.
|
||||
@ -10,12 +11,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:17:57+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:23+0000\n"
|
||||
"Language-Team: Russian\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ru\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -135,7 +136,7 @@ msgstr "Обновлено от %1$s и его друзей на %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -389,7 +390,7 @@ msgstr "Алиас не может совпадать с именем."
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Группа не найдена!"
|
||||
|
||||
@ -453,7 +454,6 @@ msgid "There was a problem with your session token. Try again, please."
|
||||
msgstr "Проблема с Вашей сессией. Попробуйте ещё раз, пожалуйста."
|
||||
|
||||
#: actions/apioauthauthorize.php:146
|
||||
#, fuzzy
|
||||
msgid "Invalid nickname / password!"
|
||||
msgstr "Неверное имя или пароль."
|
||||
|
||||
@ -1075,7 +1075,7 @@ msgid "No such application."
|
||||
msgstr "Нет такой записи."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Проблема с Вашей сессией. Попробуйте ещё раз, пожалуйста."
|
||||
|
||||
@ -4406,12 +4406,12 @@ msgstr "Вам запрещено поститься на этом сайте (
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Проблемы с сохранением записи."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Ошибка баз данных при вставке ответа для %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4609,27 +4609,41 @@ msgstr ""
|
||||
"лицензией [GNU Affero General Public License](http://www.fsf.org/licensing/"
|
||||
"licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Лицензия содержимого сайта"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "All "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "license."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Разбиение на страницы"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Сюда"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Туда"
|
||||
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-16 17:51+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
@ -123,7 +123,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -368,7 +368,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr ""
|
||||
|
||||
@ -1038,7 +1038,7 @@ msgid "No such application."
|
||||
msgstr ""
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4102,12 +4102,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4299,27 +4299,41 @@ msgid ""
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr ""
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-16 17:53:10+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:34+0000\n"
|
||||
"Language-Team: Telugu\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61138); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: te\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -125,7 +125,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -377,7 +377,7 @@ msgstr "మారుపేరు పేరుతో సమానంగా ఉం
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "గుంపు దొరకలేదు!"
|
||||
|
||||
@ -1059,7 +1059,7 @@ msgid "No such application."
|
||||
msgstr "అటువంటి సందేశమేమీ లేదు."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4197,12 +4197,12 @@ msgstr "ఈ సైటులో నోటీసులు రాయడం ను
|
||||
msgid "Problem saving notice."
|
||||
msgstr "సందేశాన్ని భద్రపరచడంలో పొరపాటు."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
@ -4405,28 +4405,42 @@ msgstr ""
|
||||
"html) కింద లభ్యమయ్యే [స్టేటస్‌నెట్](http://status.net/) మైక్రోబ్లాగింగ్ ఉపకరణం సంచిక %s "
|
||||
"పై నడుస్తుంది."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "కొత్త సందేశం"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "అన్నీ "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "పేజీకరణ"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "తర్వాత"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "ఇంతక్రితం"
|
||||
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:18:07+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:37+0000\n"
|
||||
"Language-Team: Turkish\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: tr\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -127,7 +127,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -385,7 +385,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "İstek bulunamadı!"
|
||||
@ -1096,7 +1096,7 @@ msgid "No such application."
|
||||
msgstr "Böyle bir durum mesajı yok."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4327,12 +4327,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Durum mesajını kaydederken hata oluştu."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Cevap eklenirken veritabanı hatası: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4540,29 +4540,43 @@ msgstr ""
|
||||
"licenses/agpl-3.0.html) lisansı ile korunan [StatusNet](http://status.net/) "
|
||||
"microbloglama yazılımının %s. versiyonunu kullanmaktadır."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "Yeni durum mesajı"
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
#, fuzzy
|
||||
msgid "After"
|
||||
msgstr "« Sonra"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
#, fuzzy
|
||||
msgid "Before"
|
||||
msgstr "Önce »"
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-16 17:53:16+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:40+0000\n"
|
||||
"Language-Team: Ukrainian\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61138); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: uk\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -134,7 +134,7 @@ msgstr "Оновлення від %1$s та друзів на %2$s!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -385,7 +385,7 @@ msgstr "Додаткове ім’я не може бути таким сами
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
msgid "Group not found!"
|
||||
msgstr "Групу не знайдено!"
|
||||
|
||||
@ -1067,7 +1067,7 @@ msgid "No such application."
|
||||
msgstr "Такого додатку немає."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Виникли певні проблеми з токеном поточної сесії."
|
||||
|
||||
@ -4371,12 +4371,12 @@ msgstr "Вам заборонено надсилати дописи до цьо
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Проблема при збереженні допису."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Помилка бази даних при додаванні відповіді: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
@ -4573,27 +4573,41 @@ msgstr ""
|
||||
"для мікроблоґів, версія %s, доступному під [GNU Affero General Public "
|
||||
"License](http://www.fsf.org/licensing/licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
msgid "Site content license"
|
||||
msgstr "Ліцензія змісту сайту"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "Всі "
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "ліцензія."
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "Нумерація сторінок"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr "Вперед"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
msgid "Before"
|
||||
msgstr "Назад"
|
||||
|
||||
|
@ -7,12 +7,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:18:14+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:43+0000\n"
|
||||
"Language-Team: Vietnamese\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: vi\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -126,7 +126,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -387,7 +387,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "Phương thức API không tìm thấy!"
|
||||
@ -1111,7 +1111,7 @@ msgid "No such application."
|
||||
msgstr "Không có tin nhắn nào."
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
#, fuzzy
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "Có lỗi xảy ra khi thao tác. Hãy thử lại lần nữa."
|
||||
@ -4478,12 +4478,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr "Có lỗi xảy ra khi lưu tin nhắn."
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "Lỗi cơ sở dữ liệu khi chèn trả lời: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%s (%s)"
|
||||
@ -4696,29 +4696,43 @@ msgstr ""
|
||||
"quyền [GNU Affero General Public License](http://www.fsf.org/licensing/"
|
||||
"licenses/agpl-3.0.html)."
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "Tìm theo nội dung của tin nhắn"
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
#, fuzzy
|
||||
msgid "After"
|
||||
msgstr "Sau"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
#, fuzzy
|
||||
msgid "Before"
|
||||
msgstr "Trước"
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:18:17+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:46+0000\n"
|
||||
"Language-Team: Simplified Chinese\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: zh-hans\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -128,7 +128,7 @@ msgstr "来自%2$s 上 %1$s 和好友的更新!"
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -385,7 +385,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "API 方法未实现!"
|
||||
@ -1100,7 +1100,7 @@ msgid "No such application."
|
||||
msgstr "没有这份通告。"
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
#, fuzzy
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr "会话标识有问题,请重试。"
|
||||
@ -4405,12 +4405,12 @@ msgstr "在这个网站你被禁止发布消息。"
|
||||
msgid "Problem saving notice."
|
||||
msgstr "保存通告时出错。"
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "添加回复时数据库出错:%s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
@ -4618,29 +4618,43 @@ msgstr ""
|
||||
"General Public License](http://www.fsf.org/licensing/licenses/agpl-3.0.html)"
|
||||
"授权。"
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "StatusNet软件注册证"
|
||||
|
||||
#: lib/action.php:803
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr "全部"
|
||||
|
||||
#: lib/action.php:808
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr "注册证"
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr "分页"
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
#, fuzzy
|
||||
msgid "After"
|
||||
msgstr "« 之后"
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
#, fuzzy
|
||||
msgid "Before"
|
||||
msgstr "之前 »"
|
||||
|
@ -7,12 +7,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-01-15 19:15+0000\n"
|
||||
"PO-Revision-Date: 2010-01-15 19:18:21+0000\n"
|
||||
"POT-Creation-Date: 2010-01-21 22:36+0000\n"
|
||||
"PO-Revision-Date: 2010-01-21 22:38:49+0000\n"
|
||||
"Language-Team: Traditional Chinese\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61101); Translate extension (2010-01-04)\n"
|
||||
"X-Generator: MediaWiki 1.16alpha (r61339); Translate extension (2010-01-16)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: zh-hant\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -126,7 +126,7 @@ msgstr ""
|
||||
#: actions/apigroupcreate.php:136 actions/apigroupismember.php:114
|
||||
#: actions/apigroupjoin.php:155 actions/apigroupleave.php:141
|
||||
#: actions/apigrouplist.php:132 actions/apigrouplistall.php:120
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:105
|
||||
#: actions/apigroupmembership.php:106 actions/apigroupshow.php:115
|
||||
#: actions/apihelptest.php:88 actions/apistatusesdestroy.php:102
|
||||
#: actions/apistatusesretweets.php:112 actions/apistatusesshow.php:108
|
||||
#: actions/apistatusnetconfig.php:133 actions/apistatusnetversion.php:93
|
||||
@ -380,7 +380,7 @@ msgstr ""
|
||||
|
||||
#: actions/apigroupismember.php:95 actions/apigroupjoin.php:104
|
||||
#: actions/apigroupleave.php:104 actions/apigroupmembership.php:91
|
||||
#: actions/apigroupshow.php:90 actions/apitimelinegroup.php:91
|
||||
#: actions/apigroupshow.php:82 actions/apitimelinegroup.php:91
|
||||
#, fuzzy
|
||||
msgid "Group not found!"
|
||||
msgstr "目前無請求"
|
||||
@ -1086,7 +1086,7 @@ msgid "No such application."
|
||||
msgstr "無此通知"
|
||||
|
||||
#: actions/editapplication.php:127 actions/newapplication.php:110
|
||||
#: actions/showapplication.php:118 lib/action.php:1167
|
||||
#: actions/showapplication.php:118 lib/action.php:1189
|
||||
msgid "There was a problem with your session token."
|
||||
msgstr ""
|
||||
|
||||
@ -4249,12 +4249,12 @@ msgstr ""
|
||||
msgid "Problem saving notice."
|
||||
msgstr ""
|
||||
|
||||
#: classes/Notice.php:1052
|
||||
#: classes/Notice.php:1059
|
||||
#, php-format
|
||||
msgid "DB error inserting reply: %s"
|
||||
msgstr "增加回覆時,資料庫發生錯誤: %s"
|
||||
|
||||
#: classes/Notice.php:1423
|
||||
#: classes/Notice.php:1441
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
@ -4457,28 +4457,42 @@ msgid ""
|
||||
"org/licensing/licenses/agpl-3.0.html)."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:794
|
||||
#: lib/action.php:795
|
||||
#, fuzzy
|
||||
msgid "Site content license"
|
||||
msgstr "新訊息"
|
||||
|
||||
#: lib/action.php:803
|
||||
msgid "All "
|
||||
#: lib/action.php:800
|
||||
#, php-format
|
||||
msgid "Content and data of %1$s are private and confidential."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:805
|
||||
#, php-format
|
||||
msgid "Content and data copyright by %1$s. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:808
|
||||
msgid "Content and data copyright by contributors. All rights reserved."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:820
|
||||
msgid "All "
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:825
|
||||
msgid "license."
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1102
|
||||
#: lib/action.php:1124
|
||||
msgid "Pagination"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1111
|
||||
#: lib/action.php:1133
|
||||
msgid "After"
|
||||
msgstr ""
|
||||
|
||||
#: lib/action.php:1119
|
||||
#: lib/action.php:1141
|
||||
#, fuzzy
|
||||
msgid "Before"
|
||||
msgstr "之前的內容»"
|
||||
|
@ -32,14 +32,7 @@ class EnjitQueueHandler extends QueueHandler
|
||||
return 'enjit';
|
||||
}
|
||||
|
||||
function start()
|
||||
{
|
||||
$this->log(LOG_INFO, "Starting EnjitQueueHandler");
|
||||
$this->log(LOG_INFO, "Broadcasting to ".common_config('enjit', 'apiurl'));
|
||||
return true;
|
||||
}
|
||||
|
||||
function handle_notice($notice)
|
||||
function handle($notice)
|
||||
{
|
||||
|
||||
$profile = Profile::staticGet($notice->profile_id);
|
||||
|
@ -28,7 +28,7 @@ class FacebookQueueHandler extends QueueHandler
|
||||
return 'facebook';
|
||||
}
|
||||
|
||||
function handle_notice($notice)
|
||||
function handle($notice)
|
||||
{
|
||||
if ($this->_isLocal($notice)) {
|
||||
return facebookBroadcastNotice($notice);
|
||||
|
@ -86,7 +86,7 @@ class ImapPlugin extends Plugin
|
||||
}
|
||||
}
|
||||
|
||||
function onStartIoManagerClasses(&$classes)
|
||||
function onStartQueueDaemonIoManagers(&$classes)
|
||||
{
|
||||
$classes[] = new ImapManager($this);
|
||||
}
|
||||
|
@ -176,15 +176,25 @@ margin-bottom:0;
|
||||
.profile {
|
||||
padding-top:4px;
|
||||
padding-bottom:4px;
|
||||
min-height:65px;
|
||||
}
|
||||
.notice div.entry-content {
|
||||
#content .notice .entry-title {
|
||||
float:left;
|
||||
width:100%;
|
||||
margin-left:0;
|
||||
}
|
||||
#content .notice .author .photo {
|
||||
position:static;
|
||||
float:left;
|
||||
}
|
||||
#content .notice div.entry-content {
|
||||
margin-left:0;
|
||||
width:75%;
|
||||
max-width:100%;
|
||||
min-width:0;
|
||||
}
|
||||
.notice-options {
|
||||
width:50px;
|
||||
width:43px;
|
||||
margin-right:1%;
|
||||
}
|
||||
|
||||
@ -192,6 +202,13 @@ margin-right:1%;
|
||||
width:16px;
|
||||
height:16px;
|
||||
}
|
||||
.notice-options form.processing {
|
||||
background-image:none;
|
||||
}
|
||||
#wrap .notice-options form.processing input.submit {
|
||||
background-position:0 47%;
|
||||
}
|
||||
|
||||
.notice .notice-options a,
|
||||
.notice .notice-options input {
|
||||
box-shadow:none;
|
||||
@ -202,16 +219,16 @@ box-shadow:none;
|
||||
.notice .notice-options form {
|
||||
margin:-4px 0 0 0;
|
||||
}
|
||||
.notice .notice-options .notice_repeat,
|
||||
.notice .notice-options .form_repeat,
|
||||
.notice .notice-options .notice_delete {
|
||||
margin-top:18px;
|
||||
margin-top:11px;
|
||||
}
|
||||
.notice .notice-options .notice_reply,
|
||||
.notice .notice-options .notice_repeat {
|
||||
margin-left:18px;
|
||||
.notice .notice-options .form_favor,
|
||||
.notice .notice-options .form_disfavor,
|
||||
.notice .notice-options .form_repeat {
|
||||
margin-right:11px;
|
||||
}
|
||||
|
||||
|
||||
.notice .notice-options .notice_delete {
|
||||
float:left;
|
||||
}
|
||||
|
@ -31,66 +31,152 @@ if (!defined('STATUSNET')) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
define('DEFAULT_HUB','http://pubsubhubbub.appspot.com');
|
||||
define('DEFAULT_HUB', 'http://pubsubhubbub.appspot.com');
|
||||
|
||||
require_once(INSTALLDIR.'/plugins/PubSubHubBub/publisher.php');
|
||||
require_once INSTALLDIR.'/plugins/PubSubHubBub/publisher.php';
|
||||
|
||||
/**
|
||||
* Plugin to provide publisher side of PubSubHubBub (PuSH)
|
||||
* relationship.
|
||||
*
|
||||
* PuSH is a real-time or near-real-time protocol for Atom
|
||||
* and RSS feeds. More information here:
|
||||
*
|
||||
* http://code.google.com/p/pubsubhubbub/
|
||||
*
|
||||
* To enable, add the following line to your config.php:
|
||||
*
|
||||
* addPlugin('PubSubHubBub');
|
||||
*
|
||||
* This will use the Google default hub. If you'd like to use
|
||||
* another, try:
|
||||
*
|
||||
* addPlugin('PubSubHubBub',
|
||||
* array('hub' => 'http://yourhub.example.net/'));
|
||||
*
|
||||
* @category Plugin
|
||||
* @package StatusNet
|
||||
* @author Craig Andrews <candrews@integralblue.com>
|
||||
* @copyright 2009 Craig Andrews http://candrews.integralblue.com
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
class PubSubHubBubPlugin extends Plugin
|
||||
{
|
||||
private $hub;
|
||||
/**
|
||||
* URL of the hub to advertise and publish to.
|
||||
*/
|
||||
|
||||
public $hub = DEFAULT_HUB;
|
||||
|
||||
/**
|
||||
* Default constructor.
|
||||
*/
|
||||
|
||||
function __construct()
|
||||
{
|
||||
parent::__construct();
|
||||
}
|
||||
|
||||
function onInitializePlugin(){
|
||||
$this->hub = common_config('PubSubHubBub', 'hub');
|
||||
if(empty($this->hub)){
|
||||
$this->hub = DEFAULT_HUB;
|
||||
}
|
||||
/**
|
||||
* Hooks the StartApiAtom event
|
||||
*
|
||||
* Adds the necessary bits to advertise PubSubHubBub
|
||||
* for the Atom feed.
|
||||
*
|
||||
* @param Action $action The API action being shown.
|
||||
*
|
||||
* @return boolean hook value
|
||||
*/
|
||||
|
||||
function onStartApiAtom($action)
|
||||
{
|
||||
$action->element('link', array('rel' => 'hub', 'href' => $this->hub), null);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function onStartApiAtom($action){
|
||||
$action->element('link',array('rel'=>'hub','href'=>$this->hub),null);
|
||||
/**
|
||||
* Hooks the StartApiRss event
|
||||
*
|
||||
* Adds the necessary bits to advertise PubSubHubBub
|
||||
* for the RSS 2.0 feeds.
|
||||
*
|
||||
* @param Action $action The API action being shown.
|
||||
*
|
||||
* @return boolean hook value
|
||||
*/
|
||||
|
||||
function onStartApiRss($action)
|
||||
{
|
||||
$action->element('atom:link', array('rel' => 'hub',
|
||||
'href' => $this->hub),
|
||||
null);
|
||||
return true;
|
||||
}
|
||||
|
||||
function onStartApiRss($action){
|
||||
$action->element('atom:link',array('rel'=>'hub','href'=>$this->hub),null);
|
||||
}
|
||||
/**
|
||||
* Hook for a queued notice.
|
||||
*
|
||||
* When a notice has been queued, will ping the
|
||||
* PuSH hub for each Atom and RSS feed in which
|
||||
* the notice appears.
|
||||
*
|
||||
* @param Notice $notice The notice that's been queued
|
||||
*
|
||||
* @return boolean hook value
|
||||
*/
|
||||
|
||||
function onHandleQueuedNotice($notice){
|
||||
function onHandleQueuedNotice($notice)
|
||||
{
|
||||
$publisher = new Publisher($this->hub);
|
||||
|
||||
$feeds = array();
|
||||
|
||||
//public timeline feeds
|
||||
$feeds[]=common_local_url('ApiTimelinePublic',array('format' => 'rss'));
|
||||
$feeds[]=common_local_url('ApiTimelinePublic',array('format' => 'atom'));
|
||||
$feeds[] = common_local_url('ApiTimelinePublic', array('format' => 'rss'));
|
||||
$feeds[] = common_local_url('ApiTimelinePublic', array('format' => 'atom'));
|
||||
|
||||
//author's own feeds
|
||||
$user = User::staticGet('id',$notice->profile_id);
|
||||
$feeds[]=common_local_url('ApiTimelineUser',array('id' => $user->nickname, 'format'=>'rss'));
|
||||
$feeds[]=common_local_url('ApiTimelineUser',array('id' => $user->nickname, 'format'=>'atom'));
|
||||
$user = User::staticGet('id', $notice->profile_id);
|
||||
|
||||
$feeds[] = common_local_url('ApiTimelineUser',
|
||||
array('id' => $user->nickname,
|
||||
'format' => 'rss'));
|
||||
$feeds[] = common_local_url('ApiTimelineUser',
|
||||
array('id' => $user->nickname,
|
||||
'format' => 'atom'));
|
||||
|
||||
//tag feeds
|
||||
$tag = new Notice_tag();
|
||||
|
||||
$tag->notice_id = $notice->id;
|
||||
if ($tag->find()) {
|
||||
while ($tag->fetch()) {
|
||||
$feeds[]=common_local_url('ApiTimelineTag',array('tag'=>$tag->tag, 'format'=>'rss'));
|
||||
$feeds[]=common_local_url('ApiTimelineTag',array('tag'=>$tag->tag, 'format'=>'atom'));
|
||||
$feeds[] = common_local_url('ApiTimelineTag',
|
||||
array('tag' => $tag->tag,
|
||||
'format' => 'rss'));
|
||||
$feeds[] = common_local_url('ApiTimelineTag',
|
||||
array('tag' => $tag->tag,
|
||||
'format' => 'atom'));
|
||||
}
|
||||
}
|
||||
|
||||
//group feeds
|
||||
$group_inbox = new Group_inbox();
|
||||
|
||||
$group_inbox->notice_id = $notice->id;
|
||||
if ($group_inbox->find()) {
|
||||
while ($group_inbox->fetch()) {
|
||||
$group = User_group::staticGet('id',$group_inbox->group_id);
|
||||
$feeds[]=common_local_url('ApiTimelineGroup',array('id' => $group->nickname,'format'=>'rss'));
|
||||
$feeds[]=common_local_url('ApiTimelineGroup',array('id' => $group->nickname,'format'=>'atom'));
|
||||
$group = User_group::staticGet('id', $group_inbox->group_id);
|
||||
|
||||
$feeds[] = common_local_url('ApiTimelineGroup',
|
||||
array('id' => $group->nickname,
|
||||
'format' => 'rss'));
|
||||
$feeds[] = common_local_url('ApiTimelineGroup',
|
||||
array('id' => $group->nickname,
|
||||
'format' => 'atom'));
|
||||
}
|
||||
}
|
||||
|
||||
@ -103,32 +189,70 @@ class PubSubHubBubPlugin extends Plugin
|
||||
if (empty($user)) {
|
||||
continue;
|
||||
}
|
||||
$feeds[]=common_local_url('ApiTimelineUser',array('id' => $user->nickname, 'format'=>'rss'));
|
||||
$feeds[]=common_local_url('ApiTimelineUser',array('id' => $user->nickname, 'format'=>'atom'));
|
||||
$feeds[] = common_local_url('ApiTimelineFriends',
|
||||
array('id' => $user->nickname,
|
||||
'format' => 'rss'));
|
||||
$feeds[] = common_local_url('ApiTimelineFriends',
|
||||
array('id' => $user->nickname,
|
||||
'format' => 'atom'));
|
||||
}
|
||||
|
||||
$replies = $notice->getReplies();
|
||||
|
||||
//feed of user replied to
|
||||
if($notice->reply_to){
|
||||
$user = User::staticGet('id',$notice->reply_to);
|
||||
$feeds[]=common_local_url('ApiTimelineMentions',array('id' => $user->nickname,'format'=>'rss'));
|
||||
$feeds[]=common_local_url('ApiTimelineMentions',array('id' => $user->nickname,'format'=>'atom'));
|
||||
}
|
||||
|
||||
foreach(array_unique($feeds) as $feed){
|
||||
if(! $publisher->publish_update($feed)){
|
||||
common_log_line(LOG_WARNING,$feed.' was not published to hub at '.$this->hub.':'.$publisher->last_response());
|
||||
foreach ($replies as $recipient) {
|
||||
$user = User::staticGet('id', $recipient);
|
||||
if (!empty($user)) {
|
||||
$feeds[] = common_local_url('ApiTimelineMentions',
|
||||
array('id' => $user->nickname,
|
||||
'format' => 'rss'));
|
||||
$feeds[] = common_local_url('ApiTimelineMentions',
|
||||
array('id' => $user->nickname,
|
||||
'format' => 'atom'));
|
||||
}
|
||||
}
|
||||
$feeds = array_unique($feeds);
|
||||
|
||||
ob_start();
|
||||
$ok = $publisher->publish_update($feeds);
|
||||
$push_last_response = ob_get_clean();
|
||||
|
||||
if (!$ok) {
|
||||
common_log(LOG_WARNING,
|
||||
'Failure publishing ' . count($feeds) . ' feeds to hub at '.
|
||||
$this->hub.': '.$push_last_response);
|
||||
} else {
|
||||
common_log(LOG_INFO,
|
||||
'Published ' . count($feeds) . ' feeds to hub at '.
|
||||
$this->hub.': '.$push_last_response);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Provide version information
|
||||
*
|
||||
* Adds this plugin's version data to the global
|
||||
* version array, for e.g. displaying on the version page.
|
||||
*
|
||||
* @param array &$versions array of array of versions
|
||||
*
|
||||
* @return boolean hook value
|
||||
*/
|
||||
|
||||
function onPluginVersion(&$versions)
|
||||
{
|
||||
$versions[] = array('name' => 'PubSubHubBub',
|
||||
'version' => STATUSNET_VERSION,
|
||||
'author' => 'Craig Andrews',
|
||||
'homepage' => 'http://status.net/wiki/Plugin:PubSubHubBub',
|
||||
'homepage' =>
|
||||
'http://status.net/wiki/Plugin:PubSubHubBub',
|
||||
'rawdescription' =>
|
||||
_m('The PubSubHubBub plugin pushes RSS/Atom updates to a <a href="http://pubsubhubbub.googlecode.com/">PubSubHubBub</a> hub.'));
|
||||
_m('The PubSubHubBub plugin pushes RSS/Atom updates '.
|
||||
'to a <a href = "'.
|
||||
'http://pubsubhubbub.googlecode.com/'.
|
||||
'">PubSubHubBub</a> hub.'));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
21
plugins/README-plugins
Normal file
21
plugins/README-plugins
Normal file
@ -0,0 +1,21 @@
|
||||
Several example plugins are included in the plugins/ directory. You
|
||||
can enable a plugin with the following line in config.php:
|
||||
|
||||
addPlugin('Example', array('param1' => 'value1',
|
||||
'param2' => 'value2'));
|
||||
|
||||
This will look for and load files named 'ExamplePlugin.php' or
|
||||
'Example/ExamplePlugin.php' either in the plugins/ directory (for
|
||||
plugins that ship with StatusNet) or in the local/ directory (for
|
||||
plugins you write yourself or that you get from somewhere else) or
|
||||
local/plugins/.
|
||||
|
||||
Plugins are documented in their own directories.
|
||||
|
||||
|
||||
Additional information on using and developing plugins can be found
|
||||
on the StatusNet wiki:
|
||||
|
||||
http://status.net/wiki/Plugins
|
||||
http://status.net/wiki/Plugin_development
|
||||
|
@ -138,6 +138,9 @@ class RSSCloudPlugin extends Plugin
|
||||
case 'RSSCloudNotifier':
|
||||
include_once INSTALLDIR . '/plugins/RSSCloud/RSSCloudNotifier.php';
|
||||
return false;
|
||||
case 'RSSCloudQueueHandler':
|
||||
include_once INSTALLDIR . '/plugins/RSSCloud/RSSCloudQueueHandler.php';
|
||||
return false;
|
||||
case 'RSSCloudRequestNotifyAction':
|
||||
case 'LoggingAggregatorAction':
|
||||
include_once INSTALLDIR . '/plugins/RSSCloud/' .
|
||||
@ -193,32 +196,6 @@ class RSSCloudPlugin extends Plugin
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* broadcast the message when not using queuehandler
|
||||
*
|
||||
* @param Notice &$notice the notice
|
||||
* @param array $queue destination queue
|
||||
*
|
||||
* @return boolean hook return
|
||||
*/
|
||||
|
||||
function onUnqueueHandleNotice(&$notice, $queue)
|
||||
{
|
||||
if (($queue == 'rsscloud') && ($this->_isLocal($notice))) {
|
||||
|
||||
common_debug('broadcasting rssCloud bound notice ' . $notice->id);
|
||||
|
||||
$profile = $notice->getProfile();
|
||||
|
||||
$notifier = new RSSCloudNotifier();
|
||||
$notifier->notify($profile);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether the notice was locally created
|
||||
*
|
||||
@ -261,19 +238,15 @@ class RSSCloudPlugin extends Plugin
|
||||
}
|
||||
|
||||
/**
|
||||
* Add RSSCloudQueueHandler to the list of valid daemons to
|
||||
* start
|
||||
* Register RSSCloud notice queue handler
|
||||
*
|
||||
* @param array $daemons the list of daemons to run
|
||||
* @param QueueManager $manager
|
||||
*
|
||||
* @return boolean hook return
|
||||
*
|
||||
*/
|
||||
|
||||
function onGetValidDaemons($daemons)
|
||||
function onEndInitializeQueueManager($manager)
|
||||
{
|
||||
array_push($daemons, INSTALLDIR .
|
||||
'/plugins/RSSCloud/RSSCloudQueueHandler.php');
|
||||
$manager->connect('rsscloud', 'RSSCloudQueueHandler');
|
||||
return true;
|
||||
}
|
||||
|
||||
|
50
plugins/RSSCloud/RSSCloudQueueHandler.php
Executable file → Normal file
50
plugins/RSSCloud/RSSCloudQueueHandler.php
Executable file → Normal file
@ -1,4 +1,3 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
/*
|
||||
* StatusNet - the distributed open-source microblogging tool
|
||||
@ -18,61 +17,20 @@
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
define('INSTALLDIR', realpath(dirname(__FILE__) . '/../..'));
|
||||
|
||||
$shortoptions = 'i::';
|
||||
$longoptions = array('id::');
|
||||
|
||||
$helptext = <<<END_OF_ENJIT_HELP
|
||||
Daemon script for pushing new notices to RSSCloud subscribers.
|
||||
|
||||
-i --id Identity (default none)
|
||||
|
||||
END_OF_ENJIT_HELP;
|
||||
|
||||
require_once INSTALLDIR . '/scripts/commandline.inc';
|
||||
require_once INSTALLDIR . '/lib/queuehandler.php';
|
||||
require_once INSTALLDIR . '/plugins/RSSCloud/RSSCloudNotifier.php';
|
||||
require_once INSTALLDIR . '/plugins/RSSCloud/RSSCloudSubscription.php';
|
||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
||||
|
||||
class RSSCloudQueueHandler extends QueueHandler
|
||||
{
|
||||
var $notifier = null;
|
||||
|
||||
function transport()
|
||||
{
|
||||
return 'rsscloud';
|
||||
}
|
||||
|
||||
function start()
|
||||
{
|
||||
$this->log(LOG_INFO, "INITIALIZE");
|
||||
$this->notifier = new RSSCloudNotifier();
|
||||
return true;
|
||||
}
|
||||
|
||||
function handle_notice($notice)
|
||||
function handle($notice)
|
||||
{
|
||||
$profile = $notice->getProfile();
|
||||
return $this->notifier->notify($profile);
|
||||
$notifier = new RSSCloudNotifier();
|
||||
return $notifier->notify($profile);
|
||||
}
|
||||
|
||||
function finish()
|
||||
{
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (have_option('i')) {
|
||||
$id = get_option_value('i');
|
||||
} else if (have_option('--id')) {
|
||||
$id = get_option_value('--id');
|
||||
} else if (count($args) > 0) {
|
||||
$id = $args[0];
|
||||
} else {
|
||||
$id = null;
|
||||
}
|
||||
|
||||
$handler = new RSSCloudQueueHandler($id);
|
||||
|
||||
$handler->runOnce();
|
||||
|
@ -31,8 +31,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
define('RECAPTCHA', '0.2');
|
||||
|
||||
require_once(INSTALLDIR.'/plugins/Recaptcha/recaptchalib.php');
|
||||
|
||||
class RecaptchaPlugin extends Plugin
|
||||
@ -88,4 +86,16 @@ class RecaptchaPlugin extends Plugin
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function onPluginVersion(&$versions)
|
||||
{
|
||||
$versions[] = array('name' => 'Recaptcha',
|
||||
'version' => STATUSNET_VERSION,
|
||||
'author' => 'Eric Helgeson',
|
||||
'homepage' => 'http://status.net/wiki/Plugin:Recaptcha',
|
||||
'rawdescription' =>
|
||||
_m('Uses <a href="http://recaptcha.org/">Recaptcha</a> service to add a '.
|
||||
'captcha to the registration page.'));
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
@ -28,7 +28,7 @@ class TwitterQueueHandler extends QueueHandler
|
||||
return 'twitter';
|
||||
}
|
||||
|
||||
function handle_notice($notice)
|
||||
function handle($notice)
|
||||
{
|
||||
return broadcast_twitter($notice);
|
||||
}
|
||||
|
@ -50,7 +50,7 @@ if (empty($notice)) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (!$handler->handle_notice($notice)) {
|
||||
if (!$handler->handle($notice)) {
|
||||
print "Failed to handle notice id $noticeId on queue '$queue'.\n";
|
||||
exit(1);
|
||||
}
|
||||
|
@ -29,6 +29,8 @@ $longoptions = array('id=', 'foreground', 'all', 'threads=', 'skip-xmpp', 'xmpp-
|
||||
*
|
||||
* Recognizes Linux and Mac OS X; others will return default of 1.
|
||||
*
|
||||
* @fixme move this to SpawningDaemon, but to get the default val for help
|
||||
* text we seem to need it before loading infrastructure
|
||||
* @return intval
|
||||
*/
|
||||
function getProcessorCount()
|
||||
@ -83,143 +85,29 @@ define('CLAIM_TIMEOUT', 1200);
|
||||
* We can then pass individual items through the QueueHandler subclasses
|
||||
* they belong to.
|
||||
*/
|
||||
class QueueDaemon extends Daemon
|
||||
class QueueDaemon extends SpawningDaemon
|
||||
{
|
||||
protected $allsites;
|
||||
protected $threads=1;
|
||||
protected $allsites = false;
|
||||
|
||||
function __construct($id=null, $daemonize=true, $threads=1, $allsites=false)
|
||||
{
|
||||
parent::__construct($daemonize);
|
||||
|
||||
if ($id) {
|
||||
$this->set_id($id);
|
||||
}
|
||||
parent::__construct($id, $daemonize, $threads);
|
||||
$this->all = $allsites;
|
||||
$this->threads = $threads;
|
||||
}
|
||||
|
||||
/**
|
||||
* How many seconds a polling-based queue manager should wait between
|
||||
* checks for new items to handle.
|
||||
*
|
||||
* Defaults to 60 seconds; override to speed up or slow down.
|
||||
*
|
||||
* @return int timeout in seconds
|
||||
*/
|
||||
function timeout()
|
||||
{
|
||||
return 60;
|
||||
}
|
||||
|
||||
function name()
|
||||
{
|
||||
return strtolower(get_class($this).'.'.$this->get_id());
|
||||
}
|
||||
|
||||
function run()
|
||||
{
|
||||
if ($this->threads > 1) {
|
||||
return $this->runThreads();
|
||||
} else {
|
||||
return $this->runLoop();
|
||||
}
|
||||
}
|
||||
|
||||
function runThreads()
|
||||
{
|
||||
$children = array();
|
||||
for ($i = 1; $i <= $this->threads; $i++) {
|
||||
$pid = pcntl_fork();
|
||||
if ($pid < 0) {
|
||||
print "Couldn't fork for thread $i; aborting\n";
|
||||
exit(1);
|
||||
} else if ($pid == 0) {
|
||||
$this->runChild($i);
|
||||
exit(0);
|
||||
} else {
|
||||
$this->log(LOG_INFO, "Spawned thread $i as pid $pid");
|
||||
$children[$i] = $pid;
|
||||
}
|
||||
}
|
||||
|
||||
$this->log(LOG_INFO, "Waiting for children to complete.");
|
||||
while (count($children) > 0) {
|
||||
$status = null;
|
||||
$pid = pcntl_wait($status);
|
||||
if ($pid > 0) {
|
||||
$i = array_search($pid, $children);
|
||||
if ($i === false) {
|
||||
$this->log(LOG_ERR, "Unrecognized child pid $pid exited!");
|
||||
continue;
|
||||
}
|
||||
unset($children[$i]);
|
||||
$this->log(LOG_INFO, "Thread $i pid $pid exited.");
|
||||
|
||||
$pid = pcntl_fork();
|
||||
if ($pid < 0) {
|
||||
print "Couldn't fork to respawn thread $i; aborting thread.\n";
|
||||
} else if ($pid == 0) {
|
||||
$this->runChild($i);
|
||||
exit(0);
|
||||
} else {
|
||||
$this->log(LOG_INFO, "Respawned thread $i as pid $pid");
|
||||
$children[$i] = $pid;
|
||||
}
|
||||
}
|
||||
}
|
||||
$this->log(LOG_INFO, "All child processes complete.");
|
||||
return true;
|
||||
}
|
||||
|
||||
function runChild($thread)
|
||||
{
|
||||
$this->set_id($this->get_id() . "." . $thread);
|
||||
$this->resetDb();
|
||||
$this->runLoop();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reconnect to the database for each child process,
|
||||
* or they'll get very confused trying to use the
|
||||
* same socket.
|
||||
*/
|
||||
function resetDb()
|
||||
{
|
||||
// @fixme do we need to explicitly open the db too
|
||||
// or is this implied?
|
||||
global $_DB_DATAOBJECT;
|
||||
unset($_DB_DATAOBJECT['CONNECTIONS']);
|
||||
|
||||
// Reconnect main memcached, or threads will stomp on
|
||||
// each other and corrupt their requests.
|
||||
$cache = common_memcache();
|
||||
if ($cache) {
|
||||
$cache->reconnect();
|
||||
}
|
||||
|
||||
// Also reconnect memcached for status_network table.
|
||||
if (!empty(Status_network::$cache)) {
|
||||
Status_network::$cache->close();
|
||||
Status_network::$cache = null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Setup and start of run loop for this queue handler as a daemon.
|
||||
* Most of the heavy lifting is passed on to the QueueManager's service()
|
||||
* method, which passes control on to the QueueHandler's handle_notice()
|
||||
* method for each notice that comes in on the queue.
|
||||
*
|
||||
* Most of the time this won't need to be overridden in a subclass.
|
||||
* method, which passes control on to the QueueHandler's handle()
|
||||
* method for each item that comes in on the queue.
|
||||
*
|
||||
* @return boolean true on success, false on failure
|
||||
*/
|
||||
function runLoop()
|
||||
function runThread()
|
||||
{
|
||||
$this->log(LOG_INFO, 'checking for queued notices');
|
||||
|
||||
$master = new IoMaster($this->get_id());
|
||||
$master = new QueueMaster($this->get_id());
|
||||
$master->init($this->all);
|
||||
$master->service();
|
||||
|
||||
@ -229,10 +117,25 @@ class QueueDaemon extends Daemon
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
function log($level, $msg)
|
||||
class QueueMaster extends IoMaster
|
||||
{
|
||||
/**
|
||||
* Initialize IoManagers for the currently configured site
|
||||
* which are appropriate to this instance.
|
||||
*/
|
||||
function initManagers()
|
||||
{
|
||||
common_log($level, get_class($this) . ' ('. $this->get_id() .'): '.$msg);
|
||||
$classes = array();
|
||||
if (Event::handle('StartQueueDaemonIoManagers', array(&$classes))) {
|
||||
$classes[] = 'QueueManager';
|
||||
}
|
||||
Event::handle('EndQueueDaemonIoManagers', array(&$classes));
|
||||
|
||||
foreach ($classes as $class) {
|
||||
$this->instantiate($class);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -33,347 +33,46 @@ END_OF_XMPP_HELP;
|
||||
|
||||
require_once INSTALLDIR.'/scripts/commandline.inc';
|
||||
|
||||
require_once INSTALLDIR . '/lib/common.php';
|
||||
require_once INSTALLDIR . '/lib/jabber.php';
|
||||
require_once INSTALLDIR . '/lib/daemon.php';
|
||||
|
||||
# This is kind of clunky; we create a class to call the global functions
|
||||
# in jabber.php, which create a new XMPP class. A more elegant (?) solution
|
||||
# might be to use make this a subclass of XMPP.
|
||||
|
||||
class XMPPDaemon extends Daemon
|
||||
class XMPPDaemon extends SpawningDaemon
|
||||
{
|
||||
function __construct($resource=null, $daemonize=true)
|
||||
function __construct($id=null, $daemonize=true, $threads=1)
|
||||
{
|
||||
parent::__construct($daemonize);
|
||||
|
||||
static $attrs = array('server', 'port', 'user', 'password', 'host');
|
||||
|
||||
foreach ($attrs as $attr)
|
||||
{
|
||||
$this->$attr = common_config('xmpp', $attr);
|
||||
if ($threads != 1) {
|
||||
// This should never happen. :)
|
||||
throw new Exception("XMPPDaemon can must run single-threaded");
|
||||
}
|
||||
|
||||
if ($resource) {
|
||||
$this->resource = $resource . 'daemon';
|
||||
} else {
|
||||
$this->resource = common_config('xmpp', 'resource') . 'daemon';
|
||||
}
|
||||
|
||||
$this->jid = $this->user.'@'.$this->server.'/'.$this->resource;
|
||||
|
||||
$this->log(LOG_INFO, "INITIALIZE XMPPDaemon {$this->jid}");
|
||||
parent::__construct($id, $daemonize, $threads);
|
||||
}
|
||||
|
||||
function connect()
|
||||
function runThread()
|
||||
{
|
||||
$connect_to = ($this->host) ? $this->host : $this->server;
|
||||
common_log(LOG_INFO, 'Waiting to listen to XMPP and queues');
|
||||
|
||||
$this->log(LOG_INFO, "Connecting to $connect_to on port $this->port");
|
||||
$master = new XmppMaster($this->get_id());
|
||||
$master->init();
|
||||
$master->service();
|
||||
|
||||
$this->conn = jabber_connect($this->resource);
|
||||
common_log(LOG_INFO, 'terminating normally');
|
||||
|
||||
if (!$this->conn) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->log(LOG_INFO, "Connected");
|
||||
|
||||
$this->conn->setReconnectTimeout(600);
|
||||
|
||||
$this->log(LOG_INFO, "Sending initial presence.");
|
||||
|
||||
jabber_send_presence("Send me a message to post a notice", 'available',
|
||||
null, 'available', 100);
|
||||
|
||||
$this->log(LOG_INFO, "Done connecting.");
|
||||
|
||||
return !$this->conn->isDisconnected();
|
||||
return true;
|
||||
}
|
||||
|
||||
function name()
|
||||
}
|
||||
|
||||
class XmppMaster extends IoMaster
|
||||
{
|
||||
/**
|
||||
* Initialize IoManagers for the currently configured site
|
||||
* which are appropriate to this instance.
|
||||
*/
|
||||
function initManagers()
|
||||
{
|
||||
return strtolower('xmppdaemon.'.$this->resource);
|
||||
}
|
||||
|
||||
function run()
|
||||
{
|
||||
if ($this->connect()) {
|
||||
|
||||
$this->log(LOG_DEBUG, "Initializing stanza handlers.");
|
||||
|
||||
$this->conn->addEventHandler('message', 'handle_message', $this);
|
||||
$this->conn->addEventHandler('presence', 'handle_presence', $this);
|
||||
$this->conn->addEventHandler('reconnect', 'handle_reconnect', $this);
|
||||
|
||||
$this->log(LOG_DEBUG, "Beginning processing loop.");
|
||||
|
||||
while ($this->conn->processTime(60)) {
|
||||
$this->sendPing();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function sendPing()
|
||||
{
|
||||
if (!isset($this->pingid)) {
|
||||
$this->pingid = 0;
|
||||
} else {
|
||||
$this->pingid++;
|
||||
}
|
||||
|
||||
$this->log(LOG_DEBUG, "Sending ping #{$this->pingid}");
|
||||
|
||||
$this->conn->send("<iq from='{$this->jid}' to='{$this->server}' id='ping_{$this->pingid}' type='get'><ping xmlns='urn:xmpp:ping'/></iq>");
|
||||
}
|
||||
|
||||
function handle_reconnect(&$pl)
|
||||
{
|
||||
$this->log(LOG_DEBUG, "Got reconnection callback.");
|
||||
$this->conn->processUntil('session_start');
|
||||
$this->log(LOG_DEBUG, "Sending reconnection presence.");
|
||||
$this->conn->presence('Send me a message to post a notice', 'available', null, 'available', 100);
|
||||
unset($pl['xml']);
|
||||
$pl['xml'] = null;
|
||||
|
||||
$pl = null;
|
||||
unset($pl);
|
||||
}
|
||||
|
||||
function get_user($from)
|
||||
{
|
||||
$user = User::staticGet('jabber', jabber_normalize_jid($from));
|
||||
return $user;
|
||||
}
|
||||
|
||||
function handle_message(&$pl)
|
||||
{
|
||||
$from = jabber_normalize_jid($pl['from']);
|
||||
|
||||
if ($pl['type'] != 'chat') {
|
||||
$this->log(LOG_WARNING, "Ignoring message of type ".$pl['type']." from $from.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mb_strlen($pl['body']) == 0) {
|
||||
$this->log(LOG_WARNING, "Ignoring message with empty body from $from.");
|
||||
return;
|
||||
}
|
||||
|
||||
# Forwarded from another daemon (probably a broadcaster) for
|
||||
# us to handle
|
||||
|
||||
if ($this->is_self($from)) {
|
||||
$this->log(LOG_INFO, "Got forwarded notice from self ($from).");
|
||||
$from = $this->get_ofrom($pl);
|
||||
$this->log(LOG_INFO, "Originally sent by $from.");
|
||||
if (is_null($from) || $this->is_self($from)) {
|
||||
$this->log(LOG_INFO, "Ignoring notice originally sent by $from.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
$user = $this->get_user($from);
|
||||
|
||||
// For common_current_user to work
|
||||
global $_cur;
|
||||
$_cur = $user;
|
||||
|
||||
if (!$user) {
|
||||
$this->from_site($from, 'Unknown user; go to ' .
|
||||
common_local_url('imsettings') .
|
||||
' to add your address to your account');
|
||||
$this->log(LOG_WARNING, 'Message from unknown user ' . $from);
|
||||
return;
|
||||
}
|
||||
if ($this->handle_command($user, $pl['body'])) {
|
||||
$this->log(LOG_INFO, "Command message by $from handled.");
|
||||
return;
|
||||
} else if ($this->is_autoreply($pl['body'])) {
|
||||
$this->log(LOG_INFO, 'Ignoring auto reply from ' . $from);
|
||||
return;
|
||||
} else if ($this->is_otr($pl['body'])) {
|
||||
$this->log(LOG_INFO, 'Ignoring OTR from ' . $from);
|
||||
return;
|
||||
} else {
|
||||
|
||||
$this->log(LOG_INFO, 'Posting a notice from ' . $user->nickname);
|
||||
|
||||
$this->add_notice($user, $pl);
|
||||
}
|
||||
|
||||
$user->free();
|
||||
unset($user);
|
||||
unset($_cur);
|
||||
|
||||
unset($pl['xml']);
|
||||
$pl['xml'] = null;
|
||||
|
||||
$pl = null;
|
||||
unset($pl);
|
||||
}
|
||||
|
||||
function is_self($from)
|
||||
{
|
||||
return preg_match('/^'.strtolower(jabber_daemon_address()).'/', strtolower($from));
|
||||
}
|
||||
|
||||
function get_ofrom($pl)
|
||||
{
|
||||
$xml = $pl['xml'];
|
||||
$addresses = $xml->sub('addresses');
|
||||
if (!$addresses) {
|
||||
$this->log(LOG_WARNING, 'Forwarded message without addresses');
|
||||
return null;
|
||||
}
|
||||
$address = $addresses->sub('address');
|
||||
if (!$address) {
|
||||
$this->log(LOG_WARNING, 'Forwarded message without address');
|
||||
return null;
|
||||
}
|
||||
if (!array_key_exists('type', $address->attrs)) {
|
||||
$this->log(LOG_WARNING, 'No type for forwarded message');
|
||||
return null;
|
||||
}
|
||||
$type = $address->attrs['type'];
|
||||
if ($type != 'ofrom') {
|
||||
$this->log(LOG_WARNING, 'Type of forwarded message is not ofrom');
|
||||
return null;
|
||||
}
|
||||
if (!array_key_exists('jid', $address->attrs)) {
|
||||
$this->log(LOG_WARNING, 'No jid for forwarded message');
|
||||
return null;
|
||||
}
|
||||
$jid = $address->attrs['jid'];
|
||||
if (!$jid) {
|
||||
$this->log(LOG_WARNING, 'Could not get jid from address');
|
||||
return null;
|
||||
}
|
||||
$this->log(LOG_DEBUG, 'Got message forwarded from jid ' . $jid);
|
||||
return $jid;
|
||||
}
|
||||
|
||||
function is_autoreply($txt)
|
||||
{
|
||||
if (preg_match('/[\[\(]?[Aa]uto[-\s]?[Rr]e(ply|sponse)[\]\)]/', $txt)) {
|
||||
return true;
|
||||
} else if (preg_match('/^System: Message wasn\'t delivered. Offline storage size was exceeded.$/', $txt)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function is_otr($txt)
|
||||
{
|
||||
if (preg_match('/^\?OTR/', $txt)) {
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function from_site($address, $msg)
|
||||
{
|
||||
$text = '['.common_config('site', 'name') . '] ' . $msg;
|
||||
jabber_send_message($address, $text);
|
||||
}
|
||||
|
||||
function handle_command($user, $body)
|
||||
{
|
||||
$inter = new CommandInterpreter();
|
||||
$cmd = $inter->handle_command($user, $body);
|
||||
if ($cmd) {
|
||||
$chan = new XMPPChannel($this->conn);
|
||||
$cmd->execute($chan);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
function add_notice(&$user, &$pl)
|
||||
{
|
||||
$body = trim($pl['body']);
|
||||
$content_shortened = common_shorten_links($body);
|
||||
if (Notice::contentTooLong($content_shortened)) {
|
||||
$from = jabber_normalize_jid($pl['from']);
|
||||
$this->from_site($from, sprintf(_('Message too long - maximum is %1$d characters, you sent %2$d.'),
|
||||
Notice::maxContent(),
|
||||
mb_strlen($content_shortened)));
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
$notice = Notice::saveNew($user->id, $content_shortened, 'xmpp');
|
||||
} catch (Exception $e) {
|
||||
$this->log(LOG_ERR, $e->getMessage());
|
||||
$this->from_site($user->jabber, $e->getMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
common_broadcast_notice($notice);
|
||||
$this->log(LOG_INFO,
|
||||
'Added notice ' . $notice->id . ' from user ' . $user->nickname);
|
||||
$notice->free();
|
||||
unset($notice);
|
||||
}
|
||||
|
||||
function handle_presence(&$pl)
|
||||
{
|
||||
$from = jabber_normalize_jid($pl['from']);
|
||||
switch ($pl['type']) {
|
||||
case 'subscribe':
|
||||
# We let anyone subscribe
|
||||
$this->subscribed($from);
|
||||
$this->log(LOG_INFO,
|
||||
'Accepted subscription from ' . $from);
|
||||
break;
|
||||
case 'subscribed':
|
||||
case 'unsubscribed':
|
||||
case 'unsubscribe':
|
||||
$this->log(LOG_INFO,
|
||||
'Ignoring "' . $pl['type'] . '" from ' . $from);
|
||||
break;
|
||||
default:
|
||||
if (!$pl['type']) {
|
||||
$user = User::staticGet('jabber', $from);
|
||||
if (!$user) {
|
||||
$this->log(LOG_WARNING, 'Presence from unknown user ' . $from);
|
||||
return;
|
||||
}
|
||||
if ($user->updatefrompresence) {
|
||||
$this->log(LOG_INFO, 'Updating ' . $user->nickname .
|
||||
' status from presence.');
|
||||
$this->add_notice($user, $pl);
|
||||
}
|
||||
$user->free();
|
||||
unset($user);
|
||||
}
|
||||
break;
|
||||
}
|
||||
unset($pl['xml']);
|
||||
$pl['xml'] = null;
|
||||
|
||||
$pl = null;
|
||||
unset($pl);
|
||||
}
|
||||
|
||||
function log($level, $msg)
|
||||
{
|
||||
$text = 'XMPPDaemon('.$this->resource.'): '.$msg;
|
||||
common_log($level, $text);
|
||||
if (!$this->daemonize)
|
||||
{
|
||||
$line = common_log_line($level, $text);
|
||||
echo $line;
|
||||
echo "\n";
|
||||
}
|
||||
}
|
||||
|
||||
function subscribed($to)
|
||||
{
|
||||
jabber_special_presence('subscribed', $to);
|
||||
// @fixme right now there's a hack in QueueManager to determine
|
||||
// which queues to subscribe to based on the master class.
|
||||
$this->instantiate('QueueManager');
|
||||
$this->instantiate('XmppManager');
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -1012,6 +1012,16 @@ float:left;
|
||||
#shownotice .vcard .photo {
|
||||
margin-bottom:4px;
|
||||
}
|
||||
#content .notice .author .photo {
|
||||
position:absolute;
|
||||
top:11px;
|
||||
left:0;
|
||||
float:none;
|
||||
}
|
||||
#content .notice .entry-title {
|
||||
margin-left:59px;
|
||||
}
|
||||
|
||||
.vcard .url {
|
||||
text-decoration:none;
|
||||
}
|
||||
@ -1020,13 +1030,19 @@ text-decoration:underline;
|
||||
}
|
||||
|
||||
.notice .entry-title {
|
||||
float:left;
|
||||
width:100%;
|
||||
overflow:hidden;
|
||||
}
|
||||
.notice .entry-title.ov {
|
||||
overflow:visible;
|
||||
}
|
||||
#showstream .notice .entry-title,
|
||||
#showstream .notice div.entry-content {
|
||||
margin-left:0;
|
||||
}
|
||||
#shownotice .notice .entry-title,
|
||||
#shownotice .notice div.entry-content {
|
||||
margin-left:110px;
|
||||
}
|
||||
#shownotice .notice .entry-title {
|
||||
font-size:2.2em;
|
||||
}
|
||||
@ -1056,7 +1072,6 @@ max-width:70%;
|
||||
}
|
||||
#showstream .notice div.entry-content,
|
||||
#shownotice .notice div.entry-content {
|
||||
margin-left:0;
|
||||
max-width:79%;
|
||||
}
|
||||
|
||||
@ -1120,6 +1135,7 @@ position:relative;
|
||||
font-size:0.95em;
|
||||
width:113px;
|
||||
float:right;
|
||||
margin-top:3px;
|
||||
margin-right:4px;
|
||||
}
|
||||
|
||||
|
@ -1,150 +0,0 @@
|
||||
/** theme: base
|
||||
*
|
||||
* @package StatusNet
|
||||
* @author Meitar Moscovitz <meitar@maymay.net>
|
||||
* @author Sarven Capadisli <csarven@status.net>
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
body {
|
||||
font-size:2.5em;
|
||||
}
|
||||
|
||||
#wrap {
|
||||
width:95%;
|
||||
}
|
||||
|
||||
#header,
|
||||
#header address,
|
||||
#anon_notice,
|
||||
#site_nav_local_views .nav,
|
||||
#form_notice,
|
||||
#form_notice .form_data li,
|
||||
#core,
|
||||
#content_inner,
|
||||
#notices_primary,
|
||||
.notice,
|
||||
.notice .entry-title,
|
||||
.notice div.entry-content,
|
||||
.notice-options,
|
||||
.notice .notice-options a,
|
||||
.pagination,
|
||||
.pagination .nav,
|
||||
.aside .section {
|
||||
float:none;
|
||||
}
|
||||
|
||||
.notice-options .notice_reply,
|
||||
.notice-options .notice_delete,
|
||||
.notice-options .form_favor,
|
||||
.notice-options .form_disfavor {
|
||||
position:static;
|
||||
}
|
||||
|
||||
#form_notice,
|
||||
#anon_notice,
|
||||
#footer,
|
||||
#form_notice .form_actions input.submit {
|
||||
width:auto;
|
||||
}
|
||||
|
||||
.form_settings label {
|
||||
width:25%;
|
||||
}
|
||||
.form_settings .form_data p.form_guide {
|
||||
margin-left:26%;
|
||||
}
|
||||
|
||||
#site_nav_global_primary {
|
||||
width:75%;
|
||||
}
|
||||
|
||||
.entity_profile {
|
||||
width:65%;
|
||||
}
|
||||
.entity_actions {
|
||||
margin-left:0;
|
||||
}
|
||||
|
||||
#form_notice,
|
||||
#anon_notice {
|
||||
clear:both;
|
||||
}
|
||||
|
||||
#content,
|
||||
#aside_primary {
|
||||
width:96%;
|
||||
padding-left:2%;
|
||||
padding-right:2%;
|
||||
}
|
||||
|
||||
#site_notice {
|
||||
position:static;
|
||||
float:right;
|
||||
clear:right;
|
||||
width:75%;
|
||||
margin-right:0;
|
||||
margin-bottom:11px;
|
||||
}
|
||||
|
||||
.notices {
|
||||
font-size:1.5em;
|
||||
}
|
||||
|
||||
#form_notice textarea {
|
||||
width:80%;
|
||||
height:5em;
|
||||
}
|
||||
#form_notice .form_note {
|
||||
right:20%;
|
||||
top:6em;
|
||||
}
|
||||
|
||||
|
||||
.vcard .photo,
|
||||
.section .vcard .photo {
|
||||
margin-right:18px;
|
||||
}
|
||||
.notice,
|
||||
.profile {
|
||||
margin-bottom:18px;
|
||||
}
|
||||
|
||||
.notices .entry-title,
|
||||
.notices div.entry-content {
|
||||
width:90%;
|
||||
}
|
||||
.notice div.entry-content {
|
||||
margin-left:0;
|
||||
}
|
||||
|
||||
.notice .author .photo {
|
||||
height:4.5em;
|
||||
width:4.5em;
|
||||
}
|
||||
.notice-options {
|
||||
position:absolute;
|
||||
top:0;
|
||||
right:0;
|
||||
padding-left:7%;
|
||||
width:3%;
|
||||
}
|
||||
|
||||
.notice-options .notice_delete a {
|
||||
float:left;
|
||||
}
|
||||
.pagination .nav {
|
||||
overflow:auto;
|
||||
}
|
||||
|
||||
#export_data {
|
||||
display:none;
|
||||
}
|
||||
|
||||
#site_nav_local_views li {
|
||||
margin-right:4px;
|
||||
}
|
||||
#site_nav_local_views a {
|
||||
padding:18px 11px;
|
||||
}
|
Loading…
Reference in New Issue
Block a user