Merge branch 'master' into 1.0.x

This commit is contained in:
Evan Prodromou 2010-08-13 14:33:41 -07:00
commit 7183175429
78 changed files with 11330 additions and 2668 deletions

41
README
View File

@ -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

View File

@ -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 {

View File

@ -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();
}

View File

@ -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);
}

View File

@ -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);
}
/**

View File

@ -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);

View File

@ -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.)
),
);

View File

@ -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) {

View File

@ -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'),

View File

@ -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');

View File

@ -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 ".

View File

@ -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(' ');

View File

@ -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'");

View File

@ -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)) {

View File

@ -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

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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"

File diff suppressed because it is too large Load Diff

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 didentification 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 lenregistrement 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 dautres 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"

View File

@ -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 ""

View File

@ -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."

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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"

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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

View File

@ -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 "Забелешката е повторена"

View File

@ -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 ""

View File

@ -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"

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 ""

View File

@ -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 "Допис повторили"

View File

@ -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

View File

@ -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;
}
}
}

View File

@ -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.

View File

@ -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

View File

@ -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.");

View File

@ -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,

View File

@ -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');

View File

@ -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();
}

View File

@ -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.

View File

@ -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),
);
}

View File

@ -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');
}
}

View File

@ -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";

View File

@ -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
{

View File

@ -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');

View 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;
}
}

View 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."));
}
}
}

View 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();
}

View 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);
}
}
}

View 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()
{
}
}

View 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));
}
}

View 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';
}
}

View 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';
}
}

View 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;
}
}