Merge branch 'master' into 1.0.x
This commit is contained in:
commit
7183175429
41
README
41
README
@ -2,8 +2,8 @@
|
||||
README
|
||||
------
|
||||
|
||||
StatusNet 0.9.3 ("Half a World Away")
|
||||
29 June 2010
|
||||
StatusNet 0.9.4beta2
|
||||
11 August 2010
|
||||
|
||||
This is the README file for StatusNet, the Open Source microblogging
|
||||
platform. It includes installation instructions, descriptions of
|
||||
@ -43,6 +43,10 @@ on status.net is identical to the software available for download, so
|
||||
you can move back and forth between a hosted version or a version
|
||||
installed on your own servers.
|
||||
|
||||
A commercial software subscription is available from StatusNet Inc. It
|
||||
includes 24-hour technical support and developer support. More
|
||||
information at http://status.net/contact or email sales@status.net.
|
||||
|
||||
License
|
||||
=======
|
||||
|
||||
@ -77,27 +81,31 @@ for additional terms.
|
||||
New this version
|
||||
================
|
||||
|
||||
This is a minor bug and feature release since version 0.9.2 released on
|
||||
4 May 2010.
|
||||
This is a security, bug and feature release since version 0.9.3 released on
|
||||
29 June 2010.
|
||||
|
||||
For best compatibility with client software and site federation, and a lot of
|
||||
bug fixes, it is highly recommended that all public sites upgrade to the new
|
||||
version.
|
||||
|
||||
Changes from 0.9.4beta1:
|
||||
- fix for daemon config switching on multi-site setup
|
||||
|
||||
Notable changes this version:
|
||||
|
||||
- Enhanced API output to aid StatusNet-specific clients
|
||||
- OpenID and OAuth libraries patched for potential timing attack
|
||||
- OStatus feed i/o updated for Activity Streams
|
||||
- Correctness fixes on XRD, other discovery bits
|
||||
- Support for contacting SNI-based SSL virtual hosts when SSL
|
||||
certificate verification is enabled (requires PHP 5.3.2+ or
|
||||
enabling CURL backend with $config['http']['curl'] = true)
|
||||
- Experimental SubMirror plugin
|
||||
- Multi-site status_network table mode has been tweaked to support
|
||||
multiple tags better
|
||||
- Many updates to user interface translation from TranslateWiki
|
||||
- OStatus now works subscribing to SSL-protected sites by default
|
||||
- OpenID now works on PHP 5.3, supports closer site integration.
|
||||
- Numerous API and FOAF output fixes.
|
||||
- Fixes to Facebook integration for FB API behavior changes
|
||||
- PostgreSQL support updates
|
||||
- Initial version of a custom theme uploader (disabled by default)
|
||||
- LDAP auth plugins cleanup
|
||||
- Many other bugfixes
|
||||
|
||||
A full changelog is available at http://status.net/wiki/StatusNet_0.9.3.
|
||||
A full changelog is available at http://status.net/wiki/StatusNet_0.9.4.
|
||||
|
||||
Prerequisites
|
||||
=============
|
||||
@ -125,7 +133,6 @@ Your PHP installation must include the following PHP extensions:
|
||||
- MySQL. For accessing the database.
|
||||
- GD. For scaling down avatar images.
|
||||
- mbstring. For handling Unicode (UTF-8) encoded strings.
|
||||
- gettext. For multiple languages. Default on many PHP installs.
|
||||
|
||||
For some functionality, you will also need the following extensions:
|
||||
|
||||
@ -140,6 +147,8 @@ For some functionality, you will also need the following extensions:
|
||||
Sphinx server to serve the search queries.
|
||||
- bcmath or gmp. For Salmon signatures (part of OStatus). Needed
|
||||
if you have OStatus configured.
|
||||
- gettext. For multiple languages. Default on many PHP installs;
|
||||
will be emulated if not present.
|
||||
|
||||
You will almost definitely get 2-3 times better performance from your
|
||||
site if you install a PHP bytecode cache/accelerator. Some well-known
|
||||
@ -209,7 +218,7 @@ especially if you've previously installed PHP/MySQL packages.
|
||||
1. Unpack the tarball you downloaded on your Web server. Usually a
|
||||
command like this will work:
|
||||
|
||||
tar zxf statusnet-0.9.2.tar.gz
|
||||
tar zxf statusnet-0.9.4.tar.gz
|
||||
|
||||
...which will make a statusnet-0.9.2 subdirectory in your current
|
||||
directory. (If you don't have shell access on your Web server, you
|
||||
@ -219,7 +228,7 @@ especially if you've previously installed PHP/MySQL packages.
|
||||
2. Move the tarball to a directory of your choosing in your Web root
|
||||
directory. Usually something like this will work:
|
||||
|
||||
mv statusnet-0.9.2 /var/www/statusnet
|
||||
mv statusnet-0.9.4 /var/www/statusnet
|
||||
|
||||
This will make your StatusNet instance available in the statusnet path of
|
||||
your server, like "http://example.net/statusnet". "microblog" or
|
||||
|
@ -240,6 +240,14 @@ class File_redirection extends Memcached_DataObject
|
||||
} else if (is_string($redir_data)) {
|
||||
// The file is a known redirect target.
|
||||
$file = File::staticGet('url', $redir_data);
|
||||
if (empty($file)) {
|
||||
// @fixme should we save a new one?
|
||||
// this case was triggering sometimes for redirects
|
||||
// with unresolvable targets; found while fixing
|
||||
// "can't linkify" bugs with shortened links to
|
||||
// SSL sites with cert issues.
|
||||
return null;
|
||||
}
|
||||
$file_id = $file->id;
|
||||
}
|
||||
} else {
|
||||
|
@ -485,7 +485,7 @@ class Notice extends Memcached_DataObject
|
||||
function saveKnownUrls($urls)
|
||||
{
|
||||
// @fixme validation?
|
||||
foreach ($urls as $url) {
|
||||
foreach (array_unique($urls) as $url) {
|
||||
File::processNew($url, $this->id);
|
||||
}
|
||||
}
|
||||
@ -893,7 +893,7 @@ class Notice extends Memcached_DataObject
|
||||
}
|
||||
|
||||
$groups = array();
|
||||
foreach ($group_ids as $id) {
|
||||
foreach (array_unique($group_ids) as $id) {
|
||||
$group = User_group::staticGet('id', $id);
|
||||
if ($group) {
|
||||
common_log(LOG_ERR, "Local delivery to group id $id, $group->nickname");
|
||||
@ -1016,7 +1016,7 @@ class Notice extends Memcached_DataObject
|
||||
}
|
||||
$sender = Profile::staticGet($this->profile_id);
|
||||
|
||||
foreach ($uris as $uri) {
|
||||
foreach (array_unique($uris) as $uri) {
|
||||
|
||||
$user = User::staticGet('uri', $uri);
|
||||
|
||||
@ -1029,6 +1029,7 @@ class Notice extends Memcached_DataObject
|
||||
|
||||
$reply->notice_id = $this->id;
|
||||
$reply->profile_id = $user->id;
|
||||
common_log(LOG_INFO, __METHOD__ . ": saving reply: notice $this->id to profile $user->id");
|
||||
|
||||
$id = $reply->insert();
|
||||
}
|
||||
|
@ -464,11 +464,9 @@ class Profile extends Memcached_DataObject
|
||||
|
||||
$sub = new Subscription();
|
||||
$sub->subscribed = $this->id;
|
||||
|
||||
$sub->whereAdd('subscriber != subscribed');
|
||||
$cnt = (int) $sub->count('distinct subscriber');
|
||||
|
||||
$cnt = ($cnt > 0) ? $cnt - 1 : $cnt;
|
||||
|
||||
if (!empty($c)) {
|
||||
$c->set(common_cache_key('profile:subscriber_count:'.$this->id), $cnt);
|
||||
}
|
||||
|
@ -71,6 +71,7 @@ class ActivityContext
|
||||
|
||||
$links = $element->getElementsByTagNameNS(ActivityUtils::ATOM, ActivityUtils::LINK);
|
||||
|
||||
$attention = array();
|
||||
for ($i = 0; $i < $links->length; $i++) {
|
||||
|
||||
$link = $links->item($i);
|
||||
@ -80,11 +81,12 @@ class ActivityContext
|
||||
// XXX: Deprecate this in favour of "mentioned" from Salmon spec
|
||||
// http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html#SALR
|
||||
if ($linkRel == self::ATTENTION) {
|
||||
$this->attention[] = $link->getAttribute(self::HREF);
|
||||
$attention[] = $link->getAttribute(self::HREF);
|
||||
} elseif ($linkRel == self::MENTIONED) {
|
||||
$this->attention[] = $link->getAttribute(self::HREF);
|
||||
$attention[] = $link->getAttribute(self::HREF);
|
||||
}
|
||||
}
|
||||
$this->attention = array_unique($attention);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -22,10 +22,10 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
||||
//exit with 200 response, if this is checking fancy from the installer
|
||||
if (isset($_REQUEST['p']) && $_REQUEST['p'] == 'check-fancy') { exit; }
|
||||
|
||||
define('STATUSNET_VERSION', '0.9.3');
|
||||
define('STATUSNET_VERSION', '0.9.4beta2');
|
||||
define('LACONICA_VERSION', STATUSNET_VERSION); // compatibility
|
||||
|
||||
define('STATUSNET_CODENAME', 'Half a World Away');
|
||||
define('STATUSNET_CODENAME', 'Orange Crush');
|
||||
|
||||
define('AVATAR_PROFILE_SIZE', 96);
|
||||
define('AVATAR_STREAM_SIZE', 48);
|
||||
|
@ -321,6 +321,7 @@ $default =
|
||||
'maxlength' => 25,
|
||||
'maxnoticelength' => -1),
|
||||
'http' => // HTTP client settings when contacting other sites
|
||||
array('ssl_cafile' => false // To enable SSL cert validation, point to a CA bundle (eg '/usr/lib/ssl/certs/ca-certificates.crt')
|
||||
array('ssl_cafile' => false, // To enable SSL cert validation, point to a CA bundle (eg '/usr/lib/ssl/certs/ca-certificates.crt')
|
||||
'curl' => false, // Use CURL backend for HTTP fetches if available. (If not, PHP's socket streams will be used.)
|
||||
),
|
||||
);
|
||||
|
@ -145,6 +145,10 @@ class HTTPClient extends HTTP_Request2
|
||||
$this->config['ssl_verify_peer'] = false;
|
||||
}
|
||||
|
||||
if (common_config('http', 'curl') && extension_loaded('curl')) {
|
||||
$this->config['adapter'] = 'HTTP_Request2_Adapter_Curl';
|
||||
}
|
||||
|
||||
parent::__construct($url, $method, $config);
|
||||
$this->setHeader('User-Agent', $this->userAgent());
|
||||
}
|
||||
@ -204,6 +208,15 @@ class HTTPClient extends HTTP_Request2
|
||||
protected function doRequest($url, $method, $headers)
|
||||
{
|
||||
$this->setUrl($url);
|
||||
|
||||
// Workaround for HTTP_Request2 not setting up SNI in socket contexts;
|
||||
// This fixes cert validation for SSL virtual hosts using SNI.
|
||||
// Requires PHP 5.3.2 or later and OpenSSL with SNI support.
|
||||
if ($this->url->getScheme() == 'https' && defined('OPENSSL_TLSEXT_SERVER_NAME')) {
|
||||
$this->config['ssl_SNI_enabled'] = true;
|
||||
$this->config['ssl_SNI_server_name'] = $this->url->getHost();
|
||||
}
|
||||
|
||||
$this->setMethod($method);
|
||||
if ($headers) {
|
||||
foreach ($headers as $header) {
|
||||
|
@ -310,6 +310,7 @@ function get_all_languages() {
|
||||
'da' => array('q' => 0.8, 'lang' => 'da', 'name' => 'Danish', 'direction' => 'ltr'),
|
||||
'de' => array('q' => 0.8, 'lang' => 'de', 'name' => 'German', 'direction' => 'ltr'),
|
||||
'el' => array('q' => 0.1, 'lang' => 'el', 'name' => 'Greek', 'direction' => 'ltr'),
|
||||
'eo' => array('q' => 0.8, 'lang' => 'eo', 'name' => 'Esperanto', 'direction' => 'ltr'),
|
||||
'en-us' => array('q' => 1, 'lang' => 'en', 'name' => 'English (US)', 'direction' => 'ltr'),
|
||||
'en-gb' => array('q' => 1, 'lang' => 'en_GB', 'name' => 'English (British)', 'direction' => 'ltr'),
|
||||
'en' => array('q' => 1, 'lang' => 'en', 'name' => 'English (US)', 'direction' => 'ltr'),
|
||||
|
@ -224,6 +224,7 @@ class MailboxAction extends CurrentUserDesignAction
|
||||
|
||||
if ($message->source) {
|
||||
$this->elementStart('span', 'source');
|
||||
// FIXME: bad i18n. Device should be a parameter (from %s).
|
||||
$this->text(_('from'));
|
||||
$this->element('span', 'device', $this->showSource($message->source));
|
||||
$this->elementEnd('span');
|
||||
|
@ -333,7 +333,7 @@ class MysqlSchema extends Schema
|
||||
}
|
||||
|
||||
if (empty($name)) {
|
||||
$name = "$table_".implode("_", $columnNames)."_idx";
|
||||
$name = "{$table}_".implode("_", $columnNames)."_idx";
|
||||
}
|
||||
|
||||
$res = $this->conn->query("ALTER TABLE $table ".
|
||||
|
@ -499,9 +499,10 @@ class NoticeListItem extends Widget
|
||||
$ns = $this->notice->getSource();
|
||||
|
||||
if ($ns) {
|
||||
$source_name = _($ns->code);
|
||||
$source_name = (empty($ns->name)) ? ($ns->code ? _($ns->code) : _('web')) : _($ns->name);
|
||||
$this->out->text(' ');
|
||||
$this->out->elementStart('span', 'source');
|
||||
// FIXME: probably i18n issue. If "from" is followed by text, that should be a parameter to "from" (from %s).
|
||||
$this->out->text(_('from'));
|
||||
$this->out->text(' ');
|
||||
|
||||
|
@ -141,7 +141,7 @@ class StatusNet
|
||||
return true;
|
||||
}
|
||||
|
||||
$sn = Status_network::staticGet($nickname);
|
||||
$sn = Status_network::staticGet('nickname', $nickname);
|
||||
if (empty($sn)) {
|
||||
return false;
|
||||
throw new Exception("No such site nickname '$nickname'");
|
||||
|
@ -649,7 +649,7 @@ class StompQueueManager extends QueueManager
|
||||
*/
|
||||
protected function updateSiteConfig($nickname)
|
||||
{
|
||||
$sn = Status_network::staticGet($nickname);
|
||||
$sn = Status_network::staticGet('nickname', $nickname);
|
||||
if ($sn) {
|
||||
$this->switchSite($nickname);
|
||||
if (!in_array($nickname, $this->sites)) {
|
||||
|
@ -845,7 +845,10 @@ function common_linkify($url) {
|
||||
} elseif (is_string($longurl_data)) {
|
||||
$longurl = $longurl_data;
|
||||
} else {
|
||||
throw new ServerException("Can't linkify url '$url'");
|
||||
// Unable to reach the server to verify contents, etc
|
||||
// Just pass the link on through for now.
|
||||
common_log(LOG_ERR, "Can't linkify url '$url'");
|
||||
$longurl = $url;
|
||||
}
|
||||
}
|
||||
$attrs = array('href' => $canon, 'title' => $longurl, 'rel' => 'external');
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:39+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:01+0000\n"
|
||||
"Language-Team: Arabic\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ar\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4740,21 +4740,21 @@ msgstr "مشكلة أثناء حفظ الإشعار."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "آر تي @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:41+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:02+0000\n"
|
||||
"Language-Team: Egyptian Spoken Arabic\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: arz\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4768,21 +4768,21 @@ msgstr "مشكله أثناء حفظ الإشعار."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "آر تى @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:42+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:08+0000\n"
|
||||
"Language-Team: Bulgarian\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: bg\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4920,21 +4920,21 @@ msgstr "Проблем при записване на бележката."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -11,12 +11,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:45+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:12+0000\n"
|
||||
"Language-Team: Catalan\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ca\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4992,21 +4992,21 @@ msgstr "S'ha produït un problema en desar la safata d'entrada del grup."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:47+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:14+0000\n"
|
||||
"Language-Team: Czech\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: cs\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4954,21 +4954,21 @@ msgstr "Problém při ukládání sdělení"
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:48+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:15+0000\n"
|
||||
"Language-Team: Danish\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: da\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4728,21 +4728,21 @@ msgstr ""
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -16,12 +16,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:49+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:17+0000\n"
|
||||
"Language-Team: German\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: de\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -5003,14 +5003,14 @@ msgstr "Problem bei Speichern der Nachricht."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
@ -5019,7 +5019,7 @@ msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:51+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:18+0000\n"
|
||||
"Language-Team: Greek\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: el\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4879,21 +4879,21 @@ msgstr ""
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -11,12 +11,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:52+0000\n"
|
||||
"POT-Creation-Date: 2010-08-11 10:11+0000\n"
|
||||
"PO-Revision-Date: 2010-08-11 10:11:54+0000\n"
|
||||
"Language-Team: British English\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: en-gb\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -173,8 +173,8 @@ msgid ""
|
||||
"You can try to [nudge %1$s](../%2$s) from their profile or [post something "
|
||||
"to them](%%%%action.newnotice%%%%?status_textarea=%3$s)."
|
||||
msgstr ""
|
||||
"You can try to [nudge %1$s](../%2$s) from his profile or [post something to "
|
||||
"his or her attention](%%%%action.newnotice%%%%?status_textarea=%3$s)."
|
||||
"Be the first to [post on this topic](%%%%action.newnotice%%%%?"
|
||||
"status_textarea=%s)!"
|
||||
|
||||
#: actions/all.php:149 actions/replies.php:210 actions/showstream.php:211
|
||||
#, fuzzy, php-format
|
||||
@ -182,8 +182,8 @@ msgid ""
|
||||
"Why not [register an account](%%%%action.register%%%%) and then nudge %s or "
|
||||
"post a notice to them."
|
||||
msgstr ""
|
||||
"Why not [register an account](%%%%action.register%%%%) and then nudge %s or "
|
||||
"post a notice to his or her attention."
|
||||
"Why not [register an account](%%action.register%%) and be the first to add a "
|
||||
"notice to your favourites!"
|
||||
|
||||
#. TRANS: H1 text
|
||||
#: actions/all.php:182
|
||||
@ -367,7 +367,7 @@ msgstr "Could not delete favourite."
|
||||
#: actions/apifriendshipscreate.php:109
|
||||
#, fuzzy
|
||||
msgid "Could not follow user: profile not found."
|
||||
msgstr "Could not follow user: User not found."
|
||||
msgstr "Could not unfollow user: User not found."
|
||||
|
||||
#: actions/apifriendshipscreate.php:118
|
||||
#, php-format
|
||||
@ -383,9 +383,8 @@ msgid "You cannot unfollow yourself."
|
||||
msgstr "You cannot unfollow yourself."
|
||||
|
||||
#: actions/apifriendshipsexists.php:91
|
||||
#, fuzzy
|
||||
msgid "Two valid IDs or screen_names must be supplied."
|
||||
msgstr "Two user ids or screen_names must be supplied."
|
||||
msgstr ""
|
||||
|
||||
#: actions/apifriendshipsshow.php:134
|
||||
msgid "Could not determine source user."
|
||||
@ -789,7 +788,7 @@ msgid "Preview"
|
||||
msgstr "Preview"
|
||||
|
||||
#: actions/avatarsettings.php:149 actions/showapplication.php:252
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:656
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:657
|
||||
msgid "Delete"
|
||||
msgstr "Delete"
|
||||
|
||||
@ -1070,7 +1069,7 @@ msgid "Do not delete this notice"
|
||||
msgstr "Do not delete this notice"
|
||||
|
||||
#. TRANS: Submit button title for 'Yes' when deleting a notice.
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:656
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:657
|
||||
msgid "Delete this notice"
|
||||
msgstr "Delete this notice"
|
||||
|
||||
@ -2128,8 +2127,9 @@ msgid "This is your inbox, which lists your incoming private messages."
|
||||
msgstr "This is your inbox, which lists your incoming private messages."
|
||||
|
||||
#: actions/invite.php:39
|
||||
#, fuzzy
|
||||
msgid "Invites have been disabled."
|
||||
msgstr ""
|
||||
msgstr "Invitations enabled"
|
||||
|
||||
#: actions/invite.php:41
|
||||
#, php-format
|
||||
@ -2493,11 +2493,9 @@ msgid "Updates matching search term \"%1$s\" on %2$s!"
|
||||
msgstr "Updates matching search term \"%1$s\" on %2$s!"
|
||||
|
||||
#: actions/nudge.php:85
|
||||
#, fuzzy
|
||||
msgid ""
|
||||
"This user doesn't allow nudges or hasn't confirmed or set their email yet."
|
||||
msgstr ""
|
||||
"This user doesn't allow nudges or hasn't confirmed or set his e-mail yet."
|
||||
|
||||
#: actions/nudge.php:94
|
||||
msgid "Nudge sent"
|
||||
@ -2529,8 +2527,9 @@ msgid "Connected applications"
|
||||
msgstr "Connected applications"
|
||||
|
||||
#: actions/oauthconnectionssettings.php:83
|
||||
#, fuzzy
|
||||
msgid "You have allowed the following applications to access you account."
|
||||
msgstr ""
|
||||
msgstr "You have not authorised any applications to use your account."
|
||||
|
||||
#: actions/oauthconnectionssettings.php:175
|
||||
msgid "You are not a user of that application."
|
||||
@ -2609,8 +2608,9 @@ msgid "View profile designs"
|
||||
msgstr "View profile designs"
|
||||
|
||||
#: actions/othersettings.php:123
|
||||
#, fuzzy
|
||||
msgid "Show or hide profile designs."
|
||||
msgstr ""
|
||||
msgstr "View profile designs"
|
||||
|
||||
#: actions/othersettings.php:153
|
||||
msgid "URL shortening service is too long (max 50 chars)."
|
||||
@ -2717,8 +2717,9 @@ msgid "Paths"
|
||||
msgstr ""
|
||||
|
||||
#: actions/pathsadminpanel.php:70
|
||||
#, fuzzy
|
||||
msgid "Path and server settings for this StatusNet site."
|
||||
msgstr ""
|
||||
msgstr "Basic settings for this StatusNet site"
|
||||
|
||||
#: actions/pathsadminpanel.php:157
|
||||
#, php-format
|
||||
@ -2785,16 +2786,19 @@ msgid "Theme"
|
||||
msgstr ""
|
||||
|
||||
#: actions/pathsadminpanel.php:264
|
||||
#, fuzzy
|
||||
msgid "Theme server"
|
||||
msgstr ""
|
||||
msgstr "SSL server"
|
||||
|
||||
#: actions/pathsadminpanel.php:268
|
||||
#, fuzzy
|
||||
msgid "Theme path"
|
||||
msgstr ""
|
||||
msgstr "Site path"
|
||||
|
||||
#: actions/pathsadminpanel.php:272
|
||||
#, fuzzy
|
||||
msgid "Theme directory"
|
||||
msgstr ""
|
||||
msgstr "Avatar directory"
|
||||
|
||||
#: actions/pathsadminpanel.php:279
|
||||
msgid "Avatars"
|
||||
@ -2813,20 +2817,24 @@ msgid "Avatar directory"
|
||||
msgstr "Avatar directory"
|
||||
|
||||
#: actions/pathsadminpanel.php:301
|
||||
#, fuzzy
|
||||
msgid "Backgrounds"
|
||||
msgstr ""
|
||||
msgstr "Background"
|
||||
|
||||
#: actions/pathsadminpanel.php:305
|
||||
#, fuzzy
|
||||
msgid "Background server"
|
||||
msgstr ""
|
||||
msgstr "Background"
|
||||
|
||||
#: actions/pathsadminpanel.php:309
|
||||
#, fuzzy
|
||||
msgid "Background path"
|
||||
msgstr ""
|
||||
msgstr "Background"
|
||||
|
||||
#: actions/pathsadminpanel.php:313
|
||||
#, fuzzy
|
||||
msgid "Background directory"
|
||||
msgstr ""
|
||||
msgstr "Background directory not writable: %s."
|
||||
|
||||
#: actions/pathsadminpanel.php:320
|
||||
msgid "SSL"
|
||||
@ -2845,8 +2853,9 @@ msgid "Always"
|
||||
msgstr ""
|
||||
|
||||
#: actions/pathsadminpanel.php:329
|
||||
#, fuzzy
|
||||
msgid "Use SSL"
|
||||
msgstr ""
|
||||
msgstr "SSL"
|
||||
|
||||
#: actions/pathsadminpanel.php:330
|
||||
msgid "When to use SSL"
|
||||
@ -3062,21 +3071,24 @@ msgid "Public Stream Feed (Atom)"
|
||||
msgstr "Public Stream Feed (Atom)"
|
||||
|
||||
#: actions/public.php:188
|
||||
#, php-format
|
||||
#, fuzzy, php-format
|
||||
msgid ""
|
||||
"This is the public timeline for %%site.name%% but no one has posted anything "
|
||||
"yet."
|
||||
msgstr ""
|
||||
"This is the timeline for %s and friends but no one has posted anything yet."
|
||||
|
||||
#: actions/public.php:191
|
||||
msgid "Be the first to post!"
|
||||
msgstr ""
|
||||
|
||||
#: actions/public.php:195
|
||||
#, php-format
|
||||
#, fuzzy, php-format
|
||||
msgid ""
|
||||
"Why not [register an account](%%action.register%%) and be the first to post!"
|
||||
msgstr ""
|
||||
"Why not [register an account](%%action.register%%) and be the first to add a "
|
||||
"notice to your favourites!"
|
||||
|
||||
#: actions/public.php:242
|
||||
#, php-format
|
||||
@ -3121,11 +3133,13 @@ msgid "Be the first to post one!"
|
||||
msgstr ""
|
||||
|
||||
#: actions/publictagcloud.php:75
|
||||
#, php-format
|
||||
#, fuzzy, php-format
|
||||
msgid ""
|
||||
"Why not [register an account](%%action.register%%) and be the first to post "
|
||||
"one!"
|
||||
msgstr ""
|
||||
"Why not [register an account](%%action.register%%) and be the first to add a "
|
||||
"notice to your favourites!"
|
||||
|
||||
#: actions/publictagcloud.php:134
|
||||
msgid "Tag cloud"
|
||||
@ -3172,8 +3186,9 @@ msgid "You have been identified. Enter a new password below. "
|
||||
msgstr ""
|
||||
|
||||
#: actions/recoverpassword.php:188
|
||||
#, fuzzy
|
||||
msgid "Password recovery"
|
||||
msgstr ""
|
||||
msgstr "Password recovery requested"
|
||||
|
||||
#: actions/recoverpassword.php:191
|
||||
msgid "Nickname or email address"
|
||||
@ -3463,7 +3478,7 @@ msgstr "You can't repeat your own notice."
|
||||
msgid "You already repeated that notice."
|
||||
msgstr "You already repeated that notice."
|
||||
|
||||
#: actions/repeat.php:114 lib/noticelist.php:675
|
||||
#: actions/repeat.php:114 lib/noticelist.php:676
|
||||
msgid "Repeated"
|
||||
msgstr "Repeated"
|
||||
|
||||
@ -3502,9 +3517,7 @@ msgstr "Notice feed for %s"
|
||||
msgid ""
|
||||
"This is the timeline showing replies to %1$s but %2$s hasn't received a "
|
||||
"notice to them yet."
|
||||
msgstr ""
|
||||
"This is the timeline showing replies to %1$s but %2$s hasn't received a "
|
||||
"notice to his attention yet."
|
||||
msgstr "This is the timeline for %1$s but %2$s hasn't posted anything yet."
|
||||
|
||||
#: actions/replies.php:204
|
||||
#, php-format
|
||||
@ -3519,8 +3532,8 @@ msgid ""
|
||||
"You can try to [nudge %1$s](../%2$s) or [post something to them](%%%%action."
|
||||
"newnotice%%%%?status_textarea=%3$s)."
|
||||
msgstr ""
|
||||
"You can try to [nudge %1$s](../%2$s) or [post something to his or her "
|
||||
"attention](%%%%action.newnotice%%%%?status_textarea=%3$s)."
|
||||
"Be the first to [post on this topic](%%%%action.newnotice%%%%?"
|
||||
"status_textarea=%s)!"
|
||||
|
||||
#: actions/repliesrss.php:72
|
||||
#, php-format
|
||||
@ -3550,8 +3563,9 @@ msgstr "User is already sandboxed."
|
||||
#. TRANS: Menu item for site administration
|
||||
#: actions/sessionsadminpanel.php:54 actions/sessionsadminpanel.php:170
|
||||
#: lib/adminpanelaction.php:392
|
||||
#, fuzzy
|
||||
msgid "Sessions"
|
||||
msgstr ""
|
||||
msgstr "Version"
|
||||
|
||||
#: actions/sessionsadminpanel.php:65
|
||||
msgid "Session settings for this StatusNet site."
|
||||
@ -3619,16 +3633,18 @@ msgid "Created by %1$s - %2$s access by default - %3$d users"
|
||||
msgstr ""
|
||||
|
||||
#: actions/showapplication.php:213
|
||||
#, fuzzy
|
||||
msgid "Application actions"
|
||||
msgstr ""
|
||||
msgstr "Application not found."
|
||||
|
||||
#: actions/showapplication.php:236
|
||||
msgid "Reset key & secret"
|
||||
msgstr ""
|
||||
|
||||
#: actions/showapplication.php:261
|
||||
#, fuzzy
|
||||
msgid "Application info"
|
||||
msgstr ""
|
||||
msgstr "Application not found."
|
||||
|
||||
#: actions/showapplication.php:263
|
||||
msgid "Consumer key"
|
||||
@ -3693,13 +3709,11 @@ msgstr ""
|
||||
"notices you like to bookmark them for later or shed a spotlight on them."
|
||||
|
||||
#: actions/showfavorites.php:208
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid ""
|
||||
"%s hasn't added any favorite notices yet. Post something interesting they "
|
||||
"would add to their favorites :)"
|
||||
msgstr ""
|
||||
"%s hasn't added any notices to his favourites yet. Post something "
|
||||
"interesting they would add to their favourites :)"
|
||||
|
||||
#: actions/showfavorites.php:212
|
||||
#, fuzzy, php-format
|
||||
@ -3708,9 +3722,8 @@ msgid ""
|
||||
"action.register%%%%) and then post something interesting they would add to "
|
||||
"their favorites :)"
|
||||
msgstr ""
|
||||
"%s hasn't added any notices to his favourites yet. Why not [register an "
|
||||
"account](%%%%action.register%%%%) and then post something interesting they "
|
||||
"would add to their favourites :)"
|
||||
"Why not [register an account](%%action.register%%) and be the first to add a "
|
||||
"notice to your favourites!"
|
||||
|
||||
#: actions/showfavorites.php:243
|
||||
msgid "This is a way to share what you like."
|
||||
@ -3892,17 +3905,21 @@ msgid ""
|
||||
"You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%"
|
||||
"%?status_textarea=%2$s)."
|
||||
msgstr ""
|
||||
"You can try to nudge %1$s or [post something to his or her attention](%%%%"
|
||||
"action.newnotice%%%%?status_textarea=%2$s)."
|
||||
"Be the first to [post on this topic](%%%%action.newnotice%%%%?"
|
||||
"status_textarea=%s)!"
|
||||
|
||||
#: actions/showstream.php:243
|
||||
#, php-format
|
||||
#, fuzzy, php-format
|
||||
msgid ""
|
||||
"**%s** has an account on %%%%site.name%%%%, a [micro-blogging](http://en."
|
||||
"wikipedia.org/wiki/Micro-blogging) service based on the Free Software "
|
||||
"[StatusNet](http://status.net/) tool. [Join now](%%%%action.register%%%%) to "
|
||||
"follow **%s**'s notices and many more! ([Read more](%%%%doc.help%%%%))"
|
||||
msgstr ""
|
||||
"This is %%site.name%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-"
|
||||
"blogging) service based on the Free Software [StatusNet](http://status.net/) "
|
||||
"tool. [Join now](%%action.register%%) to share notices about yourself with "
|
||||
"friends, family, and colleagues! ([Read more](%%doc.help%%))"
|
||||
|
||||
#: actions/showstream.php:248
|
||||
#, php-format
|
||||
@ -3990,8 +4007,9 @@ msgid "Local"
|
||||
msgstr "Local"
|
||||
|
||||
#: actions/siteadminpanel.php:256
|
||||
#, fuzzy
|
||||
msgid "Default timezone"
|
||||
msgstr ""
|
||||
msgstr "Default subscription"
|
||||
|
||||
#: actions/siteadminpanel.php:257
|
||||
msgid "Default timezone for the site; usually UTC."
|
||||
@ -4217,16 +4235,18 @@ msgid "Manage snapshot configuration"
|
||||
msgstr "Manage snapshot configuration"
|
||||
|
||||
#: actions/snapshotadminpanel.php:127
|
||||
#, fuzzy
|
||||
msgid "Invalid snapshot run value."
|
||||
msgstr ""
|
||||
msgstr "Invalid role."
|
||||
|
||||
#: actions/snapshotadminpanel.php:133
|
||||
msgid "Snapshot frequency must be a number."
|
||||
msgstr ""
|
||||
|
||||
#: actions/snapshotadminpanel.php:144
|
||||
#, fuzzy
|
||||
msgid "Invalid snapshot report URL."
|
||||
msgstr ""
|
||||
msgstr "nvalid logo URL."
|
||||
|
||||
#: actions/snapshotadminpanel.php:200
|
||||
msgid "Randomly during web hit"
|
||||
@ -4237,8 +4257,9 @@ msgid "In a scheduled job"
|
||||
msgstr ""
|
||||
|
||||
#: actions/snapshotadminpanel.php:206
|
||||
#, fuzzy
|
||||
msgid "Data snapshots"
|
||||
msgstr ""
|
||||
msgstr "Save snapshot settings"
|
||||
|
||||
#: actions/snapshotadminpanel.php:208
|
||||
msgid "When to send statistical data to status.net servers"
|
||||
@ -4253,8 +4274,9 @@ msgid "Snapshots will be sent once every N web hits"
|
||||
msgstr ""
|
||||
|
||||
#: actions/snapshotadminpanel.php:226
|
||||
#, fuzzy
|
||||
msgid "Report URL"
|
||||
msgstr ""
|
||||
msgstr "Source URL"
|
||||
|
||||
#: actions/snapshotadminpanel.php:227
|
||||
msgid "Snapshots will be sent to this URL"
|
||||
@ -4322,11 +4344,13 @@ msgid "%s has no subscribers. Want to be the first?"
|
||||
msgstr ""
|
||||
|
||||
#: actions/subscribers.php:114
|
||||
#, php-format
|
||||
#, fuzzy, php-format
|
||||
msgid ""
|
||||
"%s has no subscribers. Why not [register an account](%%%%action.register%%%"
|
||||
"%) and be the first?"
|
||||
msgstr ""
|
||||
"Why not [register an account](%%action.register%%) and be the first to add a "
|
||||
"notice to your favourites!"
|
||||
|
||||
#: actions/subscriptions.php:52
|
||||
#, php-format
|
||||
@ -4472,8 +4496,9 @@ msgid "User"
|
||||
msgstr "User"
|
||||
|
||||
#: actions/useradminpanel.php:70
|
||||
#, fuzzy
|
||||
msgid "User settings for this StatusNet site."
|
||||
msgstr ""
|
||||
msgstr "Design settings for this StausNet site."
|
||||
|
||||
#: actions/useradminpanel.php:149
|
||||
msgid "Invalid bio limit. Must be numeric."
|
||||
@ -4507,12 +4532,14 @@ msgid "New users"
|
||||
msgstr "New users"
|
||||
|
||||
#: actions/useradminpanel.php:235
|
||||
#, fuzzy
|
||||
msgid "New user welcome"
|
||||
msgstr ""
|
||||
msgstr "New users"
|
||||
|
||||
#: actions/useradminpanel.php:236
|
||||
#, fuzzy
|
||||
msgid "Welcome text for new users (Max 255 chars)."
|
||||
msgstr ""
|
||||
msgstr "Name is too long (max 255 chars)."
|
||||
|
||||
#: actions/useradminpanel.php:241
|
||||
msgid "Default subscription"
|
||||
@ -4622,9 +4649,9 @@ msgid "Profile URL ‘%s’ is for a local user."
|
||||
msgstr ""
|
||||
|
||||
#: actions/userauthorization.php:345
|
||||
#, php-format
|
||||
#, fuzzy, php-format
|
||||
msgid "Avatar URL ‘%s’ is not valid."
|
||||
msgstr ""
|
||||
msgstr "Callback URL is not valid."
|
||||
|
||||
#: actions/userauthorization.php:350
|
||||
#, php-format
|
||||
@ -4696,8 +4723,9 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: actions/version.php:163
|
||||
#, fuzzy
|
||||
msgid "Contributors"
|
||||
msgstr ""
|
||||
msgstr "Connections"
|
||||
|
||||
#: actions/version.php:170
|
||||
msgid ""
|
||||
@ -4894,21 +4922,21 @@ msgstr "Problem saving group inbox."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1746
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
@ -4932,8 +4960,9 @@ msgstr "You have been banned from subscribing."
|
||||
|
||||
#. TRANS: Exception thrown when trying to subscribe while already subscribed.
|
||||
#: classes/Subscription.php:80
|
||||
#, fuzzy
|
||||
msgid "Already subscribed!"
|
||||
msgstr ""
|
||||
msgstr "Not subscribed!"
|
||||
|
||||
#. TRANS: Exception thrown when trying to subscribe to a user who has blocked the subscribing user.
|
||||
#: classes/Subscription.php:85
|
||||
@ -4950,19 +4979,19 @@ msgstr "Not subscribed!"
|
||||
#: classes/Subscription.php:178
|
||||
#, fuzzy
|
||||
msgid "Could not delete self-subscription."
|
||||
msgstr "Couldn't delete self-subscription."
|
||||
msgstr "Could not save subscription."
|
||||
|
||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
||||
#: classes/Subscription.php:206
|
||||
#, fuzzy
|
||||
msgid "Could not delete subscription OMB token."
|
||||
msgstr "Couldn't delete subscription OMB token."
|
||||
msgstr "Could not save subscription."
|
||||
|
||||
#. TRANS: Exception thrown when a subscription could not be deleted on the server.
|
||||
#: classes/Subscription.php:218
|
||||
#, fuzzy
|
||||
msgid "Could not delete subscription."
|
||||
msgstr "Couldn't delete subscription."
|
||||
msgstr "Could not save subscription."
|
||||
|
||||
#. TRANS: Notice given on user registration.
|
||||
#. TRANS: %1$s is the sitename, $2$s is the registering user's nickname.
|
||||
@ -5400,13 +5429,15 @@ msgstr ""
|
||||
|
||||
#. TRANS: Form legend.
|
||||
#: lib/applicationeditform.php:137
|
||||
#, fuzzy
|
||||
msgid "Edit application"
|
||||
msgstr ""
|
||||
msgstr "Edit Application"
|
||||
|
||||
#. TRANS: Form guide.
|
||||
#: lib/applicationeditform.php:187
|
||||
#, fuzzy
|
||||
msgid "Icon for this application"
|
||||
msgstr ""
|
||||
msgstr "Do not delete this application"
|
||||
|
||||
#. TRANS: Form input field instructions.
|
||||
#: lib/applicationeditform.php:209
|
||||
@ -5503,13 +5534,15 @@ msgstr "Revoke"
|
||||
|
||||
#. TRANS: DT element label in attachment list.
|
||||
#: lib/attachmentlist.php:88
|
||||
#, fuzzy
|
||||
msgid "Attachments"
|
||||
msgstr ""
|
||||
msgstr "No attachments."
|
||||
|
||||
#. TRANS: DT element label in attachment list item.
|
||||
#: lib/attachmentlist.php:265
|
||||
#, fuzzy
|
||||
msgid "Author"
|
||||
msgstr ""
|
||||
msgstr "Authorise URL"
|
||||
|
||||
#. TRANS: DT element label in attachment list item.
|
||||
#: lib/attachmentlist.php:279
|
||||
@ -5521,8 +5554,9 @@ msgid "Notices where this attachment appears"
|
||||
msgstr ""
|
||||
|
||||
#: lib/attachmenttagcloudsection.php:48
|
||||
#, fuzzy
|
||||
msgid "Tags for this attachment"
|
||||
msgstr ""
|
||||
msgstr "No such attachment."
|
||||
|
||||
#: lib/authenticationplugin.php:221 lib/authenticationplugin.php:226
|
||||
msgid "Password changing failed"
|
||||
@ -5912,8 +5946,9 @@ msgstr ""
|
||||
"You can upload your personal background image. The maximum file size is 2MB."
|
||||
|
||||
#: lib/designsettings.php:418
|
||||
#, fuzzy
|
||||
msgid "Design defaults restored."
|
||||
msgstr ""
|
||||
msgstr "Design preferences saved."
|
||||
|
||||
#: lib/disfavorform.php:114 lib/disfavorform.php:140
|
||||
msgid "Disfavor this notice"
|
||||
@ -6313,9 +6348,9 @@ msgid ""
|
||||
msgstr ""
|
||||
|
||||
#: lib/mail.php:657
|
||||
#, php-format
|
||||
#, fuzzy, php-format
|
||||
msgid "%s (@%s) sent a notice to your attention"
|
||||
msgstr ""
|
||||
msgstr "%s (@%s) added your notice as a favorite"
|
||||
|
||||
#. TRANS: Body of @-reply notification e-mail.
|
||||
#: lib/mail.php:660
|
||||
@ -6355,7 +6390,7 @@ msgid ""
|
||||
"users in conversation. People can send you messages for your eyes only."
|
||||
msgstr ""
|
||||
|
||||
#: lib/mailbox.php:227 lib/noticelist.php:505
|
||||
#: lib/mailbox.php:228 lib/noticelist.php:506
|
||||
msgid "from"
|
||||
msgstr "from"
|
||||
|
||||
@ -6509,23 +6544,23 @@ msgstr ""
|
||||
msgid "at"
|
||||
msgstr ""
|
||||
|
||||
#: lib/noticelist.php:567
|
||||
#: lib/noticelist.php:568
|
||||
msgid "in context"
|
||||
msgstr "in context"
|
||||
|
||||
#: lib/noticelist.php:602
|
||||
#: lib/noticelist.php:603
|
||||
msgid "Repeated by"
|
||||
msgstr "Repeated by"
|
||||
|
||||
#: lib/noticelist.php:629
|
||||
#: lib/noticelist.php:630
|
||||
msgid "Reply to this notice"
|
||||
msgstr "Reply to this notice"
|
||||
|
||||
#: lib/noticelist.php:630
|
||||
#: lib/noticelist.php:631
|
||||
msgid "Reply"
|
||||
msgstr "Reply"
|
||||
|
||||
#: lib/noticelist.php:674
|
||||
#: lib/noticelist.php:675
|
||||
msgid "Notice repeated"
|
||||
msgstr "Notice repeated"
|
||||
|
||||
@ -6827,16 +6862,18 @@ msgid "Top posters"
|
||||
msgstr "Top posters"
|
||||
|
||||
#: lib/unsandboxform.php:69
|
||||
#, fuzzy
|
||||
msgid "Unsandbox"
|
||||
msgstr ""
|
||||
msgstr "Sandbox"
|
||||
|
||||
#: lib/unsandboxform.php:80
|
||||
msgid "Unsandbox this user"
|
||||
msgstr "Unsandbox this user"
|
||||
|
||||
#: lib/unsilenceform.php:67
|
||||
#, fuzzy
|
||||
msgid "Unsilence"
|
||||
msgstr ""
|
||||
msgstr "Silence"
|
||||
|
||||
#: lib/unsilenceform.php:78
|
||||
msgid "Unsilence this user"
|
||||
|
7093
locale/eo/LC_MESSAGES/statusnet.po
Normal file
7093
locale/eo/LC_MESSAGES/statusnet.po
Normal file
File diff suppressed because it is too large
Load Diff
@ -15,12 +15,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:54+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:22+0000\n"
|
||||
"Language-Team: Spanish\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: es\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4990,21 +4990,21 @@ msgstr "Hubo un problema al guarda la bandeja de entrada del grupo."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr "No se puede revocar rol \"%1$s\" para usuario #%2$d; no existe."
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -12,8 +12,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:57+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:25+0000\n"
|
||||
"Last-Translator: Ahmad Sufi Mahmudi\n"
|
||||
"Language-Team: Persian\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -22,7 +22,7 @@ msgstr ""
|
||||
"X-Language-Code: fa\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
"Plural-Forms: nplurals=1; plural=0;\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
|
||||
#. TRANS: Page title
|
||||
@ -4934,21 +4934,21 @@ msgstr "هنگام ذخیرهٔ صندوق ورودی گروه مشکلی رخ
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:55+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:23+0000\n"
|
||||
"Language-Team: Finnish\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: fi\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -5057,21 +5057,21 @@ msgstr "Ongelma päivityksen tallentamisessa."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -15,12 +15,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:21:58+0000\n"
|
||||
"POT-Creation-Date: 2010-08-11 10:11+0000\n"
|
||||
"PO-Revision-Date: 2010-08-11 10:12:08+0000\n"
|
||||
"Language-Team: French\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: fr\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -805,7 +805,7 @@ msgid "Preview"
|
||||
msgstr "Aperçu"
|
||||
|
||||
#: actions/avatarsettings.php:149 actions/showapplication.php:252
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:656
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:657
|
||||
msgid "Delete"
|
||||
msgstr "Supprimer"
|
||||
|
||||
@ -1086,7 +1086,7 @@ msgid "Do not delete this notice"
|
||||
msgstr "Ne pas supprimer cet avis"
|
||||
|
||||
#. TRANS: Submit button title for 'Yes' when deleting a notice.
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:656
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:657
|
||||
msgid "Delete this notice"
|
||||
msgstr "Supprimer cet avis"
|
||||
|
||||
@ -3538,7 +3538,7 @@ msgstr "Vous ne pouvez pas reprendre votre propre avis."
|
||||
msgid "You already repeated that notice."
|
||||
msgstr "Vous avez déjà repris cet avis."
|
||||
|
||||
#: actions/repeat.php:114 lib/noticelist.php:675
|
||||
#: actions/repeat.php:114 lib/noticelist.php:676
|
||||
msgid "Repeated"
|
||||
msgstr "Repris"
|
||||
|
||||
@ -4940,7 +4940,7 @@ msgstr "Impossible de créer le jeton d’identification pour %s"
|
||||
#. TRANS: Exception thrown when database name or Data Source Name could not be found.
|
||||
#: classes/Memcached_DataObject.php:533
|
||||
msgid "No database name or DSN found anywhere."
|
||||
msgstr "Aucune base de données de nom ou DSN trouvée nulle part."
|
||||
msgstr "Aucun nom de base de données ou DSN trouvé nulle part."
|
||||
|
||||
#. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them.
|
||||
#: classes/Message.php:46
|
||||
@ -5020,14 +5020,14 @@ msgstr "Problème lors de l’enregistrement de la boîte de réception du group
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1746
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
@ -5036,7 +5036,7 @@ msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
@ -6594,7 +6594,7 @@ msgstr ""
|
||||
"pour démarrer des conversations avec d’autres utilisateurs. Ceux-ci peuvent "
|
||||
"vous envoyer des messages destinés à vous seul(e)."
|
||||
|
||||
#: lib/mailbox.php:227 lib/noticelist.php:505
|
||||
#: lib/mailbox.php:228 lib/noticelist.php:506
|
||||
msgid "from"
|
||||
msgstr "de"
|
||||
|
||||
@ -6754,23 +6754,23 @@ msgstr "%1$u° %2$u' %3$u\" %4$s %5$u° %6$u' %7$u\" %8$s"
|
||||
msgid "at"
|
||||
msgstr "chez"
|
||||
|
||||
#: lib/noticelist.php:567
|
||||
#: lib/noticelist.php:568
|
||||
msgid "in context"
|
||||
msgstr "dans le contexte"
|
||||
|
||||
#: lib/noticelist.php:602
|
||||
#: lib/noticelist.php:603
|
||||
msgid "Repeated by"
|
||||
msgstr "Repris par"
|
||||
|
||||
#: lib/noticelist.php:629
|
||||
#: lib/noticelist.php:630
|
||||
msgid "Reply to this notice"
|
||||
msgstr "Répondre à cet avis"
|
||||
|
||||
#: lib/noticelist.php:630
|
||||
#: lib/noticelist.php:631
|
||||
msgid "Reply"
|
||||
msgstr "Répondre"
|
||||
|
||||
#: lib/noticelist.php:674
|
||||
#: lib/noticelist.php:675
|
||||
msgid "Notice repeated"
|
||||
msgstr "Avis repris"
|
||||
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:00+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:29+0000\n"
|
||||
"Language-Team: Irish\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ga\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -5114,21 +5114,21 @@ msgstr "Aconteceu un erro ó gardar o chío."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:01+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:30+0000\n"
|
||||
"Language-Team: Galician\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: gl\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -166,7 +166,7 @@ msgstr ""
|
||||
|
||||
#. TRANS: %1$s is user nickname, %2$s is user nickname, %2$s is user nickname prefixed with "@"
|
||||
#: actions/all.php:146
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid ""
|
||||
"You can try to [nudge %1$s](../%2$s) from their profile or [post something "
|
||||
"to them](%%%%action.newnotice%%%%?status_textarea=%3$s)."
|
||||
@ -176,7 +176,7 @@ msgstr ""
|
||||
"status_textarea=%3$s)."
|
||||
|
||||
#: actions/all.php:149 actions/replies.php:210 actions/showstream.php:211
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid ""
|
||||
"Why not [register an account](%%%%action.register%%%%) and then nudge %s or "
|
||||
"post a notice to them."
|
||||
@ -512,9 +512,8 @@ msgid "groups on %s"
|
||||
msgstr "grupos en %s"
|
||||
|
||||
#: actions/apimediaupload.php:99
|
||||
#, fuzzy
|
||||
msgid "Upload failed."
|
||||
msgstr "Cargar un ficheiro"
|
||||
msgstr "Houbo un erro durante a carga."
|
||||
|
||||
#: actions/apioauthauthorize.php:101
|
||||
msgid "No oauth_token parameter provided."
|
||||
@ -663,7 +662,7 @@ msgstr "Non se atopou ningún estado con esa ID."
|
||||
|
||||
#: actions/apistatusesupdate.php:221
|
||||
msgid "Client must provide a 'status' parameter with a value."
|
||||
msgstr ""
|
||||
msgstr "O cliente debe proporcionar un parámetro de \"estado\" cun valor."
|
||||
|
||||
#: actions/apistatusesupdate.php:242 actions/newnotice.php:155
|
||||
#: lib/mailhandler.php:60
|
||||
@ -3555,7 +3554,7 @@ msgid "Replies feed for %s (Atom)"
|
||||
msgstr "Fonte de novas coas respostas a %s (Atom)"
|
||||
|
||||
#: actions/replies.php:199
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid ""
|
||||
"This is the timeline showing replies to %1$s but %2$s hasn't received a "
|
||||
"notice to them yet."
|
||||
@ -3573,7 +3572,7 @@ msgstr ""
|
||||
"grupos](%%action.groups%%)."
|
||||
|
||||
#: actions/replies.php:206
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid ""
|
||||
"You can try to [nudge %1$s](../%2$s) or [post something to them](%%%%action."
|
||||
"newnotice%%%%?status_textarea=%3$s)."
|
||||
@ -3953,7 +3952,7 @@ msgstr ""
|
||||
"bo momento para comezar :)"
|
||||
|
||||
#: actions/showstream.php:207
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid ""
|
||||
"You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%"
|
||||
"%?status_textarea=%2$s)."
|
||||
@ -4843,12 +4842,12 @@ msgstr "Autores"
|
||||
#: classes/File.php:143
|
||||
#, php-format
|
||||
msgid "Cannot process URL '%s'"
|
||||
msgstr ""
|
||||
msgstr "Non se pode procesar o URL \"%s\""
|
||||
|
||||
#. TRANS: Server exception thrown when... Robin thinks something is impossible!
|
||||
#: classes/File.php:175
|
||||
msgid "Robin thinks something is impossible."
|
||||
msgstr ""
|
||||
msgstr "Robin pensa que algo é imposible."
|
||||
|
||||
#. TRANS: Message given if an upload is larger than the configured maximum.
|
||||
#. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file.
|
||||
@ -4878,9 +4877,8 @@ msgstr "Un ficheiro deste tamaño excedería a súa cota mensual de %d bytes."
|
||||
|
||||
#. TRANS: Client exception thrown if a file upload does not have a valid name.
|
||||
#: classes/File.php:248 classes/File.php:263
|
||||
#, fuzzy
|
||||
msgid "Invalid filename."
|
||||
msgstr "Tamaño non válido."
|
||||
msgstr "Nome de ficheiro incorrecto."
|
||||
|
||||
#. TRANS: Exception thrown when joining a group fails.
|
||||
#: classes/Group_member.php:42
|
||||
@ -4912,7 +4910,7 @@ msgstr "Non se puido crear un pase de sesión para %s"
|
||||
#. TRANS: Exception thrown when database name or Data Source Name could not be found.
|
||||
#: classes/Memcached_DataObject.php:533
|
||||
msgid "No database name or DSN found anywhere."
|
||||
msgstr ""
|
||||
msgstr "Non se atopou por ningures o nome da base de datos ou DSN."
|
||||
|
||||
#. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them.
|
||||
#: classes/Message.php:46
|
||||
@ -4932,9 +4930,9 @@ msgstr "Non se puido actualizar a mensaxe co novo URI."
|
||||
#. TRANS: Server exception thrown when a user profile for a notice cannot be found.
|
||||
#. TRANS: %1$d is a profile ID (number), %2$d is a notice ID (number).
|
||||
#: classes/Notice.php:98
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid "No such profile (%1$d) for notice (%2$d)."
|
||||
msgstr "Non existe tal perfil (%d) para a nota (%d)"
|
||||
msgstr "Non existe tal perfil (%1$d) para a nota (%2$d)."
|
||||
|
||||
#. TRANS: Server exception. %s are the error details.
|
||||
#: classes/Notice.php:190
|
||||
@ -4983,7 +4981,7 @@ msgstr "Houbo un problema ao gardar a nota."
|
||||
#. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups().
|
||||
#: classes/Notice.php:892
|
||||
msgid "Bad type provided to saveKnownGroups"
|
||||
msgstr ""
|
||||
msgstr "O tipo dado para saveKnownGroups era incorrecto"
|
||||
|
||||
#. TRANS: Server exception thrown when an update for a group inbox fails.
|
||||
#: classes/Notice.php:991
|
||||
@ -4992,30 +4990,31 @@ msgstr "Houbo un problema ao gardar a caixa de entrada do grupo."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "♻ @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
"Non se pode revogar o rol \"%1$s\" do usuario #%2$d: o usuario non existe."
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
"Non se pode revogar o rol \"%1$s\" do usuario #%2$d: erro na base de datos."
|
||||
|
||||
#. TRANS: Exception thrown when a right for a non-existing user profile is checked.
|
||||
#: classes/Remote_profile.php:54
|
||||
#, fuzzy
|
||||
msgid "Missing profile."
|
||||
msgstr "O usuario non ten perfil."
|
||||
msgstr "Falta o perfil de usuario."
|
||||
|
||||
#. TRANS: Exception thrown when a tag cannot be saved.
|
||||
#: classes/Status_network.php:346
|
||||
@ -5044,19 +5043,16 @@ msgstr "Non está subscrito!"
|
||||
|
||||
#. TRANS: Exception thrown when trying to unsubscribe a user from themselves.
|
||||
#: classes/Subscription.php:178
|
||||
#, fuzzy
|
||||
msgid "Could not delete self-subscription."
|
||||
msgstr "Non se puido borrar a subscrición a si mesmo."
|
||||
|
||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
||||
#: classes/Subscription.php:206
|
||||
#, fuzzy
|
||||
msgid "Could not delete subscription OMB token."
|
||||
msgstr "Non se puido borrar o pase de subscrición OMB."
|
||||
|
||||
#. TRANS: Exception thrown when a subscription could not be deleted on the server.
|
||||
#: classes/Subscription.php:218
|
||||
#, fuzzy
|
||||
msgid "Could not delete subscription."
|
||||
msgstr "Non se puido borrar a subscrición."
|
||||
|
||||
|
@ -7,12 +7,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:03+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:32+0000\n"
|
||||
"Language-Team: Hebrew\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: he\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4957,21 +4957,21 @@ msgstr "בעיה בשמירת ההודעה."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:04+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:33+0000\n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: hsb\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4705,21 +4705,21 @@ msgstr ""
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:07+0000\n"
|
||||
"POT-Creation-Date: 2010-08-11 10:11+0000\n"
|
||||
"PO-Revision-Date: 2010-08-11 10:12:24+0000\n"
|
||||
"Language-Team: Interlingua\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ia\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -790,7 +790,7 @@ msgid "Preview"
|
||||
msgstr "Previsualisation"
|
||||
|
||||
#: actions/avatarsettings.php:149 actions/showapplication.php:252
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:656
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:657
|
||||
msgid "Delete"
|
||||
msgstr "Deler"
|
||||
|
||||
@ -1071,7 +1071,7 @@ msgid "Do not delete this notice"
|
||||
msgstr "Non deler iste nota"
|
||||
|
||||
#. TRANS: Submit button title for 'Yes' when deleting a notice.
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:656
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:657
|
||||
msgid "Delete this notice"
|
||||
msgstr "Deler iste nota"
|
||||
|
||||
@ -3499,7 +3499,7 @@ msgstr "Tu non pote repeter tu proprie nota."
|
||||
msgid "You already repeated that notice."
|
||||
msgstr "Tu ha ja repetite iste nota."
|
||||
|
||||
#: actions/repeat.php:114 lib/noticelist.php:675
|
||||
#: actions/repeat.php:114 lib/noticelist.php:676
|
||||
msgid "Repeated"
|
||||
msgstr "Repetite"
|
||||
|
||||
@ -3734,24 +3734,24 @@ msgstr ""
|
||||
"mitter los in evidentia."
|
||||
|
||||
#: actions/showfavorites.php:208
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid ""
|
||||
"%s hasn't added any favorite notices yet. Post something interesting they "
|
||||
"would add to their favorites :)"
|
||||
msgstr ""
|
||||
"%s non ha ancora addite alcun nota a su favorites. Publica alique "
|
||||
"interessante que ille favoritisarea :)"
|
||||
"%s non ha ancora addite un nota favorite. Publica alique interessante que "
|
||||
"ille adderea a su favorites :)"
|
||||
|
||||
#: actions/showfavorites.php:212
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid ""
|
||||
"%s hasn't added any favorite notices yet. Why not [register an account](%%%%"
|
||||
"action.register%%%%) and then post something interesting they would add to "
|
||||
"their favorites :)"
|
||||
msgstr ""
|
||||
"%s non ha ancora addite alcun nota a su favorites. Proque non [registrar un "
|
||||
"conto](%%%%action.register%%%%) e postea publicar alique interessante que "
|
||||
"ille favoritisarea :)"
|
||||
"%s non ha ancora addite un nota favorite. Proque non [crear un conto](%%%%"
|
||||
"action.register%%%%) e postea publicar alique interessante que ille adderea "
|
||||
"a su favorites :)"
|
||||
|
||||
#: actions/showfavorites.php:243
|
||||
msgid "This is a way to share what you like."
|
||||
@ -3931,13 +3931,13 @@ msgstr ""
|
||||
"alcun nota, dunque iste es un bon momento pro comenciar :)"
|
||||
|
||||
#: actions/showstream.php:207
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid ""
|
||||
"You can try to nudge %1$s or [post something to them](%%%%action.newnotice%%%"
|
||||
"%?status_textarea=%2$s)."
|
||||
msgstr ""
|
||||
"Tu pote tentar pulsar %1$s o [publicar un nota a su attention](%%%%action."
|
||||
"newnotice%%%%?status_textarea=%2$s)."
|
||||
"Tu pote tentar dar un pulsata a %1$s o [publicar un nota a su attention](%%%%"
|
||||
"action.newnotice%%%%?status_textarea=%2$s)."
|
||||
|
||||
#: actions/showstream.php:243
|
||||
#, php-format
|
||||
@ -4817,23 +4817,23 @@ msgstr "Autor(es)"
|
||||
#: classes/File.php:143
|
||||
#, php-format
|
||||
msgid "Cannot process URL '%s'"
|
||||
msgstr ""
|
||||
msgstr "Impossibile processar le URL '%s'"
|
||||
|
||||
#. TRANS: Server exception thrown when... Robin thinks something is impossible!
|
||||
#: classes/File.php:175
|
||||
msgid "Robin thinks something is impossible."
|
||||
msgstr ""
|
||||
msgstr "Robin pensa que alique es impossibile."
|
||||
|
||||
#. TRANS: Message given if an upload is larger than the configured maximum.
|
||||
#. TRANS: %1$d is the byte limit for uploads, %2$d is the byte count for the uploaded file.
|
||||
#: classes/File.php:190
|
||||
#, fuzzy, php-format
|
||||
#, php-format
|
||||
msgid ""
|
||||
"No file may be larger than %1$d bytes and the file you sent was %2$d bytes. "
|
||||
"Try to upload a smaller version."
|
||||
msgstr ""
|
||||
"Nulle file pote esser plus grande que %d bytes e le file que tu inviava ha %"
|
||||
"d bytes. Tenta incargar un version minus grande."
|
||||
"Nulle file pote esser plus grande que %1$d bytes e le file que tu inviava ha "
|
||||
"%2$d bytes. Tenta incargar un version minus grande."
|
||||
|
||||
#. TRANS: Message given if an upload would exceed user quota.
|
||||
#. TRANS: %d (number) is the user quota in bytes.
|
||||
@ -4851,9 +4851,8 @@ msgstr "Un file de iste dimension excederea tu quota mensual de %d bytes."
|
||||
|
||||
#. TRANS: Client exception thrown if a file upload does not have a valid name.
|
||||
#: classes/File.php:248 classes/File.php:263
|
||||
#, fuzzy
|
||||
msgid "Invalid filename."
|
||||
msgstr "Dimension invalide."
|
||||
msgstr "Nomine de file invalide."
|
||||
|
||||
#. TRANS: Exception thrown when joining a group fails.
|
||||
#: classes/Group_member.php:42
|
||||
@ -4885,7 +4884,7 @@ msgstr "Non poteva crear indicio de identification pro %s"
|
||||
#. TRANS: Exception thrown when database name or Data Source Name could not be found.
|
||||
#: classes/Memcached_DataObject.php:533
|
||||
msgid "No database name or DSN found anywhere."
|
||||
msgstr ""
|
||||
msgstr "Nulle nomine de base de datos o DSN trovate."
|
||||
|
||||
#. TRANS: Client exception thrown when a user tries to send a direct message while being banned from sending them.
|
||||
#: classes/Message.php:46
|
||||
@ -4907,7 +4906,7 @@ msgstr "Non poteva actualisar message con nove URI."
|
||||
#: classes/Notice.php:98
|
||||
#, php-format
|
||||
msgid "No such profile (%1$d) for notice (%2$d)."
|
||||
msgstr ""
|
||||
msgstr "Nulle profilo (%1$d) trovate pro le nota (%2$d)."
|
||||
|
||||
#. TRANS: Server exception. %s are the error details.
|
||||
#: classes/Notice.php:190
|
||||
@ -4956,7 +4955,7 @@ msgstr "Problema salveguardar nota."
|
||||
#. TRANS: Server exception thrown when no array is provided to the method saveKnownGroups().
|
||||
#: classes/Notice.php:892
|
||||
msgid "Bad type provided to saveKnownGroups"
|
||||
msgstr ""
|
||||
msgstr "Mal typo fornite a saveKnownGroups"
|
||||
|
||||
#. TRANS: Server exception thrown when an update for a group inbox fails.
|
||||
#: classes/Notice.php:991
|
||||
@ -4965,36 +4964,36 @@ msgstr "Problema salveguardar le cassa de entrata del gruppo."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1746
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
msgstr "Non pote revocar le rolo \"%1$s\" del usator #%2$d; non existe."
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
"Non pote revocar le rolo \"%1$s\" del usator #%2$d; error in le base de "
|
||||
"datos."
|
||||
|
||||
#. TRANS: Exception thrown when a right for a non-existing user profile is checked.
|
||||
#: classes/Remote_profile.php:54
|
||||
#, fuzzy
|
||||
msgid "Missing profile."
|
||||
msgstr "Le usator non ha un profilo."
|
||||
msgstr "Profilo mancante."
|
||||
|
||||
#. TRANS: Exception thrown when a tag cannot be saved.
|
||||
#: classes/Status_network.php:346
|
||||
#, fuzzy
|
||||
msgid "Unable to save tag."
|
||||
msgstr "Impossibile salveguardar le aviso del sito."
|
||||
msgstr "Impossibile salveguardar le etiquetta."
|
||||
|
||||
#. TRANS: Exception thrown when trying to subscribe while being banned from subscribing.
|
||||
#: classes/Subscription.php:75 lib/oauthstore.php:465
|
||||
@ -5018,19 +5017,16 @@ msgstr "Non subscribite!"
|
||||
|
||||
#. TRANS: Exception thrown when trying to unsubscribe a user from themselves.
|
||||
#: classes/Subscription.php:178
|
||||
#, fuzzy
|
||||
msgid "Could not delete self-subscription."
|
||||
msgstr "Non poteva deler auto-subscription."
|
||||
|
||||
#. TRANS: Exception thrown when the OMB token for a subscription could not deleted on the server.
|
||||
#: classes/Subscription.php:206
|
||||
#, fuzzy
|
||||
msgid "Could not delete subscription OMB token."
|
||||
msgstr "Non poteva deler le indicio OMB del subscription."
|
||||
|
||||
#. TRANS: Exception thrown when a subscription could not be deleted on the server.
|
||||
#: classes/Subscription.php:218
|
||||
#, fuzzy
|
||||
msgid "Could not delete subscription."
|
||||
msgstr "Non poteva deler subscription."
|
||||
|
||||
@ -6526,7 +6522,7 @@ msgstr ""
|
||||
"altere usatores in conversation. Altere personas pote inviar te messages que "
|
||||
"solmente tu pote leger."
|
||||
|
||||
#: lib/mailbox.php:227 lib/noticelist.php:505
|
||||
#: lib/mailbox.php:228 lib/noticelist.php:506
|
||||
msgid "from"
|
||||
msgstr "de"
|
||||
|
||||
@ -6686,23 +6682,23 @@ msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
|
||||
msgid "at"
|
||||
msgstr "a"
|
||||
|
||||
#: lib/noticelist.php:567
|
||||
#: lib/noticelist.php:568
|
||||
msgid "in context"
|
||||
msgstr "in contexto"
|
||||
|
||||
#: lib/noticelist.php:602
|
||||
#: lib/noticelist.php:603
|
||||
msgid "Repeated by"
|
||||
msgstr "Repetite per"
|
||||
|
||||
#: lib/noticelist.php:629
|
||||
#: lib/noticelist.php:630
|
||||
msgid "Reply to this notice"
|
||||
msgstr "Responder a iste nota"
|
||||
|
||||
#: lib/noticelist.php:630
|
||||
#: lib/noticelist.php:631
|
||||
msgid "Reply"
|
||||
msgstr "Responder"
|
||||
|
||||
#: lib/noticelist.php:674
|
||||
#: lib/noticelist.php:675
|
||||
msgid "Notice repeated"
|
||||
msgstr "Nota repetite"
|
||||
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:08+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:37+0000\n"
|
||||
"Language-Team: Icelandic\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: is\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -5009,21 +5009,21 @@ msgstr "Vandamál komu upp við að vista babl."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:10+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:38+0000\n"
|
||||
"Language-Team: Italian\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: it\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4968,21 +4968,21 @@ msgstr "Problema nel salvare la casella della posta del gruppo."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -11,12 +11,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:11+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:41+0000\n"
|
||||
"Language-Team: Japanese\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ja\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -5001,21 +5001,21 @@ msgstr "グループ受信箱を保存する際に問題が発生しました。
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:14+0000\n"
|
||||
"POT-Creation-Date: 2010-08-11 10:11+0000\n"
|
||||
"PO-Revision-Date: 2010-08-11 10:12:44+0000\n"
|
||||
"Language-Team: Macedonian\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: mk\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -792,7 +792,7 @@ msgid "Preview"
|
||||
msgstr "Преглед"
|
||||
|
||||
#: actions/avatarsettings.php:149 actions/showapplication.php:252
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:656
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:657
|
||||
msgid "Delete"
|
||||
msgstr "Бриши"
|
||||
|
||||
@ -1074,7 +1074,7 @@ msgid "Do not delete this notice"
|
||||
msgstr "Не ја бриши оваа забелешка"
|
||||
|
||||
#. TRANS: Submit button title for 'Yes' when deleting a notice.
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:656
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:657
|
||||
msgid "Delete this notice"
|
||||
msgstr "Бриши ја оваа забелешка"
|
||||
|
||||
@ -3510,7 +3510,7 @@ msgstr "Не можете да повторувате сопствена заб
|
||||
msgid "You already repeated that notice."
|
||||
msgstr "Веќе ја имате повторено таа забелешка."
|
||||
|
||||
#: actions/repeat.php:114 lib/noticelist.php:675
|
||||
#: actions/repeat.php:114 lib/noticelist.php:676
|
||||
msgid "Repeated"
|
||||
msgstr "Повторено"
|
||||
|
||||
@ -4983,14 +4983,14 @@ msgstr "Проблем при зачувувањето на групното п
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1746
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
@ -4999,7 +4999,7 @@ msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
@ -5377,13 +5377,13 @@ msgstr "Прелом на страници"
|
||||
#. TRANS: present than the currently displayed information.
|
||||
#: lib/action.php:1203
|
||||
msgid "After"
|
||||
msgstr "По"
|
||||
msgstr "Следно"
|
||||
|
||||
#. TRANS: Pagination message to go to a page displaying information more in the
|
||||
#. TRANS: past than the currently displayed information.
|
||||
#: lib/action.php:1213
|
||||
msgid "Before"
|
||||
msgstr "Пред"
|
||||
msgstr "Претходно"
|
||||
|
||||
#. TRANS: Client exception thrown when a feed instance is a DOMDocument.
|
||||
#: lib/activity.php:122
|
||||
@ -6547,7 +6547,7 @@ msgstr ""
|
||||
"впуштите во разговор со други корисници. Луѓето можат да ви испраќаат пораки "
|
||||
"што ќе можете да ги видите само Вие."
|
||||
|
||||
#: lib/mailbox.php:227 lib/noticelist.php:505
|
||||
#: lib/mailbox.php:228 lib/noticelist.php:506
|
||||
msgid "from"
|
||||
msgstr "од"
|
||||
|
||||
@ -6709,23 +6709,23 @@ msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
|
||||
msgid "at"
|
||||
msgstr "во"
|
||||
|
||||
#: lib/noticelist.php:567
|
||||
#: lib/noticelist.php:568
|
||||
msgid "in context"
|
||||
msgstr "во контекст"
|
||||
|
||||
#: lib/noticelist.php:602
|
||||
#: lib/noticelist.php:603
|
||||
msgid "Repeated by"
|
||||
msgstr "Повторено од"
|
||||
|
||||
#: lib/noticelist.php:629
|
||||
#: lib/noticelist.php:630
|
||||
msgid "Reply to this notice"
|
||||
msgstr "Одговори на забелешкава"
|
||||
|
||||
#: lib/noticelist.php:630
|
||||
#: lib/noticelist.php:631
|
||||
msgid "Reply"
|
||||
msgstr "Одговор"
|
||||
|
||||
#: lib/noticelist.php:674
|
||||
#: lib/noticelist.php:675
|
||||
msgid "Notice repeated"
|
||||
msgstr "Забелешката е повторена"
|
||||
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:16+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:47+0000\n"
|
||||
"Language-Team: Norwegian (bokmål)\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: no\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4895,21 +4895,21 @@ msgstr "Problem ved lagring av gruppeinnboks."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -11,12 +11,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:19+0000\n"
|
||||
"POT-Creation-Date: 2010-08-11 10:11+0000\n"
|
||||
"PO-Revision-Date: 2010-08-11 10:12:58+0000\n"
|
||||
"Language-Team: Dutch\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: nl\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -804,7 +804,7 @@ msgid "Preview"
|
||||
msgstr "Voorvertoning"
|
||||
|
||||
#: actions/avatarsettings.php:149 actions/showapplication.php:252
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:656
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:657
|
||||
msgid "Delete"
|
||||
msgstr "Verwijderen"
|
||||
|
||||
@ -1086,7 +1086,7 @@ msgid "Do not delete this notice"
|
||||
msgstr "Deze mededeling niet verwijderen"
|
||||
|
||||
#. TRANS: Submit button title for 'Yes' when deleting a notice.
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:656
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:657
|
||||
msgid "Delete this notice"
|
||||
msgstr "Deze mededeling verwijderen"
|
||||
|
||||
@ -3537,7 +3537,7 @@ msgstr "U kunt uw eigen mededeling niet herhalen."
|
||||
msgid "You already repeated that notice."
|
||||
msgstr "U hent die mededeling al herhaald."
|
||||
|
||||
#: actions/repeat.php:114 lib/noticelist.php:675
|
||||
#: actions/repeat.php:114 lib/noticelist.php:676
|
||||
msgid "Repeated"
|
||||
msgstr "Herhaald"
|
||||
|
||||
@ -4907,7 +4907,7 @@ msgstr ""
|
||||
#. TRANS: Client exception thrown if a file upload does not have a valid name.
|
||||
#: classes/File.php:248 classes/File.php:263
|
||||
msgid "Invalid filename."
|
||||
msgstr "Ongeldig bestandsnaam."
|
||||
msgstr "Ongeldige bestandsnaam."
|
||||
|
||||
#. TRANS: Exception thrown when joining a group fails.
|
||||
#: classes/Group_member.php:42
|
||||
@ -5026,14 +5026,14 @@ msgstr ""
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1746
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
@ -5042,7 +5042,7 @@ msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
@ -6599,7 +6599,7 @@ msgstr ""
|
||||
"U hebt geen privéberichten. U kunt privéberichten verzenden aan andere "
|
||||
"gebruikers. Mensen kunnen u privéberichten sturen die alleen u kunt lezen."
|
||||
|
||||
#: lib/mailbox.php:227 lib/noticelist.php:505
|
||||
#: lib/mailbox.php:228 lib/noticelist.php:506
|
||||
msgid "from"
|
||||
msgstr "van"
|
||||
|
||||
@ -6697,7 +6697,7 @@ msgstr "Beschikbare tekens"
|
||||
#: lib/messageform.php:178 lib/noticeform.php:236
|
||||
msgctxt "Send button for sending notice"
|
||||
msgid "Send"
|
||||
msgstr "OK"
|
||||
msgstr "Verzenden"
|
||||
|
||||
#: lib/noticeform.php:160
|
||||
msgid "Send a notice"
|
||||
@ -6761,23 +6761,23 @@ msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
|
||||
msgid "at"
|
||||
msgstr "op"
|
||||
|
||||
#: lib/noticelist.php:567
|
||||
#: lib/noticelist.php:568
|
||||
msgid "in context"
|
||||
msgstr "in context"
|
||||
|
||||
#: lib/noticelist.php:602
|
||||
#: lib/noticelist.php:603
|
||||
msgid "Repeated by"
|
||||
msgstr "Herhaald door"
|
||||
|
||||
#: lib/noticelist.php:629
|
||||
#: lib/noticelist.php:630
|
||||
msgid "Reply to this notice"
|
||||
msgstr "Op deze mededeling antwoorden"
|
||||
|
||||
#: lib/noticelist.php:630
|
||||
#: lib/noticelist.php:631
|
||||
msgid "Reply"
|
||||
msgstr "Antwoorden"
|
||||
|
||||
#: lib/noticelist.php:674
|
||||
#: lib/noticelist.php:675
|
||||
msgid "Notice repeated"
|
||||
msgstr "Mededeling herhaald"
|
||||
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:17+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:48+0000\n"
|
||||
"Language-Team: Norwegian Nynorsk\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: nn\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -5047,21 +5047,21 @@ msgstr "Eit problem oppstod ved lagring av notis."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%1$s (%2$s)"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -11,8 +11,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:20+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:52+0000\n"
|
||||
"Last-Translator: Piotr Drąg <piotrdrag@gmail.com>\n"
|
||||
"Language-Team: Polish <pl@li.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
@ -20,7 +20,7 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 "
|
||||
"|| n%100>=20) ? 1 : 2);\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: pl\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4955,21 +4955,21 @@ msgstr "Problem podczas zapisywania skrzynki odbiorczej grupy."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr "Nie można unieważnić roli \"\"%1$s\" użytkownika #%2$d; nie istnieje."
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -11,12 +11,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:22+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:54+0000\n"
|
||||
"Language-Team: Portuguese\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: pt\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4959,14 +4959,14 @@ msgstr "Problema na gravação da caixa de entrada do grupo."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
@ -4974,7 +4974,7 @@ msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -13,12 +13,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:23+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:55+0000\n"
|
||||
"Language-Team: Brazilian Portuguese\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: pt-br\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4995,21 +4995,21 @@ msgstr "Problema no salvamento das mensagens recebidas do grupo."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -12,12 +12,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:25+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:57+0000\n"
|
||||
"Language-Team: Russian\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: ru\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4971,14 +4971,14 @@ msgstr "Проблемы с сохранением входящих сообще
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
@ -4987,7 +4987,7 @@ msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"POT-Creation-Date: 2010-08-11 10:48+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"
|
||||
@ -763,7 +763,7 @@ msgid "Preview"
|
||||
msgstr ""
|
||||
|
||||
#: actions/avatarsettings.php:149 actions/showapplication.php:252
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:656
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:657
|
||||
msgid "Delete"
|
||||
msgstr ""
|
||||
|
||||
@ -1036,7 +1036,7 @@ msgid "Do not delete this notice"
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Submit button title for 'Yes' when deleting a notice.
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:656
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:657
|
||||
msgid "Delete this notice"
|
||||
msgstr ""
|
||||
|
||||
@ -3310,7 +3310,7 @@ msgstr ""
|
||||
msgid "You already repeated that notice."
|
||||
msgstr ""
|
||||
|
||||
#: actions/repeat.php:114 lib/noticelist.php:675
|
||||
#: actions/repeat.php:114 lib/noticelist.php:676
|
||||
msgid "Repeated"
|
||||
msgstr ""
|
||||
|
||||
@ -4679,21 +4679,21 @@ msgstr ""
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1746
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
@ -6071,7 +6071,7 @@ msgid ""
|
||||
"users in conversation. People can send you messages for your eyes only."
|
||||
msgstr ""
|
||||
|
||||
#: lib/mailbox.php:227 lib/noticelist.php:505
|
||||
#: lib/mailbox.php:228 lib/noticelist.php:506
|
||||
msgid "from"
|
||||
msgstr ""
|
||||
|
||||
@ -6225,23 +6225,23 @@ msgstr ""
|
||||
msgid "at"
|
||||
msgstr ""
|
||||
|
||||
#: lib/noticelist.php:567
|
||||
#: lib/noticelist.php:568
|
||||
msgid "in context"
|
||||
msgstr ""
|
||||
|
||||
#: lib/noticelist.php:602
|
||||
#: lib/noticelist.php:603
|
||||
msgid "Repeated by"
|
||||
msgstr ""
|
||||
|
||||
#: lib/noticelist.php:629
|
||||
#: lib/noticelist.php:630
|
||||
msgid "Reply to this notice"
|
||||
msgstr ""
|
||||
|
||||
#: lib/noticelist.php:630
|
||||
#: lib/noticelist.php:631
|
||||
msgid "Reply"
|
||||
msgstr ""
|
||||
|
||||
#: lib/noticelist.php:674
|
||||
#: lib/noticelist.php:675
|
||||
msgid "Notice repeated"
|
||||
msgstr ""
|
||||
|
||||
|
@ -10,12 +10,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:26+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:24:59+0000\n"
|
||||
"Language-Team: Swedish\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: sv\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4957,21 +4957,21 @@ msgstr "Problem med att spara gruppinkorg."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:28+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:25:01+0000\n"
|
||||
"Language-Team: Telugu\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: te\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4842,21 +4842,21 @@ msgstr "సందేశాన్ని భద్రపరచడంలో పొ
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -9,12 +9,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:29+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:25:03+0000\n"
|
||||
"Language-Team: Turkish\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: tr\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -4960,21 +4960,21 @@ msgstr "Durum mesajını kaydederken hata oluştu."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
@ -11,12 +11,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:31+0000\n"
|
||||
"POT-Creation-Date: 2010-08-11 10:11+0000\n"
|
||||
"PO-Revision-Date: 2010-08-11 10:13:19+0000\n"
|
||||
"Language-Team: Ukrainian\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70848); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: uk\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -792,7 +792,7 @@ msgid "Preview"
|
||||
msgstr "Перегляд"
|
||||
|
||||
#: actions/avatarsettings.php:149 actions/showapplication.php:252
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:656
|
||||
#: lib/deleteuserform.php:66 lib/noticelist.php:657
|
||||
msgid "Delete"
|
||||
msgstr "Видалити"
|
||||
|
||||
@ -1071,7 +1071,7 @@ msgid "Do not delete this notice"
|
||||
msgstr "Не видаляти цей допис"
|
||||
|
||||
#. TRANS: Submit button title for 'Yes' when deleting a notice.
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:656
|
||||
#: actions/deletenotice.php:158 lib/noticelist.php:657
|
||||
msgid "Delete this notice"
|
||||
msgstr "Видалити допис"
|
||||
|
||||
@ -3494,7 +3494,7 @@ msgstr "Ви не можете повторювати свої власні до
|
||||
msgid "You already repeated that notice."
|
||||
msgstr "Ви вже повторили цей допис."
|
||||
|
||||
#: actions/repeat.php:114 lib/noticelist.php:675
|
||||
#: actions/repeat.php:114 lib/noticelist.php:676
|
||||
msgid "Repeated"
|
||||
msgstr "Повторено"
|
||||
|
||||
@ -4960,21 +4960,21 @@ msgstr "Проблема при збереженні вхідних дописі
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1746
|
||||
#, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "RT @%1$s %2$s"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr "Не вдалося скасувати роль «%s» для користувача #%2$s; не існує."
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
@ -6210,17 +6210,17 @@ msgid ""
|
||||
"Thanks for your time, \n"
|
||||
"%s\n"
|
||||
msgstr ""
|
||||
"Агов, %s.\n"
|
||||
"Агов, %s!\n"
|
||||
"\n"
|
||||
"Хтось щойно ввів цю електронну адресу на %s.\n"
|
||||
"\n"
|
||||
"Якщо то були Ви, мусите це підтвердити використовуючи посилання:\n"
|
||||
"Якщо то були Ви, мусите це підтвердити, використовуючи посилання:\n"
|
||||
"\n"
|
||||
"\t%s\n"
|
||||
"%s\n"
|
||||
"\n"
|
||||
"А якщо ні, то просто проігноруйте це повідомлення.\n"
|
||||
"А якщо ні, просто ігноруйте це повідомлення.\n"
|
||||
"\n"
|
||||
"Дякуємо за Ваш час \n"
|
||||
"Вибачте за турботу, \n"
|
||||
"%s\n"
|
||||
|
||||
#. TRANS: Subject of new-subscriber notification e-mail
|
||||
@ -6517,7 +6517,7 @@ msgstr ""
|
||||
"повідомлення аби долучити користувачів до розмови. Такі повідомлення бачите "
|
||||
"лише Ви."
|
||||
|
||||
#: lib/mailbox.php:227 lib/noticelist.php:505
|
||||
#: lib/mailbox.php:228 lib/noticelist.php:506
|
||||
msgid "from"
|
||||
msgstr "від"
|
||||
|
||||
@ -6676,23 +6676,23 @@ msgstr "%1$u°%2$u'%3$u\"%4$s %5$u°%6$u'%7$u\"%8$s"
|
||||
msgid "at"
|
||||
msgstr "в"
|
||||
|
||||
#: lib/noticelist.php:567
|
||||
#: lib/noticelist.php:568
|
||||
msgid "in context"
|
||||
msgstr "в контексті"
|
||||
|
||||
#: lib/noticelist.php:602
|
||||
#: lib/noticelist.php:603
|
||||
msgid "Repeated by"
|
||||
msgstr "Повторено"
|
||||
|
||||
#: lib/noticelist.php:629
|
||||
#: lib/noticelist.php:630
|
||||
msgid "Reply to this notice"
|
||||
msgstr "Відповісти на цей допис"
|
||||
|
||||
#: lib/noticelist.php:630
|
||||
#: lib/noticelist.php:631
|
||||
msgid "Reply"
|
||||
msgstr "Відповісти"
|
||||
|
||||
#: lib/noticelist.php:674
|
||||
#: lib/noticelist.php:675
|
||||
msgid "Notice repeated"
|
||||
msgstr "Допис повторили"
|
||||
|
||||
|
@ -8,12 +8,12 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: StatusNet\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2010-08-03 13:21+0000\n"
|
||||
"PO-Revision-Date: 2010-08-03 13:22:32+0000\n"
|
||||
"POT-Creation-Date: 2010-08-07 16:23+0000\n"
|
||||
"PO-Revision-Date: 2010-08-07 16:25:06+0000\n"
|
||||
"Language-Team: Vietnamese\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70381); Translate extension (2010-07-21)\n"
|
||||
"X-Generator: MediaWiki 1.17alpha (r70633); Translate extension (2010-07-21)\n"
|
||||
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
|
||||
"X-Language-Code: vi\n"
|
||||
"X-Message-Group: out-statusnet\n"
|
||||
@ -5103,21 +5103,21 @@ msgstr "Có lỗi xảy ra khi lưu tin nhắn."
|
||||
|
||||
#. TRANS: Message used to repeat a notice. RT is the abbreviation of 'retweet'.
|
||||
#. TRANS: %1$s is the repeated user's name, %2$s is the repeated notice.
|
||||
#: classes/Notice.php:1614
|
||||
#: classes/Notice.php:1745
|
||||
#, fuzzy, php-format
|
||||
msgid "RT @%1$s %2$s"
|
||||
msgstr "%s (%s)"
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke an existing role for a user that does not exist.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:740
|
||||
#: classes/Profile.php:737
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; does not exist."
|
||||
msgstr ""
|
||||
|
||||
#. TRANS: Exception thrown when trying to revoke a role for a user with a failing database query.
|
||||
#. TRANS: %1$s is the role name, %2$s is the user ID (number).
|
||||
#: classes/Profile.php:749
|
||||
#: classes/Profile.php:746
|
||||
#, php-format
|
||||
msgid "Cannot revoke role \"%1$s\" for user #%2$d; database error."
|
||||
msgstr ""
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -30,11 +30,13 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
|
||||
|
||||
class GravatarPlugin extends Plugin
|
||||
{
|
||||
function onInitializePlugin() {
|
||||
function onInitializePlugin()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
function onStartAvatarFormData($action) {
|
||||
function onStartAvatarFormData($action)
|
||||
{
|
||||
$user = common_current_user();
|
||||
$hasGravatar = $this->hasGravatar($user->id);
|
||||
|
||||
@ -43,7 +45,8 @@ class GravatarPlugin extends Plugin
|
||||
}
|
||||
}
|
||||
|
||||
function onEndAvatarFormData(&$action) {
|
||||
function onEndAvatarFormData($action)
|
||||
{
|
||||
$user = common_current_user();
|
||||
$hasGravatar = $this->hasGravatar($user->id);
|
||||
|
||||
@ -89,7 +92,8 @@ class GravatarPlugin extends Plugin
|
||||
}
|
||||
}
|
||||
|
||||
function onStartAvatarSaveForm($action) {
|
||||
function onStartAvatarSaveForm($action)
|
||||
{
|
||||
if ($action->arg('add')) {
|
||||
$result = $this->gravatar_save();
|
||||
|
||||
@ -178,7 +182,8 @@ class GravatarPlugin extends Plugin
|
||||
'success' => true);
|
||||
}
|
||||
|
||||
function gravatar_url($email, $size) {
|
||||
function gravatar_url($email, $size)
|
||||
{
|
||||
$url = "http://www.gravatar.com/avatar.php?gravatar_id=".
|
||||
md5(strtolower($email)).
|
||||
"&default=".urlencode(Avatar::defaultImage($size)).
|
||||
@ -197,4 +202,4 @@ class GravatarPlugin extends Plugin
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
@ -28,6 +28,15 @@ set_include_path(get_include_path() . PATH_SEPARATOR . dirname(__FILE__) . '/ext
|
||||
|
||||
class FeedSubException extends Exception
|
||||
{
|
||||
function __construct($msg=null)
|
||||
{
|
||||
$type = get_class($this);
|
||||
if ($msg) {
|
||||
parent::__construct("$type: $msg");
|
||||
} else {
|
||||
parent::__construct($type);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class OStatusPlugin extends Plugin
|
||||
@ -479,6 +488,24 @@ class OStatusPlugin extends Plugin
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tell the FeedSub infrastructure whether we have any active OStatus
|
||||
* usage for the feed; if not it'll be able to garbage-collect the
|
||||
* feed subscription.
|
||||
*
|
||||
* @param FeedSub $feedsub
|
||||
* @param integer $count in/out
|
||||
* @return mixed hook return code
|
||||
*/
|
||||
function onFeedSubSubscriberCount($feedsub, &$count)
|
||||
{
|
||||
$oprofile = Ostatus_profile::staticGet('feeduri', $feedsub->uri);
|
||||
if ($oprofile) {
|
||||
$count += $oprofile->subscriberCount();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* When about to subscribe to a remote user, start a server-to-server
|
||||
* PuSH subscription if needed. If we can't establish that, abort.
|
||||
|
@ -1,18 +1,42 @@
|
||||
Plugin to support importing updates from external RSS and Atom feeds into your timeline.
|
||||
Plugin to support importing and exporting notices through Atom and RSS feeds.
|
||||
The OStatus plugin concentrates on user-to-user cases for federating StatusNet
|
||||
and similar social networking / microblogging / blogging sites, but includes
|
||||
low-level feed subscription systems which are used by some other plugins.
|
||||
|
||||
Uses PubSubHubbub for push feed updates; currently non-PuSH feeds cannot be
|
||||
subscribed unless an external PuSH hub proxy is used.
|
||||
|
||||
Uses PubSubHubbub for push feed updates; currently non-PuSH feeds cannot be subscribed.
|
||||
|
||||
Configuration options available:
|
||||
|
||||
$config['ostatus']['hub']
|
||||
(default internal hub)
|
||||
Set to URL of an external PuSH hub to use it instead of our internal hub.
|
||||
Set to URL of an external PuSH hub to use it instead of our internal hub
|
||||
for sending outgoing updates in user and group feeds.
|
||||
|
||||
$config['ostatus']['hub_retries']
|
||||
(default 0)
|
||||
Number of times to retry a PuSH send to consumers if using internal hub
|
||||
|
||||
|
||||
Settings controlling incoming feed subscription:
|
||||
|
||||
$config['feedsub']['fallback_hub']
|
||||
To subscribe to feeds that don't have a hub, an external PuSH proxy hub
|
||||
such as Superfeedr may be used. Any feed without a hub of its own will
|
||||
be subscribed through the specified hub URL instead. If the external hub
|
||||
has usage charges, be aware that there is no restriction placed to how
|
||||
many feeds may be subscribed!
|
||||
|
||||
$config['feedsub']['fallback_hub'] = 'https://superfeedr.com/hubbub';
|
||||
|
||||
$config['feedsub']['hub_user']
|
||||
$config['feedsub']['hub_password']
|
||||
If using the fallback hub mode, these settings may be used to provide
|
||||
HTTP authentication credentials for contacting the hub. Default hubs
|
||||
specified from feeds are assumed to not require
|
||||
|
||||
|
||||
For testing, shouldn't be used in production:
|
||||
|
||||
$config['ostatus']['skip_signatures']
|
||||
@ -23,12 +47,11 @@ $config['feedsub']['nohub']
|
||||
(default require hub)
|
||||
Allow low-level feed subscription setup for feeds without hubs.
|
||||
Not actually usable at this stage, OStatus will check for hubs too
|
||||
and we have no polling backend.
|
||||
and we have no polling backend. (The fallback hub option can be used
|
||||
with a 3rd-party service to provide such polling.)
|
||||
|
||||
|
||||
Todo:
|
||||
* fully functional l10n
|
||||
* redo non-OStatus feed support
|
||||
** rssCloud support?
|
||||
** possibly a polling daemon to support non-PuSH feeds?
|
||||
* better support for feeds that aren't natively oriented at social networking
|
||||
* make use of tags/categories from feeds
|
||||
* better repeat handling
|
||||
|
@ -61,7 +61,7 @@ class GroupsalmonAction extends SalmonAction
|
||||
function handlePost()
|
||||
{
|
||||
// @fixme process all objects?
|
||||
switch ($this->act->objects[0]->type) {
|
||||
switch ($this->activity->objects[0]->type) {
|
||||
case ActivityObject::ARTICLE:
|
||||
case ActivityObject::BLOGENTRY:
|
||||
case ActivityObject::NOTE:
|
||||
@ -74,7 +74,7 @@ class GroupsalmonAction extends SalmonAction
|
||||
|
||||
// Notice must be to the attention of this group
|
||||
|
||||
$context = $this->act->context;
|
||||
$context = $this->activity->context;
|
||||
|
||||
if (empty($context->attention)) {
|
||||
throw new ClientException("Not to the attention of anyone.");
|
||||
|
@ -55,10 +55,10 @@ class UsersalmonAction extends SalmonAction
|
||||
*/
|
||||
function handlePost()
|
||||
{
|
||||
common_log(LOG_INFO, "Received post of '{$this->act->objects[0]->id}' from '{$this->act->actor->id}'");
|
||||
common_log(LOG_INFO, "Received post of '{$this->activity->objects[0]->id}' from '{$this->activity->actor->id}'");
|
||||
|
||||
// @fixme: process all activity objects?
|
||||
switch ($this->act->objects[0]->type) {
|
||||
switch ($this->activity->objects[0]->type) {
|
||||
case ActivityObject::ARTICLE:
|
||||
case ActivityObject::BLOGENTRY:
|
||||
case ActivityObject::NOTE:
|
||||
@ -72,7 +72,7 @@ class UsersalmonAction extends SalmonAction
|
||||
// Notice must either be a) in reply to a notice by this user
|
||||
// or b) to the attention of this user
|
||||
|
||||
$context = $this->act->context;
|
||||
$context = $this->activity->context;
|
||||
|
||||
if (!empty($context->replyToID)) {
|
||||
$notice = Notice::staticGet('uri', $context->replyToID);
|
||||
@ -92,7 +92,7 @@ class UsersalmonAction extends SalmonAction
|
||||
throw new ClientException("Not to anyone in reply to anything!");
|
||||
}
|
||||
|
||||
$existing = Notice::staticGet('uri', $this->act->objects[0]->id);
|
||||
$existing = Notice::staticGet('uri', $this->activity->objects[0]->id);
|
||||
|
||||
if (!empty($existing)) {
|
||||
common_log(LOG_ERR, "Not saving notice '{$existing->uri}'; already exists.");
|
||||
@ -143,7 +143,7 @@ class UsersalmonAction extends SalmonAction
|
||||
|
||||
function handleFavorite()
|
||||
{
|
||||
$notice = $this->getNotice($this->act->objects[0]);
|
||||
$notice = $this->getNotice($this->activity->objects[0]);
|
||||
$profile = $this->ensureProfile()->localProfile();
|
||||
|
||||
$old = Fave::pkeyGet(array('user_id' => $profile->id,
|
||||
@ -164,7 +164,7 @@ class UsersalmonAction extends SalmonAction
|
||||
*/
|
||||
function handleUnfavorite()
|
||||
{
|
||||
$notice = $this->getNotice($this->act->objects[0]);
|
||||
$notice = $this->getNotice($this->activity->objects[0]);
|
||||
$profile = $this->ensureProfile()->localProfile();
|
||||
|
||||
$fave = Fave::pkeyGet(array('user_id' => $profile->id,
|
||||
|
@ -207,8 +207,8 @@ class FeedSub extends Memcached_DataObject
|
||||
$discover = new FeedDiscovery();
|
||||
$discover->discoverFromFeedURL($feeduri);
|
||||
|
||||
$huburi = $discover->getAtomLink('hub');
|
||||
if (!$huburi) {
|
||||
$huburi = $discover->getHubLink();
|
||||
if (!$huburi && !common_config('feedsub', 'fallback_hub')) {
|
||||
throw new FeedSubNoHubException();
|
||||
}
|
||||
|
||||
@ -241,8 +241,12 @@ class FeedSub extends Memcached_DataObject
|
||||
common_log(LOG_WARNING, "Attempting to (re)start PuSH subscription to $this->uri in unexpected state $this->sub_state");
|
||||
}
|
||||
if (empty($this->huburi)) {
|
||||
if (common_config('feedsub', 'nohub')) {
|
||||
if (common_config('feedsub', 'fallback_hub')) {
|
||||
// No native hub on this feed?
|
||||
// Use our fallback hub, which handles polling on our behalf.
|
||||
} else if (common_config('feedsub', 'nohub')) {
|
||||
// Fake it! We're just testing remote feeds w/o hubs.
|
||||
// We'll never actually get updates in this mode.
|
||||
return true;
|
||||
} else {
|
||||
throw new ServerException("Attempting to start PuSH subscription for feed with no hub");
|
||||
@ -255,6 +259,9 @@ class FeedSub extends Memcached_DataObject
|
||||
/**
|
||||
* Send a PuSH unsubscription request to the hub for this feed.
|
||||
* The hub will later send us a confirmation POST to /main/push/callback.
|
||||
* Warning: this will cancel the subscription even if someone else in
|
||||
* the system is using it. Most callers will want garbageCollect() instead,
|
||||
* which confirms there's no uses left.
|
||||
*
|
||||
* @return bool true on success, false on failure
|
||||
* @throws ServerException if feed state is not valid
|
||||
@ -264,8 +271,12 @@ class FeedSub extends Memcached_DataObject
|
||||
common_log(LOG_WARNING, "Attempting to (re)end PuSH subscription to $this->uri in unexpected state $this->sub_state");
|
||||
}
|
||||
if (empty($this->huburi)) {
|
||||
if (common_config('feedsub', 'nohub')) {
|
||||
if (common_config('feedsub', 'fallback_hub')) {
|
||||
// No native hub on this feed?
|
||||
// Use our fallback hub, which handles polling on our behalf.
|
||||
} else if (common_config('feedsub', 'nohub')) {
|
||||
// Fake it! We're just testing remote feeds w/o hubs.
|
||||
// We'll never actually get updates in this mode.
|
||||
return true;
|
||||
} else {
|
||||
throw new ServerException("Attempting to end PuSH subscription for feed with no hub");
|
||||
@ -275,6 +286,33 @@ class FeedSub extends Memcached_DataObject
|
||||
return $this->doSubscribe('unsubscribe');
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if there are any active local uses of this feed, and if not then
|
||||
* make sure it's inactive, unsubscribing if necessary.
|
||||
*
|
||||
* @return boolean true if the subscription is now inactive, false if still active.
|
||||
*/
|
||||
public function garbageCollect()
|
||||
{
|
||||
if ($this->sub_state == '' || $this->sub_state == 'inactive') {
|
||||
// No active PuSH subscription, we can just leave it be.
|
||||
return true;
|
||||
} else {
|
||||
// PuSH subscription is either active or in an indeterminate state.
|
||||
// Check if we're out of subscribers, and if so send an unsubscribe.
|
||||
$count = 0;
|
||||
Event::handle('FeedSubSubscriberCount', array($this, &$count));
|
||||
|
||||
if ($count) {
|
||||
common_log(LOG_INFO, __METHOD__ . ': ok, ' . $count . ' user(s) left for ' . $this->uri);
|
||||
return false;
|
||||
} else {
|
||||
common_log(LOG_INFO, __METHOD__ . ': unsubscribing, no users left for ' . $this->uri);
|
||||
return $this->unsubscribe();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function doSubscribe($mode)
|
||||
{
|
||||
$orig = clone($this);
|
||||
@ -296,7 +334,21 @@ class FeedSub extends Memcached_DataObject
|
||||
'hub.secret' => $this->secret,
|
||||
'hub.topic' => $this->uri);
|
||||
$client = new HTTPClient();
|
||||
$response = $client->post($this->huburi, $headers, $post);
|
||||
if ($this->huburi) {
|
||||
$hub = $this->huburi;
|
||||
} else {
|
||||
if (common_config('feedsub', 'fallback_hub')) {
|
||||
$hub = common_config('feedsub', 'fallback_hub');
|
||||
if (common_config('feedsub', 'hub_user')) {
|
||||
$u = common_config('feedsub', 'hub_user');
|
||||
$p = common_config('feedsub', 'hub_pass');
|
||||
$client->setAuth($u, $p);
|
||||
}
|
||||
} else {
|
||||
throw new FeedSubException('WTF?');
|
||||
}
|
||||
}
|
||||
$response = $client->post($hub, $headers, $post);
|
||||
$status = $response->getStatus();
|
||||
if ($status == 202) {
|
||||
common_log(LOG_INFO, __METHOD__ . ': sub req ok, awaiting verification callback');
|
||||
|
@ -215,22 +215,13 @@ class Ostatus_profile extends Memcached_DataObject
|
||||
}
|
||||
|
||||
/**
|
||||
* Send a PuSH unsubscription request to the hub for this feed.
|
||||
* The hub will later send us a confirmation POST to /main/push/callback.
|
||||
* Check if this remote profile has any active local subscriptions, and
|
||||
* if not drop the PuSH subscription feed.
|
||||
*
|
||||
* @return bool true on success, false on failure
|
||||
* @throws ServerException if feed state is not valid
|
||||
*/
|
||||
public function unsubscribe() {
|
||||
$feedsub = FeedSub::staticGet('uri', $this->feeduri);
|
||||
if (!$feedsub || $feedsub->sub_state == '' || $feedsub->sub_state == 'inactive') {
|
||||
// No active PuSH subscription, we can just leave it be.
|
||||
return true;
|
||||
} else {
|
||||
// PuSH subscription is either active or in an indeterminate state.
|
||||
// Send an unsubscribe.
|
||||
return $feedsub->unsubscribe();
|
||||
}
|
||||
$this->garbageCollect();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -240,6 +231,21 @@ class Ostatus_profile extends Memcached_DataObject
|
||||
* @return boolean
|
||||
*/
|
||||
public function garbageCollect()
|
||||
{
|
||||
$feedsub = FeedSub::staticGet('uri', $this->feeduri);
|
||||
return $feedsub->garbageCollect();
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if this remote profile has any active local subscriptions, so the
|
||||
* PuSH subscription layer can decide if it can drop the feed.
|
||||
*
|
||||
* This gets called via the FeedSubSubscriberCount event when running
|
||||
* FeedSub::garbageCollect().
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function subscriberCount()
|
||||
{
|
||||
if ($this->isGroup()) {
|
||||
$members = $this->localGroup()->getMembers(0, 1);
|
||||
@ -247,13 +253,14 @@ class Ostatus_profile extends Memcached_DataObject
|
||||
} else {
|
||||
$count = $this->localProfile()->subscriberCount();
|
||||
}
|
||||
if ($count == 0) {
|
||||
common_log(LOG_INFO, "Unsubscribing from now-unused remote feed $this->feeduri");
|
||||
$this->unsubscribe();
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
common_log(LOG_INFO, __METHOD__ . " SUB COUNT BEFORE: $count");
|
||||
|
||||
// Other plugins may be piggybacking on OStatus without having
|
||||
// an active group or user-to-user subscription we know about.
|
||||
Event::handle('Ostatus_profileSubscriberCount', array($this, &$count));
|
||||
common_log(LOG_INFO, __METHOD__ . " SUB COUNT AFTER: $count");
|
||||
|
||||
return $count;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -438,26 +445,31 @@ class Ostatus_profile extends Memcached_DataObject
|
||||
* @param DOMElement $feed for context
|
||||
* @param string $source identifier ("push" or "salmon")
|
||||
*/
|
||||
|
||||
public function processEntry($entry, $feed, $source)
|
||||
{
|
||||
$activity = new Activity($entry, $feed);
|
||||
|
||||
// @todo process all activity objects
|
||||
switch ($activity->objects[0]->type) {
|
||||
case ActivityObject::ARTICLE:
|
||||
case ActivityObject::BLOGENTRY:
|
||||
case ActivityObject::NOTE:
|
||||
case ActivityObject::STATUS:
|
||||
case ActivityObject::COMMENT:
|
||||
break;
|
||||
default:
|
||||
throw new ClientException("Can't handle that kind of post.");
|
||||
}
|
||||
if (Event::handle('StartHandleFeedEntry', array($activity))) {
|
||||
|
||||
if ($activity->verb == ActivityVerb::POST) {
|
||||
$this->processPost($activity, $source);
|
||||
} else {
|
||||
common_log(LOG_INFO, "Ignoring activity with unrecognized verb $activity->verb");
|
||||
// @todo process all activity objects
|
||||
switch ($activity->objects[0]->type) {
|
||||
case ActivityObject::ARTICLE:
|
||||
case ActivityObject::BLOGENTRY:
|
||||
case ActivityObject::NOTE:
|
||||
case ActivityObject::STATUS:
|
||||
case ActivityObject::COMMENT:
|
||||
if ($activity->verb == ActivityVerb::POST) {
|
||||
$this->processPost($activity, $source);
|
||||
} else {
|
||||
common_log(LOG_INFO, "Ignoring activity with unrecognized verb $activity->verb");
|
||||
}
|
||||
break;
|
||||
default:
|
||||
throw new ClientException("Can't handle that kind of post.");
|
||||
}
|
||||
|
||||
Event::handle('EndHandleFeedEntry', array($activity));
|
||||
}
|
||||
}
|
||||
|
||||
@ -486,8 +498,14 @@ class Ostatus_profile extends Memcached_DataObject
|
||||
// OK here! assume the default
|
||||
} else if ($actor->id == $this->uri || $actor->link == $this->uri) {
|
||||
$this->updateFromActivityObject($actor);
|
||||
} else {
|
||||
} else if ($actor->id) {
|
||||
// We have an ActivityStreams actor with an explicit ID that doesn't match the feed owner.
|
||||
// This isn't what we expect from mainline OStatus person feeds!
|
||||
// Group feeds go down another path, with different validation.
|
||||
throw new Exception("Got an actor '{$actor->title}' ({$actor->id}) on single-user feed for {$this->uri}");
|
||||
} else {
|
||||
// Plain <author> without ActivityStreams actor info.
|
||||
// We'll just ignore this info for now and save the update under the feed's identity.
|
||||
}
|
||||
|
||||
$oprofile = $this;
|
||||
@ -668,7 +686,7 @@ class Ostatus_profile extends Memcached_DataObject
|
||||
common_log(LOG_DEBUG, "Original reply recipients: " . implode(', ', $attention_uris));
|
||||
$groups = array();
|
||||
$replies = array();
|
||||
foreach ($attention_uris as $recipient) {
|
||||
foreach (array_unique($attention_uris) as $recipient) {
|
||||
// Is the recipient a local user?
|
||||
$user = User::staticGet('uri', $recipient);
|
||||
if ($user) {
|
||||
@ -862,12 +880,12 @@ class Ostatus_profile extends Memcached_DataObject
|
||||
$feeduri = $discover->discoverFromFeedURL($feed_url);
|
||||
$hints['feedurl'] = $feeduri;
|
||||
|
||||
$huburi = $discover->getAtomLink('hub');
|
||||
$huburi = $discover->getHubLink();
|
||||
$hints['hub'] = $huburi;
|
||||
$salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES);
|
||||
$hints['salmon'] = $salmonuri;
|
||||
|
||||
if (!$huburi) {
|
||||
if (!$huburi && !common_config('feedsub', 'fallback_hub')) {
|
||||
// We can only deal with folks with a PuSH hub
|
||||
throw new FeedSubNoHubException();
|
||||
}
|
||||
@ -1263,10 +1281,10 @@ class Ostatus_profile extends Memcached_DataObject
|
||||
$discover = new FeedDiscovery();
|
||||
$discover->discoverFromFeedURL($hints['feedurl']);
|
||||
}
|
||||
$huburi = $discover->getAtomLink('hub');
|
||||
$huburi = $discover->getHubLink();
|
||||
}
|
||||
|
||||
if (!$huburi) {
|
||||
if (!$huburi && !common_config('feedsub', 'fallback_hub')) {
|
||||
// We can only deal with folks with a PuSH hub
|
||||
throw new FeedSubNoHubException();
|
||||
}
|
||||
|
@ -87,6 +87,16 @@ class FeedDiscovery
|
||||
return ActivityUtils::getLink($this->root, $rel, $type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the referenced PuSH hub link from an Atom feed.
|
||||
*
|
||||
* @return mixed string or false
|
||||
*/
|
||||
public function getHubLink()
|
||||
{
|
||||
return $this->getAtomLink('hub');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $url
|
||||
* @param bool $htmlOk pass false here if you don't want to follow web pages.
|
||||
|
@ -210,13 +210,13 @@ class MagicEnvelope
|
||||
}
|
||||
|
||||
$data_element = $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'data')->item(0);
|
||||
|
||||
$sig_element = $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'sig')->item(0);
|
||||
return array(
|
||||
'data' => trim($data_element->nodeValue),
|
||||
'data' => preg_replace('/\s/', '', $data_element->nodeValue),
|
||||
'data_type' => $data_element->getAttribute('type'),
|
||||
'encoding' => $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'encoding')->item(0)->nodeValue,
|
||||
'alg' => $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'alg')->item(0)->nodeValue,
|
||||
'sig' => $env_element->getElementsByTagNameNS(MagicEnvelope::NS, 'sig')->item(0)->nodeValue,
|
||||
'sig' => preg_replace('/\s/', '', $sig_element->nodeValue),
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -47,7 +47,6 @@ class SalmonAction extends Action
|
||||
|
||||
$xml = file_get_contents('php://input');
|
||||
|
||||
|
||||
// Check the signature
|
||||
$salmon = new Salmon;
|
||||
if (!$salmon->verifyMagicEnv($xml)) {
|
||||
@ -58,7 +57,6 @@ class SalmonAction extends Action
|
||||
$env = $magic_env->parse($xml);
|
||||
$xml = $magic_env->unfold($env);
|
||||
}
|
||||
|
||||
|
||||
$dom = DOMDocument::loadXML($xml);
|
||||
if ($dom->documentElement->namespaceURI != Activity::ATOM ||
|
||||
@ -67,7 +65,7 @@ class SalmonAction extends Action
|
||||
$this->clientError(_m('Salmon post must be an Atom entry.'));
|
||||
}
|
||||
|
||||
$this->act = new Activity($dom->documentElement);
|
||||
$this->activity = new Activity($dom->documentElement);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -79,9 +77,9 @@ class SalmonAction extends Action
|
||||
{
|
||||
StatusNet::setApi(true); // Send smaller error pages
|
||||
|
||||
common_log(LOG_DEBUG, "Got a " . $this->act->verb);
|
||||
common_log(LOG_DEBUG, "Got a " . $this->activity->verb);
|
||||
if (Event::handle('StartHandleSalmon', array($this->activity))) {
|
||||
switch ($this->act->verb)
|
||||
switch ($this->activity->verb)
|
||||
{
|
||||
case ActivityVerb::POST:
|
||||
$this->handlePost();
|
||||
@ -164,12 +162,12 @@ class SalmonAction extends Action
|
||||
*/
|
||||
function handleUpdateProfile()
|
||||
{
|
||||
$oprofile = Ostatus_profile::getActorProfile($this->act);
|
||||
$oprofile = Ostatus_profile::getActorProfile($this->activity);
|
||||
if ($oprofile) {
|
||||
common_log(LOG_INFO, "Got a profile-update ping from $oprofile->uri");
|
||||
$oprofile->updateFromActivityObject($this->act->actor);
|
||||
$oprofile->updateFromActivityObject($this->activity->actor);
|
||||
} else {
|
||||
common_log(LOG_INFO, "Ignoring profile-update ping from unknown " . $this->act->actor->id);
|
||||
common_log(LOG_INFO, "Ignoring profile-update ping from unknown " . $this->activity->actor->id);
|
||||
}
|
||||
}
|
||||
|
||||
@ -178,10 +176,10 @@ class SalmonAction extends Action
|
||||
*/
|
||||
function ensureProfile()
|
||||
{
|
||||
$actor = $this->act->actor;
|
||||
$actor = $this->activity->actor;
|
||||
if (empty($actor->id)) {
|
||||
common_log(LOG_ERR, "broken actor: " . var_export($actor, true));
|
||||
common_log(LOG_ERR, "activity with no actor: " . var_export($this->act, true));
|
||||
common_log(LOG_ERR, "activity with no actor: " . var_export($this->activity, true));
|
||||
throw new Exception("Received a salmon slap from unidentified actor.");
|
||||
}
|
||||
|
||||
@ -191,6 +189,6 @@ class SalmonAction extends Action
|
||||
function saveNotice()
|
||||
{
|
||||
$oprofile = $this->ensureProfile();
|
||||
return $oprofile->processPost($this->act, 'salmon');
|
||||
return $oprofile->processPost($this->activity, 'salmon');
|
||||
}
|
||||
}
|
||||
|
@ -55,7 +55,7 @@ print "Re-running feed discovery for profile URL $oprofile->uri\n";
|
||||
// @fixme will bork where the URI isn't the profile URL for now
|
||||
$discover = new FeedDiscovery();
|
||||
$feedurl = $discover->discoverFromURL($oprofile->uri);
|
||||
$huburi = $discover->getAtomLink('hub');
|
||||
$huburi = $discover->getHubLink();
|
||||
$salmonuri = $discover->getAtomLink(Salmon::NS_REPLIES);
|
||||
|
||||
print " Feed URL: $feedurl\n";
|
||||
|
@ -10,7 +10,7 @@ define('STATUSNET', true);
|
||||
define('LACONICA', true);
|
||||
|
||||
require_once INSTALLDIR . '/lib/common.php';
|
||||
require_once INSTALLDIR . '/plugins/FeedSub/feedsub.php';
|
||||
require_once INSTALLDIR . '/plugins/OStatus/lib/feeddiscovery.php';
|
||||
|
||||
class FeedDiscoveryTest extends PHPUnit_Framework_TestCase
|
||||
{
|
||||
|
@ -53,6 +53,8 @@ class SitemapAction extends Action
|
||||
|
||||
function handle($args)
|
||||
{
|
||||
parent::handle($args);
|
||||
|
||||
header('Content-Type: text/xml; charset=UTF-8');
|
||||
$this->startXML();
|
||||
|
||||
@ -67,6 +69,27 @@ class SitemapAction extends Action
|
||||
$this->endXML();
|
||||
}
|
||||
|
||||
function lastModified()
|
||||
{
|
||||
$y = $this->trimmed('year');
|
||||
|
||||
$m = $this->trimmed('month');
|
||||
$d = $this->trimmed('day');
|
||||
|
||||
$y += 0;
|
||||
$m += 0;
|
||||
$d += 0;
|
||||
|
||||
$begdate = strtotime("$y-$m-$d 00:00:00");
|
||||
$enddate = $begdate + (24 * 60 * 60);
|
||||
|
||||
if ($enddate < time()) {
|
||||
return $enddate;
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
function showUrl($url, $lastMod=null, $changeFreq=null, $priority=null)
|
||||
{
|
||||
$this->elementStart('url');
|
||||
|
168
plugins/SubMirror/SubMirrorPlugin.php
Normal file
168
plugins/SubMirror/SubMirrorPlugin.php
Normal file
@ -0,0 +1,168 @@
|
||||
<?php
|
||||
/*
|
||||
* StatusNet - the distributed open-source microblogging tool
|
||||
* Copyright (C) 2009-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/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @package SubMirrorPlugin
|
||||
* @maintainer Brion Vibber <brion@status.net>
|
||||
*/
|
||||
|
||||
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
|
||||
|
||||
|
||||
class SubMirrorPlugin extends Plugin
|
||||
{
|
||||
/**
|
||||
* Hook for RouterInitialized event.
|
||||
*
|
||||
* @param Net_URL_Mapper $m path-to-action mapper
|
||||
* @return boolean hook return
|
||||
*/
|
||||
function onRouterInitialized($m)
|
||||
{
|
||||
$m->connect('settings/mirror',
|
||||
array('action' => 'mirrorsettings'));
|
||||
$m->connect('settings/mirror/add',
|
||||
array('action' => 'addmirror'));
|
||||
$m->connect('settings/mirror/edit',
|
||||
array('action' => 'editmirror'));
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Automatically load the actions and libraries used by the plugin
|
||||
*
|
||||
* @param Class $cls the class
|
||||
*
|
||||
* @return boolean hook return
|
||||
*
|
||||
*/
|
||||
function onAutoload($cls)
|
||||
{
|
||||
$base = dirname(__FILE__);
|
||||
$lower = strtolower($cls);
|
||||
$files = array("$base/lib/$lower.php",
|
||||
"$base/classes/$cls.php");
|
||||
if (substr($lower, -6) == 'action') {
|
||||
$files[] = "$base/actions/" . substr($lower, 0, -6) . ".php";
|
||||
}
|
||||
foreach ($files as $file) {
|
||||
if (file_exists($file)) {
|
||||
include_once $file;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
function handle($notice)
|
||||
{
|
||||
// Is anybody mirroring?
|
||||
$mirror = new SubMirror();
|
||||
$mirror->subscribed = $notice->profile_id;
|
||||
if ($mirror->find()) {
|
||||
while ($mirror->fetch()) {
|
||||
$mirror->repeat($notice);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function onPluginVersion(&$versions)
|
||||
{
|
||||
$versions[] = array('name' => 'SubMirror',
|
||||
'version' => STATUSNET_VERSION,
|
||||
'author' => 'Brion Vibber',
|
||||
'homepage' => 'http://status.net/wiki/Plugin:SubMirror',
|
||||
'rawdescription' =>
|
||||
_m('Pull feeds into your timeline!'));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Menu item for settings
|
||||
*
|
||||
* @param Action &$action Action being executed
|
||||
*
|
||||
* @return boolean hook return
|
||||
*/
|
||||
|
||||
function onEndAccountSettingsNav(&$action)
|
||||
{
|
||||
$action_name = $action->trimmed('action');
|
||||
|
||||
$action->menuItem(common_local_url('mirrorsettings'),
|
||||
// TRANS: SubMirror plugin menu item on user settings page.
|
||||
_m('MENU', 'Mirroring'),
|
||||
// TRANS: SubMirror plugin tooltip for user settings menu item.
|
||||
_m('Configure mirroring of posts from other feeds'),
|
||||
$action_name === 'mirrorsettings');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
function onCheckSchema()
|
||||
{
|
||||
$schema = Schema::get();
|
||||
$schema->ensureTable('submirror', SubMirror::schemaDef());
|
||||
|
||||
// @hack until key definition support is merged
|
||||
SubMirror::fixIndexes($schema);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set up queue handlers for outgoing hub pushes
|
||||
* @param QueueManager $qm
|
||||
* @return boolean hook return
|
||||
*/
|
||||
function onEndInitializeQueueManager(QueueManager $qm)
|
||||
{
|
||||
// After each notice save, check if there's any repeat mirrors.
|
||||
$qm->connect('mirror', 'MirrorQueueHandler');
|
||||
return true;
|
||||
}
|
||||
|
||||
function onStartEnqueueNotice($notice, &$transports)
|
||||
{
|
||||
$transports[] = 'mirror';
|
||||
}
|
||||
|
||||
/**
|
||||
* Let the OStatus subscription garbage collection know if we're
|
||||
* making use of a remote feed, so it doesn't get dropped out
|
||||
* from under us.
|
||||
*
|
||||
* @param Ostatus_profile $oprofile
|
||||
* @param int $count in/out
|
||||
* @return mixed hook return value
|
||||
*/
|
||||
function onOstatus_profileSubscriberCount($oprofile, &$count)
|
||||
{
|
||||
if ($oprofile->profile_id) {
|
||||
$mirror = new SubMirror();
|
||||
$mirror->subscribed = $oprofile->profile_id;
|
||||
if ($mirror->find()) {
|
||||
while ($mirror->fetch()) {
|
||||
$count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
77
plugins/SubMirror/actions/addmirror.php
Normal file
77
plugins/SubMirror/actions/addmirror.php
Normal file
@ -0,0 +1,77 @@
|
||||
<?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/>.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Action
|
||||
* @package StatusNet
|
||||
* @author Brion Vibber <brion@status.net>
|
||||
* @copyright 2010 StatusNet, Inc.
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
if (!defined('STATUSNET')) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes parameters:
|
||||
*
|
||||
* - feed: a profile ID
|
||||
* - token: session token to prevent CSRF attacks
|
||||
* - ajax: boolean; whether to return Ajax or full-browser results
|
||||
*
|
||||
* Only works if the current user is logged in.
|
||||
*
|
||||
* @category Action
|
||||
* @package StatusNet
|
||||
* @copyright 2010 StatusNet, Inc.
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
class AddMirrorAction extends BaseMirrorAction
|
||||
{
|
||||
var $feedurl;
|
||||
|
||||
/**
|
||||
* Check pre-requisites and instantiate attributes
|
||||
*
|
||||
* @param Array $args array of arguments (URL, GET, POST)
|
||||
*
|
||||
* @return boolean success flag
|
||||
*/
|
||||
|
||||
function prepare($args)
|
||||
{
|
||||
parent::prepare($args);
|
||||
$this->feedurl = $this->validateFeedUrl($this->trimmed('feedurl'));
|
||||
$this->profile = $this->profileForFeed($this->feedurl);
|
||||
return true;
|
||||
}
|
||||
|
||||
function saveMirror()
|
||||
{
|
||||
if ($this->oprofile->subscribe()) {
|
||||
SubMirror::saveMirror($this->user, $this->profile);
|
||||
} else {
|
||||
$this->serverError(_m("Could not subscribe to feed."));
|
||||
}
|
||||
}
|
||||
}
|
169
plugins/SubMirror/actions/basemirror.php
Normal file
169
plugins/SubMirror/actions/basemirror.php
Normal file
@ -0,0 +1,169 @@
|
||||
<?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/>.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Action
|
||||
* @package StatusNet
|
||||
* @author Brion Vibber <brion@status.net>
|
||||
* @copyright 2010 StatusNet, Inc.
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
if (!defined('STATUSNET')) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes parameters:
|
||||
*
|
||||
* - feed: a profile ID
|
||||
* - token: session token to prevent CSRF attacks
|
||||
* - ajax: boolean; whether to return Ajax or full-browser results
|
||||
*
|
||||
* Only works if the current user is logged in.
|
||||
*
|
||||
* @category Action
|
||||
* @package StatusNet
|
||||
* @copyright 2010 StatusNet, Inc.
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
abstract class BaseMirrorAction extends Action
|
||||
{
|
||||
var $user;
|
||||
var $profile;
|
||||
|
||||
/**
|
||||
* Check pre-requisites and instantiate attributes
|
||||
*
|
||||
* @param Array $args array of arguments (URL, GET, POST)
|
||||
*
|
||||
* @return boolean success flag
|
||||
*/
|
||||
|
||||
function prepare($args)
|
||||
{
|
||||
parent::prepare($args);
|
||||
return $this->sharedBoilerplate();
|
||||
}
|
||||
|
||||
protected function validateFeedUrl($url)
|
||||
{
|
||||
if (common_valid_http_url($url)) {
|
||||
return $url;
|
||||
} else {
|
||||
$this->clientError(_m("Invalid feed URL."));
|
||||
}
|
||||
}
|
||||
|
||||
protected function validateProfile($id)
|
||||
{
|
||||
$id = intval($id);
|
||||
$profile = Profile::staticGet('id', $id);
|
||||
if ($profile && $profile->id != $this->user->id) {
|
||||
return $profile;
|
||||
}
|
||||
// TRANS: Error message returned to user when setting up feed mirroring, but we were unable to resolve the given URL to a working feed.
|
||||
$this->clientError(_m("Invalid profile for mirroring."));
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param string $url
|
||||
* @return Profile
|
||||
*/
|
||||
protected function profileForFeed($url)
|
||||
{
|
||||
$oprofile = Ostatus_profile::ensureProfileURL($url);
|
||||
if ($oprofile->isGroup()) {
|
||||
$this->clientError(_m("Can't mirror a StatusNet group at this time."));
|
||||
}
|
||||
$this->oprofile = $oprofile; // @fixme ugly side effect :D
|
||||
return $oprofile->localProfile();
|
||||
}
|
||||
|
||||
/**
|
||||
* @fixme none of this belongs in end classes
|
||||
* this stuff belongs in shared code!
|
||||
*/
|
||||
function sharedBoilerplate()
|
||||
{
|
||||
// Only allow POST requests
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] != 'POST') {
|
||||
$this->clientError(_('This action only accepts POST requests.'));
|
||||
return false;
|
||||
}
|
||||
|
||||
// CSRF protection
|
||||
|
||||
$token = $this->trimmed('token');
|
||||
|
||||
if (!$token || $token != common_session_token()) {
|
||||
$this->clientError(_('There was a problem with your session token.'.
|
||||
' Try again, please.'));
|
||||
return false;
|
||||
}
|
||||
|
||||
// Only for logged-in users
|
||||
|
||||
$this->user = common_current_user();
|
||||
|
||||
if (empty($this->user)) {
|
||||
$this->clientError(_('Not logged in.'));
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle request
|
||||
*
|
||||
* Does the subscription and returns results.
|
||||
*
|
||||
* @param Array $args unused.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function handle($args)
|
||||
{
|
||||
// Throws exception on error
|
||||
$this->saveMirror();
|
||||
|
||||
if ($this->boolean('ajax')) {
|
||||
$this->startHTML('text/xml;charset=utf-8');
|
||||
$this->elementStart('head');
|
||||
$this->element('title', null, _('Subscribed'));
|
||||
$this->elementEnd('head');
|
||||
$this->elementStart('body');
|
||||
$unsubscribe = new EditMirrorForm($this, $this->profile);
|
||||
$unsubscribe->show();
|
||||
$this->elementEnd('body');
|
||||
$this->elementEnd('html');
|
||||
} else {
|
||||
$url = common_local_url('mirrorsettings');
|
||||
common_redirect($url, 303);
|
||||
}
|
||||
}
|
||||
|
||||
abstract function saveMirror();
|
||||
}
|
112
plugins/SubMirror/actions/editmirror.php
Normal file
112
plugins/SubMirror/actions/editmirror.php
Normal file
@ -0,0 +1,112 @@
|
||||
<?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/>.
|
||||
*
|
||||
* PHP version 5
|
||||
*
|
||||
* @category Action
|
||||
* @package StatusNet
|
||||
* @author Brion Vibber <brion@status.net>
|
||||
* @copyright 2010 StatusNet, Inc.
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
if (!defined('STATUSNET')) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Takes parameters:
|
||||
*
|
||||
* - feed: a profile ID
|
||||
* - token: session token to prevent CSRF attacks
|
||||
* - ajax: boolean; whether to return Ajax or full-browser results
|
||||
*
|
||||
* Only works if the current user is logged in.
|
||||
*
|
||||
* @category Action
|
||||
* @package StatusNet
|
||||
* @copyright 2010 StatusNet, Inc.
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
class EditMirrorAction extends BaseMirrorAction
|
||||
{
|
||||
|
||||
/**
|
||||
* Check pre-requisites and instantiate attributes
|
||||
*
|
||||
* @param Array $args array of arguments (URL, GET, POST)
|
||||
*
|
||||
* @return boolean success flag
|
||||
*/
|
||||
|
||||
function prepare($args)
|
||||
{
|
||||
parent::prepare($args);
|
||||
|
||||
$this->profile = $this->validateProfile($this->trimmed('profile'));
|
||||
|
||||
$this->mirror = SubMirror::pkeyGet(array('subscriber' => $this->user->id,
|
||||
'subscribed' => $this->profile->id));
|
||||
|
||||
if (!$this->mirror) {
|
||||
$this->clientError(_m("Requested invalid profile to edit."));
|
||||
}
|
||||
|
||||
$this->style = $this->validateStyle($this->trimmed('style'));
|
||||
|
||||
// DO NOT change to $this->boolean(), it will be wrong.
|
||||
// We're checking for the presence of the setting, not its value.
|
||||
$this->delete = (bool)$this->arg('delete');
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
protected function validateStyle($style)
|
||||
{
|
||||
$allowed = array('repeat', 'copy');
|
||||
if (in_array($style, $allowed)) {
|
||||
return $style;
|
||||
} else {
|
||||
$this->clientError(_m("Bad form data."));
|
||||
}
|
||||
}
|
||||
|
||||
function saveMirror()
|
||||
{
|
||||
$mirror = SubMirror::getMirror($this->user, $this->profile);
|
||||
if (!$mirror) {
|
||||
$this->clientError(_m('Requested edit of missing mirror'));
|
||||
}
|
||||
|
||||
if ($this->delete) {
|
||||
$mirror->delete();
|
||||
$oprofile = Ostatus_profile::staticGet('profile_id', $this->profile->id);
|
||||
if ($oprofile) {
|
||||
$oprofile->garbageCollect();
|
||||
}
|
||||
} else if ($this->style != $mirror->style) {
|
||||
$orig = clone($mirror);
|
||||
$mirror->style = $this->style;
|
||||
$mirror->modified = common_sql_now();
|
||||
$mirror->update($orig);
|
||||
}
|
||||
}
|
||||
}
|
106
plugins/SubMirror/actions/mirrorsettings.php
Normal file
106
plugins/SubMirror/actions/mirrorsettings.php
Normal file
@ -0,0 +1,106 @@
|
||||
<?php
|
||||
/**
|
||||
* StatusNet, the distributed open-source microblogging tool
|
||||
*
|
||||
* 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 Plugins
|
||||
* @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);
|
||||
}
|
||||
|
||||
class MirrorSettingsAction extends AccountSettingsAction
|
||||
{
|
||||
/**
|
||||
* Title of the page
|
||||
*
|
||||
* @return string Page title
|
||||
*/
|
||||
|
||||
function title()
|
||||
{
|
||||
return _m('Feed mirror settings');
|
||||
}
|
||||
|
||||
/**
|
||||
* Instructions for use
|
||||
*
|
||||
* @return string Instructions for use
|
||||
*/
|
||||
|
||||
function getInstructions()
|
||||
{
|
||||
return _m('You can mirror updates from many RSS and Atom feeds ' .
|
||||
'into your StatusNet timeline!');
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for OpenID management
|
||||
*
|
||||
* We have one form with a few different submit buttons to do different things.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function showContent()
|
||||
{
|
||||
$user = common_current_user();
|
||||
|
||||
$this->showAddFeedForm();
|
||||
|
||||
$mirror = new SubMirror();
|
||||
$mirror->subscriber = $user->id;
|
||||
if ($mirror->find()) {
|
||||
while ($mirror->fetch()) {
|
||||
$this->showFeedForm($mirror);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function showFeedForm($mirror)
|
||||
{
|
||||
$profile = Profile::staticGet('id', $mirror->subscribed);
|
||||
if ($profile) {
|
||||
$form = new EditMirrorForm($this, $profile);
|
||||
$form->show();
|
||||
}
|
||||
}
|
||||
|
||||
function showAddFeedForm()
|
||||
{
|
||||
$form = new AddMirrorForm($this);
|
||||
$form->show();
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle a POST request
|
||||
*
|
||||
* Muxes to different sub-functions based on which button was pushed
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function handlePost()
|
||||
{
|
||||
}
|
||||
}
|
229
plugins/SubMirror/classes/SubMirror.php
Normal file
229
plugins/SubMirror/classes/SubMirror.php
Normal file
@ -0,0 +1,229 @@
|
||||
<?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/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* @package SubMirrorPlugin
|
||||
* @maintainer Brion Vibber <brion@status.net>
|
||||
*/
|
||||
|
||||
class SubMirror extends Memcached_DataObject
|
||||
{
|
||||
public $__table = 'submirror';
|
||||
|
||||
public $subscriber;
|
||||
public $subscribed;
|
||||
|
||||
public $style;
|
||||
|
||||
public $created;
|
||||
public $modified;
|
||||
|
||||
public /*static*/ function staticGet($k, $v=null)
|
||||
{
|
||||
return parent::staticGet(__CLASS__, $k, $v);
|
||||
}
|
||||
|
||||
/**
|
||||
* return table definition for DB_DataObject
|
||||
*
|
||||
* DB_DataObject needs to know something about the table to manipulate
|
||||
* instances. This method provides all the DB_DataObject needs to know.
|
||||
*
|
||||
* @return array array of column definitions
|
||||
*/
|
||||
|
||||
function table()
|
||||
{
|
||||
return array('subscriber' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
|
||||
'subscribed' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
|
||||
|
||||
'style' => DB_DATAOBJECT_STR,
|
||||
|
||||
'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL,
|
||||
'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
|
||||
}
|
||||
|
||||
static function schemaDef()
|
||||
{
|
||||
// @fixme need a reverse key on (subscribed, subscriber) as well
|
||||
return array(new ColumnDef('subscriber', 'integer',
|
||||
null, false, 'PRI'),
|
||||
new ColumnDef('subscribed', 'integer',
|
||||
null, false, 'PRI'),
|
||||
|
||||
new ColumnDef('style', 'varchar',
|
||||
16, true),
|
||||
|
||||
new ColumnDef('created', 'datetime',
|
||||
null, false),
|
||||
new ColumnDef('modified', 'datetime',
|
||||
null, false));
|
||||
}
|
||||
|
||||
/**
|
||||
* Temporary hack to set up the compound index, since we can't do
|
||||
* it yet through regular Schema interface. (Coming for 1.0...)
|
||||
*
|
||||
* @param Schema $schema
|
||||
* @return void
|
||||
*/
|
||||
static function fixIndexes($schema)
|
||||
{
|
||||
try {
|
||||
$schema->createIndex('submirror', array('subscribed', 'subscriber'));
|
||||
} catch (Exception $e) {
|
||||
common_log(LOG_ERR, __METHOD__ . ': ' . $e->getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* return key definitions for DB_DataObject
|
||||
*
|
||||
* DB_DataObject needs to know about keys that the table has; this function
|
||||
* defines them.
|
||||
*
|
||||
* @return array key definitions
|
||||
*/
|
||||
|
||||
function keys()
|
||||
{
|
||||
return array_keys($this->keyTypes());
|
||||
}
|
||||
|
||||
/**
|
||||
* return key definitions for Memcached_DataObject
|
||||
*
|
||||
* Our caching system uses the same key definitions, but uses a different
|
||||
* method to get them.
|
||||
*
|
||||
* @return array key definitions
|
||||
*/
|
||||
|
||||
function keyTypes()
|
||||
{
|
||||
// @fixme keys
|
||||
// need a sane key for reverse lookup too
|
||||
return array('subscriber' => 'K', 'subscribed' => 'K');
|
||||
}
|
||||
|
||||
function sequenceKey()
|
||||
{
|
||||
return array(false, false, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Profile $subscribed
|
||||
* @param Profile $subscribed
|
||||
* @return SubMirror
|
||||
* @throws ServerException
|
||||
*/
|
||||
public static function saveMirror($subscriber, $subscribed, $style='repeat')
|
||||
{
|
||||
// @fixme make sure they're subscribed!
|
||||
$mirror = new SubMirror();
|
||||
|
||||
$mirror->subscriber = $subscriber->id;
|
||||
$mirror->subscribed = $subscribed->id;
|
||||
$mirror->style = $style;
|
||||
|
||||
$mirror->created = common_sql_now();
|
||||
$mirror->modified = common_sql_now();
|
||||
$mirror->insert();
|
||||
|
||||
return $mirror;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Notice $notice
|
||||
* @return mixed Notice on successful mirroring, boolean if not
|
||||
*/
|
||||
public function mirrorNotice($notice)
|
||||
{
|
||||
$profile = Profile::staticGet('id', $this->subscriber);
|
||||
if (!$profile) {
|
||||
common_log(LOG_ERROR, "SubMirror plugin skipping auto-repeat of notice $notice->id for missing user $profile->id");
|
||||
return false;
|
||||
}
|
||||
|
||||
if ($this->style == 'copy') {
|
||||
return $this->copyNotice($profile, $notice);
|
||||
} else { // default to repeat mode
|
||||
return $this->repeatNotice($profile, $notice);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mirror a notice using StatusNet's repeat functionality.
|
||||
* This retains attribution within the site, and other nice things,
|
||||
* but currently ends up looking like 'RT @foobar bla bla' when
|
||||
* bridged out over OStatus or TwitterBridge.
|
||||
*
|
||||
* @param Notice $notice
|
||||
* @return mixed Notice on successful repeat, true if already repeated, false on failure
|
||||
*/
|
||||
protected function repeatNotice($profile, $notice)
|
||||
{
|
||||
if($profile->hasRepeated($notice->id)) {
|
||||
common_log(LOG_INFO, "SubMirror plugin skipping auto-repeat of notice $notice->id for user $profile->id; already repeated.");
|
||||
return true;
|
||||
} else {
|
||||
common_log(LOG_INFO, "SubMirror plugin auto-repeating notice $notice->id for $profile->id");
|
||||
return $notice->repeat($profile->id, 'mirror');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mirror a notice by emitting a new notice with the same contents.
|
||||
* Kind of dirty, but if pulling an external data feed into an account
|
||||
* that may be what you want.
|
||||
*
|
||||
* @param Notice $notice
|
||||
* @return mixed Notice on successful repeat, true if already repeated, false on failure
|
||||
*/
|
||||
protected function copyNotice($profile, $notice)
|
||||
{
|
||||
$options = array('is_local' => Notice::LOCAL_PUBLIC,
|
||||
'url' => $notice->bestUrl(), // pass through the foreign link...
|
||||
'rendered' => $notice->rendered);
|
||||
|
||||
$saved = Notice::saveNew($profile->id,
|
||||
$notice->content,
|
||||
'feed',
|
||||
$options);
|
||||
return $saved;
|
||||
}
|
||||
|
||||
public /*static*/ function pkeyGet($v)
|
||||
{
|
||||
return parent::pkeyGet(__CLASS__, $v);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the mirroring setting for a pair of profiles, if existing.
|
||||
*
|
||||
* @param Profile $subscriber
|
||||
* @param Profile $subscribed
|
||||
* @return mixed Profile or empty
|
||||
*/
|
||||
public static function getMirror($subscriber, $subscribed)
|
||||
{
|
||||
return self::pkeyGet(array('subscriber' => $subscriber->id,
|
||||
'subscribed' => $subscribed->id));
|
||||
}
|
||||
}
|
141
plugins/SubMirror/lib/addmirrorform.php
Normal file
141
plugins/SubMirror/lib/addmirrorform.php
Normal file
@ -0,0 +1,141 @@
|
||||
<?php
|
||||
/**
|
||||
* StatusNet, the distributed open-source microblogging tool
|
||||
* 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/>.
|
||||
*
|
||||
* @package StatusNet
|
||||
* @copyright 2010 StatusNet, Inc.
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
class AddMirrorForm extends Form
|
||||
{
|
||||
|
||||
/**
|
||||
* Name of the form
|
||||
*
|
||||
* Sub-classes should overload this with the name of their form.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function formLegend()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Visible or invisible data elements
|
||||
*
|
||||
* Display the form fields that make up the data of the form.
|
||||
* Sub-classes should overload this to show their data.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function formData()
|
||||
{
|
||||
$this->out->elementStart('fieldset');
|
||||
|
||||
$this->out->elementStart('ul');
|
||||
|
||||
$this->li();
|
||||
$this->doInput('addmirror-feedurl',
|
||||
'feedurl',
|
||||
_m('Web page or feed URL:'),
|
||||
$this->out->trimmed('feedurl'));
|
||||
$this->unli();
|
||||
|
||||
$this->li();
|
||||
$this->out->submit('addmirror-save', _m('Add feed'));
|
||||
$this->unli();
|
||||
$this->out->elementEnd('ul');
|
||||
$this->out->elementEnd('fieldset');
|
||||
}
|
||||
|
||||
private function doInput($id, $name, $label, $value=null, $instructions=null)
|
||||
{
|
||||
$this->out->element('label', array('for' => $id), $label);
|
||||
$attrs = array('name' => $name,
|
||||
'type' => 'text',
|
||||
'id' => $id,
|
||||
'style' => 'width: 80%');
|
||||
if ($value) {
|
||||
$attrs['value'] = $value;
|
||||
}
|
||||
$this->out->element('input', $attrs);
|
||||
if ($instructions) {
|
||||
$this->out->element('p', 'form_guide', $instructions);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Buttons for form actions
|
||||
*
|
||||
* Submit and cancel buttons (or whatever)
|
||||
* Sub-classes should overload this to show their own buttons.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function formActions()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* ID of the form
|
||||
*
|
||||
* Should be unique on the page. Sub-classes should overload this
|
||||
* to show their own IDs.
|
||||
*
|
||||
* @return string ID of the form
|
||||
*/
|
||||
|
||||
function id()
|
||||
{
|
||||
return 'add-mirror-form';
|
||||
}
|
||||
|
||||
/**
|
||||
* Action of the form.
|
||||
*
|
||||
* URL to post to. Should be overloaded by subclasses to give
|
||||
* somewhere to post to.
|
||||
*
|
||||
* @return string URL to post to
|
||||
*/
|
||||
|
||||
function action()
|
||||
{
|
||||
return common_local_url('addmirror');
|
||||
}
|
||||
|
||||
/**
|
||||
* Class of the form.
|
||||
*
|
||||
* @return string the form's class
|
||||
*/
|
||||
|
||||
function formClass()
|
||||
{
|
||||
return 'form_settings';
|
||||
}
|
||||
|
||||
}
|
189
plugins/SubMirror/lib/editmirrorform.php
Normal file
189
plugins/SubMirror/lib/editmirrorform.php
Normal file
@ -0,0 +1,189 @@
|
||||
<?php
|
||||
/**
|
||||
* StatusNet, the distributed open-source microblogging tool
|
||||
* 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/>.
|
||||
*
|
||||
* @package StatusNet
|
||||
* @copyright 2010 StatusNet, Inc.
|
||||
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
|
||||
* @link http://status.net/
|
||||
*/
|
||||
|
||||
if (!defined('STATUSNET') && !defined('LACONICA')) {
|
||||
exit(1);
|
||||
}
|
||||
|
||||
class EditMirrorForm extends Form
|
||||
{
|
||||
function __construct($action, $profile)
|
||||
{
|
||||
parent::__construct($action);
|
||||
|
||||
$this->profile = clone($profile);
|
||||
$this->user = common_current_user();
|
||||
$this->mirror = SubMirror::pkeyGet(array('subscriber' => $this->user->id,
|
||||
'subscribed' => $this->profile->id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Name of the form
|
||||
*
|
||||
* Sub-classes should overload this with the name of their form.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function formLegend()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Visible or invisible data elements
|
||||
*
|
||||
* Display the form fields that make up the data of the form.
|
||||
* Sub-classes should overload this to show their data.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
|
||||
function formData()
|
||||
{
|
||||
$this->out->elementStart('fieldset');
|
||||
|
||||
$this->out->hidden('profile', $this->profile->id);
|
||||
|
||||
$this->out->elementStart('div', array('style' => 'float: left; width: 80px;'));
|
||||
$img = $this->getAvatar($this->profile);
|
||||
$feed = $this->getFeed($this->profile);
|
||||
$this->out->elementStart('a', array('href' => $this->profile->profileurl));
|
||||
$this->out->element('img', array('src' => $img, 'style' => 'float: left'));
|
||||
$this->out->elementEnd('a');
|
||||
$this->out->elementEnd('div');
|
||||
|
||||
|
||||
$this->out->elementStart('div', array('style' => 'margin-left: 80px; margin-right: 20px'));
|
||||
$this->out->elementStart('p');
|
||||
$this->out->elementStart('div');
|
||||
$this->out->element('a', array('href' => $this->profile->profileurl), $this->profile->getBestName());
|
||||
$this->out->elementEnd('div');
|
||||
$this->out->elementStart('div');
|
||||
if ($feed) {
|
||||
$this->out->text(_m('LABEL', 'Remote feed:') . ' ');
|
||||
//$this->out->element('a', array('href' => $feed), $feed);
|
||||
$this->out->element('input', array('value' => $feed, 'readonly' => 'readonly', 'style' => 'width: 100%'));
|
||||
} else {
|
||||
$this->out->text(_m('LABEL', 'Local user'));
|
||||
}
|
||||
$this->out->elementEnd('div');
|
||||
$this->out->elementEnd('p');
|
||||
|
||||
$this->out->elementStart('fieldset', array('style' => 'margin-top: 20px'));
|
||||
$this->out->element('legend', false, _m("Mirroring style"));
|
||||
|
||||
$styles = array('repeat' => _m("Repeat: reference the original user's post (sometimes shows as 'RT @blah')"),
|
||||
'copy' => _m("Repost the content under my account"));
|
||||
foreach ($styles as $key => $label) {
|
||||
$this->out->elementStart('div');
|
||||
$attribs = array('type' => 'radio',
|
||||
'value' => $key,
|
||||
'name' => 'style',
|
||||
'id' => $this->id() . '-style');
|
||||
if ($key == $this->mirror->style || ($key == 'repeat' && empty($this->mirror->style))) {
|
||||
$attribs['checked'] = 'checked';
|
||||
}
|
||||
$this->out->element('input', $attribs);
|
||||
$this->out->element('span', false, $label); // @fixme should be label, but the styles muck it up for now
|
||||
$this->out->elementEnd('div');
|
||||
|
||||
}
|
||||
$this->out->elementEnd('fieldset');
|
||||
|
||||
|
||||
$this->out->elementStart('div');
|
||||
$this->out->submit($this->id() . '-save', _m('Save'));
|
||||
$this->out->element('input', array('type' => 'submit',
|
||||
'value' => _m('Stop mirroring'),
|
||||
'name' => 'delete',
|
||||
'class' => 'submit'));
|
||||
$this->out->elementEnd('div');
|
||||
|
||||
$this->out->elementEnd('div');
|
||||
$this->out->elementEnd('fieldset');
|
||||
}
|
||||
|
||||
private function getAvatar($profile)
|
||||
{
|
||||
$avatar = $this->profile->getAvatar(48);
|
||||
if ($avatar) {
|
||||
return $avatar->displayUrl();
|
||||
} else {
|
||||
return Avatar::defaultImage(48);
|
||||
}
|
||||
}
|
||||
|
||||
private function getFeed($profile)
|
||||
{
|
||||
// Ok this is a bit of a hack. ;)
|
||||
if (class_exists('Ostatus_profile')) {
|
||||
$oprofile = Ostatus_profile::staticGet('profile_id', $profile->id);
|
||||
if ($oprofile) {
|
||||
return $oprofile->feeduri;
|
||||
}
|
||||
}
|
||||
var_dump('wtf');
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* ID of the form
|
||||
*
|
||||
* Should be unique on the page. Sub-classes should overload this
|
||||
* to show their own IDs.
|
||||
*
|
||||
* @return string ID of the form
|
||||
*/
|
||||
|
||||
function id()
|
||||
{
|
||||
return 'edit-mirror-form-' . $this->profile->id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Action of the form.
|
||||
*
|
||||
* URL to post to. Should be overloaded by subclasses to give
|
||||
* somewhere to post to.
|
||||
*
|
||||
* @return string URL to post to
|
||||
*/
|
||||
|
||||
function action()
|
||||
{
|
||||
return common_local_url('editmirror');
|
||||
}
|
||||
|
||||
/**
|
||||
* Class of the form.
|
||||
*
|
||||
* @return string the form's class
|
||||
*/
|
||||
|
||||
function formClass()
|
||||
{
|
||||
return 'form_settings';
|
||||
}
|
||||
|
||||
}
|
45
plugins/SubMirror/lib/mirrorqueuehandler.php
Normal file
45
plugins/SubMirror/lib/mirrorqueuehandler.php
Normal file
@ -0,0 +1,45 @@
|
||||
<?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/>.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Check for subscription mirroring options on each newly seen post!
|
||||
*
|
||||
* @package SubMirror
|
||||
* @author Brion Vibber <brion@status.net>
|
||||
*/
|
||||
|
||||
class MirrorQueueHandler extends QueueHandler
|
||||
{
|
||||
function transport()
|
||||
{
|
||||
return 'mirror';
|
||||
}
|
||||
|
||||
function handle($notice)
|
||||
{
|
||||
$mirror = new SubMirror();
|
||||
$mirror->subscribed = $notice->profile_id;
|
||||
if ($mirror->find()) {
|
||||
while ($mirror->fetch()) {
|
||||
$mirror->mirrorNotice($notice);
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user