Merge remote-tracking branch 'gitorious/1.0.x' into 1.0.x

This commit is contained in:
Evan Prodromou 2011-04-08 16:14:09 -04:00
commit bfc33f3999
57 changed files with 497 additions and 399 deletions

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Stream of notices for the user's inbox * Stream of notices for the user's inbox
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class InboxNoticeStream extends ScopingNoticeStream class InboxNoticeStream extends ScopingNoticeStream
{ {
/** /**
@ -133,4 +132,4 @@ class RawInboxNoticeStream extends NoticeStream
return $ids; return $ids;
} }
} }

View File

@ -131,6 +131,7 @@ class oEmbedHelper
} }
if (empty($api)) { if (empty($api)) {
// TRANS: Server exception thrown in oEmbed action if no API endpoint is available.
throw new ServerException(_('No oEmbed API endpoint available.')); throw new ServerException(_('No oEmbed API endpoint available.'));
} }

View File

@ -108,6 +108,7 @@ class EchoPlugin extends Plugin
'author' => 'Zach Copley', 'author' => 'Zach Copley',
'homepage' => 'http://status.net/wiki/Plugin:Echo', 'homepage' => 'http://status.net/wiki/Plugin:Echo',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin description.
_m('Use <a href="http://aboutecho.com/">Echo</a>'. _m('Use <a href="http://aboutecho.com/">Echo</a>'.
' to add commenting to notice pages.')); ' to add commenting to notice pages.'));
return true; return true;

View File

@ -57,6 +57,7 @@ class EmailAuthenticationPlugin extends Plugin
'author' => 'Craig Andrews', 'author' => 'Craig Andrews',
'homepage' => 'http://status.net/wiki/Plugin:EmailAuthentication', 'homepage' => 'http://status.net/wiki/Plugin:EmailAuthentication',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin description.
_m('The Email Authentication plugin allows users to login using their email address.')); _m('The Email Authentication plugin allows users to login using their email address.'));
return true; return true;
} }

View File

@ -1,7 +1,8 @@
The Email Authentication plugin allows users to login using their email address. The Email Authentication plugin allows users to login using their email address.
The provided email address is used to lookup the user's nickname, then that nickname and the provided password is checked. The provided email address is used to lookup the user's nickname, then that
nickname and the provided password is checked.
Installation Installation
============ ============
add "addPlugin('emailAuthentication');" to the bottom of your config.php add "addPlugin('emailAuthentication');" to the bottom of your config.php.

View File

@ -43,7 +43,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class EmailSummaryPlugin extends Plugin class EmailSummaryPlugin extends Plugin
{ {
/** /**
@ -51,13 +50,11 @@ class EmailSummaryPlugin extends Plugin
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onCheckSchema() function onCheckSchema()
{ {
$schema = Schema::get(); $schema = Schema::get();
// For storing user-submitted flags on profiles // For storing user-submitted flags on profiles
$schema->ensureTable('email_summary_status', $schema->ensureTable('email_summary_status',
array(new ColumnDef('user_id', 'integer', null, array(new ColumnDef('user_id', 'integer', null,
false, 'PRI'), false, 'PRI'),
@ -80,9 +77,8 @@ class EmailSummaryPlugin extends Plugin
* @param string $cls Name of the class to be loaded * @param string $cls Name of the class to be loaded
* *
* @return boolean hook value; true means continue processing, false means stop. * @return boolean hook value; true means continue processing, false means stop.
* *
*/ */
function onAutoload($cls) function onAutoload($cls)
{ {
$dir = dirname(__FILE__); $dir = dirname(__FILE__);
@ -107,9 +103,7 @@ class EmailSummaryPlugin extends Plugin
* @param array &$versions array of version data * @param array &$versions array of version data
* *
* @return boolean hook value; true means continue processing, false means stop. * @return boolean hook value; true means continue processing, false means stop.
*
*/ */
function onPluginVersion(&$versions) function onPluginVersion(&$versions)
{ {
$versions[] = array('name' => 'EmailSummary', $versions[] = array('name' => 'EmailSummary',
@ -117,86 +111,84 @@ class EmailSummaryPlugin extends Plugin
'author' => 'Evan Prodromou', 'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:EmailSummary', 'homepage' => 'http://status.net/wiki/Plugin:EmailSummary',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin description.
_m('Send an email summary of the inbox to users.')); _m('Send an email summary of the inbox to users.'));
return true; return true;
} }
/** /**
* Register our queue handlers * Register our queue handlers
* *
* @param QueueManager $qm Current queue manager * @param QueueManager $qm Current queue manager
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onEndInitializeQueueManager($qm) function onEndInitializeQueueManager($qm)
{ {
$qm->connect('sitesum', 'SiteEmailSummaryHandler'); $qm->connect('sitesum', 'SiteEmailSummaryHandler');
$qm->connect('usersum', 'UserEmailSummaryHandler'); $qm->connect('usersum', 'UserEmailSummaryHandler');
return true; return true;
} }
/** /**
* Add a checkbox to turn off email summaries * Add a checkbox to turn off email summaries
* *
* @param Action $action Action being executed (emailsettings) * @param Action $action Action being executed (emailsettings)
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onEndEmailFormData($action) function onEndEmailFormData($action)
{ {
$user = common_current_user(); $user = common_current_user();
$action->elementStart('li'); $action->elementStart('li');
$action->checkbox('emailsummary', $action->checkbox('emailsummary',
// TRANS: Checkbox label in e-mail preferences form. // TRANS: Checkbox label in e-mail preferences form.
_m('Send me a periodic summary of updates from my network.'), _m('Send me a periodic summary of updates from my network'),
Email_summary_status::getSendSummary($user->id)); Email_summary_status::getSendSummary($user->id));
$action->elementEnd('li'); $action->elementEnd('li');
return true; return true;
} }
/** /**
* Add a checkbox to turn off email summaries * Add a checkbox to turn off email summaries
* *
* @param Action $action Action being executed (emailsettings) * @param Action $action Action being executed (emailsettings)
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onEndEmailSaveForm($action) function onEndEmailSaveForm($action)
{ {
$sendSummary = $action->boolean('emailsummary'); $sendSummary = $action->boolean('emailsummary');
$user = common_current_user(); $user = common_current_user();
if (!empty($user)) { if (!empty($user)) {
$ess = Email_summary_status::staticGet('user_id', $user->id); $ess = Email_summary_status::staticGet('user_id', $user->id);
if (empty($ess)) { if (empty($ess)) {
$ess = new Email_summary_status(); $ess = new Email_summary_status();
$ess->user_id = $user->id; $ess->user_id = $user->id;
$ess->send_summary = $sendSummary; $ess->send_summary = $sendSummary;
$ess->created = common_sql_now(); $ess->created = common_sql_now();
$ess->modified = common_sql_now(); $ess->modified = common_sql_now();
$ess->insert(); $ess->insert();
} else { } else {
$orig = clone($ess); $orig = clone($ess);
$ess->send_summary = $sendSummary; $ess->send_summary = $sendSummary;
$ess->modified = common_sql_now(); $ess->modified = common_sql_now();
$ess->update($orig); $ess->update($orig);
} }
} }
return true; return true;
} }
} }

View File

@ -35,7 +35,7 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
/** /**
* Data class for email summaries * Data class for email summaries
* *
* Email summary information for users * Email summary information for users
* *
* @category Action * @category Action
@ -46,7 +46,6 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
* *
* @see DB_DataObject * @see DB_DataObject
*/ */
class Email_summary_status extends Memcached_DataObject class Email_summary_status extends Memcached_DataObject
{ {
public $__table = 'email_summary_status'; // table name public $__table = 'email_summary_status'; // table name
@ -78,7 +77,6 @@ class Email_summary_status extends Memcached_DataObject
* *
* @return array array of column definitions * @return array array of column definitions
*/ */
function table() function table()
{ {
return array('user_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, return array('user_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
@ -93,7 +91,6 @@ class Email_summary_status extends Memcached_DataObject
* *
* @return array list of key field names * @return array list of key field names
*/ */
function keys() function keys()
{ {
return array_keys($this->keyTypes()); return array_keys($this->keyTypes());
@ -121,7 +118,6 @@ class Email_summary_status extends Memcached_DataObject
* *
* @return array magic three-false array that stops auto-incrementing. * @return array magic three-false array that stops auto-incrementing.
*/ */
function sequenceKey() function sequenceKey()
{ {
return array(false, false, false); return array(false, false, false);
@ -134,7 +130,6 @@ class Email_summary_status extends Memcached_DataObject
* *
* @return int flag for whether to send this user a summary email * @return int flag for whether to send this user a summary email
*/ */
static function getSendSummary($user_id) static function getSendSummary($user_id)
{ {
$ess = Email_summary_status::staticGet('user_id', $user_id); $ess = Email_summary_status::staticGet('user_id', $user_id);
@ -153,11 +148,10 @@ class Email_summary_status extends Memcached_DataObject
* *
* @return Email_summary_status instance for this user, with count already incremented. * @return Email_summary_status instance for this user, with count already incremented.
*/ */
static function getLastSummaryID($user_id) static function getLastSummaryID($user_id)
{ {
$ess = Email_summary_status::staticGet('user_id', $user_id); $ess = Email_summary_status::staticGet('user_id', $user_id);
if (!empty($ess)) { if (!empty($ess)) {
return $ess->last_summary_id; return $ess->last_summary_id;
} else { } else {

View File

@ -1,7 +1,7 @@
<?php <?php
/* /*
* StatusNet - the distributed open-source microblogging tool * StatusNet - the distributed open-source microblogging tool
* *
* Handler for queue items of type 'sitesum', sends email summaries * Handler for queue items of type 'sitesum', sends email summaries
* to all users on the site. * to all users on the site.
* *
@ -31,7 +31,7 @@ if (!defined('STATUSNET')) {
} }
/** /**
* *
* Handler for queue items of type 'sitesum', sends email summaries * Handler for queue items of type 'sitesum', sends email summaries
* to all users on the site. * to all users on the site.
* *
@ -42,7 +42,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class SiteEmailSummaryHandler extends QueueHandler class SiteEmailSummaryHandler extends QueueHandler
{ {
@ -55,7 +54,6 @@ class SiteEmailSummaryHandler extends QueueHandler
* *
* @return string * @return string
*/ */
function transport() function transport()
{ {
return 'sitesum'; return 'sitesum';
@ -63,21 +61,20 @@ class SiteEmailSummaryHandler extends QueueHandler
/** /**
* Handle the site * Handle the site
* *
* @param mixed $object * @param mixed $object
* @return boolean true on success, false on failure * @return boolean true on success, false on failure
*/ */
function handle($object) function handle($object)
{ {
$qm = QueueManager::get(); $qm = QueueManager::get();
try { try {
// Enqueue a summary for all users // Enqueue a summary for all users
$user = new User(); $user = new User();
$user->find(); $user->find();
while ($user->fetch()) { while ($user->fetch()) {
try { try {
$qm->enqueue($user->id, 'usersum'); $qm->enqueue($user->id, 'usersum');
@ -89,8 +86,7 @@ class SiteEmailSummaryHandler extends QueueHandler
} catch (Exception $e) { } catch (Exception $e) {
common_log(LOG_WARNING, $e->getMessage()); common_log(LOG_WARNING, $e->getMessage());
} }
return true; return true;
} }
} }

View File

@ -1,7 +1,7 @@
<?php <?php
/** /**
* StatusNet - the distributed open-source microblogging tool * StatusNet - the distributed open-source microblogging tool
* *
* Handler for queue items of type 'usersum', sends an email summaries * Handler for queue items of type 'usersum', sends an email summaries
* to a particular user. * to a particular user.
* *
@ -41,13 +41,11 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class UserEmailSummaryHandler extends QueueHandler class UserEmailSummaryHandler extends QueueHandler
{ {
// Maximum number of notices to include by default. This is probably too much. // Maximum number of notices to include by default. This is probably too much.
const MAX_NOTICES = 200; const MAX_NOTICES = 200;
/** /**
* Return transport keyword which identifies items this queue handler * Return transport keyword which identifies items this queue handler
* services; must be defined for all subclasses. * services; must be defined for all subclasses.
@ -57,7 +55,6 @@ class UserEmailSummaryHandler extends QueueHandler
* *
* @return string * @return string
*/ */
function transport() function transport()
{ {
return 'sitesum'; return 'sitesum';
@ -65,47 +62,46 @@ class UserEmailSummaryHandler extends QueueHandler
/** /**
* Send a summary email to the user * Send a summary email to the user
* *
* @param mixed $object * @param mixed $object
* @return boolean true on success, false on failure * @return boolean true on success, false on failure
*/ */
function handle($user_id) function handle($user_id)
{ {
// Skip if they've asked not to get summaries // Skip if they've asked not to get summaries
$ess = Email_summary_status::staticGet('user_id', $user_id); $ess = Email_summary_status::staticGet('user_id', $user_id);
if (!empty($ess) && !$ess->send_summary) { if (!empty($ess) && !$ess->send_summary) {
common_log(LOG_INFO, sprintf('Not sending email summary for user %s by request.', $user_id)); common_log(LOG_INFO, sprintf('Not sending email summary for user %s by request.', $user_id));
return true; return true;
} }
$since_id = null; $since_id = null;
if (!empty($ess)) { if (!empty($ess)) {
$since_id = $ess->last_summary_id; $since_id = $ess->last_summary_id;
} }
$user = User::staticGet('id', $user_id); $user = User::staticGet('id', $user_id);
if (empty($user)) { if (empty($user)) {
common_log(LOG_INFO, sprintf('Not sending email summary for user %s; no such user.', $user_id)); common_log(LOG_INFO, sprintf('Not sending email summary for user %s; no such user.', $user_id));
return true; return true;
} }
if (empty($user->email)) { if (empty($user->email)) {
common_log(LOG_INFO, sprintf('Not sending email summary for user %s; no email address.', $user_id)); common_log(LOG_INFO, sprintf('Not sending email summary for user %s; no email address.', $user_id));
return true; return true;
} }
$profile = $user->getProfile(); $profile = $user->getProfile();
if (empty($profile)) { if (empty($profile)) {
common_log(LOG_WARNING, sprintf('Not sending email summary for user %s; no profile.', $user_id)); common_log(LOG_WARNING, sprintf('Not sending email summary for user %s; no profile.', $user_id));
return true; return true;
} }
$notice = $user->ownFriendsTimeline(0, self::MAX_NOTICES, $since_id); $notice = $user->ownFriendsTimeline(0, self::MAX_NOTICES, $since_id);
if (empty($notice) || $notice->N == 0) { if (empty($notice) || $notice->N == 0) {
@ -117,18 +113,20 @@ class UserEmailSummaryHandler extends QueueHandler
// figuring out a better way. -ESP // figuring out a better way. -ESP
$new_top = null; $new_top = null;
if ($notice instanceof ArrayWrapper) { if ($notice instanceof ArrayWrapper) {
$new_top = $notice->_items[0]->id; $new_top = $notice->_items[0]->id;
} }
$out = new XMLStringer(); $out = new XMLStringer();
$out->elementStart('div', array('width' => '100%', $out->elementStart('div', array('width' => '100%',
'style' => 'background-color: #ffffff; border: 4px solid #4c609a; padding: 10px;')); 'style' => 'background-color: #ffffff; border: 4px solid #4c609a; padding: 10px;'));
$out->elementStart('div', array('style' => 'color: #ffffff; background-color: #4c609a; font-weight: bold; margin-bottom: 10px; padding: 4px;')); $out->elementStart('div', array('style' => 'color: #ffffff; background-color: #4c609a; font-weight: bold; margin-bottom: 10px; padding: 4px;'));
$out->raw(sprintf(_m('Recent updates from %1s for %2s:'), // TRANS: Text in e-mail summary.
// TRANS: %1$s is the StatusNet sitename, %2$s is the recipient's profile name.
$out->raw(sprintf(_m('Recent updates from %1$s for %2s:'),
common_config('site', 'name'), common_config('site', 'name'),
$profile->getBestName())); $profile->getBestName()));
$out->elementEnd('div'); $out->elementEnd('div');
@ -137,13 +135,12 @@ class UserEmailSummaryHandler extends QueueHandler
'style' => 'border: none; border-collapse: collapse;', 'cellpadding' => '6')); 'style' => 'border: none; border-collapse: collapse;', 'cellpadding' => '6'));
while ($notice->fetch()) { while ($notice->fetch()) {
$profile = Profile::staticGet('id', $notice->profile_id); $profile = Profile::staticGet('id', $notice->profile_id);
if (empty($profile)) { if (empty($profile)) {
continue; continue;
} }
$avatar = $profile->getAvatar(AVATAR_STREAM_SIZE); $avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
$out->elementStart('tr'); $out->elementStart('tr');
@ -191,7 +188,7 @@ class UserEmailSummaryHandler extends QueueHandler
$out->elementEnd('td'); $out->elementEnd('td');
$out->elementEnd('tr'); $out->elementEnd('tr');
} }
$out->elementEnd('table'); $out->elementEnd('table');
$out->raw(sprintf(_m('<p><a href="%1s">change your email settings for %2s</a></p>'), $out->raw(sprintf(_m('<p><a href="%1s">change your email settings for %2s</a></p>'),
@ -199,35 +196,32 @@ class UserEmailSummaryHandler extends QueueHandler
common_config('site', 'name'))); common_config('site', 'name')));
$out->elementEnd('div'); $out->elementEnd('div');
$body = $out->getString(); $body = $out->getString();
// FIXME: do something for people who don't like HTML email // FIXME: do something for people who don't like HTML email
mail_to_user($user, _m('Updates from your network'), $body, mail_to_user($user, _m('Updates from your network'), $body,
array('Content-Type' => 'text/html; charset=UTF-8')); array('Content-Type' => 'text/html; charset=UTF-8'));
if (empty($ess)) { if (empty($ess)) {
$ess = new Email_summary_status(); $ess = new Email_summary_status();
$ess->user_id = $user_id; $ess->user_id = $user_id;
$ess->created = common_sql_now(); $ess->created = common_sql_now();
$ess->last_summary_id = $new_top; $ess->last_summary_id = $new_top;
$ess->modified = common_sql_now(); $ess->modified = common_sql_now();
$ess->insert(); $ess->insert();
} else { } else {
$orig = clone($ess); $orig = clone($ess);
$ess->last_summary_id = $new_top; $ess->last_summary_id = $new_top;
$ess->modified = common_sql_now(); $ess->modified = common_sql_now();
$ess->update($orig); $ess->update($orig);
} }
return true; return true;
} }
} }

View File

@ -23,7 +23,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
/** /**
* Queue handler for watching new notices and posting to enjit. * Queue handler for watching new notices and posting to enjit.
* @fixme is this actually being used/functional atm? * @todo FIXME: Is this actually being used/functional atm?
*/ */
class EnjitQueueHandler extends QueueHandler class EnjitQueueHandler extends QueueHandler
{ {

View File

@ -105,7 +105,6 @@ class EventPlugin extends MicroappPlugin
* *
* @return boolean hook value; true means continue processing, false means stop. * @return boolean hook value; true means continue processing, false means stop.
*/ */
function onRouterInitialized($m) function onRouterInitialized($m)
{ {
$m->connect('main/event/new', $m->connect('main/event/new',
@ -130,12 +129,14 @@ class EventPlugin extends MicroappPlugin
'author' => 'Evan Prodromou', 'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:Event', 'homepage' => 'http://status.net/wiki/Plugin:Event',
'description' => 'description' =>
// TRANS: Plugin description.
_m('Event invitations and RSVPs.')); _m('Event invitations and RSVPs.'));
return true; return true;
} }
function appTitle() { function appTitle() {
return _m('Event'); // TRANS: Title for event application.
return _m('TITLE','Event');
} }
function tag() { function tag() {
@ -162,12 +163,13 @@ class EventPlugin extends MicroappPlugin
function saveNoticeFromActivity($activity, $actor, $options=array()) function saveNoticeFromActivity($activity, $actor, $options=array())
{ {
if (count($activity->objects) != 1) { if (count($activity->objects) != 1) {
throw new Exception('Too many activity objects.'); throw new Exception(_('Too many activity objects.'));
} }
$happeningObj = $activity->objects[0]; $happeningObj = $activity->objects[0];
if ($happeningObj->type != Happening::OBJECT_TYPE) { if ($happeningObj->type != Happening::OBJECT_TYPE) {
// TRANS: Exception thrown when event plugin comes across a non-event type object.
throw new Exception(_m('Wrong type for object.')); throw new Exception(_m('Wrong type for object.'));
} }
@ -175,8 +177,8 @@ class EventPlugin extends MicroappPlugin
switch ($activity->verb) { switch ($activity->verb) {
case ActivityVerb::POST: case ActivityVerb::POST:
$notice = Happening::saveNew($actor, $notice = Happening::saveNew($actor,
$start_time, $start_time,
$end_time, $end_time,
$happeningObj->title, $happeningObj->title,
null, null,
@ -189,12 +191,14 @@ class EventPlugin extends MicroappPlugin
$happening = Happening::staticGet('uri', $happeningObj->id); $happening = Happening::staticGet('uri', $happeningObj->id);
if (empty($happening)) { if (empty($happening)) {
// FIXME: save the event // FIXME: save the event
// TRANS: Exception thrown when trying to RSVP for an unknown event.
throw new Exception(_m('RSVP for unknown event.')); throw new Exception(_m('RSVP for unknown event.'));
} }
$notice = RSVP::saveNew($actor, $happening, $activity->verb, $options); $notice = RSVP::saveNew($actor, $happening, $activity->verb, $options);
break; break;
default: default:
throw new Exception(_m('Unknown verb for events')); // TRANS: Exception thrown when event plugin comes across a undefined verb.
throw new Exception(_m('Unknown verb for events.'));
} }
return $notice; return $notice;
@ -207,7 +211,6 @@ class EventPlugin extends MicroappPlugin
* *
* @return ActivityObject * @return ActivityObject
*/ */
function activityObjectFromNotice($notice) function activityObjectFromNotice($notice)
{ {
$happening = null; $happening = null;
@ -225,12 +228,14 @@ class EventPlugin extends MicroappPlugin
} }
if (empty($happening)) { if (empty($happening)) {
// TRANS: Exception thrown when event plugin comes across a unknown object type.
throw new Exception(_m('Unknown object type.')); throw new Exception(_m('Unknown object type.'));
} }
$notice = $happening->getNotice(); $notice = $happening->getNotice();
if (empty($notice)) { if (empty($notice)) {
// TRANS: Exception thrown when referring to a notice that is not an event an in event context.
throw new Exception(_m('Unknown event notice.')); throw new Exception(_m('Unknown event notice.'));
} }
@ -264,7 +269,6 @@ class EventPlugin extends MicroappPlugin
* *
* @return ActivityObject * @return ActivityObject
*/ */
function onEndNoticeAsActivity($notice, &$act) { function onEndNoticeAsActivity($notice, &$act) {
switch ($notice->object_type) { switch ($notice->object_type) {
case RSVP::POSITIVE: case RSVP::POSITIVE:
@ -282,7 +286,6 @@ class EventPlugin extends MicroappPlugin
* @param Notice $notice * @param Notice $notice
* @param HTMLOutputter $out * @param HTMLOutputter $out
*/ */
function showNotice($notice, $out) function showNotice($notice, $out)
{ {
switch ($notice->object_type) { switch ($notice->object_type) {
@ -372,6 +375,7 @@ class EventPlugin extends MicroappPlugin
$out->elementStart('div', 'event-times'); // VEVENT/EVENT-TIMES IN $out->elementStart('div', 'event-times'); // VEVENT/EVENT-TIMES IN
// TRANS: Field label for event description.
$out->element('strong', null, _m('Time:')); $out->element('strong', null, _m('Time:'));
$out->element('abbr', array('class' => 'dtstart', $out->element('abbr', array('class' => 'dtstart',
@ -392,6 +396,7 @@ class EventPlugin extends MicroappPlugin
if (!empty($event->location)) { if (!empty($event->location)) {
$out->elementStart('div', 'event-location'); $out->elementStart('div', 'event-location');
// TRANS: Field label for event description.
$out->element('strong', null, _m('Location:')); $out->element('strong', null, _m('Location:'));
$out->element('span', 'location', $event->location); $out->element('span', 'location', $event->location);
$out->elementEnd('div'); $out->elementEnd('div');
@ -399,6 +404,7 @@ class EventPlugin extends MicroappPlugin
if (!empty($event->description)) { if (!empty($event->description)) {
$out->elementStart('div', 'event-description'); $out->elementStart('div', 'event-description');
// TRANS: Field label for event description.
$out->element('strong', null, _m('Description:')); $out->element('strong', null, _m('Description:'));
$out->element('span', 'description', $event->description); $out->element('span', 'description', $event->description);
$out->elementEnd('div'); $out->elementEnd('div');
@ -407,6 +413,7 @@ class EventPlugin extends MicroappPlugin
$rsvps = $event->getRSVPs(); $rsvps = $event->getRSVPs();
$out->elementStart('div', 'event-rsvps'); $out->elementStart('div', 'event-rsvps');
// TRANS: Field label for event description.
$out->element('strong', null, _m('Attending:')); $out->element('strong', null, _m('Attending:'));
$out->element('span', 'event-rsvps', $out->element('span', 'event-rsvps',
// TRANS: RSVP counts. // TRANS: RSVP counts.
@ -440,7 +447,6 @@ class EventPlugin extends MicroappPlugin
* @param HTMLOutputter $out * @param HTMLOutputter $out
* @return Widget * @return Widget
*/ */
function entryForm($out) function entryForm($out)
{ {
return new EventForm($out); return new EventForm($out);
@ -451,7 +457,6 @@ class EventPlugin extends MicroappPlugin
* *
* @param Notice $notice * @param Notice $notice
*/ */
function deleteRelated($notice) function deleteRelated($notice)
{ {
switch ($notice->object_type) { switch ($notice->object_type) {

View File

@ -47,7 +47,6 @@ if (!defined('STATUSNET')) {
* *
* @see Managed_DataObject * @see Managed_DataObject
*/ */
class Happening extends Managed_DataObject class Happening extends Managed_DataObject
{ {
const OBJECT_TYPE = 'http://activitystrea.ms/schema/1.0/event'; const OBJECT_TYPE = 'http://activitystrea.ms/schema/1.0/event';
@ -122,6 +121,7 @@ class Happening extends Managed_DataObject
if (array_key_exists('uri', $options)) { if (array_key_exists('uri', $options)) {
$other = Happening::staticGet('uri', $options['uri']); $other = Happening::staticGet('uri', $options['uri']);
if (!empty($other)) { if (!empty($other)) {
// TRANS: Client exception thrown when trying to create an event that already exists.
throw new ClientException(_m('Event already exists.')); throw new ClientException(_m('Event already exists.'));
} }
} }
@ -163,6 +163,9 @@ class Happening extends Managed_DataObject
$location, $location,
$description); $description);
// TRANS: Rendered event description. %1$s is a title, %2$s is start time, %3$s is start time,
// TRANS: %4$s is end time, %5$s is end time, %6$s is location, %7$s is description.
// TRANS: Class names should not be translated.
$rendered = sprintf(_m('<span class="vevent">'. $rendered = sprintf(_m('<span class="vevent">'.
'<span class="summary">%1$s</span> '. '<span class="summary">%1$s</span> '.
'<abbr class="dtstart" title="%2$s">%3$s</a> - '. '<abbr class="dtstart" title="%2$s">%3$s</a> - '.

View File

@ -42,7 +42,6 @@ if (!defined('STATUSNET')) {
* *
* @see Managed_DataObject * @see Managed_DataObject
*/ */
class RSVP extends Managed_DataObject class RSVP extends Managed_DataObject
{ {
const POSITIVE = 'http://activitystrea.ms/schema/1.0/rsvp-yes'; const POSITIVE = 'http://activitystrea.ms/schema/1.0/rsvp-yes';
@ -64,7 +63,6 @@ class RSVP extends Managed_DataObject
* @param mixed $v Value to lookup * @param mixed $v Value to lookup
* *
* @return RSVP object found, or null for no hits * @return RSVP object found, or null for no hits
*
*/ */
function staticGet($k, $v=null) function staticGet($k, $v=null)
{ {
@ -77,7 +75,6 @@ class RSVP extends Managed_DataObject
* @param array $kv array of key-value mappings * @param array $kv array of key-value mappings
* *
* @return Bookmark object found, or null for no hits * @return Bookmark object found, or null for no hits
*
*/ */
function pkeyGet($kv) function pkeyGet($kv)
@ -141,6 +138,7 @@ class RSVP extends Managed_DataObject
if (array_key_exists('uri', $options)) { if (array_key_exists('uri', $options)) {
$other = RSVP::staticGet('uri', $options['uri']); $other = RSVP::staticGet('uri', $options['uri']);
if (!empty($other)) { if (!empty($other)) {
// TRANS: Client exception thrown when trying to save an already existing RSVP ("please respond").
throw new ClientException(_m('RSVP already exists.')); throw new ClientException(_m('RSVP already exists.'));
} }
} }
@ -149,6 +147,7 @@ class RSVP extends Managed_DataObject
'event_id' => $event->id)); 'event_id' => $event->id));
if (!empty($other)) { if (!empty($other)) {
// TRANS: Client exception thrown when trying to save an already existing RSVP ("please respond").
throw new ClientException(_m('RSVP already exists.')); throw new ClientException(_m('RSVP already exists.'));
} }
@ -179,7 +178,7 @@ class RSVP extends Managed_DataObject
// XXX: come up with something sexier // XXX: come up with something sexier
$content = $rsvp->asString(); $content = $rsvp->asString();
$rendered = $rsvp->asHTML(); $rendered = $rsvp->asHTML();
$options = array_merge(array('object_type' => $verb), $options = array_merge(array('object_type' => $verb),
@ -217,7 +216,8 @@ class RSVP extends Managed_DataObject
return '?'; return '?';
break; break;
default: default:
throw new Exception(sprintf(_m('Unknown verb "%s"'),$verb)); // TRANS: Exception thrown when requesting an undefined verb for RSVP.
throw new Exception(sprintf(_m('Unknown verb "%s".'),$verb));
} }
} }
@ -234,6 +234,7 @@ class RSVP extends Managed_DataObject
return RSVP::POSSIBLE; return RSVP::POSSIBLE;
break; break;
default: default:
// TRANS: Exception thrown when requesting an undefined code for RSVP.
throw new Exception(sprintf(_m('Unknown code "%s".'),$code)); throw new Exception(sprintf(_m('Unknown code "%s".'),$code));
} }
} }
@ -242,6 +243,8 @@ class RSVP extends Managed_DataObject
{ {
$notice = Notice::staticGet('uri', $this->uri); $notice = Notice::staticGet('uri', $this->uri);
if (empty($notice)) { if (empty($notice)) {
// TRANS: Server exception thrown when requesting a non-exsting notice for an RSVP ("please respond").
// TRANS: %s is the RSVP with the missing notice.
throw new ServerException(sprintf(_m('RSVP %s does not correspond to a notice in the database.'),$this->id)); throw new ServerException(sprintf(_m('RSVP %s does not correspond to a notice in the database.'),$this->id));
} }
return $notice; return $notice;
@ -297,6 +300,8 @@ class RSVP extends Managed_DataObject
{ {
$profile = Profile::staticGet('id', $this->profile_id); $profile = Profile::staticGet('id', $this->profile_id);
if (empty($profile)) { if (empty($profile)) {
// TRANS: Exception thrown when requesting a non-existing profile.
// TRANS: %s is the ID of the non-existing profile.
throw new Exception(sprintf(_m('No profile with ID %s.'),$this->profile_id)); throw new Exception(sprintf(_m('No profile with ID %s.'),$this->profile_id));
} }
return $profile; return $profile;
@ -306,6 +311,8 @@ class RSVP extends Managed_DataObject
{ {
$event = Happening::staticGet('id', $this->event_id); $event = Happening::staticGet('id', $this->event_id);
if (empty($event)) { if (empty($event)) {
// TRANS: Exception thrown when requesting a non-existing event.
// TRANS: %s is the ID of the non-existing event.
throw new Exception(sprintf(_m('No event with ID %s.'),$this->event_id)); throw new Exception(sprintf(_m('No event with ID %s.'),$this->event_id));
} }
return $event; return $event;
@ -335,21 +342,34 @@ class RSVP extends Managed_DataObject
switch ($response) { switch ($response) {
case 'Y': case 'Y':
// TRANS: HTML version of an RSVP ("please respond") status for a user.
// TRANS: %1$s is a profile URL, %2$s a profile name,
// TRANS: %3$s is an event URL, %4$s an event title.
$fmt = _m("<span class='automatic event-rsvp'><a href='%1\$s'>%2\$s</a> is attending <a href='%3\$s'>%4\$s</a>.</span>"); $fmt = _m("<span class='automatic event-rsvp'><a href='%1\$s'>%2\$s</a> is attending <a href='%3\$s'>%4\$s</a>.</span>");
break; break;
case 'N': case 'N':
// TRANS: HTML version of an RSVP ("please respond") status for a user.
// TRANS: %1$s is a profile URL, %2$s a profile name,
// TRANS: %3$s is an event URL, %4$s an event title.
$fmt = _m("<span class='automatic event-rsvp'><a href='%1\$s'>%2\$s</a> is not attending <a href='%3\$s'>%4\$s</a>.</span>"); $fmt = _m("<span class='automatic event-rsvp'><a href='%1\$s'>%2\$s</a> is not attending <a href='%3\$s'>%4\$s</a>.</span>");
break; break;
case '?': case '?':
// TRANS: HTML version of an RSVP ("please respond") status for a user.
// TRANS: %1$s is a profile URL, %2$s a profile name,
// TRANS: %3$s is an event URL, %4$s an event title.
$fmt = _m("<span class='automatic event-rsvp'><a href='%1\$s'>%2\$s</a> might attend <a href='%3\$s'>%4\$s</a>.</span>"); $fmt = _m("<span class='automatic event-rsvp'><a href='%1\$s'>%2\$s</a> might attend <a href='%3\$s'>%4\$s</a>.</span>");
break; break;
default: default:
// TRANS: Exception thrown when requesting a user's RSVP status for a non-existing response code.
// TRANS: %s is the non-existing response code.
throw new Exception(sprintf(_m('Unknown response code %s.'),$response)); throw new Exception(sprintf(_m('Unknown response code %s.'),$response));
break; break;
} }
if (empty($event)) { if (empty($event)) {
$eventUrl = '#'; $eventUrl = '#';
// TRANS: Used as event title when not event title is available.
// TRANS: Used as: Username [is [not ] attending|might attend] an unknown event.
$eventTitle = _m('an unknown event'); $eventTitle = _m('an unknown event');
} else { } else {
$notice = $event->getNotice(); $notice = $event->getNotice();
@ -370,20 +390,30 @@ class RSVP extends Managed_DataObject
switch ($response) { switch ($response) {
case 'Y': case 'Y':
// TRANS: Plain text version of an RSVP ("please respond") status for a user.
// TRANS: %1$s is a profile name, %2$s is an event title.
$fmt = _m('%1$s is attending %2$s.'); $fmt = _m('%1$s is attending %2$s.');
break; break;
case 'N': case 'N':
// TRANS: Plain text version of an RSVP ("please respond") status for a user.
// TRANS: %1$s is a profile name, %2$s is an event title.
$fmt = _m('%1$s is not attending %2$s.'); $fmt = _m('%1$s is not attending %2$s.');
break; break;
case '?': case '?':
// TRANS: Plain text version of an RSVP ("please respond") status for a user.
// TRANS: %1$s is a profile name, %2$s is an event title.
$fmt = _m('%1$s might attend %2$s.'); $fmt = _m('%1$s might attend %2$s.');
break; break;
default: default:
// TRANS: Exception thrown when requesting a user's RSVP status for a non-existing response code.
// TRANS: %s is the non-existing response code.
throw new Exception(sprintf(_m('Unknown response code %s.'),$response)); throw new Exception(sprintf(_m('Unknown response code %s.'),$response));
break; break;
} }
if (empty($event)) { if (empty($event)) {
// TRANS: Used as event title when not event title is available.
// TRANS: Used as: Username [is [not ] attending|might attend] an unknown event.
$eventTitle = _m('an unknown event'); $eventTitle = _m('an unknown event');
} else { } else {
$notice = $event->getNotice(); $notice = $event->getNotice();

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Cancel the RSVP for an event * Cancel the RSVP for an event
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -27,6 +27,7 @@
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
if (!defined('STATUSNET')) { if (!defined('STATUSNET')) {
// This check helps protect against security problems; // This check helps protect against security problems;
// your code file can't be executed directly from the web. // your code file can't be executed directly from the web.
@ -43,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class CancelrsvpAction extends Action class CancelrsvpAction extends Action
{ {
protected $user = null; protected $user = null;
@ -55,10 +55,10 @@ class CancelrsvpAction extends Action
* *
* @return string Action title * @return string Action title
*/ */
function title() function title()
{ {
return _m('Cancel RSVP'); // TRANS: Title for RSVP ("please respond") action.
return _m('TITLE','Cancel RSVP');
} }
/** /**
@ -68,7 +68,6 @@ class CancelrsvpAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -79,24 +78,28 @@ class CancelrsvpAction extends Action
$rsvpId = $this->trimmed('rsvp'); $rsvpId = $this->trimmed('rsvp');
if (empty($rsvpId)) { if (empty($rsvpId)) {
// TRANS: Client exception thrown when referring to a non-existing RSVP ("please respond") item.
throw new ClientException(_m('No such RSVP.')); throw new ClientException(_m('No such RSVP.'));
} }
$this->rsvp = RSVP::staticGet('id', $rsvpId); $this->rsvp = RSVP::staticGet('id', $rsvpId);
if (empty($this->rsvp)) { if (empty($this->rsvp)) {
// TRANS: Client exception thrown when referring to a non-existing RSVP ("please respond") item.
throw new ClientException(_m('No such RSVP.')); throw new ClientException(_m('No such RSVP.'));
} }
$this->event = Happening::staticGet('id', $this->rsvp->event_id); $this->event = Happening::staticGet('id', $this->rsvp->event_id);
if (empty($this->event)) { if (empty($this->event)) {
// TRANS: Client exception thrown when referring to a non-existing event.
throw new ClientException(_m('No such event.')); throw new ClientException(_m('No such event.'));
} }
$this->user = common_current_user(); $this->user = common_current_user();
if (empty($this->user)) { if (empty($this->user)) {
// TRANS: Client exception thrown when trying tp RSVP ("please respond") while not logged in.
throw new ClientException(_m('You must be logged in to RSVP for an event.')); throw new ClientException(_m('You must be logged in to RSVP for an event.'));
} }
@ -110,7 +113,6 @@ class CancelrsvpAction extends Action
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -129,7 +131,6 @@ class CancelrsvpAction extends Action
* *
* @return void * @return void
*/ */
function cancelRSVP() function cancelRSVP()
{ {
try { try {
@ -171,7 +172,6 @@ class CancelrsvpAction extends Action
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
if (!empty($this->error)) { if (!empty($this->error)) {
@ -194,7 +194,6 @@ class CancelrsvpAction extends Action
* *
* @return boolean is read only action? * @return boolean is read only action?
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
if ($_SERVER['REQUEST_METHOD'] == 'GET' || if ($_SERVER['REQUEST_METHOD'] == 'GET' ||

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Form to RSVP for an event * Form to RSVP for an event
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class CancelRSVPForm extends Form class CancelRSVPForm extends Form
{ {
protected $rsvp = null; protected $rsvp = null;
@ -60,7 +59,6 @@ class CancelRSVPForm extends Form
* *
* @return int ID of the form * @return int ID of the form
*/ */
function id() function id()
{ {
return 'form_event_rsvp'; return 'form_event_rsvp';
@ -71,7 +69,6 @@ class CancelRSVPForm extends Form
* *
* @return string class of the form * @return string class of the form
*/ */
function formClass() function formClass()
{ {
return 'ajax'; return 'ajax';
@ -82,7 +79,6 @@ class CancelRSVPForm extends Form
* *
* @return string URL of the action * @return string URL of the action
*/ */
function action() function action()
{ {
return common_local_url('cancelrsvp'); return common_local_url('cancelrsvp');
@ -93,7 +89,6 @@ class CancelRSVPForm extends Form
* *
* @return void * @return void
*/ */
function formData() function formData()
{ {
$this->out->elementStart('fieldset', array('id' => 'new_rsvp_data')); $this->out->elementStart('fieldset', array('id' => 'new_rsvp_data'));
@ -102,12 +97,15 @@ class CancelRSVPForm extends Form
switch (RSVP::verbFor($this->rsvp->response)) { switch (RSVP::verbFor($this->rsvp->response)) {
case RSVP::POSITIVE: case RSVP::POSITIVE:
// TRANS: Possible status for RSVP ("please respond") item.
$this->out->text(_m('You will attend this event.')); $this->out->text(_m('You will attend this event.'));
break; break;
case RSVP::NEGATIVE: case RSVP::NEGATIVE:
// TRANS: Possible status for RSVP ("please respond") item.
$this->out->text(_m('You will not attend this event.')); $this->out->text(_m('You will not attend this event.'));
break; break;
case RSVP::POSSIBLE: case RSVP::POSSIBLE:
// TRANS: Possible status for RSVP ("please respond") item.
$this->out->text(_m('You might attend this event.')); $this->out->text(_m('You might attend this event.'));
break; break;
} }
@ -120,9 +118,9 @@ class CancelRSVPForm extends Form
* *
* @return void * @return void
*/ */
function formActions() function formActions()
{ {
// TRANS: Button text to cancel responding to an RSVP ("please respond") item.
$this->out->submit('cancel', _m('BUTTON', 'Cancel')); $this->out->submit('cancel', _m('BUTTON', 'Cancel'));
} }
} }

View File

@ -6,4 +6,3 @@
.event-title { margin-left: 0px; } .event-title { margin-left: 0px; }
#content .event .entry-title { margin-left: 0px; } #content .event .entry-title { margin-left: 0px; }
#content .event .entry-content { margin-left: 0px; } #content .event .entry-content { margin-left: 0px; }

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Form for entering an event * Form for entering an event
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class EventForm extends Form class EventForm extends Form
{ {
/** /**
@ -52,7 +51,6 @@ class EventForm extends Form
* *
* @return int ID of the form * @return int ID of the form
*/ */
function id() function id()
{ {
return 'form_new_event'; return 'form_new_event';
@ -63,7 +61,6 @@ class EventForm extends Form
* *
* @return string class of the form * @return string class of the form
*/ */
function formClass() function formClass()
{ {
return 'form_settings ajax-notice'; return 'form_settings ajax-notice';
@ -74,7 +71,6 @@ class EventForm extends Form
* *
* @return string URL of the action * @return string URL of the action
*/ */
function action() function action()
{ {
return common_local_url('newevent'); return common_local_url('newevent');
@ -85,7 +81,6 @@ class EventForm extends Form
* *
* @return void * @return void
*/ */
function formData() function formData()
{ {
$this->out->elementStart('fieldset', array('id' => 'new_bookmark_data')); $this->out->elementStart('fieldset', array('id' => 'new_bookmark_data'));
@ -93,57 +88,73 @@ class EventForm extends Form
$this->li(); $this->li();
$this->out->input('title', $this->out->input('title',
// TRANS: Field label on event form.
_m('LABEL','Title'), _m('LABEL','Title'),
null, null,
// TRANS: Field title on event form.
_m('Title of the event.')); _m('Title of the event.'));
$this->unli(); $this->unli();
$this->li(); $this->li();
$this->out->input('startdate', $this->out->input('startdate',
// TRANS: Field label on event form.
_m('LABEL','Start date'), _m('LABEL','Start date'),
null, null,
// TRANS: Field title on event form.
_m('Date the event starts.')); _m('Date the event starts.'));
$this->unli(); $this->unli();
$this->li(); $this->li();
$this->out->input('starttime', $this->out->input('starttime',
// TRANS: Field label on event form.
_m('LABEL','Start time'), _m('LABEL','Start time'),
null, null,
// TRANS: Field title on event form.
_m('Time the event starts.')); _m('Time the event starts.'));
$this->unli(); $this->unli();
$this->li(); $this->li();
$this->out->input('enddate', $this->out->input('enddate',
// TRANS: Field label on event form.
_m('LABEL','End date'), _m('LABEL','End date'),
null, null,
// TRANS: Field title on event form.
_m('Date the event ends.')); _m('Date the event ends.'));
$this->unli(); $this->unli();
$this->li(); $this->li();
$this->out->input('endtime', $this->out->input('endtime',
// TRANS: Field label on event form.
_m('LABEL','End time'), _m('LABEL','End time'),
null, null,
// TRANS: Field title on event form.
_m('Time the event ends.')); _m('Time the event ends.'));
$this->unli(); $this->unli();
$this->li(); $this->li();
$this->out->input('location', $this->out->input('location',
// TRANS: Field label on event form.
_m('LABEL','Location'), _m('LABEL','Location'),
null, null,
// TRANS: Field title on event form.
_m('Event location.')); _m('Event location.'));
$this->unli(); $this->unli();
$this->li(); $this->li();
$this->out->input('url', $this->out->input('url',
// TRANS: Field label on event form.
_m('LABEL','URL'), _m('LABEL','URL'),
null, null,
// TRANS: Field title on event form.
_m('URL for more information.')); _m('URL for more information.'));
$this->unli(); $this->unli();
$this->li(); $this->li();
$this->out->input('description', $this->out->input('description',
// TRANS: Field label on event form.
_m('LABEL','Description'), _m('LABEL','Description'),
null, null,
// TRANS: Field title on event form.
_m('Description of the event.')); _m('Description of the event.'));
$this->unli(); $this->unli();
@ -162,9 +173,9 @@ class EventForm extends Form
* *
* @return void * @return void
*/ */
function formActions() function formActions()
{ {
// TRANS: Button text to save an event..
$this->out->submit('submit', _m('BUTTON', 'Save')); $this->out->submit('submit', _m('BUTTON', 'Save'));
} }
} }

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Add a new event * Add a new event
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -27,6 +27,7 @@
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
if (!defined('STATUSNET')) { if (!defined('STATUSNET')) {
// This check helps protect against security problems; // This check helps protect against security problems;
// your code file can't be executed directly from the web. // your code file can't be executed directly from the web.
@ -43,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class NeweventAction extends Action class NeweventAction extends Action
{ {
protected $user = null; protected $user = null;
@ -60,10 +60,10 @@ class NeweventAction extends Action
* *
* @return string Action title * @return string Action title
*/ */
function title() function title()
{ {
return _m('New event'); // TRANS: Title for new event form.
return _m('TITLE','New event');
} }
/** /**
@ -73,7 +73,6 @@ class NeweventAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -81,6 +80,7 @@ class NeweventAction extends Action
$this->user = common_current_user(); $this->user = common_current_user();
if (empty($this->user)) { if (empty($this->user)) {
// TRANS: Client exception thrown when trying to post an event while not logged in.
throw new ClientException(_m('Must be logged in to post a event.'), throw new ClientException(_m('Must be logged in to post a event.'),
403); 403);
} }
@ -92,6 +92,7 @@ class NeweventAction extends Action
$this->title = $this->trimmed('title'); $this->title = $this->trimmed('title');
if (empty($this->title)) { if (empty($this->title)) {
// TRANS: Client exception thrown when trying to post an event without providing a title.
throw new ClientException(_m('Title required.')); throw new ClientException(_m('Title required.'));
} }
@ -102,6 +103,7 @@ class NeweventAction extends Action
$startDate = $this->trimmed('startdate'); $startDate = $this->trimmed('startdate');
if (empty($startDate)) { if (empty($startDate)) {
// TRANS: Client exception thrown when trying to post an event without providing a start date.
throw new ClientException(_m('Start date required.')); throw new ClientException(_m('Start date required.'));
} }
@ -114,6 +116,7 @@ class NeweventAction extends Action
$endDate = $this->trimmed('enddate'); $endDate = $this->trimmed('enddate');
if (empty($endDate)) { if (empty($endDate)) {
// TRANS: Client exception thrown when trying to post an event without providing an end date.
throw new ClientException(_m('End date required.')); throw new ClientException(_m('End date required.'));
} }
@ -135,12 +138,16 @@ class NeweventAction extends Action
$this->endTime = strtotime($end); $this->endTime = strtotime($end);
if ($this->startTime == 0) { if ($this->startTime == 0) {
// TRANS: Client exception thrown when trying to post an event with a date that cannot be processed.
// TRANS: %s is the data that could not be processed.
throw new Exception(sprintf(_m('Could not parse date "%s".'), throw new Exception(sprintf(_m('Could not parse date "%s".'),
$start)); $start));
} }
if ($this->endTime == 0) { if ($this->endTime == 0) {
// TRANS: Client exception thrown when trying to post an event with a date that cannot be processed.
// TRANS: %s is the data that could not be processed.
throw new Exception(sprintf(_m('Could not parse date "%s".'), throw new Exception(sprintf(_m('Could not parse date "%s".'),
$end)); $end));
} }
@ -155,7 +162,6 @@ class NeweventAction extends Action
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -174,19 +180,21 @@ class NeweventAction extends Action
* *
* @return void * @return void
*/ */
function newEvent() function newEvent()
{ {
try { try {
if (empty($this->title)) { if (empty($this->title)) {
// TRANS: Client exception thrown when trying to post an event without providing a title.
throw new ClientException(_m('Event must have a title.')); throw new ClientException(_m('Event must have a title.'));
} }
if (empty($this->startTime)) { if (empty($this->startTime)) {
// TRANS: Client exception thrown when trying to post an event without providing a start time.
throw new ClientException(_m('Event must have a start time.')); throw new ClientException(_m('Event must have a start time.'));
} }
if (empty($this->endTime)) { if (empty($this->endTime)) {
// TRANS: Client exception thrown when trying to post an event without providing an end time.
throw new ClientException(_m('Event must have an end time.')); throw new ClientException(_m('Event must have an end time.'));
} }
@ -195,7 +203,7 @@ class NeweventAction extends Action
// Does the heavy-lifting for getting "To:" information // Does the heavy-lifting for getting "To:" information
ToSelector::fillOptions($this, $options); ToSelector::fillOptions($this, $options);
$profile = $this->user->getProfile(); $profile = $this->user->getProfile();
$saved = Happening::saveNew($profile, $saved = Happening::saveNew($profile,
@ -239,7 +247,6 @@ class NeweventAction extends Action
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
if (!empty($this->error)) { if (!empty($this->error)) {
@ -262,7 +269,6 @@ class NeweventAction extends Action
* *
* @return boolean is read only action? * @return boolean is read only action?
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
if ($_SERVER['REQUEST_METHOD'] == 'GET' || if ($_SERVER['REQUEST_METHOD'] == 'GET' ||

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* RSVP for an event * RSVP for an event
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -27,6 +27,7 @@
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
if (!defined('STATUSNET')) { if (!defined('STATUSNET')) {
// This check helps protect against security problems; // This check helps protect against security problems;
// your code file can't be executed directly from the web. // your code file can't be executed directly from the web.
@ -43,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class NewrsvpAction extends Action class NewrsvpAction extends Action
{ {
protected $user = null; protected $user = null;
@ -55,10 +55,10 @@ class NewrsvpAction extends Action
* *
* @return string Action title * @return string Action title
*/ */
function title() function title()
{ {
return _m('New RSVP'); // TRANS: Title for RSVP ("please respond") action.
return _m('TITLE','New RSVP');
} }
/** /**
@ -68,7 +68,6 @@ class NewrsvpAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -79,18 +78,21 @@ class NewrsvpAction extends Action
$eventId = $this->trimmed('event'); $eventId = $this->trimmed('event');
if (empty($eventId)) { if (empty($eventId)) {
// TRANS: Client exception thrown when requesting a non-exsting event.
throw new ClientException(_m('No such event.')); throw new ClientException(_m('No such event.'));
} }
$this->event = Happening::staticGet('id', $eventId); $this->event = Happening::staticGet('id', $eventId);
if (empty($this->event)) { if (empty($this->event)) {
// TRANS: Client exception thrown when requesting a non-exsting event.
throw new ClientException(_m('No such event.')); throw new ClientException(_m('No such event.'));
} }
$this->user = common_current_user(); $this->user = common_current_user();
if (empty($this->user)) { if (empty($this->user)) {
// TRANS: Client exception thrown when trying to RSVP ("please respond") while not logged in.
throw new ClientException(_m('You must be logged in to RSVP for an event.')); throw new ClientException(_m('You must be logged in to RSVP for an event.'));
} }
@ -107,7 +109,8 @@ class NewrsvpAction extends Action
$this->verb = RSVP::POSSIBLE; $this->verb = RSVP::POSSIBLE;
break; break;
default: default:
throw new ClientException('Unknown submit value.'); // TRANS: Client exception thrown when using an invalud value for RSVP ("please respond").
throw new ClientException(_('Unknown submit value.'));
} }
return true; return true;
@ -120,7 +123,6 @@ class NewrsvpAction extends Action
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -139,7 +141,6 @@ class NewrsvpAction extends Action
* *
* @return void * @return void
*/ */
function newRSVP() function newRSVP()
{ {
try { try {
@ -158,7 +159,7 @@ class NewrsvpAction extends Action
$this->xw->startDocument('1.0', 'UTF-8'); $this->xw->startDocument('1.0', 'UTF-8');
$this->elementStart('html'); $this->elementStart('html');
$this->elementStart('head'); $this->elementStart('head');
// TRANS: Page title after sending a notice. // TRANS: Page title after creating an event.
$this->element('title', null, _m('Event saved')); $this->element('title', null, _m('Event saved'));
$this->elementEnd('head'); $this->elementEnd('head');
$this->elementStart('body'); $this->elementStart('body');
@ -178,7 +179,6 @@ class NewrsvpAction extends Action
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
if (!empty($this->error)) { if (!empty($this->error)) {
@ -201,7 +201,6 @@ class NewrsvpAction extends Action
* *
* @return boolean is read only action? * @return boolean is read only action?
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
if ($_SERVER['REQUEST_METHOD'] == 'GET' || if ($_SERVER['REQUEST_METHOD'] == 'GET' ||

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Form to RSVP for an event * Form to RSVP for an event
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class RSVPForm extends Form class RSVPForm extends Form
{ {
protected $event = null; protected $event = null;
@ -60,7 +59,6 @@ class RSVPForm extends Form
* *
* @return int ID of the form * @return int ID of the form
*/ */
function id() function id()
{ {
return 'form_event_rsvp'; return 'form_event_rsvp';
@ -71,7 +69,6 @@ class RSVPForm extends Form
* *
* @return string class of the form * @return string class of the form
*/ */
function formClass() function formClass()
{ {
return 'ajax'; return 'ajax';
@ -82,7 +79,6 @@ class RSVPForm extends Form
* *
* @return string URL of the action * @return string URL of the action
*/ */
function action() function action()
{ {
return common_local_url('newrsvp'); return common_local_url('newrsvp');
@ -93,11 +89,11 @@ class RSVPForm extends Form
* *
* @return void * @return void
*/ */
function formData() function formData()
{ {
$this->out->elementStart('fieldset', array('id' => 'new_rsvp_data')); $this->out->elementStart('fieldset', array('id' => 'new_rsvp_data'));
// TRANS: Field label on form to RSVP ("please respond") for an event.
$this->out->text(_m('RSVP:')); $this->out->text(_m('RSVP:'));
$this->out->hidden('event', $this->event->id); $this->out->hidden('event', $this->event->id);
@ -111,14 +107,16 @@ class RSVPForm extends Form
* *
* @return void * @return void
*/ */
function formActions() function formActions()
{ {
// TRANS: Button text for RSVP ("please respond") reply to confirm attendence.
$this->submitButton('yes', _m('BUTTON', 'Yes')); $this->submitButton('yes', _m('BUTTON', 'Yes'));
// TRANS: Button text for RSVP ("please respond") reply to deny attendence.
$this->submitButton('no', _m('BUTTON', 'No')); $this->submitButton('no', _m('BUTTON', 'No'));
// TRANS: Button text for RSVP ("please respond") reply to indicate one might attend.
$this->submitButton('maybe', _m('BUTTON', 'Maybe')); $this->submitButton('maybe', _m('BUTTON', 'Maybe'));
} }
function submitButton($id, $label) function submitButton($id, $label)
{ {
$this->out->element('input', array('type' => 'submit', $this->out->element('input', array('type' => 'submit',

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Show a single event * Show a single event
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc. * Copyright (C) 2010, StatusNet, Inc.
* *
* Show a single RSVP * Show a single RSVP
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify

View File

@ -29,7 +29,6 @@ if (!defined('STATUSNET')) {
*/ */
class ExtendedProfilePlugin extends Plugin class ExtendedProfilePlugin extends Plugin
{ {
function onPluginVersion(&$versions) function onPluginVersion(&$versions)
{ {
$versions[] = array( $versions[] = array(
@ -37,8 +36,8 @@ class ExtendedProfilePlugin extends Plugin
'version' => STATUSNET_VERSION, 'version' => STATUSNET_VERSION,
'author' => 'Brion Vibber, Samantha Doherty, Zach Copley', 'author' => 'Brion Vibber, Samantha Doherty, Zach Copley',
'homepage' => 'http://status.net/wiki/Plugin:ExtendedProfile', 'homepage' => 'http://status.net/wiki/Plugin:ExtendedProfile',
'rawdescription' => _m( // TRANS: Plugin description.
'UI extensions for additional profile fields.') 'rawdescription' => _m('UI extensions for additional profile fields.')
); );
return true; return true;
@ -120,9 +119,9 @@ class ExtendedProfilePlugin extends Plugin
$user = User::staticGet('id', $profile->id); $user = User::staticGet('id', $profile->id);
if ($user) { if ($user) {
$url = common_local_url('profiledetail', array('nickname' => $user->nickname)); $url = common_local_url('profiledetail', array('nickname' => $user->nickname));
// TRANS: Link text on user profile page leading to extended profile page.
$out->element('a', array('href' => $url, 'class' => 'profiledetail'), _m('More details...')); $out->element('a', array('href' => $url, 'class' => 'profiledetail'), _m('More details...'));
} }
return true; return true;
} }
} }

View File

@ -80,7 +80,6 @@ class Profile_detail extends Managed_DataObject
* @return User_greeting_count object found, or null for no hits * @return User_greeting_count object found, or null for no hits
* *
*/ */
function staticGet($k, $v=null) function staticGet($k, $v=null)
{ {
return Memcached_DataObject::staticGet('Profile_detail', $k, $v); return Memcached_DataObject::staticGet('Profile_detail', $k, $v);
@ -98,7 +97,6 @@ class Profile_detail extends Managed_DataObject
* @return Bookmark object found, or null for no hits * @return Bookmark object found, or null for no hits
* *
*/ */
function pkeyGet($kv) function pkeyGet($kv)
{ {
return Memcached_DataObject::pkeyGet('Profile_detail', $kv); return Memcached_DataObject::pkeyGet('Profile_detail', $kv);
@ -107,6 +105,7 @@ class Profile_detail extends Managed_DataObject
static function schemaDef() static function schemaDef()
{ {
return array( return array(
// No need for i18n. Table properties.
'description' 'description'
=> 'Additional profile details for the ExtendedProfile plugin', => 'Additional profile details for the ExtendedProfile plugin',
'fields' => array( 'fields' => array(
@ -138,5 +137,4 @@ class Profile_detail extends Managed_DataObject
) )
); );
} }
} }

View File

@ -116,6 +116,7 @@ class ExtendedProfile
if (empty($phones)) { if (empty($phones)) {
$pArrays[] = array( $pArrays[] = array(
// TRANS: Field label for extended profile properties.
'label' => _m('Phone'), 'label' => _m('Phone'),
'index' => 0, 'index' => 0,
'type' => 'phone', 'type' => 'phone',
@ -126,6 +127,7 @@ class ExtendedProfile
} else { } else {
for ($i = 0; $i < sizeof($phones); $i++) { for ($i = 0; $i < sizeof($phones); $i++) {
$pa = array( $pa = array(
// TRANS: Field label for extended profile properties.
'label' => _m('Phone'), 'label' => _m('Phone'),
'type' => 'phone', 'type' => 'phone',
'index' => intval($phones[$i]->value_index), 'index' => intval($phones[$i]->value_index),
@ -147,12 +149,14 @@ class ExtendedProfile
if (empty($ims)) { if (empty($ims)) {
$iArrays[] = array( $iArrays[] = array(
// TRANS: Field label for extended profile properties (Instant Messaging).
'label' => _m('IM'), 'label' => _m('IM'),
'type' => 'im' 'type' => 'im'
); );
} else { } else {
for ($i = 0; $i < sizeof($ims); $i++) { for ($i = 0; $i < sizeof($ims); $i++) {
$ia = array( $ia = array(
// TRANS: Field label for extended profile properties (Instant Messaging).
'label' => _m('IM'), 'label' => _m('IM'),
'type' => 'im', 'type' => 'im',
'index' => intval($ims[$i]->value_index), 'index' => intval($ims[$i]->value_index),
@ -173,12 +177,14 @@ class ExtendedProfile
if (empty($sites)) { if (empty($sites)) {
$wArrays[] = array( $wArrays[] = array(
// TRANS: Field label for extended profile properties.
'label' => _m('Website'), 'label' => _m('Website'),
'type' => 'website' 'type' => 'website'
); );
} else { } else {
for ($i = 0; $i < sizeof($sites); $i++) { for ($i = 0; $i < sizeof($sites); $i++) {
$wa = array( $wa = array(
// TRANS: Field label for extended profile properties.
'label' => _m('Website'), 'label' => _m('Website'),
'type' => 'website', 'type' => 'website',
'index' => intval($sites[$i]->value_index), 'index' => intval($sites[$i]->value_index),
@ -202,6 +208,7 @@ class ExtendedProfile
if (empty($companies)) { if (empty($companies)) {
$eArrays[] = array( $eArrays[] = array(
// TRANS: Field label for extended profile properties.
'label' => _m('Employer'), 'label' => _m('Employer'),
'type' => 'experience', 'type' => 'experience',
'company' => null, 'company' => null,
@ -213,6 +220,7 @@ class ExtendedProfile
} else { } else {
for ($i = 0; $i < sizeof($companies); $i++) { for ($i = 0; $i < sizeof($companies); $i++) {
$ea = array( $ea = array(
// TRANS: Field label for extended profile properties.
'label' => _m('Employer'), 'label' => _m('Employer'),
'type' => 'experience', 'type' => 'experience',
'company' => $companies[$i]->field_value, 'company' => $companies[$i]->field_value,
@ -239,6 +247,7 @@ class ExtendedProfile
if (empty($schools)) { if (empty($schools)) {
$iArrays[] = array( $iArrays[] = array(
'type' => 'education', 'type' => 'education',
// TRANS: Field label for extended profile properties.
'label' => _m('Institution'), 'label' => _m('Institution'),
'school' => null, 'school' => null,
'degree' => null, 'degree' => null,
@ -251,6 +260,7 @@ class ExtendedProfile
for ($i = 0; $i < sizeof($schools); $i++) { for ($i = 0; $i < sizeof($schools); $i++) {
$ia = array( $ia = array(
'type' => 'education', 'type' => 'education',
// TRANS: Field label for extended profile properties.
'label' => _m('Institution'), 'label' => _m('Institution'),
'school' => $schools[$i]->field_value, 'school' => $schools[$i]->field_value,
'degree' => isset($degrees[$i]->field_value) ? $degrees[$i]->field_value : null, 'degree' => isset($degrees[$i]->field_value) ? $degrees[$i]->field_value : null,
@ -275,32 +285,39 @@ class ExtendedProfile
{ {
return array( return array(
'basic' => array( 'basic' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Personal'), 'label' => _m('Personal'),
'fields' => array( 'fields' => array(
'fullname' => array( 'fullname' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Full name'), 'label' => _m('Full name'),
'profile' => 'fullname', 'profile' => 'fullname',
'vcard' => 'fn', 'vcard' => 'fn',
), ),
'title' => array( 'title' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Title'), 'label' => _m('Title'),
'vcard' => 'title', 'vcard' => 'title',
), ),
'manager' => array( 'manager' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Manager'), 'label' => _m('Manager'),
'type' => 'person', 'type' => 'person',
'vcard' => 'x-manager', 'vcard' => 'x-manager',
), ),
'location' => array( 'location' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Location'), 'label' => _m('Location'),
'profile' => 'location' 'profile' => 'location'
), ),
'bio' => array( 'bio' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Bio'), 'label' => _m('Bio'),
'type' => 'textarea', 'type' => 'textarea',
'profile' => 'bio', 'profile' => 'bio',
), ),
'tags' => array( 'tags' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Tags'), 'label' => _m('Tags'),
'type' => 'tags', 'type' => 'tags',
'profile' => 'tags', 'profile' => 'tags',
@ -308,6 +325,7 @@ class ExtendedProfile
), ),
), ),
'contact' => array( 'contact' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Contact'), 'label' => _m('Contact'),
'fields' => array( 'fields' => array(
'phone' => $this->getPhones(), 'phone' => $this->getPhones(),
@ -316,29 +334,35 @@ class ExtendedProfile
), ),
), ),
'personal' => array( 'personal' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Personal'), 'label' => _m('Personal'),
'fields' => array( 'fields' => array(
'birthday' => array( 'birthday' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Birthday'), 'label' => _m('Birthday'),
'type' => 'date', 'type' => 'date',
'vcard' => 'bday', 'vcard' => 'bday',
), ),
'spouse' => array( 'spouse' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Spouse\'s name'), 'label' => _m('Spouse\'s name'),
'vcard' => 'x-spouse', 'vcard' => 'x-spouse',
), ),
'kids' => array( 'kids' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Kids\' names') 'label' => _m('Kids\' names')
), ),
), ),
), ),
'experience' => array( 'experience' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Work experience'), 'label' => _m('Work experience'),
'fields' => array( 'fields' => array(
'experience' => $this->getExperiences() 'experience' => $this->getExperiences()
), ),
), ),
'education' => array( 'education' => array(
// TRANS: Field label for extended profile properties.
'label' => _m('Education'), 'label' => _m('Education'),
'fields' => array( 'fields' => array(
'education' => $this->getEducation() 'education' => $this->getEducation()

View File

@ -80,9 +80,11 @@ class ExtendedProfileWidget extends Form
// For JQuery UI modal dialog // For JQuery UI modal dialog
$this->out->elementStart( $this->out->elementStart(
'div', 'div',
array('id' => 'confirm-dialog', 'title' => 'Confirmation Required') // TRANS: Title for extended profile entry deletion dialog.
array('id' => 'confirm-dialog', 'title' => _m('Confirmation Required'))
); );
$this->out->text('Really delete this entry?'); // TRANS: Confirmation text for extended profile entry deletion dialog.
$this->out->text(_m('Really delete this entry?'));
$this->out->elementEnd('div'); $this->out->elementEnd('div');
$this->showSections(); $this->showSections();
} }
@ -163,7 +165,9 @@ class ExtendedProfileWidget extends Form
if (!empty($field['value'])) { if (!empty($field['value'])) {
$this->out->text($field['value']); $this->out->text($field['value']);
if (!empty($field['rel'])) { if (!empty($field['rel'])) {
$this->out->text(' (' . $field['rel'] . ')'); // TRANS: Value between parentheses (phone number, website, or IM address).
$outtext = sprintf(_m('(%s)'),$field['rel']);
$this->out->text(' '.$outtext);
} }
} }
$this->out->elementEnd('div'); $this->out->elementEnd('div');
@ -174,7 +178,9 @@ class ExtendedProfileWidget extends Form
$this->out->elementStart('div', array('class' => 'im-display')); $this->out->elementStart('div', array('class' => 'im-display'));
$this->out->text($field['value']); $this->out->text($field['value']);
if (!empty($field['rel'])) { if (!empty($field['rel'])) {
$this->out->text(' (' . $field['rel'] . ')'); // TRANS: Value between parentheses (phone number, website, or IM address).
$outtext = sprintf(_m('(%s)'),$field['rel']);
$this->out->text(' '.$outtext);
} }
$this->out->elementEnd('div'); $this->out->elementEnd('div');
} }
@ -196,7 +202,9 @@ class ExtendedProfileWidget extends Form
); );
if (!empty($field['rel'])) { if (!empty($field['rel'])) {
$this->out->text(' (' . $field['rel'] . ')'); // TRANS: Value between parentheses (phone number, website, or IM address).
$outtext = sprintf(_m('(%s)'),$field['rel']);
$this->out->text(' '.$outtext);
} }
$this->out->elementEnd('div'); $this->out->elementEnd('div');
} }
@ -314,11 +322,13 @@ class ExtendedProfileWidget extends Form
protected function showExperience($name, $field) protected function showExperience($name, $field)
{ {
$this->out->elementStart('div', 'experience-item'); $this->out->elementStart('div', 'experience-item');
// TRANS: Field label in experience area of extended profile.
$this->out->element('div', 'label', _m('Company')); $this->out->element('div', 'label', _m('Company'));
if (!empty($field['company'])) { if (!empty($field['company'])) {
$this->out->element('div', 'field', $field['company']); $this->out->element('div', 'field', $field['company']);
// TRANS: Field label in experience area of extended profile (when did one start a position).
$this->out->element('div', 'label', _m('Start')); $this->out->element('div', 'label', _m('Start'));
$this->out->element( $this->out->element(
'div', 'div',
@ -326,6 +336,7 @@ class ExtendedProfileWidget extends Form
date('j M Y', strtotime($field['start']) date('j M Y', strtotime($field['start'])
) )
); );
// TRANS: Field label in experience area of extended profile (when did one end a position).
$this->out->element('div', 'label', _m('End')); $this->out->element('div', 'label', _m('End'));
$this->out->element( $this->out->element(
'div', 'div',
@ -338,7 +349,8 @@ class ExtendedProfileWidget extends Form
$this->out->element( $this->out->element(
'div', 'div',
array('class' => 'field current'), array('class' => 'field current'),
'(' . _m('Current') . ')' // TRANS: Field value in experience area of extended profile (one still holds a position).
_m('(Current)')
); );
} }
} }
@ -356,6 +368,7 @@ class ExtendedProfileWidget extends Form
) )
); );
// TRANS: Field label in experience edit area of extended profile (which company does one work for).
$this->out->element('div', 'label', _m('Company')); $this->out->element('div', 'label', _m('Company'));
$this->out->input( $this->out->input(
$id, $id,
@ -363,6 +376,7 @@ class ExtendedProfileWidget extends Form
isset($field['company']) ? $field['company'] : null isset($field['company']) ? $field['company'] : null
); );
// TRANS: Field label in experience edit area of extended profile (when did one start at a company).
$this->out->element('div', 'label', _m('Start')); $this->out->element('div', 'label', _m('Start'));
$this->out->input( $this->out->input(
$id . '-start', $id . '-start',
@ -370,6 +384,7 @@ class ExtendedProfileWidget extends Form
isset($field['start']) ? date('j M Y', strtotime($field['start'])) : null isset($field['start']) ? date('j M Y', strtotime($field['start'])) : null
); );
// TRANS: Field label in experience edit area of extended profile (when did one terminate at a company).
$this->out->element('div', 'label', _m('End')); $this->out->element('div', 'label', _m('End'));
$this->out->input( $this->out->input(
@ -384,6 +399,7 @@ class ExtendedProfileWidget extends Form
$this->out->elementStart('div', 'current-checkbox'); $this->out->elementStart('div', 'current-checkbox');
$this->out->checkbox( $this->out->checkbox(
$id . '-current', $id . '-current',
// TRANS: Checkbox label in experience edit area of extended profile (one still works at a company).
_m('Current'), _m('Current'),
$field['current'] $field['current']
); );
@ -396,14 +412,17 @@ class ExtendedProfileWidget extends Form
protected function showEducation($name, $field) protected function showEducation($name, $field)
{ {
$this->out->elementStart('div', 'education-item'); $this->out->elementStart('div', 'education-item');
// TRANS: Field label in education area of extended profile.
$this->out->element('div', 'label', _m('Institution')); $this->out->element('div', 'label', _m('Institution'));
if (!empty($field['school'])) { if (!empty($field['school'])) {
$this->out->element('div', 'field', $field['school']); $this->out->element('div', 'field', $field['school']);
// TRANS: Field label in education area of extended profile.
$this->out->element('div', 'label', _m('Degree')); $this->out->element('div', 'label', _m('Degree'));
$this->out->element('div', 'field', $field['degree']); $this->out->element('div', 'field', $field['degree']);
// TRANS: Field label in education area of extended profile.
$this->out->element('div', 'label', _m('Description')); $this->out->element('div', 'label', _m('Description'));
$this->out->element('div', 'field', $field['description']); $this->out->element('div', 'field', $field['description']);
// TRANS: Field label in education area of extended profile (when did one start an education).
$this->out->element('div', 'label', _m('Start')); $this->out->element('div', 'label', _m('Start'));
$this->out->element( $this->out->element(
'div', 'div',
@ -411,6 +430,7 @@ class ExtendedProfileWidget extends Form
date('j M Y', strtotime($field['start']) date('j M Y', strtotime($field['start'])
) )
); );
// TRANS: Field label in education area of extended profile (when did one end a education).
$this->out->element('div', 'label', _m('End')); $this->out->element('div', 'label', _m('End'));
$this->out->element( $this->out->element(
'div', 'div',
@ -432,6 +452,7 @@ class ExtendedProfileWidget extends Form
'class' => 'education-item' 'class' => 'education-item'
) )
); );
// TRANS: Field label in education edit area of extended profile.
$this->out->element('div', 'label', _m('Institution')); $this->out->element('div', 'label', _m('Institution'));
$this->out->input( $this->out->input(
$id, $id,
@ -439,6 +460,7 @@ class ExtendedProfileWidget extends Form
isset($field['school']) ? $field['school'] : null isset($field['school']) ? $field['school'] : null
); );
// TRANS: Field label in education edit area of extended profile.
$this->out->element('div', 'label', _m('Degree')); $this->out->element('div', 'label', _m('Degree'));
$this->out->input( $this->out->input(
$id . '-degree', $id . '-degree',
@ -446,6 +468,7 @@ class ExtendedProfileWidget extends Form
isset($field['degree']) ? $field['degree'] : null isset($field['degree']) ? $field['degree'] : null
); );
// TRANS: Field label in education edit area of extended profile.
$this->out->element('div', 'label', _m('Description')); $this->out->element('div', 'label', _m('Description'));
$this->out->textarea( $this->out->textarea(
@ -454,17 +477,21 @@ class ExtendedProfileWidget extends Form
isset($field['description']) ? $field['description'] : null isset($field['description']) ? $field['description'] : null
); );
// TRANS: Field label in education edit area of extended profile (when did one start an education).
$this->out->element('div', 'label', _m('Start')); $this->out->element('div', 'label', _m('Start'));
$this->out->input( $this->out->input(
$id . '-start', $id . '-start',
null, null,
// @todo FIXME: does date format need i18n? If so, should probly be dealt with in core.
isset($field['start']) ? date('j M Y', strtotime($field['start'])) : null isset($field['start']) ? date('j M Y', strtotime($field['start'])) : null
); );
// TRANS: Field label in education edit area of extended profile (when did one end an education).
$this->out->element('div', 'label', _m('End')); $this->out->element('div', 'label', _m('End'));
$this->out->input( $this->out->input(
$id . '-end', $id . '-end',
null, null,
// @todo FIXME: does date format need i18n? If so, should probly be dealt with in core.
isset($field['end']) ? date('j M Y', strtotime($field['end'])) : null isset($field['end']) ? date('j M Y', strtotime($field['end'])) : null
); );
@ -491,7 +518,8 @@ class ExtendedProfileWidget extends Form
'href' => 'javascript://', 'href' => 'javascript://',
'style' => 'display: none;' 'style' => 'display: none;'
), ),
'Add another item' // TRANS: Link description in extended profile page to add another profile element.
_m('Add another item')
); );
} }
@ -601,7 +629,8 @@ class ExtendedProfileWidget extends Form
$this->showEditableEducation($name, $field); $this->showEditableEducation($name, $field);
break; break;
default: default:
$out->input($id, null, "TYPE: $type"); // TRANS: Field label for undefined field in extended profile.
$out->input($id, null, sprintf(_m('TYPE: %s'),$type));
} }
} }
@ -610,14 +639,16 @@ class ExtendedProfileWidget extends Form
* *
* @return void * @return void
*/ */
function formActions() function formActions()
{ {
$this->out->submit( $this->out->submit(
'save', 'save',
// TRANS: Button text for saving extended profile properties.
_m('BUTTON','Save'), _m('BUTTON','Save'),
'submit form_action-secondary', 'submit form_action-secondary',
'save', 'save',
// TRANS: .
// TRANS: Button title for saving extended profile properties.
_m('Save details') _m('Save details')
); );
} }
@ -627,7 +658,6 @@ class ExtendedProfileWidget extends Form
* *
* @return string ID of the form * @return string ID of the form
*/ */
function id() function id()
{ {
return 'profile-details-' . $this->profile->id; return 'profile-details-' . $this->profile->id;
@ -638,7 +668,6 @@ class ExtendedProfileWidget extends Form
* *
* @return string of the form class * @return string of the form class
*/ */
function formClass() function formClass()
{ {
return 'form_profile_details form_settings'; return 'form_profile_details form_settings';
@ -649,7 +678,6 @@ class ExtendedProfileWidget extends Form
* *
* @return string URL of the action * @return string URL of the action
*/ */
function action() function action()
{ {
return common_local_url('profiledetailsettings'); return common_local_url('profiledetailsettings');

View File

@ -101,7 +101,6 @@ class FacebookBridgePlugin extends Plugin
*/ */
function onAutoload($cls) function onAutoload($cls)
{ {
$dir = dirname(__FILE__); $dir = dirname(__FILE__);
//common_debug("class = " . $cls); //common_debug("class = " . $cls);
@ -128,7 +127,6 @@ class FacebookBridgePlugin extends Plugin
default: default:
return true; return true;
} }
} }
/** /**
@ -214,10 +212,11 @@ class FacebookBridgePlugin extends Plugin
if ($this->hasApplication()) { if ($this->hasApplication()) {
$action->menuItem( $action->menuItem(
// TRANS: Menu item for "Facebook" login.
common_local_url('facebooklogin'), common_local_url('facebooklogin'),
_m('MENU', 'Facebook'), _m('MENU', 'Facebook'),
// TRANS: Tooltip for menu item "Facebook". // TRANS: Menu title for "Facebook" login.
_m('Login or register using Facebook'), _m('Login or register using Facebook.'),
'facebooklogin' === $action_name 'facebooklogin' === $action_name
); );
} }
@ -253,10 +252,10 @@ class FacebookBridgePlugin extends Plugin
$nav->out->menuItem( $nav->out->menuItem(
common_local_url('facebookadminpanel'), common_local_url('facebookadminpanel'),
// TRANS: Menu item. // TRANS: Menu item for "Facebook" in administration panel.
_m('MENU','Facebook'), _m('MENU','Facebook'),
// TRANS: Tooltip for menu item "Facebook". // TRANS: Menu title for "Facebook" in administration panel.
_m('Facebook integration configuration'), _m('Facebook integration configuration.'),
$action_name == 'facebookadminpanel', $action_name == 'facebookadminpanel',
'nav_facebook_admin_panel' 'nav_facebook_admin_panel'
); );
@ -294,16 +293,14 @@ class FacebookBridgePlugin extends Plugin
$action->menuItem( $action->menuItem(
common_local_url('facebooksettings'), common_local_url('facebooksettings'),
// TRANS: Menu item tab. // TRANS: Menu item for "Facebook" in user settings.
_m('MENU','Facebook'), _m('MENU','Facebook'),
// TRANS: Tooltip for menu item "Facebook". // TRANS: Menu title for "Facebook" in user settings.
_m('Facebook settings'), _m('Facebook settings.'),
$action_name === 'facebooksettings' $action_name === 'facebooksettings'
); );
} }
} }
} }
/* /*
@ -324,7 +321,6 @@ class FacebookBridgePlugin extends Plugin
if (!empty($appId) && !empty($secret)) { if (!empty($appId) && !empty($secret)) {
return true; return true;
} }
} }
return false; return false;
@ -420,7 +416,6 @@ ENDOFSCRIPT;
common_debug("LOGOUT URL = $logoutUrl"); common_debug("LOGOUT URL = $logoutUrl");
common_redirect($logoutUrl, 303); common_redirect($logoutUrl, 303);
} }
} }
} }
@ -561,6 +556,7 @@ ENDOFSCRIPT;
'author' => 'Craig Andrews, Zach Copley', 'author' => 'Craig Andrews, Zach Copley',
'homepage' => 'http://status.net/wiki/Plugin:FacebookBridge', 'homepage' => 'http://status.net/wiki/Plugin:FacebookBridge',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin description.
_m('A plugin for integrating StatusNet with Facebook.') _m('A plugin for integrating StatusNet with Facebook.')
); );

View File

@ -49,7 +49,8 @@ class FacebookadminpanelAction extends AdminPanelAction
*/ */
function title() function title()
{ {
return _m('Facebook'); // TRANS: Title for Facebook administration panel.
return _m('TITLE','Facebook integration settings');
} }
/** /**
@ -59,6 +60,7 @@ class FacebookadminpanelAction extends AdminPanelAction
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Instruction for Facebook administration panel.
return _m('Facebook integration settings'); return _m('Facebook integration settings');
} }
@ -120,12 +122,14 @@ class FacebookadminpanelAction extends AdminPanelAction
if (mb_strlen($values['facebook']['appid']) > 255) { if (mb_strlen($values['facebook']['appid']) > 255) {
$this->clientError( $this->clientError(
// TRANS: Client error displayed when providing too long a Facebook application ID.
_m("Invalid Facebook ID. Maximum length is 255 characters.") _m("Invalid Facebook ID. Maximum length is 255 characters.")
); );
} }
if (mb_strlen($values['facebook']['secret']) > 255) { if (mb_strlen($values['facebook']['secret']) > 255) {
$this->clientError( $this->clientError(
// TRANS: Client error displayed when providing too long a Facebook secret key.
_m("Invalid Facebook secret. Maximum length is 255 characters.") _m("Invalid Facebook secret. Maximum length is 255 characters.")
); );
} }
@ -175,13 +179,16 @@ class FacebookAdminPanelForm extends AdminForm
'fieldset', 'fieldset',
array('id' => 'settings_facebook-application') array('id' => 'settings_facebook-application')
); );
// TRANS: Fieldset legend.
$this->out->element('legend', null, _m('Facebook application settings')); $this->out->element('legend', null, _m('Facebook application settings'));
$this->out->elementStart('ul', 'form_data'); $this->out->elementStart('ul', 'form_data');
$this->li(); $this->li();
$this->input( $this->input(
'appid', 'appid',
// TRANS: Field label for Facebook application ID.
_m('Application ID'), _m('Application ID'),
// TRANS: Field title for Facebook application ID.
_m('ID of your Facebook application.'), _m('ID of your Facebook application.'),
'facebook' 'facebook'
); );
@ -190,7 +197,9 @@ class FacebookAdminPanelForm extends AdminForm
$this->li(); $this->li();
$this->input( $this->input(
'secret', 'secret',
_m('Secret'), // TRANS: Field label for Facebook secret key.
_m('Secret'),
// TRANS: Field title for Facebook secret key.
_m('Application secret.'), _m('Application secret.'),
'facebook' 'facebook'
); );
@ -207,6 +216,9 @@ class FacebookAdminPanelForm extends AdminForm
*/ */
function formActions() function formActions()
{ {
$this->out->submit('submit', _m('BUTTON','Save'), 'submit', null, _m('Save Facebook settings.')); // TRANS: Button text to save Facebook integration settings.
$this->out->submit('submit', _m('BUTTON','Save'),
// TRANS: Button title to save Facebook integration settings.
'submit', null, _m('Save Facebook settings.'));
} }
} }

View File

@ -140,5 +140,4 @@ class FacebookdeauthorizeAction extends Action
} }
} }
} }
}
}

View File

@ -38,7 +38,6 @@ class FacebookfinishloginAction extends Action
private $fbuser = null; // Facebook user object (JSON) private $fbuser = null; // Facebook user object (JSON)
function prepare($args) { function prepare($args) {
parent::prepare($args); parent::prepare($args);
$this->facebook = new Facebook( $this->facebook = new Facebook(
@ -64,7 +63,6 @@ class FacebookfinishloginAction extends Action
} }
if (!empty($this->fbuser)) { if (!empty($this->fbuser)) {
// OKAY, all is well... proceed to register // OKAY, all is well... proceed to register
common_debug("Found a valid Facebook user.", __FILE__); common_debug("Found a valid Facebook user.", __FILE__);
@ -85,6 +83,7 @@ class FacebookfinishloginAction extends Action
); );
$this->clientError( $this->clientError(
// TRANS: Client error displayed when trying to connect to Facebook while not logged in.
_m('You must be logged into Facebook to register a local account using Facebook.') _m('You must be logged into Facebook to register a local account using Facebook.')
); );
} }
@ -115,6 +114,8 @@ class FacebookfinishloginAction extends Action
); );
$this->clientError( $this->clientError(
// TRANS: Client error displayed when trying to connect to a Facebook account that is already linked
// TRANS: in the same StatusNet site.
_m('There is already a local account linked with that Facebook account.') _m('There is already a local account linked with that Facebook account.')
); );
@ -138,6 +139,7 @@ class FacebookfinishloginAction extends Action
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
$this->showForm( $this->showForm(
// TRANS: Client error displayed when the session token does not match or is not given.
_m('There was a problem with your session token. Try again, please.') _m('There was a problem with your session token. Try again, please.')
); );
return; return;
@ -147,6 +149,7 @@ class FacebookfinishloginAction extends Action
if (!$this->boolean('license')) { if (!$this->boolean('license')) {
$this->showForm( $this->showForm(
// TRANS: Form validation error displayed when user has not agreed to the license.
_m('You cannot register if you do not agree to the license.'), _m('You cannot register if you do not agree to the license.'),
$this->trimmed('newname') $this->trimmed('newname')
); );
@ -164,6 +167,7 @@ class FacebookfinishloginAction extends Action
} else { } else {
$this->showForm( $this->showForm(
// TRANS: Form validation error displayed when an unhandled error occurs.
_m('An unknown error has occured.'), _m('An unknown error has occured.'),
$this->trimmed('newname') $this->trimmed('newname')
); );
@ -180,8 +184,9 @@ class FacebookfinishloginAction extends Action
$this->element( $this->element(
'div', 'instructions', 'div', 'instructions',
// TRANS: %s is the site name.
sprintf( sprintf(
// TRANS: Form instructions for connecting to Facebook.
// TRANS: %s is the site name.
_m('This is the first time you have logged into %s so we must connect your Facebook to a local account. You can either create a new local account, or connect with an existing local account.'), _m('This is the first time you have logged into %s so we must connect your Facebook to a local account. You can either create a new local account, or connect with an existing local account.'),
common_config('site', 'name') common_config('site', 'name')
) )
@ -209,7 +214,7 @@ class FacebookfinishloginAction extends Action
} }
/** /**
* @fixme much of this duplicates core code, which is very fragile. * @todo FIXME: Much of this duplicates core code, which is very fragile.
* Should probably be replaced with an extensible mini version of * Should probably be replaced with an extensible mini version of
* the core registration form. * the core registration form.
*/ */
@ -225,7 +230,7 @@ class FacebookfinishloginAction extends Action
'class' => 'form_settings', 'class' => 'form_settings',
'action' => common_local_url('facebookfinishlogin'))); 'action' => common_local_url('facebookfinishlogin')));
$this->elementStart('fieldset', array('id' => 'settings_facebook_connect_options')); $this->elementStart('fieldset', array('id' => 'settings_facebook_connect_options'));
// TRANS: Legend. // TRANS: Fieldset legend.
$this->element('legend', null, _m('Connection options')); $this->element('legend', null, _m('Connection options'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
@ -252,9 +257,10 @@ class FacebookfinishloginAction extends Action
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
$this->element('legend', null, $this->element('legend', null,
// TRANS: Legend. // TRANS: Fieldset legend.
_m('Create new account')); _m('Create new account'));
$this->element('p', null, $this->element('p', null,
// TRANS: Form instructions.
_m('Create a new user with this nickname.')); _m('Create a new user with this nickname.'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
@ -265,6 +271,7 @@ class FacebookfinishloginAction extends Action
// TRANS: Field label. // TRANS: Field label.
$this->input('newname', _m('New nickname'), $this->input('newname', _m('New nickname'),
($this->username) ? $this->username : '', ($this->username) ? $this->username : '',
// TRANS: Field title.
_m('1-64 lowercase letters or numbers, no punctuation or spaces.')); _m('1-64 lowercase letters or numbers, no punctuation or spaces.'));
$this->elementEnd('li'); $this->elementEnd('li');
@ -272,15 +279,16 @@ class FacebookfinishloginAction extends Action
Event::handle('EndRegistrationFormData', array($this)); Event::handle('EndRegistrationFormData', array($this));
$this->elementEnd('ul'); $this->elementEnd('ul');
// TRANS: Submit button. // TRANS: Submit button to create a new account.
$this->submit('create', _m('BUTTON','Create')); $this->submit('create', _m('BUTTON','Create'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementStart('fieldset'); $this->elementStart('fieldset');
// TRANS: Legend.
$this->element('legend', null, $this->element('legend', null,
// TRANS: Fieldset legend.
_m('Connect existing account')); _m('Connect existing account'));
$this->element('p', null, $this->element('p', null,
// TRANS: Form instructions.
_m('If you already have an account, login with your username and password to connect it to your Facebook.')); _m('If you already have an account, login with your username and password to connect it to your Facebook.'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
@ -288,10 +296,11 @@ class FacebookfinishloginAction extends Action
$this->input('nickname', _m('Existing nickname')); $this->input('nickname', _m('Existing nickname'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
// TRANS: Field label.
$this->password('password', _m('Password')); $this->password('password', _m('Password'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
// TRANS: Submit button. // TRANS: Submit button to connect a Facebook account to an existing StatusNet account.
$this->submit('connect', _m('BUTTON','Connect')); $this->submit('connect', _m('BUTTON','Connect'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
@ -344,11 +353,13 @@ class FacebookfinishloginAction extends Action
} }
if (!User::allowed_nickname($nickname)) { if (!User::allowed_nickname($nickname)) {
// TRANS: Form validation error displayed when picking a nickname that is not allowed.
$this->showForm(_m('Nickname not allowed.')); $this->showForm(_m('Nickname not allowed.'));
return; return;
} }
if (User::staticGet('nickname', $nickname)) { if (User::staticGet('nickname', $nickname)) {
// TRANS: Form validation error displayed when picking a nickname that is already in use.
$this->showForm(_m('Nickname already in use. Try another one.')); $this->showForm(_m('Nickname already in use. Try another one.'));
return; return;
} }
@ -377,6 +388,7 @@ class FacebookfinishloginAction extends Action
$result = $this->flinkUser($user->id, $this->fbuid); $result = $this->flinkUser($user->id, $this->fbuid);
if (!$result) { if (!$result) {
// TRANS: Server error displayed when connecting to Facebook fails.
$this->serverError(_m('Error connecting user to Facebook.')); $this->serverError(_m('Error connecting user to Facebook.'));
return; return;
} }
@ -479,6 +491,7 @@ class FacebookfinishloginAction extends Action
$password = $this->trimmed('password'); $password = $this->trimmed('password');
if (!common_check_user($nickname, $password)) { if (!common_check_user($nickname, $password)) {
// TRANS: Form validation error displayed when username/password combination is incorrect.
$this->showForm(_m('Invalid username or password.')); $this->showForm(_m('Invalid username or password.'));
return; return;
} }
@ -516,6 +529,7 @@ class FacebookfinishloginAction extends Action
$result = $this->flinkUser($user->id, $this->fbuid); $result = $this->flinkUser($user->id, $this->fbuid);
if (empty($result)) { if (empty($result)) {
// TRANS: Server error displayed when connecting to Facebook fails.
$this->serverError(_m('Error connecting user to Facebook.')); $this->serverError(_m('Error connecting user to Facebook.'));
return; return;
} }
@ -687,5 +701,4 @@ class FacebookfinishloginAction extends Action
return false; return false;
} }
} }

View File

@ -34,12 +34,12 @@ if (!defined('STATUSNET')) {
class FacebookloginAction extends Action class FacebookloginAction extends Action
{ {
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
if (common_is_real_login()) { if (common_is_real_login()) {
// TRANS: Client error displayed when trying to login while already logged in.
$this->clientError(_m('Already logged in.')); $this->clientError(_m('Already logged in.'));
} else { } else {
$this->showPage(); $this->showPage();
@ -48,7 +48,7 @@ class FacebookloginAction extends Action
function getInstructions() function getInstructions()
{ {
// TRANS: Instructions. // TRANS: Form instructions.
return _m('Login with your Facebook Account'); return _m('Login with your Facebook Account');
} }
@ -68,7 +68,6 @@ class FacebookloginAction extends Action
} }
function showContent() { function showContent() {
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$facebook = Facebookclient::getFacebook(); $facebook = Facebookclient::getFacebook();
@ -90,8 +89,10 @@ class FacebookloginAction extends Action
$attrs = array( $attrs = array(
'src' => Plugin::staticPath('FacebookBridge', 'images/login-button.png'), 'src' => Plugin::staticPath('FacebookBridge', 'images/login-button.png'),
'alt' => 'Login with Facebook', // TRANS: Alt text for "Login with Facebook" image.
'title' => 'Login with Facebook' 'alt' => _m('Login with Facebook'),
// TRANS: Title for "Login with Facebook" image.
'title' => _m('Login with Facebook.')
); );
$this->element('img', $attrs); $this->element('img', $attrs);
@ -117,4 +118,3 @@ class FacebookloginAction extends Action
$nav->show(); $nav->show();
} }
} }

View File

@ -83,6 +83,7 @@ class FacebooksettingsAction extends SettingsAction {
$token = $this->trimmed('token'); $token = $this->trimmed('token');
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
$this->showForm( $this->showForm(
// TRANS: Client error displayed when the session token does not match or is not given.
_m('There was a problem with your session token. Try again, please.') _m('There was a problem with your session token. Try again, please.')
); );
return; return;
@ -102,7 +103,7 @@ class FacebooksettingsAction extends SettingsAction {
*/ */
function title() { function title() {
// TRANS: Page title for Facebook settings. // TRANS: Page title for Facebook settings.
return _m('Facebook settings'); return _m('TITLE','Facebook settings');
} }
/** /**
@ -111,6 +112,7 @@ class FacebooksettingsAction extends SettingsAction {
* @return instructions for use * @return instructions for use
*/ */
function getInstructions() { function getInstructions() {
// TRANS: Instructions for Facebook settings.
return _m('Facebook settings'); return _m('Facebook settings');
} }
@ -134,6 +136,7 @@ class FacebooksettingsAction extends SettingsAction {
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
// TRANS: Form note. User is connected to facebook.
$this->element('p', 'form_note', _m('Connected Facebook user')); $this->element('p', 'form_note', _m('Connected Facebook user'));
$this->elementStart('p', array('class' => 'facebook-user-display')); $this->elementStart('p', array('class' => 'facebook-user-display'));
@ -161,6 +164,7 @@ class FacebooksettingsAction extends SettingsAction {
$this->checkbox( $this->checkbox(
'noticesync', 'noticesync',
// TRANS: Checkbox label in Facebook settings.
_m('Publish my notices to Facebook.'), _m('Publish my notices to Facebook.'),
($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND) : true ($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND) : true
); );
@ -171,6 +175,7 @@ class FacebooksettingsAction extends SettingsAction {
$this->checkbox( $this->checkbox(
'replysync', 'replysync',
// TRANS: Checkbox label in Facebook settings.
_m('Send "@" replies to Facebook.'), _m('Send "@" replies to Facebook.'),
($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true ($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true
); );
@ -188,13 +193,14 @@ class FacebooksettingsAction extends SettingsAction {
$this->elementStart('fieldset'); $this->elementStart('fieldset');
// TRANS: Legend. // TRANS: Fieldset legend for form to disconnect from Facebook.
$this->element('legend', null, _m('Disconnect my account from Facebook')); $this->element('legend', null, _m('Disconnect my account from Facebook'));
if (empty($this->user->password)) { if (empty($this->user->password)) {
$this->elementStart('p', array('class' => 'form_guide')); $this->elementStart('p', array('class' => 'form_guide'));
$msg = sprintf( $msg = sprintf(
// TRANS: Notice in disconnect from Facebook form if user has no local StatusNet password.
_m( _m(
'Disconnecting your Faceboook would make it impossible to ' 'Disconnecting your Faceboook would make it impossible to '
. 'log in! Please [set a password](%s) first.' . 'log in! Please [set a password](%s) first.'
@ -206,14 +212,11 @@ class FacebooksettingsAction extends SettingsAction {
$this->elementEnd('p'); $this->elementEnd('p');
} else { } else {
// @todo FIXME: i18n: This message is not being used. // @todo FIXME: i18n: This message is not being used.
$msg = sprintf( // TRANS: Message displayed when initiating disconnect of a StatusNet user
// TRANS: Message displayed when initiating disconnect of a StatusNet user // TRANS: from a Facebook account. %1$s is the StatusNet site name.
// TRANS: from a Facebook account. %1$s is the StatusNet site name. $msg = sprintf(_m('Keep your %1$s account but disconnect from Facebook. ' .
_m( 'You\'ll use your %1$s password to log in.'),
'Keep your %1$s account but disconnect from Facebook. ' . common_config('site', 'name')
'You\'ll use your %1$s password to log in.'
),
common_config('site', 'name')
); );
// TRANS: Submit button. // TRANS: Submit button.
@ -240,6 +243,7 @@ class FacebooksettingsAction extends SettingsAction {
$result = $this->flink->update($original); $result = $this->flink->update($original);
if ($result === false) { if ($result === false) {
// TRANS: Notice in case saving of synchronisation preferences fail.
$this->showForm(_m('There was a problem saving your sync preferences.')); $this->showForm(_m('There was a problem saving your sync preferences.'));
} else { } else {
// TRANS: Confirmation that synchronisation settings have been saved into the system. // TRANS: Confirmation that synchronisation settings have been saved into the system.
@ -257,10 +261,12 @@ class FacebooksettingsAction extends SettingsAction {
if ($result === false) { if ($result === false) {
common_log_db_error($user, 'DELETE', __FILE__); common_log_db_error($user, 'DELETE', __FILE__);
// TRANS: Server error displayed when deleting the link to a Facebook account fails.
$this->serverError(_m('Could not delete link to Facebook.')); $this->serverError(_m('Could not delete link to Facebook.'));
return; return;
} }
// TRANS: Confirmation message. StatusNet account was unlinked from Facebook.
$this->showForm(_m('You have disconnected from Facebook.'), true); $this->showForm(_m('You have disconnected from Facebook.'), true);
} }
} }

View File

@ -48,7 +48,6 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
* *
* @see DB_DataObject * @see DB_DataObject
*/ */
class Notice_to_item extends Memcached_DataObject class Notice_to_item extends Memcached_DataObject
{ {
public $__table = 'notice_to_item'; // table name public $__table = 'notice_to_item'; // table name
@ -67,7 +66,6 @@ class Notice_to_item extends Memcached_DataObject
* @return Notice_to_item object found, or null for no hits * @return Notice_to_item object found, or null for no hits
* *
*/ */
function staticGet($k, $v=null) function staticGet($k, $v=null)
{ {
return Memcached_DataObject::staticGet('Notice_to_item', $k, $v); return Memcached_DataObject::staticGet('Notice_to_item', $k, $v);
@ -81,7 +79,6 @@ class Notice_to_item extends Memcached_DataObject
* *
* @return array array of column definitions * @return array array of column definitions
*/ */
function table() function table()
{ {
return array( return array(
@ -109,7 +106,6 @@ class Notice_to_item extends Memcached_DataObject
* *
* @return array list of key field names * @return array list of key field names
*/ */
function keys() function keys()
{ {
return array_keys($this->keyTypes()); return array_keys($this->keyTypes());
@ -127,7 +123,6 @@ class Notice_to_item extends Memcached_DataObject
* 'K' for primary key: for compound keys, add an entry for each component; * 'K' for primary key: for compound keys, add an entry for each component;
* 'U' for unique keys: compound keys are not well supported here. * 'U' for unique keys: compound keys are not well supported here.
*/ */
function keyTypes() function keyTypes()
{ {
return array('notice_id' => 'K', 'item_id' => 'U'); return array('notice_id' => 'K', 'item_id' => 'U');
@ -143,7 +138,6 @@ class Notice_to_item extends Memcached_DataObject
* *
* @return array magic three-false array that stops auto-incrementing. * @return array magic three-false array that stops auto-incrementing.
*/ */
function sequenceKey() function sequenceKey()
{ {
return array(false, false, false); return array(false, false, false);
@ -157,7 +151,6 @@ class Notice_to_item extends Memcached_DataObject
* *
* @return Notice_to_item new object for this value * @return Notice_to_item new object for this value
*/ */
static function saveNew($notice_id, $item_id) static function saveNew($notice_id, $item_id)
{ {
$n2i = Notice_to_item::staticGet('notice_id', $notice_id); $n2i = Notice_to_item::staticGet('notice_id', $notice_id);

View File

@ -340,7 +340,8 @@ class Facebookclient
function checkPermission($permission) function checkPermission($permission)
{ {
if (!in_array($permission, array('publish_stream', 'status_update'))) { if (!in_array($permission, array('publish_stream', 'status_update'))) {
throw new ServerException("No such permission!"); // TRANS: Server exception thrown when permission check fails.
throw new ServerException(_('No such permission!'));
} }
$fbuid = $this->flink->foreign_id; $fbuid = $this->flink->foreign_id;
@ -397,7 +398,6 @@ class Facebookclient
); );
return false; return false;
} }
} }
@ -461,7 +461,7 @@ class Facebookclient
), ),
__FILE__ __FILE__
); );
// @fixme: We want to rety at a later time when the throttling has expired // @todo FIXME: We want to rety at a later time when the throttling has expired
// instead of just giving up. // instead of just giving up.
return true; return true;
break; break;
@ -582,7 +582,6 @@ class Facebookclient
); );
if (!empty($result)) { // result will contain the item ID if (!empty($result)) { // result will contain the item ID
// Save a mapping // Save a mapping
Notice_to_item::saveNew($this->notice->id, $result); Notice_to_item::saveNew($this->notice->id, $result);
@ -598,7 +597,6 @@ class Facebookclient
), ),
__FILE__ __FILE__
); );
} else { } else {
$msg = sprintf( $msg = sprintf(
@ -740,7 +738,6 @@ class Facebookclient
$result = $this->mailFacebookDisconnect(); $result = $this->mailFacebookDisconnect();
if (!$result) { if (!$result) {
$msg = 'Unable to send email to notify %s (%d), fbuid %d ' $msg = 'Unable to send email to notify %s (%d), fbuid %d '
. 'about his/her Facebook link being removed.'; . 'about his/her Facebook link being removed.';
@ -755,9 +752,7 @@ class Facebookclient
__FILE__ __FILE__
); );
} }
} else { } else {
$msg = 'Unable to send email to notify %s (%d), fbuid %d ' $msg = 'Unable to send email to notify %s (%d), fbuid %d '
. 'about his/her Facebook link being removed because the ' . 'about his/her Facebook link being removed because the '
. 'user has not set an email address.'; . 'user has not set an email address.';
@ -789,26 +784,23 @@ class Facebookclient
common_switch_locale($this->user->language); common_switch_locale($this->user->language);
// TRANS: E-mail subject.
$subject = _m('Your Facebook connection has been removed'); $subject = _m('Your Facebook connection has been removed');
$msg = <<<BODY // TRANS: E-mail body. %1$s is a username, %2$s is the StatusNet sitename.
Hi %1$s, $msg = _m("Hi %1\$s,\n\n".
"We are sorry to inform you we are unable to publish your notice to\n".
"Facebook, and have removed the connection between your %2\$s account and\n".
"Facebook.\n\n".
"This may have happened because you have removed permission for %2\$s\n".
"to post on your behalf, or perhaps you have deactivated your Facebook\n".
"account. You can reconnect your %2\$s account to Facebook at any time by\n".
"logging in with Facebook again.\n\n".
"Sincerely,\n\n".
"%2\$s\n");
We're sorry to inform you we are unable to publish your notice to
Facebook, and have removed the connection between your %2$s account and
Facebook.
This may have happened because you have removed permission for %2$s
to post on your behalf, or perhaps you have deactivated your Facebook
account. You can reconnect your %s account to Facebook at any time by
logging in with Facebook again.
Sincerely,
%2$s
BODY;
$body = sprintf( $body = sprintf(
_m($msg), $msg,
$this->user->nickname, $this->user->nickname,
$siteName $siteName
); );
@ -848,22 +840,21 @@ BODY;
common_switch_locale($user->language); common_switch_locale($user->language);
// TRANS: E-mail subject. %s is the StatusNet sitename.
$subject = _m('Contact the %s administrator to retrieve your account'); $subject = _m('Contact the %s administrator to retrieve your account');
$msg = <<<BODY // TRANS: E-mail body. %1$s is a username,
Hi %1$s, // TRANS: %2$s is the StatusNet sitename, %3$s is the site contact e-mail address.
$msg = _m("Hi %1\$s,\n\n".
"We have noticed you have deauthorized the Facebook connection for your\n".
"%2\$s account. You have not set a password for your %2\$s account yet, so\n".
"you will not be able to login. If you wish to continue using your %2\$s\n".
"account, please contact the site administrator (%3\$s) to set a password.\n\n".
"Sincerely,\n\n".
"%2\$s\n");
We've noticed you have deauthorized the Facebook connection for your
%2$s account. You have not set a password for your %2$s account yet, so
you will not be able to login. If you wish to continue using your %2$s
account, please contact the site administrator (%3$s) to set a password.
Sincerely,
%2$s
BODY;
$body = sprintf( $body = sprintf(
_m($msg), $msg,
$user->nickname, $user->nickname,
$siteName, $siteName,
$siteEmail $siteEmail
@ -990,9 +981,7 @@ BODY;
$n2i = Notice_to_item::staticGet('notice_id', $this->notice->id); $n2i = Notice_to_item::staticGet('notice_id', $this->notice->id);
if (!empty($this->flink) && !empty($n2i)) { if (!empty($this->flink) && !empty($n2i)) {
try { try {
$result = $this->facebook->api( $result = $this->facebook->api(
array( array(
'method' => 'stream.remove', 'method' => 'stream.remove',
@ -1002,7 +991,6 @@ BODY;
); );
if (!empty($result) && result == true) { if (!empty($result) && result == true) {
common_log( common_log(
LOG_INFO, LOG_INFO,
sprintf( sprintf(
@ -1020,7 +1008,6 @@ BODY;
} else { } else {
throw new FaceboookApiException(var_export($result, true)); throw new FaceboookApiException(var_export($result, true));
} }
} catch (FacebookApiException $e) { } catch (FacebookApiException $e) {
common_log( common_log(
LOG_WARNING, LOG_WARNING,
@ -1049,9 +1036,7 @@ BODY;
$n2i = Notice_to_item::staticGet('notice_id', $this->notice->id); $n2i = Notice_to_item::staticGet('notice_id', $this->notice->id);
if (!empty($this->flink) && !empty($n2i)) { if (!empty($this->flink) && !empty($n2i)) {
try { try {
$result = $this->facebook->api( $result = $this->facebook->api(
array( array(
'method' => 'stream.addlike', 'method' => 'stream.addlike',
@ -1061,7 +1046,6 @@ BODY;
); );
if (!empty($result) && result == true) { if (!empty($result) && result == true) {
common_log( common_log(
LOG_INFO, LOG_INFO,
sprintf( sprintf(
@ -1073,11 +1057,9 @@ BODY;
), ),
__FILE__ __FILE__
); );
} else { } else {
throw new FacebookApiException(var_export($result, true)); throw new FacebookApiException(var_export($result, true));
} }
} catch (FacebookApiException $e) { } catch (FacebookApiException $e) {
common_log( common_log(
LOG_WARNING, LOG_WARNING,
@ -1105,9 +1087,7 @@ BODY;
$n2i = Notice_to_item::staticGet('notice_id', $this->notice->id); $n2i = Notice_to_item::staticGet('notice_id', $this->notice->id);
if (!empty($this->flink) && !empty($n2i)) { if (!empty($this->flink) && !empty($n2i)) {
try { try {
$result = $this->facebook->api( $result = $this->facebook->api(
array( array(
'method' => 'stream.removeLike', 'method' => 'stream.removeLike',
@ -1117,7 +1097,6 @@ BODY;
); );
if (!empty($result) && result == true) { if (!empty($result) && result == true) {
common_log( common_log(
LOG_INFO, LOG_INFO,
sprintf( sprintf(
@ -1133,7 +1112,6 @@ BODY;
} else { } else {
throw new FacebookApiException(var_export($result, true)); throw new FacebookApiException(var_export($result, true));
} }
} catch (FacebookApiException $e) { } catch (FacebookApiException $e) {
common_log( common_log(
LOG_WARNING, LOG_WARNING,
@ -1151,5 +1129,4 @@ BODY;
} }
} }
} }
} }

View File

@ -1,11 +1,11 @@
<?php <?php
/* /*
StatusNet Plugin: 0.9 * StatusNet Plugin: 0.9
Plugin Name: FirePHP * Plugin Name: FirePHP
Description: Sends StatusNet log output to FirePHP * Description: Sends StatusNet log output to FirePHP
Version: 0.1 * Version: 0.1
Author: Craig Andrews <candrews@integralblue.com> * Author: Craig Andrews <candrews@integralblue.com>
Author URI: http://candrews.integralblue.com/ * Author URI: http://candrews.integralblue.com/
*/ */
/* /*
@ -65,6 +65,7 @@ class FirePHPPlugin extends Plugin
'author' => 'Craig Andrews', 'author' => 'Craig Andrews',
'homepage' => 'http://status.net/wiki/Plugin:FirePHP', 'homepage' => 'http://status.net/wiki/Plugin:FirePHP',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin description.
_m('The FirePHP plugin writes StatusNet\'s log output to FirePHP.')); _m('The FirePHP plugin writes StatusNet\'s log output to FirePHP.'));
return true; return true;
} }

View File

@ -1,8 +1,9 @@
The FirePHP plugin writes StatusNet's log output to FirePHP. The FirePHP plugin writes StatusNet's log output to FirePHP.
Using FirePHP on production sites can expose sensitive information. Using FirePHP on production sites can expose sensitive information.
You must protect the security of your application by disabling FirePHP
logging on your live site. You must protect the security of your application by disabling FirePHP logging
on your live site!
Installation Installation
============ ============
@ -18,4 +19,3 @@ Example
======= =======
addPlugin('FirePHP', array()); addPlugin('FirePHP', array());

View File

@ -59,7 +59,6 @@ class FollowEveryonePlugin extends Plugin
* @param User &$newUser The new user * @param User &$newUser The new user
* *
* @return boolean hook value * @return boolean hook value
*
*/ */
function onEndUserRegister(&$newProfile, &$newUser) function onEndUserRegister(&$newProfile, &$newUser)
{ {
@ -115,7 +114,6 @@ class FollowEveryonePlugin extends Plugin
$schema = Schema::get(); $schema = Schema::get();
// For storing user-submitted flags on profiles // For storing user-submitted flags on profiles
$schema->ensureTable('user_followeveryone_prefs', $schema->ensureTable('user_followeveryone_prefs',
array(new ColumnDef('user_id', 'integer', null, array(new ColumnDef('user_id', 'integer', null,
true, 'PRI'), true, 'PRI'),
@ -200,6 +198,7 @@ class FollowEveryonePlugin extends Plugin
'author' => 'Evan Prodromou', 'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:FollowEveryone', 'homepage' => 'http://status.net/wiki/Plugin:FollowEveryone',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin description.
_m('New users follow everyone at registration and are followed in return.')); _m('New users follow everyone at registration and are followed in return.'));
return true; return true;
} }

View File

@ -33,11 +33,11 @@ class ForceGroupPlugin extends Plugin
* List by local nickname. * List by local nickname.
*/ */
public $post = array(); public $post = array();
/** /**
* New user registrations will automatically join these groups on * New user registrations will automatically join these groups on
* registration. They're not prevented from leaving, however. * registration. They're not prevented from leaving, however.
* *
* List by local nickname. * List by local nickname.
*/ */
public $join = array(); public $join = array();

View File

@ -121,6 +121,7 @@ class GeoURLPlugin extends Plugin
'author' => 'Evan Prodromou', 'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:GeoURL', 'homepage' => 'http://status.net/wiki/Plugin:GeoURL',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin description.
_m('Ping <a href="http://geourl.org/">GeoURL</a> when '. _m('Ping <a href="http://geourl.org/">GeoURL</a> when '.
'new geolocation-enhanced notices are posted.')); 'new geolocation-enhanced notices are posted.'));
return true; return true;

View File

@ -435,7 +435,8 @@ class GeonamesPlugin extends Plugin
function getGeonames($method, $params) function getGeonames($method, $params)
{ {
if ($this->lastTimeout && (time() - $this->lastTimeout < $this->timeoutWindow)) { if ($this->lastTimeout && (time() - $this->lastTimeout < $this->timeoutWindow)) {
throw new Exception("skipping due to recent web service timeout"); // TRANS: Exception thrown when a geo names service is not used because of a recent timeout.
throw new Exception(_m('Skipping due to recent web service timeout.'));
} }
$client = HTTPClient::start(); $client = HTTPClient::start();
@ -451,13 +452,16 @@ class GeonamesPlugin extends Plugin
} }
if (!$result->isOk()) { if (!$result->isOk()) {
throw new Exception("HTTP error code " . $result->getStatus()); // TRANS: Exception thrown when a geo names service does not return an expected response.
// TRANS: %s is an HTTP error code.
throw new Exception(sprintf(_m('HTTP error code %s.'),$result->getStatus()));
} }
$body = $result->getBody(); $body = $result->getBody();
if (empty($body)) { if (empty($body)) {
throw new Exception("Empty HTTP body in response"); // TRANS: Exception thrown when a geo names service returns an empty body.
throw new Exception(_m('Empty HTTP body in response.'));
} }
// This will throw an exception if the XML is mal-formed // This will throw an exception if the XML is mal-formed
@ -473,7 +477,9 @@ class GeonamesPlugin extends Plugin
} }
if (isset($document->status)) { if (isset($document->status)) {
throw new Exception("Error #".$document->status['value']." ('".$document->status['message']."')"); // TRANS: Exception thrown when a geo names service return a specific error number and error text.
// TRANS: %1$s is an error code, %2$s is an error message.
throw new Exception(sprintf(_m('Error #%1$s ("%2$s").'),$document->status['value'],$document->status['message']));
} }
// Array of elements, >0 elements // Array of elements, >0 elements
@ -488,6 +494,7 @@ class GeonamesPlugin extends Plugin
'author' => 'Evan Prodromou', 'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:Geonames', 'homepage' => 'http://status.net/wiki/Plugin:Geonames',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin description.
_m('Uses <a href="http://geonames.org/">Geonames</a> service to get human-readable '. _m('Uses <a href="http://geonames.org/">Geonames</a> service to get human-readable '.
'names for locations based on user-provided lat/long pairs.')); 'names for locations based on user-provided lat/long pairs.'));
return true; return true;

View File

@ -77,6 +77,7 @@ class GoogleAnalyticsPlugin extends Plugin
'author' => 'Evan Prodromou', 'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:GoogleAnalytics', 'homepage' => 'http://status.net/wiki/Plugin:GoogleAnalytics',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin description.
_m('Use <a href="http://www.google.com/analytics/">Google Analytics</a>'. _m('Use <a href="http://www.google.com/analytics/">Google Analytics</a>'.
' to track web access.')); ' to track web access.'));
return true; return true;

View File

@ -57,15 +57,18 @@ class GravatarPlugin extends Plugin
'action' => 'action' =>
common_local_url('avatarsettings'))); common_local_url('avatarsettings')));
$action->elementStart('fieldset', array('id' => 'settings_gravatar_add')); $action->elementStart('fieldset', array('id' => 'settings_gravatar_add'));
// TRANS: Fieldset legend. Gravatar is an avatar service.
$action->element('legend', null, _m('Set Gravatar')); $action->element('legend', null, _m('Set Gravatar'));
$action->hidden('token', common_session_token()); $action->hidden('token', common_session_token());
$action->element('p', 'form_guide', $action->element('p', 'form_guide',
// TRANS: Form guide. Gravatar is an avatar service.
_m('If you want to use your Gravatar image, click "Add".')); _m('If you want to use your Gravatar image, click "Add".'));
$action->element('input', array('type' => 'submit', $action->element('input', array('type' => 'submit',
'id' => 'settings_gravatar_add_action-submit', 'id' => 'settings_gravatar_add_action-submit',
'name' => 'add', 'name' => 'add',
'class' => 'submit', 'class' => 'submit',
'value' => _m('Add'))); // TRANS: Button text to add a Gravatar. Gravatar is an avatar service.
'value' => _m('BUTTON','Add')));
$action->elementEnd('fieldset'); $action->elementEnd('fieldset');
$action->elementEnd('form'); $action->elementEnd('form');
} elseif($hasGravatar) { } elseif($hasGravatar) {
@ -75,19 +78,23 @@ class GravatarPlugin extends Plugin
'action' => 'action' =>
common_local_url('avatarsettings'))); common_local_url('avatarsettings')));
$action->elementStart('fieldset', array('id' => 'settings_gravatar_remove')); $action->elementStart('fieldset', array('id' => 'settings_gravatar_remove'));
// TRANS: Fieldset legend. Gravatar is an avatar service.
$action->element('legend', null, _m('Remove Gravatar')); $action->element('legend', null, _m('Remove Gravatar'));
$action->hidden('token', common_session_token()); $action->hidden('token', common_session_token());
$action->element('p', 'form_guide', $action->element('p', 'form_guide',
// TRANS: Form guide. Gravatar is an avatar service.
_m('If you want to remove your Gravatar image, click "Remove".')); _m('If you want to remove your Gravatar image, click "Remove".'));
$action->element('input', array('type' => 'submit', $action->element('input', array('type' => 'submit',
'id' => 'settings_gravatar_remove_action-submit', 'id' => 'settings_gravatar_remove_action-submit',
'name' => 'remove', 'name' => 'remove',
'class' => 'submit', 'class' => 'submit',
// TRANS: Button text to remove a Gravatar. Gravatar is an avatar service.
'value' => _m('Remove'))); 'value' => _m('Remove')));
$action->elementEnd('fieldset'); $action->elementEnd('fieldset');
$action->elementEnd('form'); $action->elementEnd('form');
} else { } else {
$action->element('p', 'form_guide', $action->element('p', 'form_guide',
// TRANS: Form guide. Gravatar is an avatar service.
_m('To use a Gravatar first enter in an email address.')); _m('To use a Gravatar first enter in an email address.'));
} }
} }
@ -137,6 +144,7 @@ class GravatarPlugin extends Plugin
$cur = common_current_user(); $cur = common_current_user();
if(empty($cur->email)) { if(empty($cur->email)) {
// TRANS: Message displayed when no e-mail address was set when saving Gravatar setting. Gravatar is an avatar service.
return array('message' => _m('You do not have an email address set in your profile.'), return array('message' => _m('You do not have an email address set in your profile.'),
'success' => false); 'success' => false);
} }
@ -155,10 +163,12 @@ class GravatarPlugin extends Plugin
$gravatar->created = DB_DataObject_Cast::dateTime(); # current time $gravatar->created = DB_DataObject_Cast::dateTime(); # current time
if (!$gravatar->insert()) { if (!$gravatar->insert()) {
// TRANS: Message displayed when saving Gravatar setting fails. Gravatar is an avatar service.
return array('message' => _m('Failed to save Gravatar to the database.'), return array('message' => _m('Failed to save Gravatar to the database.'),
'success' => false); 'success' => false);
} }
} }
// TRANS: Message displayed when Gravatar was added. Gravatar is an avatar service.
return array('message' => _m('Gravatar added.'), return array('message' => _m('Gravatar added.'),
'success' => true); 'success' => true);
} }
@ -177,6 +187,7 @@ class GravatarPlugin extends Plugin
$avatar = $profile->getAvatar(AVATAR_MINI_SIZE); $avatar = $profile->getAvatar(AVATAR_MINI_SIZE);
if($avatar) $avatar->delete(); if($avatar) $avatar->delete();
// TRANS: Message displayed when Gravatar was removed. Gravatar is an avatar service.
return array('message' => _m('Gravatar removed.'), return array('message' => _m('Gravatar removed.'),
'success' => true); 'success' => true);
} }
@ -197,6 +208,7 @@ class GravatarPlugin extends Plugin
'author' => 'Eric Helgeson', 'author' => 'Eric Helgeson',
'homepage' => 'http://status.net/wiki/Plugin:Gravatar', 'homepage' => 'http://status.net/wiki/Plugin:Gravatar',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin decsription.
_m('The Gravatar plugin allows users to use their <a href="http://www.gravatar.com/">Gravatar</a> with StatusNet.')); _m('The Gravatar plugin allows users to use their <a href="http://www.gravatar.com/">Gravatar</a> with StatusNet.'));
return true; return true;

View File

@ -1,13 +1,12 @@
GravatarPlugin 0.1 GravatarPlugin 0.1
About About:
This will allow users to use their Gravatar Avatar with your StatusNet install. This will allow users to use their Gravatar Avatar with your StatusNet install.
Configuration Configuration:
add this to your config.php: add this to your config.php:
addPlugin('Gravatar', array()); addPlugin('Gravatar', array());
ToDo: To do:
Site default all on for gravatar by default Site default all on for gravatar by default
Migration Script Migration Script
Localize

View File

@ -46,7 +46,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class GroupPrivateMessagePlugin extends Plugin class GroupPrivateMessagePlugin extends Plugin
{ {
/** /**
@ -57,7 +56,6 @@ class GroupPrivateMessagePlugin extends Plugin
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onCheckSchema() function onCheckSchema()
{ {
$schema = Schema::get(); $schema = Schema::get();
@ -78,7 +76,7 @@ class GroupPrivateMessagePlugin extends Plugin
'datetime'), 'datetime'),
new ColumnDef('modified', new ColumnDef('modified',
'timestamp'))); 'timestamp')));
$schema->ensureTable('group_message', $schema->ensureTable('group_message',
array(new ColumnDef('id', array(new ColumnDef('id',
'char', 'char',
@ -136,7 +134,6 @@ class GroupPrivateMessagePlugin extends Plugin
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onAutoload($cls) function onAutoload($cls)
{ {
$dir = dirname(__FILE__); $dir = dirname(__FILE__);
@ -171,7 +168,6 @@ class GroupPrivateMessagePlugin extends Plugin
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onRouterInitialized($m) function onRouterInitialized($m)
{ {
$m->connect('group/:nickname/inbox', $m->connect('group/:nickname/inbox',
@ -199,7 +195,6 @@ class GroupPrivateMessagePlugin extends Plugin
* *
* @see Action * @see Action
*/ */
function onEndGroupGroupNav($groupnav) function onEndGroupGroupNav($groupnav)
{ {
$action = $groupnav->action; $action = $groupnav->action;
@ -207,7 +202,9 @@ class GroupPrivateMessagePlugin extends Plugin
$action->menuItem(common_local_url('groupinbox', $action->menuItem(common_local_url('groupinbox',
array('nickname' => $group->nickname)), array('nickname' => $group->nickname)),
// TRANS: Menu item in group page.
_m('MENU','Inbox'), _m('MENU','Inbox'),
// TRANS: Menu title in group page.
_m('Private messages for this group.'), _m('Private messages for this group.'),
$action->trimmed('action') == 'groupinbox', $action->trimmed('action') == 'groupinbox',
'nav_group_inbox'); 'nav_group_inbox');
@ -221,7 +218,6 @@ class GroupPrivateMessagePlugin extends Plugin
* *
* @result boolean hook value * @result boolean hook value
*/ */
function onEndGroupSave($group) function onEndGroupSave($group)
{ {
$gps = new Group_privacy_settings(); $gps = new Group_privacy_settings();
@ -244,7 +240,6 @@ class GroupPrivateMessagePlugin extends Plugin
* *
* @param GroupEditForm $form form being shown * @param GroupEditForm $form form being shown
*/ */
function onEndGroupEditFormData($form) function onEndGroupEditFormData($form)
{ {
$gps = null; $gps = null;
@ -255,20 +250,30 @@ class GroupPrivateMessagePlugin extends Plugin
$form->out->elementStart('li'); $form->out->elementStart('li');
$form->out->dropdown('allow_privacy', $form->out->dropdown('allow_privacy',
// TRANS: Dropdown label in group settings page for if group allows private messages.
_m('Private messages'), _m('Private messages'),
// TRANS: Dropdown option in group settings page for allowing private messages.
array(Group_privacy_settings::SOMETIMES => _m('Sometimes'), array(Group_privacy_settings::SOMETIMES => _m('Sometimes'),
// TRANS: Dropdown option in group settings page for allowing private messages.
Group_privacy_settings::ALWAYS => _m('Always'), Group_privacy_settings::ALWAYS => _m('Always'),
// TRANS: Dropdown option in group settings page for allowing private messages.
Group_privacy_settings::NEVER => _m('Never')), Group_privacy_settings::NEVER => _m('Never')),
// TRANS: Dropdown title in group settings page for if group allows private messages.
_m('Whether to allow private messages to this group.'), _m('Whether to allow private messages to this group.'),
false, false,
(empty($gps)) ? Group_privacy_settings::SOMETIMES : $gps->allow_privacy); (empty($gps)) ? Group_privacy_settings::SOMETIMES : $gps->allow_privacy);
$form->out->elementEnd('li'); $form->out->elementEnd('li');
$form->out->elementStart('li'); $form->out->elementStart('li');
$form->out->dropdown('allow_sender', $form->out->dropdown('allow_sender',
// TRANS: Dropdown label in group settings page for who can send private messages to the group.
_m('Private senders'), _m('Private senders'),
// TRANS: Dropdown option in group settings page for who can send private messages.
array(Group_privacy_settings::EVERYONE => _m('Everyone'), array(Group_privacy_settings::EVERYONE => _m('Everyone'),
// TRANS: Dropdown option in group settings page for who can send private messages.
Group_privacy_settings::MEMBER => _m('Member'), Group_privacy_settings::MEMBER => _m('Member'),
// TRANS: Dropdown option in group settings page for who can send private messages.
Group_privacy_settings::ADMIN => _m('Admin')), Group_privacy_settings::ADMIN => _m('Admin')),
// TRANS: Dropdown title in group settings page for who can send private messages to the group.
_m('Who can send private messages to the group.'), _m('Who can send private messages to the group.'),
false, false,
(empty($gps)) ? Group_privacy_settings::MEMBER : $gps->allow_sender); (empty($gps)) ? Group_privacy_settings::MEMBER : $gps->allow_sender);
@ -292,7 +297,7 @@ class GroupPrivateMessagePlugin extends Plugin
} else { } else {
$orig = clone($gps); $orig = clone($gps);
} }
$gps->allow_privacy = $action->trimmed('allow_privacy'); $gps->allow_privacy = $action->trimmed('allow_privacy');
$gps->allow_sender = $action->trimmed('allow_sender'); $gps->allow_sender = $action->trimmed('allow_sender');
@ -302,21 +307,21 @@ class GroupPrivateMessagePlugin extends Plugin
} else { } else {
$gps->update($orig); $gps->update($orig);
} }
return true; return true;
} }
/** /**
* Overload 'd' command to send private messages to groups. * Overload 'd' command to send private messages to groups.
* *
* 'd !group word word word' will send the private message * 'd !group word word word' will send the private message
* 'word word word' to the group 'group'. * 'word word word' to the group 'group'.
* *
* @param string $cmd Command being run * @param string $cmd Command being run
* @param string $arg Rest of the message (including address) * @param string $arg Rest of the message (including address)
* @param User $user User sending the message * @param User $user User sending the message
* @param Command &$result The resulting command object to be run. * @param Command &$result The resulting command object to be run.
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onStartIntepretCommand($cmd, $arg, $user, &$result) function onStartIntepretCommand($cmd, $arg, $user, &$result)
@ -350,7 +355,7 @@ class GroupPrivateMessagePlugin extends Plugin
* *
* @param Widget $widget The showgroup action being shown * @param Widget $widget The showgroup action being shown
* @param User_group $group The current group * @param User_group $group The current group
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onEndGroupActionsList($widget, $group) function onEndGroupActionsList($widget, $group)
@ -370,8 +375,10 @@ class GroupPrivateMessagePlugin extends Plugin
$action->elementStart('li', 'entity_send-a-message'); $action->elementStart('li', 'entity_send-a-message');
$action->element('a', array('href' => common_local_url('newgroupmessage', array('nickname' => $group->nickname)), $action->element('a', array('href' => common_local_url('newgroupmessage', array('nickname' => $group->nickname)),
// TRANS: Title for action in group actions list.
'title' => _m('Send a direct message to this group.')), 'title' => _m('Send a direct message to this group.')),
_m('Message')); // TRANS: Link text for action in group actions list to send a private message to a group.
_m('LINKTEXT','Message'));
// $form = new GroupMessageForm($action, $group); // $form = new GroupMessageForm($action, $group);
// $form->hidden = true; // $form->hidden = true;
// $form->show(); // $form->show();
@ -384,12 +391,9 @@ class GroupPrivateMessagePlugin extends Plugin
* privacy == always, force a group private message to all mentioned groups. * privacy == always, force a group private message to all mentioned groups.
* If any of the groups disallows private messages, skip it. * If any of the groups disallows private messages, skip it.
* *
* @param * @param
*
*/ */
function onStartNoticeSave(&$notice) { function onStartNoticeSave(&$notice) {
// Look for group tags // Look for group tags
// FIXME: won't work for remote groups // FIXME: won't work for remote groups
// @fixme if Notice::saveNew is refactored so we can just pull its list // @fixme if Notice::saveNew is refactored so we can just pull its list
@ -406,11 +410,9 @@ class GroupPrivateMessagePlugin extends Plugin
$profile = $notice->getProfile(); $profile = $notice->getProfile();
if ($count > 0) { if ($count > 0) {
/* Add them to the database */ /* Add them to the database */
foreach (array_unique($match[1]) as $nickname) { foreach (array_unique($match[1]) as $nickname) {
$group = User_group::getForNickname($nickname, $profile); $group = User_group::getForNickname($nickname, $profile);
if (empty($group)) { if (empty($group)) {
@ -433,7 +435,6 @@ class GroupPrivateMessagePlugin extends Plugin
} }
if ($forcePrivate) { if ($forcePrivate) {
foreach ($ignored as $group) { foreach ($ignored as $group) {
common_log(LOG_NOTICE, common_log(LOG_NOTICE,
"Notice forced to group direct message ". "Notice forced to group direct message ".
@ -454,11 +455,12 @@ class GroupPrivateMessagePlugin extends Plugin
// Don't save the notice! // Don't save the notice!
// FIXME: this is probably cheating. // FIXME: this is probably cheating.
// TRANS: Client exception thrown when a private group message has to be forced.
throw new ClientException(sprintf(_m('Forced notice to private group message.')), throw new ClientException(sprintf(_m('Forced notice to private group message.')),
200); 200);
} }
} }
return true; return true;
} }
@ -470,12 +472,12 @@ class GroupPrivateMessagePlugin extends Plugin
* *
* @return boolean hook value * @return boolean hook value
*/ */
function onEndGroupProfileElements($action, $group) function onEndGroupProfileElements($action, $group)
{ {
$gps = Group_privacy_settings::forGroup($group); $gps = Group_privacy_settings::forGroup($group);
if ($gps->allow_privacy == Group_privacy_settings::ALWAYS) { if ($gps->allow_privacy == Group_privacy_settings::ALWAYS) {
// TRANS: Indicator on the group page that the group is (essentially) private.
$action->element('p', 'privategroupindicator', _m('Private')); $action->element('p', 'privategroupindicator', _m('Private'));
} }
@ -486,7 +488,7 @@ class GroupPrivateMessagePlugin extends Plugin
{ {
if ($action instanceof ShowgroupAction) { if ($action instanceof ShowgroupAction) {
$gps = Group_privacy_settings::forGroup($action->group); $gps = Group_privacy_settings::forGroup($action->group);
if ($gps->allow_privacy == Group_privacy_settings::ALWAYS) { if ($gps->allow_privacy == Group_privacy_settings::ALWAYS) {
return false; return false;
} }
@ -501,6 +503,7 @@ class GroupPrivateMessagePlugin extends Plugin
'author' => 'Evan Prodromou', 'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:GroupPrivateMessage', 'homepage' => 'http://status.net/wiki/Plugin:GroupPrivateMessage',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin description.
_m('Allow posting private messages to groups.')); _m('Allow posting private messages to groups.'));
return true; return true;
} }

View File

@ -44,7 +44,6 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
* *
* @see DB_DataObject * @see DB_DataObject
*/ */
class Group_message extends Memcached_DataObject class Group_message extends Memcached_DataObject
{ {
public $__table = 'group_message'; // table name public $__table = 'group_message'; // table name
@ -66,7 +65,6 @@ class Group_message extends Memcached_DataObject
* @param mixed $v Value to lookup * @param mixed $v Value to lookup
* *
* @return Group_message object found, or null for no hits * @return Group_message object found, or null for no hits
*
*/ */
function staticGet($k, $v=null) function staticGet($k, $v=null)
{ {
@ -123,6 +121,8 @@ class Group_message extends Memcached_DataObject
{ {
if (!$user->hasRight(Right::NEWMESSAGE)) { if (!$user->hasRight(Right::NEWMESSAGE)) {
// XXX: maybe break this out into a separate right // XXX: maybe break this out into a separate right
// TRANS: Exception thrown when trying to send group private message without having the right to do that.
// TRANS: %s is a user nickname.
throw new Exception(sprintf(_m('User %s is not allowed to send private messages.'), throw new Exception(sprintf(_m('User %s is not allowed to send private messages.'),
$user->nickname)); $user->nickname));
} }
@ -134,6 +134,8 @@ class Group_message extends Memcached_DataObject
// We use the same limits as for 'regular' private messages. // We use the same limits as for 'regular' private messages.
if (Message::contentTooLong($text)) { if (Message::contentTooLong($text)) {
// TRANS: Exception thrown when trying to send group private message that is too long.
// TRANS: %d is the maximum meggage length.
throw new Exception(sprintf(_m('That\'s too long. Maximum message size is %d character.', throw new Exception(sprintf(_m('That\'s too long. Maximum message size is %d character.',
'That\'s too long. Maximum message size is %d characters.', 'That\'s too long. Maximum message size is %d characters.',
Message::maxContent()), Message::maxContent()),
@ -143,7 +145,7 @@ class Group_message extends Memcached_DataObject
// Valid! Let's do this thing! // Valid! Let's do this thing!
$gm = new Group_message(); $gm = new Group_message();
$gm->id = UUID::gen(); $gm->id = UUID::gen();
$gm->uri = common_local_url('showgroupmessage', array('id' => $gm->id)); $gm->uri = common_local_url('showgroupmessage', array('id' => $gm->id));
$gm->from_profile = $user->id; $gm->from_profile = $user->id;
@ -165,7 +167,7 @@ class Group_message extends Memcached_DataObject
function distribute() function distribute()
{ {
$group = User_group::staticGet('id', $this->to_group); $group = User_group::staticGet('id', $this->to_group);
$member = $group->getMembers(); $member = $group->getMembers();
while ($member->fetch()) { while ($member->fetch()) {
@ -177,6 +179,7 @@ class Group_message extends Memcached_DataObject
{ {
$group = User_group::staticGet('id', $this->to_group); $group = User_group::staticGet('id', $this->to_group);
if (empty($group)) { if (empty($group)) {
// TRANS: Exception thrown when trying to send group private message to a non-existing group.
throw new ServerException(_m('No group for group message.')); throw new ServerException(_m('No group for group message.'));
} }
return $group; return $group;
@ -186,6 +189,7 @@ class Group_message extends Memcached_DataObject
{ {
$sender = Profile::staticGet('id', $this->from_profile); $sender = Profile::staticGet('id', $this->from_profile);
if (empty($sender)) { if (empty($sender)) {
// TRANS: Exception thrown when trying to send group private message without having a sender.
throw new ServerException(_m('No sender for group message.')); throw new ServerException(_m('No sender for group message.'));
} }
return $sender; return $sender;
@ -204,5 +208,4 @@ class Group_message extends Memcached_DataObject
return $gm; return $gm;
} }
} }

View File

@ -44,7 +44,6 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
* *
* @see DB_DataObject * @see DB_DataObject
*/ */
class Group_message_profile extends Memcached_DataObject class Group_message_profile extends Memcached_DataObject
{ {
public $__table = 'group_message_profile'; // table name public $__table = 'group_message_profile'; // table name
@ -61,7 +60,6 @@ class Group_message_profile extends Memcached_DataObject
* @param mixed $v Value to lookup * @param mixed $v Value to lookup
* *
* @return Group_message object found, or null for no hits * @return Group_message object found, or null for no hits
*
*/ */
function staticGet($k, $v=null) function staticGet($k, $v=null)
{ {
@ -120,7 +118,7 @@ class Group_message_profile extends Memcached_DataObject
function send($gm, $profile) function send($gm, $profile)
{ {
$gmp = new Group_message_profile(); $gmp = new Group_message_profile();
$gmp->group_message_id = $gm->id; $gmp->group_message_id = $gm->id;
$gmp->to_profile = $profile->id; $gmp->to_profile = $profile->id;
$gmp->created = common_sql_now(); $gmp->created = common_sql_now();
@ -138,7 +136,7 @@ class Group_message_profile extends Memcached_DataObject
$this->notifyByMail(); $this->notifyByMail();
} }
function notifyByMail() function notifyByMail()
{ {
$to = User::staticGet('id', $this->to_profile); $to = User::staticGet('id', $this->to_profile);
@ -163,14 +161,14 @@ class Group_message_profile extends Memcached_DataObject
// TRANS: %3$s is the message content, %4$s a URL to the message, // TRANS: %3$s is the message content, %4$s a URL to the message,
// TRANS: %5$s is the StatusNet sitename. // TRANS: %5$s is the StatusNet sitename.
$body = sprintf(_m("%1\$s (%2\$s) sent a private message to group %3\$s:\n\n". $body = sprintf(_m("%1\$s (%2\$s) sent a private message to group %3\$s:\n\n".
"------------------------------------------------------\n". "------------------------------------------------------\n".
"%4\$s\n". "%4\$s\n".
"------------------------------------------------------\n\n". "------------------------------------------------------\n\n".
"You can reply to their message here:\n\n". "You can reply to their message here:\n\n".
"%5\$s\n\n". "%5\$s\n\n".
"Do not reply to this email; it will not get to them.\n\n". "Do not reply to this email; it will not get to them.\n\n".
"With kind regards,\n". "With kind regards,\n".
"%6\$s"), "%6\$s"),
$from_profile->getBestName(), $from_profile->getBestName(),
$from_profile->nickname, $from_profile->nickname,
$group->nickname, $group->nickname,

View File

@ -44,16 +44,15 @@ if (!defined('STATUSNET')) {
* *
* @see DB_DataObject * @see DB_DataObject
*/ */
class Group_privacy_settings extends Memcached_DataObject class Group_privacy_settings extends Memcached_DataObject
{ {
public $__table = 'group_privacy_settings'; public $__table = 'group_privacy_settings';
/** ID of the group. */ /** ID of the group. */
public $group_id; public $group_id;
/** When to allow privacy: always, sometimes, or never. */ /** When to allow privacy: always, sometimes, or never. */
public $allow_privacy; public $allow_privacy;
/** Who can send private messages: everyone, member, admin */ /** Who can send private messages: everyone, member, admin */
public $allow_sender; public $allow_sender;
/** row creation timestamp */ /** row creation timestamp */
public $created; public $created;
/** Last-modified timestamp */ /** Last-modified timestamp */
@ -81,7 +80,6 @@ class Group_privacy_settings extends Memcached_DataObject
* *
* @return User_greeting_count object found, or null for no hits * @return User_greeting_count object found, or null for no hits
*/ */
function staticGet($k, $v=null) function staticGet($k, $v=null)
{ {
return Memcached_DataObject::staticGet('Group_privacy_settings', $k, $v); return Memcached_DataObject::staticGet('Group_privacy_settings', $k, $v);
@ -95,7 +93,6 @@ class Group_privacy_settings extends Memcached_DataObject
* *
* @return array array of column definitions * @return array array of column definitions
*/ */
function table() function table()
{ {
return array('group_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL, return array('group_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
@ -103,7 +100,7 @@ class Group_privacy_settings extends Memcached_DataObject
'allow_sender' => DB_DATAOBJECT_INT, 'allow_sender' => DB_DATAOBJECT_INT,
'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL, '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); 'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
} }
/** /**
@ -115,7 +112,6 @@ class Group_privacy_settings extends Memcached_DataObject
* *
* @return array list of key field names * @return array list of key field names
*/ */
function keys() function keys()
{ {
return array_keys($this->keyTypes()); return array_keys($this->keyTypes());
@ -128,7 +124,6 @@ class Group_privacy_settings extends Memcached_DataObject
* 'K' for primary key: for compound keys, add an entry for each component; * 'K' for primary key: for compound keys, add an entry for each component;
* 'U' for unique keys: compound keys are not well supported here. * 'U' for unique keys: compound keys are not well supported here.
*/ */
function keyTypes() function keyTypes()
{ {
return array('group_id' => 'K'); return array('group_id' => 'K');
@ -139,7 +134,6 @@ class Group_privacy_settings extends Memcached_DataObject
* *
* @return array magic three-false array that stops auto-incrementing. * @return array magic three-false array that stops auto-incrementing.
*/ */
function sequenceKey() function sequenceKey()
{ {
return array(false, false, false); return array(false, false, false);
@ -164,6 +158,7 @@ class Group_privacy_settings extends Memcached_DataObject
$gps = self::forGroup($group); $gps = self::forGroup($group);
if ($gps->allow_privacy == Group_privacy_settings::NEVER) { if ($gps->allow_privacy == Group_privacy_settings::NEVER) {
// TRANS: Exception thrown when trying to set group privacy setting if group %s does not allow private messages.
throw new Exception(sprintf(_m('Group %s does not allow private messages.'), throw new Exception(sprintf(_m('Group %s does not allow private messages.'),
$group->nickname)); $group->nickname));
} }
@ -172,6 +167,8 @@ class Group_privacy_settings extends Memcached_DataObject
case Group_privacy_settings::EVERYONE: case Group_privacy_settings::EVERYONE:
$profile = $user->getProfile(); $profile = $user->getProfile();
if (Group_block::isBlocked($group, $profile)) { if (Group_block::isBlocked($group, $profile)) {
// TRANS: Exception thrown when trying to send group private message while blocked from that group.
// TRANS: %1$s is a user nickname, %2$s is a group nickname.
throw new Exception(sprintf(_m('User %1$s is blocked from group %2$s.'), throw new Exception(sprintf(_m('User %1$s is blocked from group %2$s.'),
$user->nickname, $user->nickname,
$group->nickname)); $group->nickname));
@ -179,6 +176,8 @@ class Group_privacy_settings extends Memcached_DataObject
break; break;
case Group_privacy_settings::MEMBER: case Group_privacy_settings::MEMBER:
if (!$user->isMember($group)) { if (!$user->isMember($group)) {
// TRANS: Exception thrown when trying to send group private message while not a member.
// TRANS: %1$s is a user nickname, %2$s is a group nickname.
throw new Exception(sprintf(_m('User %1$s is not a member of group %2$s.'), throw new Exception(sprintf(_m('User %1$s is not a member of group %2$s.'),
$user->nickname, $user->nickname,
$group->nickname)); $group->nickname));
@ -186,12 +185,16 @@ class Group_privacy_settings extends Memcached_DataObject
break; break;
case Group_privacy_settings::ADMIN: case Group_privacy_settings::ADMIN:
if (!$user->isAdmin($group)) { if (!$user->isAdmin($group)) {
// TRANS: Exception thrown when trying to send group private message while not a group administrator.
// TRANS: %1$s is a user nickname, %2$s is a group nickname.
throw new Exception(sprintf(_m('User %1$s is not an administrator of group %2$s.'), throw new Exception(sprintf(_m('User %1$s is not an administrator of group %2$s.'),
$user->nickname, $user->nickname,
$group->nickname)); $group->nickname));
} }
break; break;
default: default:
// TRANS: Exception thrown when encountering undefined group privacy settings.
// TRANS: %s is a group nickname.
throw new Exception(sprintf(_m('Unknown privacy settings for group %s.'), throw new Exception(sprintf(_m('Unknown privacy settings for group %s.'),
$group->nickname)); $group->nickname));
} }

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* List of private messages to this group * List of private messages to this group
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class GroupinboxAction extends GroupDesignAction class GroupinboxAction extends GroupDesignAction
{ {
var $gm; var $gm;
@ -63,6 +62,7 @@ class GroupinboxAction extends GroupDesignAction
$cur = common_current_user(); $cur = common_current_user();
if (empty($cur)) { if (empty($cur)) {
// TRANS: Client exception thrown when trying to view group inbox while not logged in.
throw new ClientException(_m('Only for logged-in users.'), 403); throw new ClientException(_m('Only for logged-in users.'), 403);
} }
@ -79,16 +79,19 @@ class GroupinboxAction extends GroupDesignAction
$localGroup = Local_group::staticGet('nickname', $nickname); $localGroup = Local_group::staticGet('nickname', $nickname);
if (empty($localGroup)) { if (empty($localGroup)) {
// TRANS: Client exception thrown when trying to view group inbox for non-existing group.
throw new ClientException(_m('No such group.'), 404); throw new ClientException(_m('No such group.'), 404);
} }
$this->group = User_group::staticGet('id', $localGroup->group_id); $this->group = User_group::staticGet('id', $localGroup->group_id);
if (empty($this->group)) { if (empty($this->group)) {
// TRANS: Client exception thrown when trying to view group inbox for non-existing group.
throw new ClientException(_m('No such group.'), 404); throw new ClientException(_m('No such group.'), 404);
} }
if (!$cur->isMember($this->group)) { if (!$cur->isMember($this->group)) {
// TRANS: Client exception thrown when trying to view group inbox while not a member.
throw new ClientException(_m('Only for members.'), 403); throw new ClientException(_m('Only for members.'), 403);
} }
@ -97,8 +100,8 @@ class GroupinboxAction extends GroupDesignAction
if (!$this->page) { if (!$this->page) {
$this->page = 1; $this->page = 1;
} }
$this->gm = Group_message::forGroup($this->group, $this->gm = Group_message::forGroup($this->group,
($this->page - 1) * MESSAGES_PER_PAGE, ($this->page - 1) * MESSAGES_PER_PAGE,
MESSAGES_PER_PAGE + 1); MESSAGES_PER_PAGE + 1);
return true; return true;
@ -122,6 +125,7 @@ class GroupinboxAction extends GroupDesignAction
$cnt = $gml->show(); $cnt = $gml->show();
if ($cnt == 0) { if ($cnt == 0) {
// TRANS: Text of group inbox if no private messages were sent to it.
$this->element('p', 'guide', _m('This group has not received any private messages.')); $this->element('p', 'guide', _m('This group has not received any private messages.'));
} }
$this->pagination($this->page > 1, $this->pagination($this->page > 1,
@ -167,6 +171,7 @@ class GroupinboxAction extends GroupDesignAction
$base = $this->group->getFancyName(); $base = $this->group->getFancyName();
if ($this->page == 1) { if ($this->page == 1) {
// TRANS: Title of inbox for group %s.
return sprintf(_m('%s group inbox'), $base); return sprintf(_m('%s group inbox'), $base);
} else { } else {
// TRANS: Page title for any but first group page. // TRANS: Page title for any but first group page.
@ -184,7 +189,6 @@ class GroupinboxAction extends GroupDesignAction
* *
* @return void * @return void
*/ */
function showPageNotice() function showPageNotice()
{ {
$instr = $this->getInstructions(); $instr = $this->getInstructions();

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Command object for messages to groups * Command object for messages to groups
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class GroupMessageCommand extends Command class GroupMessageCommand extends Command
{ {
/** User sending the message. */ /** User sending the message. */
@ -61,7 +60,6 @@ class GroupMessageCommand extends Command
* @param string $nickname Nickname of the group * @param string $nickname Nickname of the group
* @param string $text Text of message * @param string $text Text of message
*/ */
function __construct($user, $nickname, $text) function __construct($user, $nickname, $text)
{ {
$this->user = $user; $this->user = $user;
@ -76,8 +74,9 @@ class GroupMessageCommand extends Command
$gm = Group_message::send($this->user, $group, $this->text); $gm = Group_message::send($this->user, $group, $this->text);
$channel->output($this->user, $channel->output($this->user,
sprintf(_m('Direct message to group %s sent.'), // TRANS: Succes message after sending private group message to group %s.
sprintf(_m('Direct message to group %s sent.'),
$group->nickname)); $group->nickname));
return true; return true;

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Form for posting a group message * Form for posting a group message
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class GroupMessageForm extends Form class GroupMessageForm extends Form
{ {
var $group; var $group;
@ -58,7 +57,6 @@ class GroupMessageForm extends Form
* *
* @todo add a drop-down list to post to any group * @todo add a drop-down list to post to any group
*/ */
function __construct($out, $group, $content=null) function __construct($out, $group, $content=null)
{ {
parent::__construct($out); parent::__construct($out);
@ -71,7 +69,7 @@ class GroupMessageForm extends Form
* Action for the form * Action for the form
*/ */
function action() function action()
{ {
return common_local_url('newgroupmessage', return common_local_url('newgroupmessage',
array('nickname' => $this->group->nickname)); array('nickname' => $this->group->nickname));
} }
@ -87,6 +85,7 @@ class GroupMessageForm extends Form
{ {
$this->out->element('legend', $this->out->element('legend',
null, null,
// TRANS: Form legend for sending private message to group %s.
sprintf(_m('Message to %s'), $this->group->nickname)); sprintf(_m('Message to %s'), $this->group->nickname));
} }
@ -97,7 +96,6 @@ class GroupMessageForm extends Form
* *
* @return * @return
*/ */
function id() function id()
{ {
return 'form_notice-group-message'; return 'form_notice-group-message';
@ -110,7 +108,6 @@ class GroupMessageForm extends Form
* *
* @return * @return
*/ */
function formClass() function formClass()
{ {
return 'form_notice'; return 'form_notice';
@ -123,11 +120,11 @@ class GroupMessageForm extends Form
* *
* @return * @return
*/ */
function formData() function formData()
{ {
$this->out->element('label', array('for' => 'notice_data-text', $this->out->element('label', array('for' => 'notice_data-text',
'id' => 'notice_data-text-label'), 'id' => 'notice_data-text-label'),
// TRANS: Field label for private group message to group %s.
sprintf(_m('Direct message to %s'), $this->group->nickname)); sprintf(_m('Direct message to %s'), $this->group->nickname));
$this->out->element('textarea', array('id' => 'notice_data-text', $this->out->element('textarea', array('id' => 'notice_data-text',
@ -140,6 +137,7 @@ class GroupMessageForm extends Form
if ($contentLimit > 0) { if ($contentLimit > 0) {
$this->out->elementStart('dl', 'form_note'); $this->out->elementStart('dl', 'form_note');
// TRANS: Indicator for number of chatacters still available for notice.
$this->out->element('dt', null, _m('Available characters')); $this->out->element('dt', null, _m('Available characters'));
$this->out->element('dd', array('class' => 'count'), $this->out->element('dd', array('class' => 'count'),
$contentLimit); $contentLimit);
@ -154,13 +152,13 @@ class GroupMessageForm extends Form
* *
* @return * @return
*/ */
function formActions() function formActions()
{ {
$this->out->element('input', array('id' => 'notice_action-submit', $this->out->element('input', array('id' => 'notice_action-submit',
'class' => 'submit', 'class' => 'submit',
'name' => 'message_send', 'name' => 'message_send',
'type' => 'submit', 'type' => 'submit',
// TRANS: Send button text for sending private group notice.
'value' => _m('Send button for sending notice', 'Send'))); 'value' => _m('Send button for sending notice', 'Send')));
} }
} }

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Widget for showing list of group messages * Widget for showing list of group messages
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Widget for showing an individual group message * Widget for showing an individual group message
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -69,13 +69,13 @@ class GroupMessageListItem extends Widget
{ {
$group = $this->gm->getGroup(); $group = $this->gm->getGroup();
$sender = $this->gm->getSender(); $sender = $this->gm->getSender();
$this->out->elementStart('li', array('class' => 'hentry notice message group-message', $this->out->elementStart('li', array('class' => 'hentry notice message group-message',
'id' => 'message-' . $this->gm->id)); 'id' => 'message-' . $this->gm->id));
$this->out->elementStart('div', 'entry-title'); $this->out->elementStart('div', 'entry-title');
$this->out->elementStart('span', 'vcard author'); $this->out->elementStart('span', 'vcard author');
$this->out->elementStart('a', $this->out->elementStart('a',
array('href' => $sender->profileurl, array('href' => $sender->profileurl,
'class' => 'url')); 'class' => 'url'));
$avatar = $sender->getAvatar(AVATAR_STREAM_SIZE); $avatar = $sender->getAvatar(AVATAR_STREAM_SIZE);

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Action for adding a new group message * Action for adding a new group message
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class NewgroupmessageAction extends Action class NewgroupmessageAction extends Action
{ {
var $group; var $group;
@ -58,7 +57,6 @@ class NewgroupmessageAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -66,10 +64,12 @@ class NewgroupmessageAction extends Action
$this->user = common_current_user(); $this->user = common_current_user();
if (empty($this->user)) { if (empty($this->user)) {
// TRANS: Client exception thrown when trying to send a private group message while not logged in.
throw new ClientException(_m('Must be logged in.'), 403); throw new ClientException(_m('Must be logged in.'), 403);
} }
if (!$this->user->hasRight(Right::NEWMESSAGE)) { if (!$this->user->hasRight(Right::NEWMESSAGE)) {
// TRANS: Exception thrown when user %s is not allowed to send a private group message.
throw new Exception(sprintf(_m('User %s is not allowed to send private messages.'), throw new Exception(sprintf(_m('User %s is not allowed to send private messages.'),
$this->user->nickname)); $this->user->nickname));
} }
@ -87,21 +87,21 @@ class NewgroupmessageAction extends Action
$localGroup = Local_group::staticGet('nickname', $nickname); $localGroup = Local_group::staticGet('nickname', $nickname);
if (empty($localGroup)) { if (empty($localGroup)) {
// TRANS: Client exception thrown when trying to send a private group message to a non-existing group.
throw new ClientException(_m('No such group.'), 404); throw new ClientException(_m('No such group.'), 404);
} }
$this->group = User_group::staticGet('id', $localGroup->group_id); $this->group = User_group::staticGet('id', $localGroup->group_id);
if (empty($this->group)) { if (empty($this->group)) {
// TRANS: Client exception thrown when trying to send a private group message to a non-existing group.
throw new ClientException(_m('No such group.'), 404); throw new ClientException(_m('No such group.'), 404);
} }
// This throws an exception on error // This throws an exception on error
Group_privacy_settings::ensurePost($this->user, $this->group); Group_privacy_settings::ensurePost($this->user, $this->group);
// If we're posted to, check session token and get text // If we're posted to, check session token and get text
if ($this->isPost()) { if ($this->isPost()) {
$this->checkSessionToken(); $this->checkSessionToken();
$this->text = $this->trimmed('content'); $this->text = $this->trimmed('content');
@ -117,7 +117,6 @@ class NewgroupmessageAction extends Action
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
if ($this->isPost()) { if ($this->isPost()) {
@ -140,11 +139,13 @@ class NewgroupmessageAction extends Action
if ($this->boolean('ajax')) { if ($this->boolean('ajax')) {
$this->startHTML('text/xml;charset=utf-8'); $this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head'); $this->elementStart('head');
// TRANS: Title after sending a private group message.
$this->element('title', null, _m('Message sent')); $this->element('title', null, _m('Message sent'));
$this->elementEnd('head'); $this->elementEnd('head');
$this->elementStart('body'); $this->elementStart('body');
$this->element('p', $this->element('p',
array('id' => 'command_result'), array('id' => 'command_result'),
// TRANS: Succes text after sending a direct message to group %s.
sprintf(_m('Direct message to %s sent.'), sprintf(_m('Direct message to %s sent.'),
$this->group->nickname)); $this->group->nickname));
$this->elementEnd('body'); $this->elementEnd('body');
@ -156,6 +157,7 @@ class NewgroupmessageAction extends Action
function title() function title()
{ {
// TRANS: Title of form for new private group message.
return sprintf(_m('New message to group %s'), $this->group->nickname); return sprintf(_m('New message to group %s'), $this->group->nickname);
} }
} }

View File

@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc. * Copyright (C) 2011, StatusNet, Inc.
* *
* Show a single group message * Show a single group message
* *
* PHP version 5 * PHP version 5
* *
* This program is free software: you can redistribute it and/or modify * This program is free software: you can redistribute it and/or modify
@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class ShowgroupmessageAction extends Action class ShowgroupmessageAction extends Action
{ {
var $gm; var $gm;
@ -59,7 +58,6 @@ class ShowgroupmessageAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -67,6 +65,7 @@ class ShowgroupmessageAction extends Action
$this->user = common_current_user(); $this->user = common_current_user();
if (empty($this->user)) { if (empty($this->user)) {
// TRANS: Client exception thrown when trying to view group private messages without being logged in.
throw new ClientException(_m('Only logged-in users can view private messages.'), throw new ClientException(_m('Only logged-in users can view private messages.'),
403); 403);
} }
@ -76,22 +75,26 @@ class ShowgroupmessageAction extends Action
$this->gm = Group_message::staticGet('id', $id); $this->gm = Group_message::staticGet('id', $id);
if (empty($this->gm)) { if (empty($this->gm)) {
// TRANS: Client exception thrown when trying to view a non-existing group private message.
throw new ClientException(_m('No such message.'), 404); throw new ClientException(_m('No such message.'), 404);
} }
$this->group = User_group::staticGet('id', $this->gm->to_group); $this->group = User_group::staticGet('id', $this->gm->to_group);
if (empty($this->group)) { if (empty($this->group)) {
// TRANS: Server exception thrown when trying to view group private messages for a non-exsting group.
throw new ServerException(_m('Group not found.')); throw new ServerException(_m('Group not found.'));
} }
if (!$this->user->isMember($this->group)) { if (!$this->user->isMember($this->group)) {
// TRANS: Client exception thrown when trying to view a group private message without being a group member.
throw new ClientException(_m('Cannot read message.'), 403); throw new ClientException(_m('Cannot read message.'), 403);
} }
$this->sender = Profile::staticGet('id', $this->gm->from_profile); $this->sender = Profile::staticGet('id', $this->gm->from_profile);
if (empty($this->sender)) { if (empty($this->sender)) {
// TRANS: Server exception thrown when trying to view a group private message without a sender.
throw new ServerException(_m('No sender found.')); throw new ServerException(_m('No sender found.'));
} }
@ -105,7 +108,6 @@ class ShowgroupmessageAction extends Action
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
$this->showPage(); $this->showPage();
@ -114,9 +116,10 @@ class ShowgroupmessageAction extends Action
/** /**
* Title of the page * Title of the page
*/ */
function title() function title()
{ {
// TRANS: Title for private group message.
// TRANS: %1$s is the sender name, %2$s is the group name, %3$s is a timestamp.
return sprintf(_m('Message from %1$s to group %2$s on %3$s'), return sprintf(_m('Message from %1$s to group %2$s on %3$s'),
$this->sender->nickname, $this->sender->nickname,
$this->group->nickname, $this->group->nickname,
@ -126,7 +129,6 @@ class ShowgroupmessageAction extends Action
/** /**
* Show the content area. * Show the content area.
*/ */
function showContent() function showContent()
{ {
$this->elementStart('ul', 'notices messages'); $this->elementStart('ul', 'notices messages');
@ -144,7 +146,6 @@ class ShowgroupmessageAction extends Action
* *
* @return boolean is read only action? * @return boolean is read only action?
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return true; return true;

View File

@ -25,9 +25,8 @@ if (!defined('STATUSNET')) {
* Check DB queries for filesorts and such and log em. * Check DB queries for filesorts and such and log em.
* *
* @package SQLStatsPlugin * @package SQLStatsPlugin
* @maintainer Evan Prodromou <brion@status.net> * @maintainer Evan Prodromou <evan@status.net>
*/ */
class SQLStatsPlugin extends Plugin class SQLStatsPlugin extends Plugin
{ {
protected $queryCount = 0; protected $queryCount = 0;
@ -42,6 +41,7 @@ class SQLStatsPlugin extends Plugin
'author' => 'Evan Prodromou', 'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:SQLStats', 'homepage' => 'http://status.net/wiki/Plugin:SQLStats',
'rawdescription' => 'rawdescription' =>
// TRANS: Plugin decription.
_m('Debug tool to watch for poorly indexed DB queries.')); _m('Debug tool to watch for poorly indexed DB queries.'));
return true; return true;

View File

@ -1349,7 +1349,7 @@ table.profile_list tr.alt {
margin: 0px; margin: 0px;
} }
.question fieldset legend, .qna-full-question fieldset legend { .question fieldset legend, .qna-full-question fieldset legend, .answer fieldset legend {
display: none; display: none;
} }
@ -1408,7 +1408,7 @@ table.profile_list tr.alt {
margin-top: 0px; margin-top: 0px;
} }
.question p.best { .question p.best, .answer p.best {
background: url(../images/rosette.png) no-repeat top left; background: url(../images/rosette.png) no-repeat top left;
padding-left: 20px; padding-left: 20px;
} }

View File

@ -717,15 +717,10 @@ display:none;
#export_data li { #export_data li {
list-style-type:none; list-style-type:none;
display: inline; line-height: 2.5;
line-height: 2;
} }
#export_data li a { #export_data li a {
padding-left: 20px;
margin-right: 10px;
}
#export_data li a.foaf {
padding-left: 30px; padding-left: 30px;
} }