Merge branch '0.9.x' into 1.0.x

Conflicts:
	actions/confirmaddress.php
	actions/emailsettings.php
	actions/hostmeta.php
	actions/imsettings.php
	actions/login.php
	actions/profilesettings.php
	actions/showgroup.php
	actions/smssettings.php
	actions/urlsettings.php
	actions/userauthorization.php
	actions/userdesignsettings.php
	classes/Memcached_DataObject.php
	index.php
	lib/accountsettingsaction.php
	lib/action.php
	lib/common.php
	lib/connectsettingsaction.php
	lib/designsettings.php
	lib/personalgroupnav.php
	lib/profileaction.php
	lib/userprofile.php
	plugins/ClientSideShorten/ClientSideShortenPlugin.php
	plugins/Facebook/FBConnectSettings.php
	plugins/Facebook/FacebookPlugin.php
	plugins/NewMenu/NewMenuPlugin.php
	plugins/NewMenu/newmenu.css
This commit is contained in:
Zach Copley 2011-02-28 15:39:43 -08:00
commit b7d0746694
1504 changed files with 136871 additions and 78532 deletions

View File

@ -1075,3 +1075,43 @@ StartCloseNoticeListItemElement: Before the closing </li> of a notice list eleme
EndCloseNoticeListItemElement: After the closing </li> of a notice list element EndCloseNoticeListItemElement: After the closing </li> of a notice list element
- $nli: The notice list item being shown - $nli: The notice list item being shown
StartGroupEditFormData: Beginning the group edit form entries
- $form: The form widget being shown
EndGroupEditFormData: Ending the group edit form entries
- $form: The form widget being shown
StartGroupSave: After initializing but before saving a group
- &$group: group about to be saved
EndGroupSave: After saving a group, aliases, and first member
- $group: group that was saved
StartInterpretCommand: Before running a command
- $cmd: First word in the string, 'foo' in 'foo argument'
- $arg: Argument, if any, like 'argument' in 'foo argument'
- $user: User who issued the command
- &$result: Resulting command; you can set this!
EndInterpretCommand: Before running a command
- $cmd: First word in the string, 'foo' in 'foo argument'
- $arg: Argument, if any, like 'argument' in 'foo argument'
- $user: User who issued the command
- $result: Resulting command
StartGroupActionsList: Start the list of actions on a group profile page (after <ul>, before first <li>)
- $action: action being executed (for output and params)
- $group: group for the page
EndGroupActionsList: End the list of actions on a group profile page (before </ul>, after last </li>)
- $action: action being executed (for output and params)
- $group: group for the page
StartGroupProfileElements: Start showing stuff about the group on its profile page
- $action: action being executed (for output and params)
- $group: group for the page
EndGroupProfileElements: Start showing stuff about the group on its profile page
- $action: action being executed (for output and params)
- $group: group for the page

20
README
View File

@ -1283,7 +1283,7 @@ biolimit: max character length of bio; 0 means no limit; null means to use
backup: whether users can backup their own profiles. Defaults to true. backup: whether users can backup their own profiles. Defaults to true.
restore: whether users can restore their profiles from backup files. Defaults restore: whether users can restore their profiles from backup files. Defaults
to true. to true.
delete: whether users can delete their own accounts. Defaults to true. delete: whether users can delete their own accounts. Defaults to false.
move: whether users can move their accounts to another server. Defaults move: whether users can move their accounts to another server. Defaults
to true. to true.
@ -1592,6 +1592,24 @@ proxy_user: Username to use for authenticating to the HTTP proxy. Default null.
proxy_password: Password to use for authenticating to the HTTP proxy. Default null. proxy_password: Password to use for authenticating to the HTTP proxy. Default null.
proxy_auth_scheme: Scheme to use for authenticating to the HTTP proxy. Default null. proxy_auth_scheme: Scheme to use for authenticating to the HTTP proxy. Default null.
plugins
-------
default: associative array mapping plugin name to array of arguments. To disable
a default plugin, unset its value in this array.
locale_path: path for finding plugin locale files. In the plugin's directory
by default.
server: Server to find static files for a plugin when the page is plain old HTTP.
Defaults to site/server (same as pages). Use this to move plugin CSS and
JS files to a CDN.
sslserver: Server to find static files for a plugin when the page is HTTPS. Defaults
to site/server (same as pages). Use this to move plugin CSS and JS files
to a CDN.
path: Path to the plugin files. defaults to site/path + '/plugins/'. Expects that
each plugin will have a subdirectory at plugins/NameOfPlugin. Change this
if you're using a CDN.
sslpath: Path to use on the SSL server. Same as plugins/path.
Plugins Plugins
======= =======

View File

@ -149,7 +149,7 @@ class ApiAccountUpdateDeliveryDeviceAction extends ApiAuthAction
if ($this->format == 'xml') { if ($this->format == 'xml') {
$this->initDocument('xml'); $this->initDocument('xml');
$this->showTwitterXmlUser($twitter_user); $this->showTwitterXmlUser($twitter_user, 'user', true);
$this->endDocument('xml'); $this->endDocument('xml');
} elseif ($this->format == 'json') { } elseif ($this->format == 'json') {
$this->initDocument('json'); $this->initDocument('json');

View File

@ -154,7 +154,7 @@ class ApiAccountUpdateProfileAction extends ApiAuthAction
if ($this->format == 'xml') { if ($this->format == 'xml') {
$this->initDocument('xml'); $this->initDocument('xml');
$this->showTwitterXmlUser($twitter_user); $this->showTwitterXmlUser($twitter_user, 'user', true);
$this->endDocument('xml'); $this->endDocument('xml');
} elseif ($this->format == 'json') { } elseif ($this->format == 'json') {
$this->initDocument('json'); $this->initDocument('json');

View File

@ -204,7 +204,7 @@ class ApiAccountUpdateProfileBackgroundImageAction extends ApiAuthAction
if ($this->format == 'xml') { if ($this->format == 'xml') {
$this->initDocument('xml'); $this->initDocument('xml');
$this->showTwitterXmlUser($twitter_user); $this->showTwitterXmlUser($twitter_user, 'user', true);
$this->endDocument('xml'); $this->endDocument('xml');
} elseif ($this->format == 'json') { } elseif ($this->format == 'json') {
$this->initDocument('json'); $this->initDocument('json');

View File

@ -188,7 +188,7 @@ class ApiAccountUpdateProfileColorsAction extends ApiAuthAction
if ($this->format == 'xml') { if ($this->format == 'xml') {
$this->initDocument('xml'); $this->initDocument('xml');
$this->showTwitterXmlUser($twitter_user); $this->showTwitterXmlUser($twitter_user, 'user', true);
$this->endDocument('xml'); $this->endDocument('xml');
} elseif ($this->format == 'json') { } elseif ($this->format == 'json') {
$this->initDocument('json'); $this->initDocument('json');

View File

@ -112,16 +112,17 @@ class ApiAccountUpdateProfileImageAction extends ApiAuthAction
return; return;
} }
$type = $imagefile->preferredType();
$filename = Avatar::filename( $filename = Avatar::filename(
$user->id, $user->id,
image_type_to_extension($imagefile->type), image_type_to_extension($type),
null, null,
'tmp'.common_timestamp() 'tmp'.common_timestamp()
); );
$filepath = Avatar::path($filename); $filepath = Avatar::path($filename);
move_uploaded_file($imagefile->filepath, $filepath); $imagefile->copyTo($filepath);
$profile = $this->user->getProfile(); $profile = $this->user->getProfile();
@ -139,7 +140,7 @@ class ApiAccountUpdateProfileImageAction extends ApiAuthAction
if ($this->format == 'xml') { if ($this->format == 'xml') {
$this->initDocument('xml'); $this->initDocument('xml');
$this->showTwitterXmlUser($twitter_user); $this->showTwitterXmlUser($twitter_user, 'user', true);
$this->endDocument('xml'); $this->endDocument('xml');
} elseif ($this->format == 'json') { } elseif ($this->format == 'json') {
$this->initDocument('json'); $this->initDocument('json');

View File

@ -39,7 +39,6 @@ require_once INSTALLDIR.'/lib/apibareauth.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
* @link http://status.net/ * @link http://status.net/
*/ */
class ApiAtomServiceAction extends ApiBareAuthAction class ApiAtomServiceAction extends ApiBareAuthAction
{ {
/** /**
@ -50,13 +49,13 @@ class ApiAtomServiceAction extends ApiBareAuthAction
* @return boolean success flag * @return boolean success flag
* *
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
$this->user = $this->getTargetUser($this->arg('id')); $this->user = $this->getTargetUser($this->arg('id'));
if (empty($this->user)) { if (empty($this->user)) {
// TRANS: Client error displayed when making an Atom API request for an unknown user.
$this->clientError(_('No such user.'), 404, $this->format); $this->clientError(_('No such user.'), 404, $this->format);
return; return;
} }
@ -71,7 +70,6 @@ class ApiAtomServiceAction extends ApiBareAuthAction
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
@ -83,13 +81,15 @@ class ApiAtomServiceAction extends ApiBareAuthAction
'xmlns:atom' => 'http://www.w3.org/2005/Atom', 'xmlns:atom' => 'http://www.w3.org/2005/Atom',
'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/')); 'xmlns:activity' => 'http://activitystrea.ms/spec/1.0/'));
$this->elementStart('workspace'); $this->elementStart('workspace');
$this->element('atom:title', null, _('Main')); // TRANS: Title for Atom feed.
$this->element('atom:title', null, _m('ATOM','Main'));
$this->elementStart('collection', $this->elementStart('collection',
array('href' => common_local_url('ApiTimelineUser', array('href' => common_local_url('ApiTimelineUser',
array('id' => $this->user->id, array('id' => $this->user->id,
'format' => 'atom')))); 'format' => 'atom'))));
$this->element('atom:title', $this->element('atom:title',
null, null,
// TRANS: Title for Atom feed. %s is a user nickname.
sprintf(_("%s timeline"), sprintf(_("%s timeline"),
$this->user->nickname)); $this->user->nickname));
$this->element('accept', null, 'application/atom+xml;type=entry'); $this->element('accept', null, 'application/atom+xml;type=entry');
@ -100,6 +100,7 @@ class ApiAtomServiceAction extends ApiBareAuthAction
array('subscriber' => $this->user->id)))); array('subscriber' => $this->user->id))));
$this->element('atom:title', $this->element('atom:title',
null, null,
// TRANS: Title for Atom feed with a user's subscriptions. %s is a user nickname.
sprintf(_("%s subscriptions"), sprintf(_("%s subscriptions"),
$this->user->nickname)); $this->user->nickname));
$this->element('accept', null, 'application/atom+xml;type=entry'); $this->element('accept', null, 'application/atom+xml;type=entry');
@ -110,6 +111,7 @@ class ApiAtomServiceAction extends ApiBareAuthAction
array('profile' => $this->user->id)))); array('profile' => $this->user->id))));
$this->element('atom:title', $this->element('atom:title',
null, null,
// TRANS: Title for Atom feed with a user's favorite notices. %s is a user nickname.
sprintf(_("%s favorites"), sprintf(_("%s favorites"),
$this->user->nickname)); $this->user->nickname));
$this->element('accept', null, 'application/atom+xml;type=entry'); $this->element('accept', null, 'application/atom+xml;type=entry');
@ -120,6 +122,7 @@ class ApiAtomServiceAction extends ApiBareAuthAction
array('profile' => $this->user->id)))); array('profile' => $this->user->id))));
$this->element('atom:title', $this->element('atom:title',
null, null,
// TRANS: Title for Atom feed with a user's memberships. %s is a user nickname.
sprintf(_("%s memberships"), sprintf(_("%s memberships"),
$this->user->nickname)); $this->user->nickname));
$this->element('accept', null, 'application/atom+xml;type=entry'); $this->element('accept', null, 'application/atom+xml;type=entry');

View File

@ -92,6 +92,7 @@ class ApiBlockCreateAction extends ApiAuthAction
} }
if (empty($this->user) || empty($this->other)) { if (empty($this->user) || empty($this->other)) {
// TRANS: Client error displayed when trying to block a non-existing user or a user from another site.
$this->clientError(_('No such user.'), 404, $this->format); $this->clientError(_('No such user.'), 404, $this->format);
return; return;
} }

View File

@ -141,7 +141,7 @@ class ApiDirectMessageNewAction extends ApiAuthAction
} else if (!$this->user->mutuallySubscribed($this->other)) { } else if (!$this->user->mutuallySubscribed($this->other)) {
$this->clientError( $this->clientError(
// TRANS: Client error displayed trying to direct message another user who's not a friend (403). // TRANS: Client error displayed trying to direct message another user who's not a friend (403).
_('Can\'t send direct messages to users who aren\'t your friend.'), _('Cannot send direct messages to users who aren\'t your friend.'),
403, 403,
$this->format $this->format
); );

View File

@ -66,6 +66,12 @@ class ApiGroupMembershipAction extends ApiPrivateAuthAction
parent::prepare($args); parent::prepare($args);
$this->group = $this->getTargetGroup($this->arg('id')); $this->group = $this->getTargetGroup($this->arg('id'));
if (empty($this->group)) {
// TRANS: Client error displayed trying to show group membership on a non-existing group.
$this->clientError(_('Group not found.'), 404, $this->format);
return false;
}
$this->profiles = $this->getProfiles(); $this->profiles = $this->getProfiles();
return true; return true;
@ -84,12 +90,6 @@ class ApiGroupMembershipAction extends ApiPrivateAuthAction
{ {
parent::handle($args); parent::handle($args);
if (empty($this->group)) {
// TRANS: Client error displayed trying to show group membership on a non-existing group.
$this->clientError(_('Group not found.'), 404, $this->format);
return false;
}
// XXX: RSS and Atom // XXX: RSS and Atom
switch($this->format) { switch($this->format) {

View File

@ -84,6 +84,7 @@ class ApiOauthAccessTokenAction extends ApiOauthAction
common_debug(var_export($req, true)); common_debug(var_export($req, true));
$code = $e->getCode(); $code = $e->getCode();
$this->clientError($e->getMessage(), empty($code) ? 401 : $code, 'text'); $this->clientError($e->getMessage(), empty($code) ? 401 : $code, 'text');
return;
} }
if (empty($atok)) { if (empty($atok)) {
@ -98,7 +99,7 @@ class ApiOauthAccessTokenAction extends ApiOauthAction
common_log(LOG_WARNING, $msg); common_log(LOG_WARNING, $msg);
// TRANS: Client error given from the OAuth API when the request token or verifier is invalid. // TRANS: Client error given from the OAuth API when the request token or verifier is invalid.
$this->clientError(_("Invalid request token or verifier.", 400, 'text')); $this->clientError(_('Invalid request token or verifier.'), 400, 'text');
} else { } else {
common_log( common_log(
LOG_INFO, LOG_INFO,

View File

@ -114,6 +114,7 @@ class ApiStatusesShowAction extends ApiPrivateAuthAction
$this->deleteNotice(); $this->deleteNotice();
break; break;
default: default:
// TRANS: Client error displayed calling an unsupported HTTP error in API status show.
$this->clientError(_('HTTP method not supported.'), 405); $this->clientError(_('HTTP method not supported.'), 405);
return; return;
} }
@ -138,7 +139,9 @@ class ApiStatusesShowAction extends ApiPrivateAuthAction
$this->showSingleAtomStatus($this->notice); $this->showSingleAtomStatus($this->notice);
break; break;
default: default:
throw new Exception(sprintf(_("Unsupported format: %s"), $this->format)); // TRANS: Exception thrown requesting an unsupported notice output format.
// TRANS: %s is the requested output format.
throw new Exception(sprintf(_("Unsupported format: %s."), $this->format));
} }
} else { } else {
// XXX: Twitter just sets a 404 header and doens't bother // XXX: Twitter just sets a 404 header and doens't bother
@ -171,7 +174,7 @@ class ApiStatusesShowAction extends ApiPrivateAuthAction
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD'); return ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD');
@ -220,14 +223,16 @@ class ApiStatusesShowAction extends ApiPrivateAuthAction
function deleteNotice() function deleteNotice()
{ {
if ($this->format != 'atom') { if ($this->format != 'atom') {
$this->clientError(_("Can only delete using the Atom format.")); // TRANS: Client error displayed when trying to delete a notice not using the Atom format.
$this->clientError(_('Can only delete using the Atom format.'));
return; return;
} }
if (empty($this->auth_user) || if (empty($this->auth_user) ||
($this->notice->profile_id != $this->auth_user->id && ($this->notice->profile_id != $this->auth_user->id &&
!$this->auth_user->hasRight(Right::DELETEOTHERSNOTICE))) { !$this->auth_user->hasRight(Right::DELETEOTHERSNOTICE))) {
$this->clientError(_('Can\'t delete this notice.'), 403); // TRANS: Client error displayed when a user has no rights to delete notices of other users.
$this->clientError(_('Cannot delete this notice.'), 403);
return; return;
} }
@ -240,6 +245,7 @@ class ApiStatusesShowAction extends ApiPrivateAuthAction
header('HTTP/1.1 200 OK'); header('HTTP/1.1 200 OK');
header('Content-Type: text/plain'); header('Content-Type: text/plain');
// TRANS: Confirmation of notice deletion in API. %d is the ID (number) of the deleted notice.
print(sprintf(_('Deleted notice %d'), $this->notice->id)); print(sprintf(_('Deleted notice %d'), $this->notice->id));
print("\n"); print("\n");
} }

View File

@ -377,7 +377,7 @@ class ApiStatusesUpdateAction extends ApiAuthAction
function supported($cmd) function supported($cmd)
{ {
static $cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand', static $cmdlist = array('MessageCommand', 'SubCommand', 'UnsubCommand',
'FavCommand', 'OnCommand', 'OffCommand'); 'FavCommand', 'OnCommand', 'OffCommand', 'JoinCommand', 'LeaveCommand');
if (in_array(get_class($cmd), $cmdlist)) { if (in_array(get_class($cmd), $cmdlist)) {
return true; return true;

View File

@ -59,7 +59,8 @@ class ApiStatusnetConfigAction extends ApiAction
'notice' => array('contentlimit'), 'notice' => array('contentlimit'),
'throttle' => array('enabled', 'count', 'timespan'), 'throttle' => array('enabled', 'count', 'timespan'),
'xmpp' => array('enabled', 'server', 'port', 'user'), 'xmpp' => array('enabled', 'server', 'port', 'user'),
'integration' => array('source') 'integration' => array('source'),
'attachments' => array('uploads', 'file_quota')
); );
/** /**
@ -96,7 +97,7 @@ class ApiStatusnetConfigAction extends ApiAction
foreach ($this->keys as $section => $settings) { foreach ($this->keys as $section => $settings) {
$this->elementStart($section); $this->elementStart($section);
foreach ($settings as $setting) { foreach ($settings as $setting) {
$value = common_config($section, $setting); $value = $this->setting($section, $setting);
if (is_array($value)) { if (is_array($value)) {
$value = implode(',', $value); $value = implode(',', $value);
} else if ($value === false || $value == '0') { } else if ($value === false || $value == '0') {
@ -125,7 +126,7 @@ class ApiStatusnetConfigAction extends ApiAction
$result[$section] = array(); $result[$section] = array();
foreach ($settings as $setting) { foreach ($settings as $setting) {
$result[$section][$setting] $result[$section][$setting]
= common_config($section, $setting); = $this->setting($section, $setting);
} }
} }
$this->initDocument('json'); $this->initDocument('json');
@ -143,6 +144,20 @@ class ApiStatusnetConfigAction extends ApiAction
} }
} }
function setting($section, $key) {
$result = common_config($section, $key);
if ($key == 'file_quota') {
// hack: adjust for the live upload limit
if (common_config($section, 'uploads')) {
$max = ImageFile::maxFileSizeInt();
} else {
$max = 0;
}
return min($result, $max);
}
return $result;
}
/** /**
* Return true if read only. * Return true if read only.
* *

View File

@ -169,6 +169,14 @@ class ApiTimelineFavoritesAction extends ApiBareAuthAction
case 'json': case 'json':
$this->showJsonTimeline($this->notices); $this->showJsonTimeline($this->notices);
break; break;
case 'as':
header('Content-Type: application/json; charset=utf-8');
$doc = new ActivityStreamJSONDocument($this->auth_user);
$doc->setTitle($title);
$doc->addLink($link,'alternate', 'text/html');
$doc->addItemsFromNotices($this->notices);
$this->raw($doc->asString());
break;
default: default:
// TRANS: Client error displayed when trying to handle an unknown API method. // TRANS: Client error displayed when trying to handle an unknown API method.
$this->clientError(_('API method not found.'), $code = 404); $this->clientError(_('API method not found.'), $code = 404);

View File

@ -263,6 +263,14 @@ class ApiTimelineFriendsAction extends ApiBareAuthAction
case 'json': case 'json':
$this->showJsonTimeline($this->notices); $this->showJsonTimeline($this->notices);
break; break;
case 'as':
header('Content-Type: application/json; charset=utf-8');
$doc = new ActivityStreamJSONDocument($this->auth_user);
$doc->setTitle($title);
$doc->addLink($link,'alternate', 'text/html');
$doc->addItemsFromNotices($this->notices);
$this->raw($doc->asString());
break;
default: default:
// TRANS: Client error displayed when trying to handle an unknown API method. // TRANS: Client error displayed when trying to handle an unknown API method.
$this->clientError(_('API method not found.'), $code = 404); $this->clientError(_('API method not found.'), $code = 404);

View File

@ -106,6 +106,11 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
$self = $this->getSelfUri(); $self = $this->getSelfUri();
$link = common_local_url(
'ApiTimelineGroup',
array('nickname' => $this->group->nickname)
);
switch($this->format) { switch($this->format) {
case 'xml': case 'xml':
$this->showXmlTimeline($this->notices); $this->showXmlTimeline($this->notices);
@ -123,24 +128,20 @@ class ApiTimelineGroupAction extends ApiPrivateAuthAction
break; break;
case 'atom': case 'atom':
header('Content-Type: application/atom+xml; charset=utf-8'); header('Content-Type: application/atom+xml; charset=utf-8');
try {
$atom->addEntryFromNotices($this->notices); $atom->addEntryFromNotices($this->notices);
$this->raw($atom->getString()); $this->raw($atom->getString());
} catch (Atom10FeedException $e) {
$this->serverError(
// TRANS: Server error displayed when generating an Atom feed fails.
// TRANS: %s is the error.
sprintf(_('Could not generate feed for group - %s'),$e->getMessage()),
400,
$this->format
);
return;
}
break; break;
case 'json': case 'json':
$this->showJsonTimeline($this->notices); $this->showJsonTimeline($this->notices);
break; break;
case 'as':
header('Content-Type: application/json; charset=utf-8');
$doc = new ActivityStreamJSONDocument($this->auth_user);
$doc->setTitle($atom->title);
$doc->addLink($link, 'alternate', 'text/html');
$doc->addItemsFromNotices($this->notices);
$this->raw($doc->asString());
break;
default: default:
$this->clientError( $this->clientError(
// TRANS: Client error displayed when trying to handle an unknown API method. // TRANS: Client error displayed when trying to handle an unknown API method.

View File

@ -168,6 +168,14 @@ class ApiTimelineHomeAction extends ApiBareAuthAction
case 'json': case 'json':
$this->showJsonTimeline($this->notices); $this->showJsonTimeline($this->notices);
break; break;
case 'as':
header('Content-Type: application/json; charset=utf-8');
$doc = new ActivityStreamJSONDocument($this->auth_user);
$doc->setTitle($title);
$doc->addLink($link, 'alternate', 'text/html');
$doc->addItemsFromNotices($this->notices);
$this->raw($doc->asString());
break;
default: default:
// TRANS: Client error displayed when trying to handle an unknown API method. // TRANS: Client error displayed when trying to handle an unknown API method.
$this->clientError(_('API method not found.'), $code = 404); $this->clientError(_('API method not found.'), $code = 404);

View File

@ -169,6 +169,14 @@ class ApiTimelineMentionsAction extends ApiBareAuthAction
case 'json': case 'json':
$this->showJsonTimeline($this->notices); $this->showJsonTimeline($this->notices);
break; break;
case 'as':
header('Content-Type: application/json; charset=utf-8');
$doc = new ActivityStreamJSONDocument($this->auth_user);
$doc->setTitle($title);
$doc->addLink($link, 'alternate', 'text/html');
$doc->addItemsFromNotices($this->notices);
$this->raw($doc->asString());
break;
default: default:
// TRANS: Client error displayed when trying to handle an unknown API method. // TRANS: Client error displayed when trying to handle an unknown API method.
$this->clientError(_('API method not found.'), $code = 404); $this->clientError(_('API method not found.'), $code = 404);

View File

@ -234,6 +234,14 @@ class ApiTimelinePublicAction extends ApiPrivateAuthAction
case 'json': case 'json':
$this->showJsonTimeline($this->notices); $this->showJsonTimeline($this->notices);
break; break;
case 'as':
header('Content-Type: application/json; charset=utf-8');
$doc = new ActivityStreamJSONDocument($this->auth_user);
$doc->setTitle($title);
$doc->addLink($link, 'alternate', 'text/html');
$doc->addItemsFromNotices($this->notices);
$this->raw($doc->asString());
break;
default: default:
// TRANS: Client error displayed when trying to handle an unknown API method. // TRANS: Client error displayed when trying to handle an unknown API method.
$this->clientError(_('API method not found.'), $code = 404); $this->clientError(_('API method not found.'), $code = 404);

View File

@ -92,6 +92,20 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction
$offset = ($this->page-1) * $this->cnt; $offset = ($this->page-1) * $this->cnt;
$limit = $this->cnt; $limit = $this->cnt;
// TRANS: Title for Atom feed "repeated to me". %s is the user nickname.
$title = sprintf(_("Repeated to %s"), $this->auth_user->nickname);
$subtitle = sprintf(
_('%1$s notices that were to repeated to %2$s / %3$s.'),
$sitename, $this->user->nickname, $profile->getBestName()
);
$taguribase = TagURI::base();
$id = "tag:$taguribase:RepeatedToMe:" . $this->auth_user->id;
$link = common_local_url(
'all',
array('nickname' => $this->auth_user->nickname)
);
$strm = $this->auth_user->repeatedToMe($offset, $limit, $this->since_id, $this->max_id); $strm = $this->auth_user->repeatedToMe($offset, $limit, $this->since_id, $this->max_id);
switch ($this->format) { switch ($this->format) {
@ -102,16 +116,31 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction
$this->showJsonTimeline($strm); $this->showJsonTimeline($strm);
break; break;
case 'atom': case 'atom':
$profile = $this->auth_user->getProfile(); header('Content-Type: application/atom+xml; charset=utf-8');
// TRANS: Title for Atom feed "repeated to me". %s is the user nickname. $atom = new AtomNoticeFeed($this->auth_user);
$title = sprintf(_("Repeated to %s"), $this->auth_user->nickname);
$taguribase = TagURI::base();
$id = "tag:$taguribase:RepeatedToMe:" . $this->auth_user->id;
$link = common_local_url('all',
array('nickname' => $this->auth_user->nickname));
$this->showAtomTimeline($strm, $title, $id, $link); $atom->setId($id);
$atom->setTitle($title);
$atom->setSubtitle($subtitle);
$atom->setUpdated('now');
$atom->addLink($link);
$id = $this->arg('id');
$atom->setSelfLink($self);
$atom->addEntryFromNotices($strm);
$this->raw($atom->getString());
break;
case 'as':
header('Content-Type: application/json; charset=utf-8');
$doc = new ActivityStreamJSONDocument($this->auth_user);
$doc->setTitle($title);
$doc->addLink($link, 'alternate', 'text/html');
$doc->addItemsFromNotices($strm);
$this->raw($doc->asString());
break; break;
default: default:
// TRANS: Client error displayed when trying to handle an unknown API method. // TRANS: Client error displayed when trying to handle an unknown API method.

View File

@ -93,9 +93,27 @@ class ApiTimelineRetweetsOfMeAction extends ApiAuthAction
$offset = ($this->page-1) * $this->cnt; $offset = ($this->page-1) * $this->cnt;
$limit = $this->cnt; $limit = $this->cnt;
$strm = $this->auth_user->repeatsOfMe($offset, $limit, $this->since_id, $this->max_id); // TRANS: Title of list of repeated notices of the logged in user.
// TRANS: %s is the nickname of the logged in user.
$title = sprintf(_("Repeats of %s"), $this->auth_user->nickname);
$sitename = common_config('site', 'name');
common_debug(var_export($strm, true)); $profile = $this->auth_user->getProfile();
$subtitle = sprintf(
_('%1$s notices that %2$s / %3$s has repeated.'),
$sitename, $this->auth_user->nickname, $profile->getBestName()
);
$taguribase = TagURI::base();
$id = "tag:$taguribase:RepeatsOfMe:" . $this->auth_user->id;
$link = common_local_url(
'all',
array('nickname' => $this->auth_user->nickname)
);
$strm = $this->auth_user->repeatsOfMe($offset, $limit, $this->since_id, $this->max_id);
switch ($this->format) { switch ($this->format) {
case 'xml': case 'xml':
@ -105,49 +123,28 @@ class ApiTimelineRetweetsOfMeAction extends ApiAuthAction
$this->showJsonTimeline($strm); $this->showJsonTimeline($strm);
break; break;
case 'atom': case 'atom':
$profile = $this->auth_user->getProfile();
// TRANS: Title of list of repeated notices of the logged in user.
// TRANS: %s is the nickname of the logged in user.
$title = sprintf(_("Repeats of %s"), $this->auth_user->nickname);
$taguribase = TagURI::base();
$id = "tag:$taguribase:RepeatsOfMe:" . $this->auth_user->id;
header('Content-Type: application/atom+xml; charset=utf-8'); header('Content-Type: application/atom+xml; charset=utf-8');
$atom = new AtomNoticeFeed($this->auth_user); $atom = new AtomNoticeFeed($this->auth_user);
$atom->setId($id); $atom->setId($id);
$atom->setTitle($title); $atom->setTitle($title);
$atom->setSubtitle($subtitle); $atom->setSubtitle($subtitle);
$atom->setUpdated('now'); $atom->setUpdated('now');
$atom->addLink($link);
$atom->addLink( $atom->setSelfLink($this->getSelfUri());
common_local_url(
'showstream',
array('nickname' => $this->auth_user->nickname)
)
);
$id = $this->arg('id');
$aargs = array('format' => 'atom');
if (!empty($id)) {
$aargs['id'] = $id;
}
$atom->addLink(
$this->getSelfUri('ApiTimelineRetweetsOfMe', $aargs),
array('rel' => 'self', 'type' => 'application/atom+xml')
);
$atom->addEntryFromNotices($strm); $atom->addEntryFromNotices($strm);
$this->raw($atom->getString()); $this->raw($atom->getString());
break;
case 'as':
header('Content-Type: application/json; charset=utf-8');
$doc = new ActivityStreamJSONDocument($this->auth_user);
$doc->setTitle($title);
$doc->addLink($link, 'alternate', 'text/html');
$doc->addItemsFromNotices($strm);
$this->raw($doc->asString());
break; break;
default: default:
// TRANS: Client error displayed when trying to handle an unknown API method. // TRANS: Client error displayed when trying to handle an unknown API method.
$this->clientError(_('API method not found.'), $code = 404); $this->clientError(_('API method not found.'), 404);
break; break;
} }
} }

View File

@ -107,7 +107,7 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
$sitename $sitename
); );
$taguribase = TagURI::base(); $taguribase = TagURI::base();
$id = "tag:$taguribase:TagTimeline:".$tag; $id = "tag:$taguribase:TagTimeline:".$this->tag;
$link = common_local_url( $link = common_local_url(
'tag', 'tag',
@ -116,8 +116,6 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
$self = $this->getSelfUri(); $self = $this->getSelfUri();
common_debug("self link is: $self");
switch($this->format) { switch($this->format) {
case 'xml': case 'xml':
$this->showXmlTimeline($this->notices); $this->showXmlTimeline($this->notices);
@ -154,6 +152,14 @@ class ApiTimelineTagAction extends ApiPrivateAuthAction
case 'json': case 'json':
$this->showJsonTimeline($this->notices); $this->showJsonTimeline($this->notices);
break; break;
case 'as':
header('Content-Type: application/json; charset=utf-8');
$doc = new ActivityStreamJSONDocument($this->auth_user);
$doc->setTitle($title);
$doc->addLink($link, 'alternate', 'text/html');
$doc->addItemsFromNotices($this->notices);
$this->raw($doc->asString());
break;
default: default:
// TRANS: Client error displayed when trying to handle an unknown API method. // TRANS: Client error displayed when trying to handle an unknown API method.
$this->clientError(_('API method not found.'), $code = 404); $this->clientError(_('API method not found.'), $code = 404);

View File

@ -201,6 +201,17 @@ class ApiTimelineUserAction extends ApiBareAuthAction
case 'json': case 'json':
$this->showJsonTimeline($this->notices); $this->showJsonTimeline($this->notices);
break; break;
case 'as':
header('Content-Type: application/json; charset=utf-8');
$doc = new ActivityStreamJSONDocument($this->auth_user);
$doc->setTitle($atom->title);
$doc->addLink($link, 'alternate', 'text/html');
$doc->addItemsFromNotices($this->notices);
// XXX: Add paging extension?
$this->raw($doc->asString());
break;
default: default:
// TRANS: Client error displayed when trying to handle an unknown API method. // TRANS: Client error displayed when trying to handle an unknown API method.
$this->clientError(_('API method not found.'), $code = 404); $this->clientError(_('API method not found.'), $code = 404);
@ -241,7 +252,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD'); return ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD');
@ -307,11 +318,13 @@ class ApiTimelineUserAction extends ApiBareAuthAction
$xml = trim(file_get_contents('php://input')); $xml = trim(file_get_contents('php://input'));
if (empty($xml)) { if (empty($xml)) {
// TRANS: Client error displayed attempting to post an empty API notice.
$this->clientError(_('Atom post must not be empty.')); $this->clientError(_('Atom post must not be empty.'));
} }
$dom = DOMDocument::loadXML($xml); $dom = DOMDocument::loadXML($xml);
if (!$dom) { if (!$dom) {
// TRANS: Client error displayed attempting to post an API that is not well-formed XML.
$this->clientError(_('Atom post must be well-formed XML.')); $this->clientError(_('Atom post must be well-formed XML.'));
} }
@ -327,10 +340,8 @@ class ApiTimelineUserAction extends ApiBareAuthAction
$saved = null; $saved = null;
if (Event::handle('StartAtomPubNewActivity', array(&$activity, $this->user, &$saved))) { if (Event::handle('StartAtomPubNewActivity', array(&$activity, $this->user, &$saved))) {
if ($activity->verb != ActivityVerb::POST) { if ($activity->verb != ActivityVerb::POST) {
// TRANS: Client error displayed when not using the POST verb. // TRANS: Client error displayed when not using the POST verb. Do not translate POST.
// TRANS: Do not translate POST.
$this->clientError(_('Can only handle POST activities.')); $this->clientError(_('Can only handle POST activities.'));
return; return;
} }
@ -375,6 +386,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction
} else { } else {
// @fixme fetch from $sourceUrl? // @fixme fetch from $sourceUrl?
// TRANS: Client error displayed when posting a notice without content through the API. // TRANS: Client error displayed when posting a notice without content through the API.
// TRANS: %d is the notice ID (number).
$this->clientError(sprintf(_('No content for notice %d.'), $this->clientError(sprintf(_('No content for notice %d.'),
$note->id)); $note->id));
return; return;
@ -403,6 +415,7 @@ class ApiTimelineUserAction extends ApiBareAuthAction
if (!empty($notice)) { if (!empty($notice)) {
// TRANS: Client error displayed when using another format than AtomPub. // TRANS: Client error displayed when using another format than AtomPub.
// TRANS: %s is the notice URI.
$this->clientError(sprintf(_('Notice with URI "%s" already exists.'), $this->clientError(sprintf(_('Notice with URI "%s" already exists.'),
$note->id)); $note->id));
return; return;
@ -427,14 +440,14 @@ class ApiTimelineUserAction extends ApiBareAuthAction
$profile = Profile::fromURI($uri); $profile = Profile::fromURI($uri);
if (!empty($profile)) { if (!empty($profile)) {
$options['replies'] = $uri; $options['replies'][] = $uri;
} else { } else {
$group = User_group::staticGet('uri', $uri); $group = User_group::staticGet('uri', $uri);
if (!empty($group)) { if (!empty($group)) {
$options['groups'] = $uri; $options['groups'][] = $uri;
} else { } else {
// @fixme: hook for discovery here // @fixme: hook for discovery here
common_log(LOG_WARNING, sprintf(_('AtomPub post with unknown attention URI %s'), $uri)); common_log(LOG_WARNING, sprintf('AtomPub post with unknown attention URI %s', $uri));
} }
} }
} }

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc. * Copyright (C) 2010, StatusNet, Inc.
* *
* Feed of ActivityStreams 'favorite' actions * Feed of ActivityStreams 'favorite' actions
* *
* 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
@ -46,7 +46,6 @@ require_once INSTALLDIR . '/lib/apiauth.php';
* @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 AtompubfavoritefeedAction extends ApiAuthAction class AtompubfavoritefeedAction extends ApiAuthAction
{ {
private $_profile = null; private $_profile = null;
@ -59,7 +58,6 @@ class AtompubfavoritefeedAction extends ApiAuthAction
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -67,7 +65,8 @@ class AtompubfavoritefeedAction extends ApiAuthAction
$this->_profile = Profile::staticGet('id', $this->trimmed('profile')); $this->_profile = Profile::staticGet('id', $this->trimmed('profile'));
if (empty($this->_profile)) { if (empty($this->_profile)) {
throw new ClientException(_('No such profile'), 404); // TRANS: Client exception thrown when requesting a favorite feed for a non-existing profile.
throw new ClientException(_('No such profile.'), 404);
} }
$offset = ($this->page-1) * $this->count; $offset = ($this->page-1) * $this->count;
@ -76,7 +75,7 @@ class AtompubfavoritefeedAction extends ApiAuthAction
$this->_faves = Fave::byProfile($this->_profile->id, $this->_faves = Fave::byProfile($this->_profile->id,
$offset, $offset,
$limit); $limit);
return true; return true;
} }
@ -87,7 +86,6 @@ class AtompubfavoritefeedAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -101,6 +99,7 @@ class AtompubfavoritefeedAction extends ApiAuthAction
$this->addFavorite(); $this->addFavorite();
break; break;
default: default:
// TRANS: Client exception thrown when using an unsupported HTTP method.
throw new ClientException(_('HTTP method not supported.'), 405); throw new ClientException(_('HTTP method not supported.'), 405);
return; return;
} }
@ -113,7 +112,6 @@ class AtompubfavoritefeedAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function showFeed() function showFeed()
{ {
header('Content-Type: application/atom+xml; charset=utf-8'); header('Content-Type: application/atom+xml; charset=utf-8');
@ -139,21 +137,25 @@ class AtompubfavoritefeedAction extends ApiAuthAction
$feed->addAuthor($this->_profile->getBestName(), $feed->addAuthor($this->_profile->getBestName(),
$this->_profile->getURI()); $this->_profile->getURI());
// TRANS: Title for Atom favorites feed.
// TRANS: %s is a user nickname.
$feed->setTitle(sprintf(_("%s favorites"), $feed->setTitle(sprintf(_("%s favorites"),
$this->_profile->getBestName())); $this->_profile->getBestName()));
$feed->setSubtitle(sprintf(_("Notices %s has favorited to on %s"), // TRANS: Subtitle for Atom favorites feed.
// TRANS: %1$s is a user nickname, %2$s is the StatusNet sitename.
$feed->setSubtitle(sprintf(_('Notices %1$s has favorited on %2$s'),
$this->_profile->getBestName(), $this->_profile->getBestName(),
common_config('site', 'name'))); common_config('site', 'name')));
$feed->addLink(common_local_url('showfavorites', $feed->addLink(common_local_url('showfavorites',
array('nickname' => array('nickname' =>
$this->_profile->nickname))); $this->_profile->nickname)));
$feed->addLink($url, $feed->addLink($url,
array('rel' => 'self', array('rel' => 'self',
'type' => 'application/atom+xml')); 'type' => 'application/atom+xml'));
// If there's more... // If there's more...
if ($this->page > 1) { if ($this->page > 1) {
@ -162,9 +164,9 @@ class AtompubfavoritefeedAction extends ApiAuthAction
'type' => 'application/atom+xml')); 'type' => 'application/atom+xml'));
$feed->addLink(common_local_url('AtomPubFavoriteFeed', $feed->addLink(common_local_url('AtomPubFavoriteFeed',
array('profile' => array('profile' =>
$this->_profile->id), $this->_profile->id),
array('page' => array('page' =>
$this->page - 1)), $this->page - 1)),
array('rel' => 'prev', array('rel' => 'prev',
'type' => 'application/atom+xml')); 'type' => 'application/atom+xml'));
@ -205,17 +207,17 @@ class AtompubfavoritefeedAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function addFavorite() function addFavorite()
{ {
// XXX: Refactor this; all the same for atompub // XXX: Refactor this; all the same for atompub
if (empty($this->auth_user) || if (empty($this->auth_user) ||
$this->auth_user->id != $this->_profile->id) { $this->auth_user->id != $this->_profile->id) {
throw new ClientException(_("Can't add someone else's". // TRANS: Client exception thrown when trying to set a favorite for another user.
" subscription"), 403); throw new ClientException(_("Cannot add someone else's".
" subscription."), 403);
} }
$xml = file_get_contents('php://input'); $xml = file_get_contents('php://input');
$dom = DOMDocument::loadXML($xml); $dom = DOMDocument::loadXML($xml);
@ -234,9 +236,8 @@ class AtompubfavoritefeedAction extends ApiAuthAction
if (Event::handle('StartAtomPubNewActivity', array(&$activity))) { if (Event::handle('StartAtomPubNewActivity', array(&$activity))) {
if ($activity->verb != ActivityVerb::FAVORITE) { if ($activity->verb != ActivityVerb::FAVORITE) {
// TRANS: Client error displayed when not using the POST verb. // TRANS: Client exception thrown when trying use an incorrect activity verb for the Atom pub method.
// TRANS: Do not translate POST. throw new ClientException(_('Can only handle favorite activities.'));
throw new ClientException(_('Can only handle Favorite activities.'));
return; return;
} }
@ -245,6 +246,7 @@ class AtompubfavoritefeedAction extends ApiAuthAction
if (!in_array($note->type, array(ActivityObject::NOTE, if (!in_array($note->type, array(ActivityObject::NOTE,
ActivityObject::BLOGENTRY, ActivityObject::BLOGENTRY,
ActivityObject::STATUS))) { ActivityObject::STATUS))) {
// TRANS: Client exception thrown when trying favorite an object that is not a notice.
throw new ClientException(_('Can only fave notices.')); throw new ClientException(_('Can only fave notices.'));
return; return;
} }
@ -253,6 +255,7 @@ class AtompubfavoritefeedAction extends ApiAuthAction
if (empty($notice)) { if (empty($notice)) {
// XXX: import from listed URL or something // XXX: import from listed URL or something
// TRANS: Client exception thrown when trying favorite a notice without content.
throw new ClientException(_('Unknown note.')); throw new ClientException(_('Unknown note.'));
} }
@ -260,6 +263,7 @@ class AtompubfavoritefeedAction extends ApiAuthAction
'notice_id' => $notice->id)); 'notice_id' => $notice->id));
if (!empty($old)) { if (!empty($old)) {
// TRANS: Client exception thrown when trying favorite an already favorited notice.
throw new ClientException(_('Already a favorite.')); throw new ClientException(_('Already a favorite.'));
} }
@ -296,7 +300,6 @@ class AtompubfavoritefeedAction extends ApiAuthAction
* *
* @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' ||
@ -328,7 +331,6 @@ class AtompubfavoritefeedAction extends ApiAuthAction
* *
* @return string etag http header * @return string etag http header
*/ */
function etag() function etag()
{ {
return null; return null;
@ -339,7 +341,6 @@ class AtompubfavoritefeedAction extends ApiAuthAction
* *
* @return boolean true if delete, else false * @return boolean true if delete, else false
*/ */
function requiresAuth() function requiresAuth()
{ {
if ($_SERVER['REQUEST_METHOD'] == 'GET' || if ($_SERVER['REQUEST_METHOD'] == 'GET' ||
@ -359,7 +360,6 @@ class AtompubfavoritefeedAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function notify($fave, $notice, $user) function notify($fave, $notice, $user)
{ {
$other = User::staticGet('id', $notice->profile_id); $other = User::staticGet('id', $notice->profile_id);

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc. * Copyright (C) 2010, StatusNet, Inc.
* *
* Feed of group memberships for a user, in ActivityStreams format * Feed of group memberships for a user, in ActivityStreams format
* *
* 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
@ -46,7 +46,6 @@ require_once INSTALLDIR . '/lib/apiauth.php';
* @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 AtompubmembershipfeedAction extends ApiAuthAction class AtompubmembershipfeedAction extends ApiAuthAction
{ {
private $_profile = null; private $_profile = null;
@ -59,7 +58,6 @@ class AtompubmembershipfeedAction extends ApiAuthAction
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -67,8 +65,9 @@ class AtompubmembershipfeedAction extends ApiAuthAction
$profileId = $this->trimmed('profile'); $profileId = $this->trimmed('profile');
$this->_profile = Profile::staticGet('id', $profileId); $this->_profile = Profile::staticGet('id', $profileId);
if (empty($this->_profile)) { if (empty($this->_profile)) {
// TRANS: Client exception.
throw new ClientException(_('No such profile.'), 404); throw new ClientException(_('No such profile.'), 404);
} }
@ -78,7 +77,7 @@ class AtompubmembershipfeedAction extends ApiAuthAction
$this->_memberships = Group_member::byMember($this->_profile->id, $this->_memberships = Group_member::byMember($this->_profile->id,
$offset, $offset,
$limit); $limit);
return true; return true;
} }
@ -89,7 +88,6 @@ class AtompubmembershipfeedAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -103,6 +101,7 @@ class AtompubmembershipfeedAction extends ApiAuthAction
$this->addMembership(); $this->addMembership();
break; break;
default: default:
// TRANS: Client exception thrown when using an unsupported HTTP method.
throw new ClientException(_('HTTP method not supported.'), 405); throw new ClientException(_('HTTP method not supported.'), 405);
return; return;
} }
@ -115,7 +114,6 @@ class AtompubmembershipfeedAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function showFeed() function showFeed()
{ {
header('Content-Type: application/atom+xml; charset=utf-8'); header('Content-Type: application/atom+xml; charset=utf-8');
@ -141,21 +139,25 @@ class AtompubmembershipfeedAction extends ApiAuthAction
$feed->addAuthor($this->_profile->getBestName(), $feed->addAuthor($this->_profile->getBestName(),
$this->_profile->getURI()); $this->_profile->getURI());
// TRANS: Title for group membership feed.
// TRANS: %s is a username.
$feed->setTitle(sprintf(_("%s group memberships"), $feed->setTitle(sprintf(_("%s group memberships"),
$this->_profile->getBestName())); $this->_profile->getBestName()));
$feed->setSubtitle(sprintf(_("Groups %s is a member of on %s"), // TRANS: Subtitle for group membership feed.
// TRANS: %1$s is a username, %2$s is the StatusNet sitename.
$feed->setSubtitle(sprintf(_('Groups %1$s is a member of on %2$s'),
$this->_profile->getBestName(), $this->_profile->getBestName(),
common_config('site', 'name'))); common_config('site', 'name')));
$feed->addLink(common_local_url('usergroups', $feed->addLink(common_local_url('usergroups',
array('nickname' => array('nickname' =>
$this->_profile->nickname))); $this->_profile->nickname)));
$feed->addLink($url, $feed->addLink($url,
array('rel' => 'self', array('rel' => 'self',
'type' => 'application/atom+xml')); 'type' => 'application/atom+xml'));
// If there's more... // If there's more...
if ($this->page > 1) { if ($this->page > 1) {
@ -164,9 +166,9 @@ class AtompubmembershipfeedAction extends ApiAuthAction
'type' => 'application/atom+xml')); 'type' => 'application/atom+xml'));
$feed->addLink(common_local_url('AtomPubMembershipFeed', $feed->addLink(common_local_url('AtomPubMembershipFeed',
array('profile' => array('profile' =>
$this->_profile->id), $this->_profile->id),
array('page' => array('page' =>
$this->page - 1)), $this->page - 1)),
array('rel' => 'prev', array('rel' => 'prev',
'type' => 'application/atom+xml')); 'type' => 'application/atom+xml'));
@ -207,17 +209,17 @@ class AtompubmembershipfeedAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function addMembership() function addMembership()
{ {
// XXX: Refactor this; all the same for atompub // XXX: Refactor this; all the same for atompub
if (empty($this->auth_user) || if (empty($this->auth_user) ||
$this->auth_user->id != $this->_profile->id) { $this->auth_user->id != $this->_profile->id) {
throw new ClientException(_("Can't add someone else's". // TRANS: Client exception thrown when trying subscribe someone else to a group.
" membership"), 403); throw new ClientException(_("Cannot add someone else's".
" membership."), 403);
} }
$xml = file_get_contents('php://input'); $xml = file_get_contents('php://input');
$dom = DOMDocument::loadXML($xml); $dom = DOMDocument::loadXML($xml);
@ -234,25 +236,26 @@ class AtompubmembershipfeedAction extends ApiAuthAction
$membership = null; $membership = null;
if (Event::handle('StartAtomPubNewActivity', array(&$activity))) { if (Event::handle('StartAtomPubNewActivity', array(&$activity))) {
if ($activity->verb != ActivityVerb::JOIN) { if ($activity->verb != ActivityVerb::JOIN) {
// TRANS: Client error displayed when not using the POST verb. // TRANS: Client error displayed when not using the POST verb.
// TRANS: Do not translate POST. // TRANS: Do not translate POST.
throw new ClientException(_('Can only handle Join activities.')); throw new ClientException(_('Can only handle join activities.'));
return; return;
} }
$groupObj = $activity->objects[0]; $groupObj = $activity->objects[0];
if ($groupObj->type != ActivityObject::GROUP) { if ($groupObj->type != ActivityObject::GROUP) {
// TRANS: Client exception thrown when trying favorite an object that is not a notice.
throw new ClientException(_('Can only fave notices.')); throw new ClientException(_('Can only fave notices.'));
return; return;
} }
$group = User_group::staticGet('uri', $groupObj->id); $group = User_group::staticGet('uri', $groupObj->id);
if (empty($group)) { if (empty($group)) {
// XXX: import from listed URL or something // XXX: import from listed URL or something
// TRANS: Client exception thrown when trying to subscribe to a non-existing group.
throw new ClientException(_('Unknown group.')); throw new ClientException(_('Unknown group.'));
} }
@ -260,6 +263,7 @@ class AtompubmembershipfeedAction extends ApiAuthAction
'group_id' => $group->id)); 'group_id' => $group->id));
if (!empty($old)) { if (!empty($old)) {
// TRANS: Client exception thrown when trying to subscribe to an already subscribed group.
throw new ClientException(_('Already a member.')); throw new ClientException(_('Already a member.'));
} }
@ -267,6 +271,7 @@ class AtompubmembershipfeedAction extends ApiAuthAction
if (Group_block::isBlocked($group, $profile)) { if (Group_block::isBlocked($group, $profile)) {
// XXX: import from listed URL or something // XXX: import from listed URL or something
// TRANS: Client exception thrown when trying to subscribe to group while blocked from that group.
throw new ClientException(_('Blocked by admin.')); throw new ClientException(_('Blocked by admin.'));
} }
@ -299,7 +304,6 @@ class AtompubmembershipfeedAction extends ApiAuthAction
* *
* @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' ||
@ -331,7 +335,6 @@ class AtompubmembershipfeedAction extends ApiAuthAction
* *
* @return string etag http header * @return string etag http header
*/ */
function etag() function etag()
{ {
return null; return null;
@ -342,7 +345,6 @@ class AtompubmembershipfeedAction extends ApiAuthAction
* *
* @return boolean true if delete, else false * @return boolean true if delete, else false
*/ */
function requiresAuth() function requiresAuth()
{ {
if ($_SERVER['REQUEST_METHOD'] == 'GET' || if ($_SERVER['REQUEST_METHOD'] == 'GET' ||

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc. * Copyright (C) 2010, StatusNet, Inc.
* *
* Show a single favorite in Atom Activity Streams format * Show a single favorite in Atom Activity Streams format
* *
* 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
@ -48,7 +48,6 @@ require_once INSTALLDIR . '/lib/apiauth.php';
* @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 AtompubshowfavoriteAction extends ApiAuthAction class AtompubshowfavoriteAction extends ApiAuthAction
{ {
private $_profile = null; private $_profile = null;
@ -62,7 +61,6 @@ class AtompubshowfavoriteAction extends ApiAuthAction
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -73,12 +71,14 @@ class AtompubshowfavoriteAction extends ApiAuthAction
$this->_profile = Profile::staticGet('id', $profileId); $this->_profile = Profile::staticGet('id', $profileId);
if (empty($this->_profile)) { if (empty($this->_profile)) {
// TRANS: Client exception.
throw new ClientException(_('No such profile.'), 404); throw new ClientException(_('No such profile.'), 404);
} }
$this->_notice = Notice::staticGet('id', $noticeId); $this->_notice = Notice::staticGet('id', $noticeId);
if (empty($this->_notice)) { if (empty($this->_notice)) {
// TRANS: Client exception thrown when referencing a non-existing notice.
throw new ClientException(_('No such notice.'), 404); throw new ClientException(_('No such notice.'), 404);
} }
@ -86,6 +86,7 @@ class AtompubshowfavoriteAction extends ApiAuthAction
'notice_id' => $noticeId)); 'notice_id' => $noticeId));
if (empty($this->_fave)) { if (empty($this->_fave)) {
// TRANS: Client exception thrown when referencing a non-existing favorite.
throw new ClientException(_('No such favorite.'), 404); throw new ClientException(_('No such favorite.'), 404);
} }
@ -99,7 +100,6 @@ class AtompubshowfavoriteAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -113,6 +113,7 @@ class AtompubshowfavoriteAction extends ApiAuthAction
$this->deleteFave(); $this->deleteFave();
break; break;
default: default:
// TRANS: Client exception thrown using an unsupported HTTP method.
throw new ClientException(_('HTTP method not supported.'), throw new ClientException(_('HTTP method not supported.'),
405); 405);
} }
@ -121,10 +122,9 @@ class AtompubshowfavoriteAction extends ApiAuthAction
/** /**
* Show a single favorite, in ActivityStreams format * Show a single favorite, in ActivityStreams format
* *
* @return void * @return void
*/ */
function showFave() function showFave()
{ {
$activity = $this->_fave->asActivity(); $activity = $this->_fave->asActivity();
@ -140,16 +140,16 @@ class AtompubshowfavoriteAction extends ApiAuthAction
/** /**
* Delete the favorite * Delete the favorite
* *
* @return void * @return void
*/ */
function deleteFave() function deleteFave()
{ {
if (empty($this->auth_user) || if (empty($this->auth_user) ||
$this->auth_user->id != $this->_profile->id) { $this->auth_user->id != $this->_profile->id) {
throw new ClientException(_("Can't delete someone else's". // TRANS: Client exception thrown when trying to remove a favorite notice of another user.
" favorite"), 403); throw new ClientException(_("Cannot delete someone else's".
" favorite."), 403);
} }
$this->_fave->delete(); $this->_fave->delete();
@ -166,7 +166,6 @@ class AtompubshowfavoriteAction extends ApiAuthAction
* *
* @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' ||
@ -184,7 +183,6 @@ class AtompubshowfavoriteAction extends ApiAuthAction
* *
* @return string last modified http header * @return string last modified http header
*/ */
function lastModified() function lastModified()
{ {
return max(strtotime($this->_profile->modified), return max(strtotime($this->_profile->modified),
@ -199,7 +197,6 @@ class AtompubshowfavoriteAction extends ApiAuthAction
* *
* @return string etag http header * @return string etag http header
*/ */
function etag() function etag()
{ {
$mtime = strtotime($this->_fave->modified); $mtime = strtotime($this->_fave->modified);
@ -215,7 +212,6 @@ class AtompubshowfavoriteAction extends ApiAuthAction
* *
* @return boolean true if delete, else false * @return boolean true if delete, else false
*/ */
function requiresAuth() function requiresAuth()
{ {
if ($_SERVER['REQUEST_METHOD'] == 'GET' || if ($_SERVER['REQUEST_METHOD'] == 'GET' ||

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc. * Copyright (C) 2010, StatusNet, Inc.
* *
* Show a single membership as an Activity Streams entry * Show a single membership as an Activity Streams entry
* *
* 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
@ -46,7 +46,6 @@ require_once INSTALLDIR . '/lib/apiauth.php';
* @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 AtompubshowmembershipAction extends ApiAuthAction class AtompubshowmembershipAction extends ApiAuthAction
{ {
private $_profile = null; private $_profile = null;
@ -60,7 +59,6 @@ class AtompubshowmembershipAction extends ApiAuthAction
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -68,8 +66,9 @@ class AtompubshowmembershipAction extends ApiAuthAction
$profileId = $this->trimmed('profile'); $profileId = $this->trimmed('profile');
$this->_profile = Profile::staticGet('id', $profileId); $this->_profile = Profile::staticGet('id', $profileId);
if (empty($this->_profile)) { if (empty($this->_profile)) {
// TRANS: Client exception.
throw new ClientException(_('No such profile.'), 404); throw new ClientException(_('No such profile.'), 404);
} }
@ -78,7 +77,8 @@ class AtompubshowmembershipAction extends ApiAuthAction
$this->_group = User_group::staticGet('id', $groupId); $this->_group = User_group::staticGet('id', $groupId);
if (empty($this->_group)) { if (empty($this->_group)) {
throw new ClientException(_('No such group'), 404); // TRANS: Client exception thrown when referencing a non-existing group.
throw new ClientException(_('No such group.'), 404);
} }
$kv = array('group_id' => $groupId, $kv = array('group_id' => $groupId,
@ -87,7 +87,8 @@ class AtompubshowmembershipAction extends ApiAuthAction
$this->_membership = Group_member::pkeyGet($kv); $this->_membership = Group_member::pkeyGet($kv);
if (empty($this->_membership)) { if (empty($this->_membership)) {
throw new ClientException(_('Not a member'), 404); // TRANS: Client exception thrown when trying to show membership of a non-subscribed group
throw new ClientException(_('Not a member.'), 404);
} }
return true; return true;
@ -100,7 +101,6 @@ class AtompubshowmembershipAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
switch ($_SERVER['REQUEST_METHOD']) { switch ($_SERVER['REQUEST_METHOD']) {
@ -112,7 +112,8 @@ class AtompubshowmembershipAction extends ApiAuthAction
$this->deleteMembership(); $this->deleteMembership();
break; break;
default: default:
throw new ClientException(_('Method not supported'), 405); // TRANS: Client exception thrown when using an unsupported HTTP method.
throw new ClientException(_('HTTP method not supported.'), 405);
break; break;
} }
return; return;
@ -123,7 +124,6 @@ class AtompubshowmembershipAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function showMembership() function showMembership()
{ {
$activity = $this->_membership->asActivity(); $activity = $this->_membership->asActivity();
@ -142,13 +142,13 @@ class AtompubshowmembershipAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function deleteMembership() function deleteMembership()
{ {
if (empty($this->auth_user) || if (empty($this->auth_user) ||
$this->auth_user->id != $this->_profile->id) { $this->auth_user->id != $this->_profile->id) {
throw new ClientException(_("Can't delete someone else's". // TRANS: Client exception thrown when deleting someone else's membership.
" membership"), 403); throw new ClientException(_("Cannot delete someone else's".
" membership."), 403);
} }
if (Event::handle('StartLeaveGroup', array($this->_group, $this->auth_user))) { if (Event::handle('StartLeaveGroup', array($this->_group, $this->auth_user))) {
@ -168,7 +168,6 @@ class AtompubshowmembershipAction extends ApiAuthAction
* *
* @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' ||
@ -203,7 +202,6 @@ class AtompubshowmembershipAction extends ApiAuthAction
* *
* @return string etag http header * @return string etag http header
*/ */
function etag() function etag()
{ {
$ctime = strtotime($this->_membership->created); $ctime = strtotime($this->_membership->created);
@ -222,7 +220,6 @@ class AtompubshowmembershipAction extends ApiAuthAction
* *
* @return boolean true if delete, else false * @return boolean true if delete, else false
*/ */
function requiresAuth() function requiresAuth()
{ {
if ($_SERVER['REQUEST_METHOD'] == 'GET' || if ($_SERVER['REQUEST_METHOD'] == 'GET' ||

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc. * Copyright (C) 2010, StatusNet, Inc.
* *
* Single subscription * Single subscription
* *
* 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
@ -46,21 +46,19 @@ require_once INSTALLDIR . '/lib/apiauth.php';
* @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 AtompubshowsubscriptionAction extends ApiAuthAction class AtompubshowsubscriptionAction extends ApiAuthAction
{ {
private $_subscriber = null; private $_subscriber = null;
private $_subscribed = null; private $_subscribed = null;
private $_subscription = null; private $_subscription = null;
/** /**
* For initializing members of the class. * For initializing members of the class.
* *
* @param array $argarray misc. arguments * @param array $argarray misc. arguments
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -69,7 +67,9 @@ class AtompubshowsubscriptionAction extends ApiAuthAction
$this->_subscriber = Profile::staticGet('id', $subscriberId); $this->_subscriber = Profile::staticGet('id', $subscriberId);
if (empty($this->_subscriber)) { if (empty($this->_subscriber)) {
throw new ClientException(sprintf(_('No such profile id: %d'), // TRANS: Client exception thrown when trying to display a subscription for a non-existing profile ID.
// TRANS: %d is the non-existing profile ID number.
throw new ClientException(sprintf(_('No such profile id: %d.'),
$subscriberId), 404); $subscriberId), 404);
} }
@ -78,16 +78,20 @@ class AtompubshowsubscriptionAction extends ApiAuthAction
$this->_subscribed = Profile::staticGet('id', $subscribedId); $this->_subscribed = Profile::staticGet('id', $subscribedId);
if (empty($this->_subscribed)) { if (empty($this->_subscribed)) {
throw new ClientException(sprintf(_('No such profile id: %d'), // TRANS: Client exception thrown when trying to display a subscription for a non-existing profile ID.
// TRANS: %d is the non-existing profile ID number.
throw new ClientException(sprintf(_('No such profile id: %d.'),
$subscribedId), 404); $subscribedId), 404);
} }
$this->_subscription = $this->_subscription =
Subscription::pkeyGet(array('subscriber' => $subscriberId, Subscription::pkeyGet(array('subscriber' => $subscriberId,
'subscribed' => $subscribedId)); 'subscribed' => $subscribedId));
if (empty($this->_subscription)) { if (empty($this->_subscription)) {
$msg = sprintf(_('Profile %d not subscribed to profile %d'), // TRANS: Client exception thrown when trying to display a subscription for a non-subscribed profile ID.
// TRANS: %1$d is the non-existing subscriber ID number, $2$d is the ID of the profile that was not subscribed to.
$msg = sprintf(_('Profile %1$d not subscribed to profile %2$d.'),
$subscriberId, $subscribedId); $subscriberId, $subscribedId);
throw new ClientException($msg, 404); throw new ClientException($msg, 404);
} }
@ -102,7 +106,6 @@ class AtompubshowsubscriptionAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -115,6 +118,7 @@ class AtompubshowsubscriptionAction extends ApiAuthAction
$this->deleteSubscription(); $this->deleteSubscription();
break; break;
default: default:
// TRANS: Client error shown when using a non-supported HTTP method.
$this->clientError(_('HTTP method not supported.'), 405); $this->clientError(_('HTTP method not supported.'), 405);
return; return;
} }
@ -127,7 +131,6 @@ class AtompubshowsubscriptionAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function showSubscription() function showSubscription()
{ {
$activity = $this->_subscription->asActivity(); $activity = $this->_subscription->asActivity();
@ -146,13 +149,13 @@ class AtompubshowsubscriptionAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function deleteSubscription() function deleteSubscription()
{ {
if (empty($this->auth_user) || if (empty($this->auth_user) ||
$this->auth_user->id != $this->_subscriber->id) { $this->auth_user->id != $this->_subscriber->id) {
throw new ClientException(_("Can't delete someone else's". // TRANS: Client exception thrown when trying to delete a subscription of another user.
" subscription"), 403); throw new ClientException(_("Cannot delete someone else's ".
"subscription."), 403);
} }
Subscription::cancel($this->_subscriber, Subscription::cancel($this->_subscriber,
@ -168,7 +171,6 @@ class AtompubshowsubscriptionAction extends ApiAuthAction
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
if ($_SERVER['REQUEST_METHOD'] == 'DELETE') { if ($_SERVER['REQUEST_METHOD'] == 'DELETE') {
@ -183,7 +185,6 @@ class AtompubshowsubscriptionAction extends ApiAuthAction
* *
* @return string last modified http header * @return string last modified http header
*/ */
function lastModified() function lastModified()
{ {
return max(strtotime($this->_subscriber->modified), return max(strtotime($this->_subscriber->modified),
@ -196,7 +197,6 @@ class AtompubshowsubscriptionAction extends ApiAuthAction
* *
* @return string etag http header * @return string etag http header
*/ */
function etag() function etag()
{ {
$mtime = strtotime($this->_subscription->modified); $mtime = strtotime($this->_subscription->modified);
@ -212,7 +212,6 @@ class AtompubshowsubscriptionAction extends ApiAuthAction
* *
* @return boolean true if delete, else false * @return boolean true if delete, else false
*/ */
function requiresAuth() function requiresAuth()
{ {
if ($_SERVER['REQUEST_METHOD'] == 'DELETE') { if ($_SERVER['REQUEST_METHOD'] == 'DELETE') {

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc. * Copyright (C) 2010, StatusNet, Inc.
* *
* AtomPub subscription feed * AtomPub subscription feed
* *
* 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
@ -40,7 +40,7 @@ require_once INSTALLDIR . '/lib/apiauth.php';
* Subscription feed class for AtomPub * Subscription feed class for AtomPub
* *
* Generates a list of the user's subscriptions * Generates a list of the user's subscriptions
* *
* @category AtomPub * @category AtomPub
* @package StatusNet * @package StatusNet
* @author Evan Prodromou <evan@status.net> * @author Evan Prodromou <evan@status.net>
@ -48,7 +48,6 @@ require_once INSTALLDIR . '/lib/apiauth.php';
* @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 AtompubsubscriptionfeedAction extends ApiAuthAction class AtompubsubscriptionfeedAction extends ApiAuthAction
{ {
private $_profile = null; private $_profile = null;
@ -61,17 +60,18 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
$subscriber = $this->trimmed('subscriber'); $subscriber = $this->trimmed('subscriber');
$this->_profile = Profile::staticGet('id', $subscriber); $this->_profile = Profile::staticGet('id', $subscriber);
if (empty($this->_profile)) { if (empty($this->_profile)) {
throw new ClientException(sprintf(_('No such profile id: %d'), // TRANS: Client exception thrown when trying to display a subscription for a non-existing profile ID.
// TRANS: %d is the non-existing profile ID number.
throw new ClientException(sprintf(_('No such profile id: %d.'),
$subscriber), 404); $subscriber), 404);
} }
@ -93,7 +93,6 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -106,6 +105,7 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
$this->addSubscription(); $this->addSubscription();
break; break;
default: default:
// TRANS: Client exception thrown when using an unsupported HTTP method.
$this->clientError(_('HTTP method not supported.'), 405); $this->clientError(_('HTTP method not supported.'), 405);
return; return;
} }
@ -118,7 +118,6 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function showFeed() function showFeed()
{ {
header('Content-Type: application/atom+xml; charset=utf-8'); header('Content-Type: application/atom+xml; charset=utf-8');
@ -144,21 +143,25 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
$feed->addAuthor($this->_profile->getBestName(), $feed->addAuthor($this->_profile->getBestName(),
$this->_profile->getURI()); $this->_profile->getURI());
// TRANS: Title for Atom subscription feed.
// TRANS: %s is a user nickname.
$feed->setTitle(sprintf(_("%s subscriptions"), $feed->setTitle(sprintf(_("%s subscriptions"),
$this->_profile->getBestName())); $this->_profile->getBestName()));
$feed->setSubtitle(sprintf(_("People %s has subscribed to on %s"), // TRANS: Subtitle for Atom subscription feed.
// TRANS: %1$s is a user nickname, %s$s is the StatusNet sitename.
$feed->setSubtitle(sprintf(_("People %1\$s has subscribed to on %2\$s"),
$this->_profile->getBestName(), $this->_profile->getBestName(),
common_config('site', 'name'))); common_config('site', 'name')));
$feed->addLink(common_local_url('subscriptions', $feed->addLink(common_local_url('subscriptions',
array('nickname' => array('nickname' =>
$this->_profile->nickname))); $this->_profile->nickname)));
$feed->addLink($url, $feed->addLink($url,
array('rel' => 'self', array('rel' => 'self',
'type' => 'application/atom+xml')); 'type' => 'application/atom+xml'));
// If there's more... // If there's more...
if ($this->page > 1) { if ($this->page > 1) {
@ -167,9 +170,9 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
'type' => 'application/atom+xml')); 'type' => 'application/atom+xml'));
$feed->addLink(common_local_url('AtomPubSubscriptionFeed', $feed->addLink(common_local_url('AtomPubSubscriptionFeed',
array('subscriber' => array('subscriber' =>
$this->_profile->id), $this->_profile->id),
array('page' => array('page' =>
$this->page - 1)), $this->page - 1)),
array('rel' => 'prev', array('rel' => 'prev',
'type' => 'application/atom+xml')); 'type' => 'application/atom+xml'));
@ -214,15 +217,15 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
* *
* @return void * @return void
*/ */
function addSubscription() function addSubscription()
{ {
if (empty($this->auth_user) || if (empty($this->auth_user) ||
$this->auth_user->id != $this->_profile->id) { $this->auth_user->id != $this->_profile->id) {
throw new ClientException(_("Can't add someone else's". // TRANS: Client exception thrown when trying to subscribe another user.
" subscription"), 403); throw new ClientException(_("Cannot add someone else's".
" subscription."), 403);
} }
$xml = file_get_contents('php://input'); $xml = file_get_contents('php://input');
$dom = DOMDocument::loadXML($xml); $dom = DOMDocument::loadXML($xml);
@ -241,8 +244,7 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
if (Event::handle('StartAtomPubNewActivity', array(&$activity))) { if (Event::handle('StartAtomPubNewActivity', array(&$activity))) {
if ($activity->verb != ActivityVerb::FOLLOW) { if ($activity->verb != ActivityVerb::FOLLOW) {
// TRANS: Client error displayed when not using the POST verb. // TRANS: Client error displayed when not using the follow verb.
// TRANS: Do not translate POST.
$this->clientError(_('Can only handle Follow activities.')); $this->clientError(_('Can only handle Follow activities.'));
return; return;
} }
@ -250,6 +252,7 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
$person = $activity->objects[0]; $person = $activity->objects[0];
if ($person->type != ActivityObject::PERSON) { if ($person->type != ActivityObject::PERSON) {
// TRANS: Client exception thrown when subscribing to an object that is not a person.
$this->clientError(_('Can only follow people.')); $this->clientError(_('Can only follow people.'));
return; return;
} }
@ -259,7 +262,19 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
$profile = Profile::fromURI($person->id); $profile = Profile::fromURI($person->id);
if (empty($profile)) { if (empty($profile)) {
$this->clientError(sprintf(_('Unknown profile %s'), $person->id)); // TRANS: Client exception thrown when subscribing to a non-existing profile.
// TRANS: %s is the unknown profile ID.
$this->clientError(sprintf(_('Unknown profile %s.'), $person->id));
return;
}
if (Subscription::exists($this->_profile, $profile)) {
// 409 Conflict
// TRANS: Client error displayed trying to subscribe to an already subscribed profile.
// TRANS: %s is the profile the user already has a subscription on.
$this->clientError(sprintf(_('Already subscribed to %s.'),
$person->id),
409);
return; return;
} }
@ -290,7 +305,6 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
* *
* @return boolean is read only action? * @return boolean is read only action?
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return $_SERVER['REQUEST_METHOD'] != 'POST'; return $_SERVER['REQUEST_METHOD'] != 'POST';
@ -301,7 +315,6 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
* *
* @return string last modified http header * @return string last modified http header
*/ */
function lastModified() function lastModified()
{ {
return null; return null;
@ -312,7 +325,6 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
* *
* @return string etag http header * @return string etag http header
*/ */
function etag() function etag()
{ {
return null; return null;
@ -323,7 +335,6 @@ class AtompubsubscriptionfeedAction extends ApiAuthAction
* *
* @return boolean true if delete, else false * @return boolean true if delete, else false
*/ */
function requiresAuth() function requiresAuth()
{ {
if ($_SERVER['REQUEST_METHOD'] == 'POST') { if ($_SERVER['REQUEST_METHOD'] == 'POST') {

View File

@ -157,13 +157,13 @@ class AvatarsettingsAction extends SettingsAction
} }
$this->elementStart('li', array ('id' => 'settings_attach')); $this->elementStart('li', array ('id' => 'settings_attach'));
$this->element('input', array('name' => 'avatarfile',
'type' => 'file',
'id' => 'avatarfile'));
$this->element('input', array('name' => 'MAX_FILE_SIZE', $this->element('input', array('name' => 'MAX_FILE_SIZE',
'type' => 'hidden', 'type' => 'hidden',
'id' => 'MAX_FILE_SIZE', 'id' => 'MAX_FILE_SIZE',
'value' => ImageFile::maxFileSizeInt())); 'value' => ImageFile::maxFileSizeInt()));
$this->element('input', array('name' => 'avatarfile',
'type' => 'file',
'id' => 'avatarfile'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
@ -211,7 +211,7 @@ class AvatarsettingsAction extends SettingsAction
array('id' => 'avatar_original', array('id' => 'avatar_original',
'class' => 'avatar_view')); 'class' => 'avatar_view'));
// TRANS: Header on avatar upload crop form for thumbnail of originally uploaded avatar (h2). // TRANS: Header on avatar upload crop form for thumbnail of originally uploaded avatar (h2).
$this->element('h2', null, _("Original")); $this->element('h2', null, _('Original'));
$this->elementStart('div', array('id'=>'avatar_original_view')); $this->elementStart('div', array('id'=>'avatar_original_view'));
$this->element('img', array('src' => Avatar::url($this->filedata['filename']), $this->element('img', array('src' => Avatar::url($this->filedata['filename']),
'width' => $this->filedata['width'], 'width' => $this->filedata['width'],
@ -224,7 +224,7 @@ class AvatarsettingsAction extends SettingsAction
array('id' => 'avatar_preview', array('id' => 'avatar_preview',
'class' => 'avatar_view')); 'class' => 'avatar_view'));
// TRANS: Header on avatar upload crop form for thumbnail of to be used rendition of uploaded avatar (h2). // TRANS: Header on avatar upload crop form for thumbnail of to be used rendition of uploaded avatar (h2).
$this->element('h2', null, _("Preview")); $this->element('h2', null, _('Preview'));
$this->elementStart('div', array('id'=>'avatar_preview_view')); $this->elementStart('div', array('id'=>'avatar_preview_view'));
$this->element('img', array('src' => Avatar::url($this->filedata['filename']), $this->element('img', array('src' => Avatar::url($this->filedata['filename']),
'width' => AVATAR_PROFILE_SIZE, 'width' => AVATAR_PROFILE_SIZE,
@ -320,21 +320,20 @@ class AvatarsettingsAction extends SettingsAction
} }
$cur = common_current_user(); $cur = common_current_user();
$type = $imagefile->preferredType();
$filename = Avatar::filename($cur->id, $filename = Avatar::filename($cur->id,
image_type_to_extension($imagefile->type), image_type_to_extension($type),
null, null,
'tmp'.common_timestamp()); 'tmp'.common_timestamp());
$filepath = Avatar::path($filename); $filepath = Avatar::path($filename);
$imagefile->copyTo($filepath);
move_uploaded_file($imagefile->filepath, $filepath);
$filedata = array('filename' => $filename, $filedata = array('filename' => $filename,
'filepath' => $filepath, 'filepath' => $filepath,
'width' => $imagefile->width, 'width' => $imagefile->width,
'height' => $imagefile->height, 'height' => $imagefile->height,
'type' => $imagefile->type); 'type' => $type);
$_SESSION['FILEDATA'] = $filedata; $_SESSION['FILEDATA'] = $filedata;
@ -342,8 +341,8 @@ class AvatarsettingsAction extends SettingsAction
$this->mode = 'crop'; $this->mode = 'crop';
// TRANS: Avatar upload form unstruction after uploading a file. // TRANS: Avatar upload form instruction after uploading a file.
$this->showForm(_('Pick a square area of the image to be your avatar'), $this->showForm(_('Pick a square area of the image to be your avatar.'),
true); true);
} }

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc. * Copyright (C) 2010, StatusNet, Inc.
* *
* Download a backup of your own account to the browser * Download a backup of your own account to the browser
* *
* 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
@ -48,18 +48,17 @@ 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 BackupaccountAction extends Action class BackupaccountAction extends Action
{ {
/** /**
* Returns the title of the page * Returns the title of the page
* *
* @return string page title * @return string page title
*/ */
function title() function title()
{ {
return _("Backup account"); // TRANS: Title for backup account page.
return _('Backup account');
} }
/** /**
@ -69,7 +68,6 @@ class BackupaccountAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -77,10 +75,12 @@ class BackupaccountAction extends Action
$cur = common_current_user(); $cur = common_current_user();
if (empty($cur)) { if (empty($cur)) {
// TRANS: Client exception thrown when trying to backup an account while not logged in.
throw new ClientException(_('Only logged-in users can backup their account.'), 403); throw new ClientException(_('Only logged-in users can backup their account.'), 403);
} }
if (!$cur->hasRight(Right::BACKUPACCOUNT)) { if (!$cur->hasRight(Right::BACKUPACCOUNT)) {
// TRANS: Client exception thrown when trying to backup an account without having backup rights.
throw new ClientException(_('You may not backup your account.'), 403); throw new ClientException(_('You may not backup your account.'), 403);
} }
@ -94,7 +94,6 @@ class BackupaccountAction extends Action
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -109,7 +108,7 @@ class BackupaccountAction extends Action
/** /**
* Send a feed of the user's activities to the browser * Send a feed of the user's activities to the browser
* *
* Uses the UserActivityStream class; may take a long time! * Uses the UserActivityStream class; may take a long time!
* *
* @return void * @return void
@ -118,12 +117,14 @@ class BackupaccountAction extends Action
function sendFeed() function sendFeed()
{ {
$cur = common_current_user(); $cur = common_current_user();
$stream = new UserActivityStream($cur); $stream = new UserActivityStream($cur, true, UserActivityStream::OUTPUT_RAW);
header('Content-Disposition: attachment; filename='.$cur->nickname.'.atom'); header('Content-Disposition: attachment; filename='.$cur->nickname.'.atom');
header('Content-Type: application/atom+xml; charset=utf-8'); header('Content-Type: application/atom+xml; charset=utf-8');
// @fixme atom feed logic is in getString...
// but we just want it to output to the outputter.
$this->raw($stream->getString()); $this->raw($stream->getString());
} }
@ -132,13 +133,13 @@ class BackupaccountAction extends Action
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
$form = new BackupAccountForm($this); $form = new BackupAccountForm($this);
$form->show(); $form->show();
} }
/** /**
* Return true if read only. * Return true if read only.
* *
@ -148,10 +149,9 @@ class BackupaccountAction extends Action
* *
* @return boolean is read only action? * @return boolean is read only action?
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return false; return true;
} }
/** /**
@ -161,7 +161,6 @@ class BackupaccountAction extends Action
* *
* @return string last modified http header * @return string last modified http header
*/ */
function lastModified() function lastModified()
{ {
// For comparison with If-Last-Modified // For comparison with If-Last-Modified
@ -176,7 +175,6 @@ class BackupaccountAction extends Action
* *
* @return string etag http header * @return string etag http header
*/ */
function etag() function etag()
{ {
return null; return null;
@ -193,7 +191,6 @@ class BackupaccountAction extends Action
* @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 BackupAccountForm extends Form class BackupAccountForm extends Form
{ {
/** /**
@ -201,7 +198,6 @@ class BackupAccountForm extends Form
* *
* @return string the form's class * @return string the form's class
*/ */
function formClass() function formClass()
{ {
return 'form_profile_backup'; return 'form_profile_backup';
@ -212,7 +208,6 @@ class BackupAccountForm extends Form
* *
* @return string the form's action URL * @return string the form's action URL
*/ */
function action() function action()
{ {
return common_local_url('backupaccount'); return common_local_url('backupaccount');
@ -220,18 +215,18 @@ class BackupAccountForm extends Form
/** /**
* Output form data * Output form data
* *
* Really, just instructions for doing a backup. * Really, just instructions for doing a backup.
* *
* @return void * @return void
*/ */
function formData() function formData()
{ {
$msg = $msg =
// TRANS: Information displayed on the backup account page.
_('You can backup your account data in '. _('You can backup your account data in '.
'<a href="http://activitystrea.ms/">Activity Streams</a> '. '<a href="http://activitystrea.ms/">Activity Streams</a> '.
'format. This is an experimental feature and provides an '. 'format. This is an experimental feature and provides an '.
'incomplete backup; private account '. 'incomplete backup; private account '.
'information like email and IM addresses is not backed up. '. 'information like email and IM addresses is not backed up. '.
'Additionally, uploaded files and direct messages are not '. 'Additionally, uploaded files and direct messages are not '.
@ -243,18 +238,19 @@ class BackupAccountForm extends Form
/** /**
* Buttons for the form * Buttons for the form
* *
* In this case, a single submit button * In this case, a single submit button
* *
* @return void * @return void
*/ */
function formActions() function formActions()
{ {
$this->out->submit('submit', $this->out->submit('submit',
// TRANS: Submit button to backup an account on the backup account page.
_m('BUTTON', 'Backup'), _m('BUTTON', 'Backup'),
'submit', 'submit',
null, null,
_('Backup your account')); // TRANS: Title for submit button to backup an account on the backup account page.
_('Backup your account.'));
} }
} }

View File

@ -155,14 +155,14 @@ class BlockAction extends ProfileFormAction
'submit form_action-primary', 'submit form_action-primary',
'no', 'no',
// TRANS: Submit button title for 'No' when blocking a user. // TRANS: Submit button title for 'No' when blocking a user.
_('Do not block this user')); _('Do not block this user.'));
$this->submit('form_action-yes', $this->submit('form_action-yes',
// TRANS: Button label on the user block form. // TRANS: Button label on the user block form.
_m('BUTTON','Yes'), _m('BUTTON','Yes'),
'submit form_action-secondary', 'submit form_action-secondary',
'yes', 'yes',
// TRANS: Submit button title for 'Yes' when blocking a user. // TRANS: Submit button title for 'Yes' when blocking a user.
_('Block this user')); _('Block this user.'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc. * Copyright (C) 2010, StatusNet, Inc.
* *
* Delete your own account * Delete your own account
* *
* 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
@ -36,7 +36,7 @@ if (!defined('STATUSNET')) {
/** /**
* Action to delete your own account * Action to delete your own account
* *
* Note that this is distinct from DeleteuserAction, which see. I thought * Note that this is distinct from DeleteuserAction, which see. I thought
* that making that action do both things (delete another user and delete the * that making that action do both things (delete another user and delete the
* current user) would open a lot of holes. I'm open to refactoring, however. * current user) would open a lot of holes. I'm open to refactoring, however.
@ -48,7 +48,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 DeleteaccountAction extends Action class DeleteaccountAction extends Action
{ {
private $_complete = false; private $_complete = false;
@ -61,19 +60,20 @@ class DeleteaccountAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
$cur = common_current_user(); $cur = common_current_user();
if (empty($cur)) { if (empty($cur)) {
// TRANS: Client exception displayed trying to delete a user account while not logged in.
throw new ClientException(_("Only logged-in users ". throw new ClientException(_("Only logged-in users ".
"can delete their account."), 403); "can delete their account."), 403);
} }
if (!$cur->hasRight(Right::DELETEACCOUNT)) { if (!$cur->hasRight(Right::DELETEACCOUNT)) {
// TRANS: Client exception displayed trying to delete a user account without have the rights to do that.
throw new ClientException(_("You cannot delete your account."), 403); throw new ClientException(_("You cannot delete your account."), 403);
} }
@ -87,7 +87,6 @@ class DeleteaccountAction extends Action
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -109,7 +108,6 @@ class DeleteaccountAction extends Action
* *
* @return boolean is read only action? * @return boolean is read only action?
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return false; return false;
@ -122,7 +120,6 @@ class DeleteaccountAction extends Action
* *
* @return string last modified http header * @return string last modified http header
*/ */
function lastModified() function lastModified()
{ {
// For comparison with If-Last-Modified // For comparison with If-Last-Modified
@ -137,7 +134,6 @@ class DeleteaccountAction extends Action
* *
* @return string etag http header * @return string etag http header
*/ */
function etag() function etag()
{ {
return null; return null;
@ -145,7 +141,7 @@ class DeleteaccountAction extends Action
/** /**
* Delete the current user's account * Delete the current user's account
* *
* Checks for the "I am sure." string to make sure the user really * Checks for the "I am sure." string to make sure the user really
* wants to delete their account. * wants to delete their account.
* *
@ -156,13 +152,16 @@ class DeleteaccountAction extends Action
* *
* @return void * @return void
*/ */
function deleteAccount() function deleteAccount()
{ {
$this->checkSessionToken(); $this->checkSessionToken();
// !!! If this string is changed, it also needs to be changed in DeleteAccountForm::formData()
if ($this->trimmed('iamsure') != _('I am sure.')) { // TRANS: Confirmation text for user deletion. The user has to type this exactly the same, including punctuation.
$this->_error = _('You must write "I am sure." exactly in the box.'); $iamsure = _('I am sure.');
if ($this->trimmed('iamsure') != $iamsure ) {
// TRANS: Notification for user about the text that must be input to be able to delete a user account.
// TRANS: %s is the text that needs to be input.
$this->_error = sprintf(_('You must write "%s" exactly in the box.'), $iamsure);
$this->showPage(); $this->showPage();
return; return;
} }
@ -191,7 +190,7 @@ class DeleteaccountAction extends Action
/** /**
* Shows the page content. * Shows the page content.
* *
* If the deletion is complete, just shows a completion message. * If the deletion is complete, just shows a completion message.
* *
* Otherwise, shows the deletion form. * Otherwise, shows the deletion form.
@ -199,11 +198,11 @@ class DeleteaccountAction extends Action
* @return void * @return void
* *
*/ */
function showContent() function showContent()
{ {
if ($this->_complete) { if ($this->_complete) {
$this->element('p', 'confirmation', $this->element('p', 'confirmation',
// TRANS: Confirmation that a user account has been deleted.
_('Account deleted.')); _('Account deleted.'));
return; return;
} }
@ -216,7 +215,7 @@ class DeleteaccountAction extends Action
$form = new DeleteAccountForm($this); $form = new DeleteAccountForm($this);
$form->show(); $form->show();
} }
/** /**
* Show the title of the page * Show the title of the page
* *
@ -225,13 +224,14 @@ class DeleteaccountAction extends Action
function title() function title()
{ {
// TRANS: Page title for page on which a user account can be deleted.
return _('Delete account'); return _('Delete account');
} }
} }
/** /**
* Form for deleting your account * Form for deleting your account
* *
* Note that this mostly is here to keep you from accidentally deleting your * Note that this mostly is here to keep you from accidentally deleting your
* account. * account.
* *
@ -242,7 +242,6 @@ class DeleteaccountAction extends Action
* @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 DeleteAccountForm extends Form class DeleteAccountForm extends Form
{ {
/** /**
@ -250,7 +249,6 @@ class DeleteAccountForm extends Form
* *
* @return string the form's class * @return string the form's class
*/ */
function formClass() function formClass()
{ {
return 'form_profile_delete'; return 'form_profile_delete';
@ -261,7 +259,6 @@ class DeleteAccountForm extends Form
* *
* @return string the form's action URL * @return string the form's action URL
*/ */
function action() function action()
{ {
return common_local_url('deleteaccount'); return common_local_url('deleteaccount');
@ -269,51 +266,60 @@ class DeleteAccountForm extends Form
/** /**
* Output form data * Output form data
* *
* Instructions plus an 'i am sure' entry box. * Instructions plus an 'i am sure' entry box.
* *
* @return void * @return void
*/ */
function formData() function formData()
{ {
$cur = common_current_user(); $cur = common_current_user();
$msg = _('<p>This will <strong>permanently delete</strong> '. // TRANS: Form text for user deletion form.
'your account data from this server. </p>'); $msg = '<p>' . _('This will <strong>permanently delete</strong> '.
'your account data from this server.') . '</p>';
if ($cur->hasRight(Right::BACKUPACCOUNT)) { if ($cur->hasRight(Right::BACKUPACCOUNT)) {
$msg .= sprintf(_('<p>You are strongly advised to '. // TRANS: Additional form text for user deletion form shown if a user has account backup rights.
// TRANS: %s is a URL to the backup page.
$msg .= '<p>' . sprintf(_('You are strongly advised to '.
'<a href="%s">back up your data</a>'. '<a href="%s">back up your data</a>'.
' before deletion.</p>'), ' before deletion.'),
common_local_url('backupaccount')); common_local_url('backupaccount')) . '</p>';
} }
$this->out->elementStart('p'); $this->out->elementStart('p');
$this->out->raw($msg); $this->out->raw($msg);
$this->out->elementEnd('p'); $this->out->elementEnd('p');
// !!! If this string is changed, it also needs to be changed in class DeleteaccountAction.
// TRANS: Confirmation text for user deletion. The user has to type this exactly the same, including punctuation.
$iamsure = _("I am sure.");
$this->out->input('iamsure', $this->out->input('iamsure',
// TRANS: Field label for delete account confirmation entry.
_('Confirm'), _('Confirm'),
null, null,
_('Enter "I am sure." to confirm that '. // TRANS: Input title for the delete account field.
'you want to delete your account.')); // TRANS: %s is the text that needs to be input.
sprintf(_('Enter "%s" to confirm that '.
'you want to delete your account.'),$iamsure ));
} }
/** /**
* Buttons for the form * Buttons for the form
* *
* In this case, a single submit button * In this case, a single submit button
* *
* @return void * @return void
*/ */
function formActions() function formActions()
{ {
$this->out->submit('submit', $this->out->submit('submit',
// TRANS: Button text for user account deletion.
_m('BUTTON', 'Delete'), _m('BUTTON', 'Delete'),
'submit', 'submit',
null, null,
_('Permanently your account')); // TRANS: Button title for user account deletion.
_('Permanently delete your account'));
} }
} }

View File

@ -158,13 +158,13 @@ class DeleteapplicationAction extends Action
'submit form_action-primary', 'submit form_action-primary',
'no', 'no',
// TRANS: Submit button title for 'No' when deleting an application. // TRANS: Submit button title for 'No' when deleting an application.
_('Do not delete this application')); _('Do not delete this application.'));
$this->submit('form_action-yes', $this->submit('form_action-yes',
// TRANS: Button label on the delete application form. // TRANS: Button label on the delete application form.
_m('BUTTON','Yes'), _m('BUTTON','Yes'),
'submit form_action-secondary', 'submit form_action-secondary',
// TRANS: Submit button title for 'Yes' when deleting an application. // TRANS: Submit button title for 'Yes' when deleting an application.
'yes', _('Delete this application')); 'yes', _('Delete this application.'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }

View File

@ -221,14 +221,14 @@ class DeletegroupAction extends RedirectingAction
'submit form_action-primary', 'submit form_action-primary',
'no', 'no',
// TRANS: Submit button title for 'No' when deleting a group. // TRANS: Submit button title for 'No' when deleting a group.
_('Do not delete this group')); _('Do not delete this group.'));
$this->submit('form_action-yes', $this->submit('form_action-yes',
// TRANS: Button label on the delete group form. // TRANS: Button label on the delete group form.
_m('BUTTON','Yes'), _m('BUTTON','Yes'),
'submit form_action-secondary', 'submit form_action-secondary',
'yes', 'yes',
// TRANS: Submit button title for 'Yes' when deleting a group. // TRANS: Submit button title for 'Yes' when deleting a group.
_('Delete this group')); _('Delete this group.'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }

View File

@ -75,7 +75,7 @@ class DeletenoticeAction extends Action
if ($this->notice->profile_id != $this->user_profile->id && if ($this->notice->profile_id != $this->user_profile->id &&
!$this->user->hasRight(Right::DELETEOTHERSNOTICE)) { !$this->user->hasRight(Right::DELETEOTHERSNOTICE)) {
// TRANS: Error message displayed trying to delete a notice that was not made by the current user. // TRANS: Error message displayed trying to delete a notice that was not made by the current user.
common_user_error(_('Can\'t delete this notice.')); common_user_error(_('Cannot delete this notice.'));
exit; exit;
} }
// XXX: Ajax! // XXX: Ajax!
@ -156,14 +156,14 @@ class DeletenoticeAction extends Action
'submit form_action-primary', 'submit form_action-primary',
'no', 'no',
// TRANS: Submit button title for 'No' when deleting a notice. // TRANS: Submit button title for 'No' when deleting a notice.
_("Do not delete this notice")); _('Do not delete this notice.'));
$this->submit('form_action-yes', $this->submit('form_action-yes',
// TRANS: Button label on the delete notice form. // TRANS: Button label on the delete notice form.
_m('BUTTON','Yes'), _m('BUTTON','Yes'),
'submit form_action-secondary', 'submit form_action-secondary',
'yes', 'yes',
// TRANS: Submit button title for 'Yes' when deleting a notice. // TRANS: Submit button title for 'Yes' when deleting a notice.
_('Delete this notice')); _('Delete this notice.'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }

View File

@ -40,7 +40,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/ * @link http://status.net/
*/ */
class DeleteuserAction extends ProfileFormAction class DeleteuserAction extends ProfileFormAction
{ {
var $user = null; var $user = null;
@ -52,7 +51,6 @@ class DeleteuserAction extends ProfileFormAction
* *
* @return boolean success flag * @return boolean success flag
*/ */
function prepare($args) function prepare($args)
{ {
if (!parent::prepare($args)) { if (!parent::prepare($args)) {
@ -64,6 +62,7 @@ class DeleteuserAction extends ProfileFormAction
assert(!empty($cur)); // checked by parent assert(!empty($cur)); // checked by parent
if (!$cur->hasRight(Right::DELETEUSER)) { if (!$cur->hasRight(Right::DELETEUSER)) {
// TRANS: Client error displayed when trying to delete a user without having the right to delete users.
$this->clientError(_('You cannot delete users.')); $this->clientError(_('You cannot delete users.'));
return false; return false;
} }
@ -71,6 +70,7 @@ class DeleteuserAction extends ProfileFormAction
$this->user = User::staticGet('id', $this->profile->id); $this->user = User::staticGet('id', $this->profile->id);
if (empty($this->user)) { if (empty($this->user)) {
// TRANS: Client error displayed when trying to delete a non-local user.
$this->clientError(_('You can only delete local users.')); $this->clientError(_('You can only delete local users.'));
return false; return false;
} }
@ -87,7 +87,6 @@ class DeleteuserAction extends ProfileFormAction
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
if ($_SERVER['REQUEST_METHOD'] == 'POST') { if ($_SERVER['REQUEST_METHOD'] == 'POST') {
@ -107,7 +106,8 @@ class DeleteuserAction extends ProfileFormAction
} }
function title() { function title() {
return _('Delete user'); // TRANS: Title of delete user page.
return _m('TITLE','Delete user');
} }
function showNoticeForm() { function showNoticeForm() {
@ -130,9 +130,11 @@ class DeleteuserAction extends ProfileFormAction
'action' => common_local_url('deleteuser'))); 'action' => common_local_url('deleteuser')));
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
// TRANS: Fieldset legend on delete user page.
$this->element('legend', _('Delete user')); $this->element('legend', _('Delete user'));
if (Event::handle('StartDeleteUserForm', array($this, $this->user))) { if (Event::handle('StartDeleteUserForm', array($this, $this->user))) {
$this->element('p', null, $this->element('p', null,
// TRANS: Information text to request if a user is certain that the described action has to be performed.
_('Are you sure you want to delete this user? '. _('Are you sure you want to delete this user? '.
'This will clear all data about the user from the '. 'This will clear all data about the user from the '.
'database, without a backup.')); 'database, without a backup.'));
@ -153,14 +155,14 @@ class DeleteuserAction extends ProfileFormAction
'submit form_action-primary', 'submit form_action-primary',
'no', 'no',
// TRANS: Submit button title for 'No' when deleting a user. // TRANS: Submit button title for 'No' when deleting a user.
_('Do not block this user')); _('Do not delete this user.'));
$this->submit('form_action-yes', $this->submit('form_action-yes',
// TRANS: Button label on the delete user form. // TRANS: Button label on the delete user form.
_m('BUTTON','Yes'), _m('BUTTON','Yes'),
'submit form_action-secondary', 'submit form_action-secondary',
'yes', 'yes',
// TRANS: Submit button title for 'Yes' when deleting a user. // TRANS: Submit button title for 'Yes' when deleting a user.
_('Delete this user')); _('Delete this user.'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }
@ -170,7 +172,6 @@ class DeleteuserAction extends ProfileFormAction
* *
* @return void * @return void
*/ */
function handlePost() function handlePost()
{ {
if (Event::handle('StartDeleteUser', array($this, $this->user))) { if (Event::handle('StartDeleteUser', array($this, $this->user))) {

View File

@ -44,10 +44,8 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class DesignadminpanelAction extends AdminPanelAction class DesignadminpanelAction extends AdminPanelAction
{ {
/* The default site design */ /* The default site design */
var $design = null; var $design = null;
@ -56,7 +54,6 @@ class DesignadminpanelAction extends AdminPanelAction
* *
* @return string page title * @return string page title
*/ */
function title() function title()
{ {
// TRANS: Message used as title for design settings for the site. // TRANS: Message used as title for design settings for the site.
@ -68,9 +65,9 @@ class DesignadminpanelAction extends AdminPanelAction
* *
* @return string instructions * @return string instructions
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Instructions for design adminsitration panel.
return _('Design settings for this StatusNet site'); return _('Design settings for this StatusNet site');
} }
@ -79,7 +76,6 @@ class DesignadminpanelAction extends AdminPanelAction
* *
* @return void * @return void
*/ */
function showForm() function showForm()
{ {
$this->design = Design::siteDesign(); $this->design = Design::siteDesign();
@ -93,7 +89,6 @@ class DesignadminpanelAction extends AdminPanelAction
* *
* @return void * @return void
*/ */
function saveSettings() function saveSettings()
{ {
if ($this->arg('save')) { if ($this->arg('save')) {
@ -101,6 +96,7 @@ class DesignadminpanelAction extends AdminPanelAction
} else if ($this->arg('defaults')) { } else if ($this->arg('defaults')) {
$this->restoreDefaults(); $this->restoreDefaults();
} else { } else {
// TRANS: Client error displayed when the submitted form contains unexpected data.
$this->clientError(_('Unexpected form submission.')); $this->clientError(_('Unexpected form submission.'));
} }
} }
@ -110,7 +106,6 @@ class DesignadminpanelAction extends AdminPanelAction
* *
* @return void * @return void
*/ */
function saveDesignSettings() function saveDesignSettings()
{ {
// Workaround for PHP returning empty $_POST and $_FILES when POST // Workaround for PHP returning empty $_POST and $_FILES when POST
@ -225,11 +220,10 @@ class DesignadminpanelAction extends AdminPanelAction
} }
/** /**
* Restore the default design * Restore the default design
* *
* @return void * @return void
*/ */
function restoreDefaults() function restoreDefaults()
{ {
$this->deleteSetting('site', 'logo'); $this->deleteSetting('site', 'logo');
@ -257,7 +251,6 @@ class DesignadminpanelAction extends AdminPanelAction
* *
* @return string $filename the filename of the image * @return string $filename the filename of the image
*/ */
function saveBackgroundImage() function saveBackgroundImage()
{ {
$filename = null; $filename = null;
@ -302,7 +295,6 @@ class DesignadminpanelAction extends AdminPanelAction
* @throws ClientException for invalid theme archives * @throws ClientException for invalid theme archives
* @throws ServerException if trouble saving the theme files * @throws ServerException if trouble saving the theme files
*/ */
function saveCustomTheme() function saveCustomTheme()
{ {
if (common_config('theme_upload', 'enabled') && if (common_config('theme_upload', 'enabled') &&
@ -327,21 +319,24 @@ class DesignadminpanelAction extends AdminPanelAction
* *
* @return void * @return void
*/ */
function validate(&$values) function validate(&$values)
{ {
if (!empty($values['logo']) && if (!empty($values['logo']) &&
!Validate::uri($values['logo'], array('allowed_schemes' => array('http', 'https')))) { !Validate::uri($values['logo'], array('allowed_schemes' => array('http', 'https')))) {
// TRANS: Client error displayed when a logo URL does is not valid.
$this->clientError(_('Invalid logo URL.')); $this->clientError(_('Invalid logo URL.'));
} }
if (!empty($values['ssllogo']) && if (!empty($values['ssllogo']) &&
!Validate::uri($values['ssllogo'], array('allowed_schemes' => array('https')))) { !Validate::uri($values['ssllogo'], array('allowed_schemes' => array('https')))) {
// TRANS: Client error displayed when an SSL logo URL is invalid.
$this->clientError(_('Invalid SSL logo URL.')); $this->clientError(_('Invalid SSL logo URL.'));
} }
if (!in_array($values['theme'], Theme::listAvailable())) { if (!in_array($values['theme'], Theme::listAvailable())) {
$this->clientError(sprintf(_("Theme not available: %s."), $values['theme'])); // TRANS: Client error displayed when a theme is submitted through the form that is not in the theme list.
// TRANS: %s is the chosen unavailable theme.
$this->clientError(sprintf(_('Theme not available: %s.'), $values['theme']));
} }
} }
@ -350,7 +345,6 @@ class DesignadminpanelAction extends AdminPanelAction
* *
* @return void * @return void
*/ */
function showStylesheets() function showStylesheets()
{ {
parent::showStylesheets(); parent::showStylesheets();
@ -362,7 +356,6 @@ class DesignadminpanelAction extends AdminPanelAction
* *
* @return void * @return void
*/ */
function showScripts() function showScripts()
{ {
parent::showScripts(); parent::showScripts();
@ -383,7 +376,6 @@ class DesignAdminPanelForm extends AdminForm
* *
* @return int ID of the form * @return int ID of the form
*/ */
function id() function id()
{ {
return 'form_design_admin_panel'; return 'form_design_admin_panel';
@ -394,7 +386,6 @@ class DesignAdminPanelForm extends AdminForm
* *
* @return string class of the form * @return string class of the form
*/ */
function formClass() function formClass()
{ {
return 'form_settings'; return 'form_settings';
@ -408,7 +399,6 @@ class DesignAdminPanelForm extends AdminForm
* *
* @return string the method to use for submitting * @return string the method to use for submitting
*/ */
function method() function method()
{ {
$this->enctype = 'multipart/form-data'; $this->enctype = 'multipart/form-data';
@ -421,7 +411,6 @@ class DesignAdminPanelForm extends AdminForm
* *
* @return string URL of the action * @return string URL of the action
*/ */
function action() function action()
{ {
return common_local_url('designadminpanel'); return common_local_url('designadminpanel');
@ -432,7 +421,6 @@ class DesignAdminPanelForm extends AdminForm
* *
* @return void * @return void
*/ */
function formData() function formData()
{ {
$this->showLogo(); $this->showLogo();
@ -445,16 +433,25 @@ class DesignAdminPanelForm extends AdminForm
function showLogo() function showLogo()
{ {
$this->out->elementStart('fieldset', array('id' => 'settings_design_logo')); $this->out->elementStart('fieldset', array('id' => 'settings_design_logo'));
// TRANS: Fieldset legend for form to change logo.
$this->out->element('legend', null, _('Change logo')); $this->out->element('legend', null, _('Change logo'));
$this->out->elementStart('ul', 'form_data'); $this->out->elementStart('ul', 'form_data');
$this->li(); $this->li();
$this->input('logo', _('Site logo'), 'Logo for the site (full URL)'); $this->input('logo',
// TRANS: Field label for StatusNet site logo.
_('Site logo'),
// TRANS: Title for field label for StatusNet site logo.
'Logo for the site (full URL).');
$this->unli(); $this->unli();
$this->li(); $this->li();
$this->input('ssllogo', _('SSL logo'), 'Logo to show on SSL pages'); $this->input('ssllogo',
// TRANS: Field label for SSL StatusNet site logo.
_('SSL logo'),
// TRANS: Title for field label for SSL StatusNet site logo.
'Logo to show on SSL pages.');
$this->unli(); $this->unli();
$this->out->elementEnd('ul'); $this->out->elementEnd('ul');
@ -466,6 +463,7 @@ class DesignAdminPanelForm extends AdminForm
function showTheme() function showTheme()
{ {
$this->out->elementStart('fieldset', array('id' => 'settings_design_theme')); $this->out->elementStart('fieldset', array('id' => 'settings_design_theme'));
// TRANS: Fieldset legend for form change StatusNet site's theme.
$this->out->element('legend', null, _('Change theme')); $this->out->element('legend', null, _('Change theme'));
$this->out->elementStart('ul', 'form_data'); $this->out->elementStart('ul', 'form_data');
@ -483,17 +481,21 @@ class DesignAdminPanelForm extends AdminForm
$themes = array_combine($themes, $themes); $themes = array_combine($themes, $themes);
$this->li(); $this->li();
// TRANS: Field label for dropdown to choose site theme.
$this->out->dropdown('theme', _('Site theme'), $this->out->dropdown('theme', _('Site theme'),
// TRANS: Title for field label for dropdown to choose site theme.
$themes, _('Theme for the site.'), $themes, _('Theme for the site.'),
false, $this->value('theme')); false, $this->value('theme'));
$this->unli(); $this->unli();
if (common_config('theme_upload', 'enabled')) { if (common_config('theme_upload', 'enabled')) {
$this->li(); $this->li();
// TRANS: Field label for uploading a cutom theme.
$this->out->element('label', array('for' => 'design_upload_theme'), _('Custom theme')); $this->out->element('label', array('for' => 'design_upload_theme'), _('Custom theme'));
$this->out->element('input', array('id' => 'design_upload_theme', $this->out->element('input', array('id' => 'design_upload_theme',
'name' => 'design_upload_theme', 'name' => 'design_upload_theme',
'type' => 'file')); 'type' => 'file'));
// TRANS: Form instructions for uploading a cutom StatusNet theme.
$this->out->element('p', 'form_guide', _('You can upload a custom StatusNet theme as a .ZIP archive.')); $this->out->element('p', 'form_guide', _('You can upload a custom StatusNet theme as a .ZIP archive.'));
$this->unli(); $this->unli();
} }
@ -509,22 +511,25 @@ class DesignAdminPanelForm extends AdminForm
$this->out->elementStart('fieldset', array('id' => $this->out->elementStart('fieldset', array('id' =>
'settings_design_background-image')); 'settings_design_background-image'));
// TRANS: Fieldset legend for theme background image.
$this->out->element('legend', null, _('Change background image')); $this->out->element('legend', null, _('Change background image'));
$this->out->elementStart('ul', 'form_data'); $this->out->elementStart('ul', 'form_data');
$this->li(); $this->li();
$this->out->element('input', array('name' => 'MAX_FILE_SIZE',
'type' => 'hidden',
'id' => 'MAX_FILE_SIZE',
'value' => ImageFile::maxFileSizeInt()));
$this->out->element('label', array('for' => 'design_background-image_file'), $this->out->element('label', array('for' => 'design_background-image_file'),
// TRANS: Field label for background image on theme designer page.
_('Background')); _('Background'));
$this->out->element('input', array('name' => 'design_background-image_file', $this->out->element('input', array('name' => 'design_background-image_file',
'type' => 'file', 'type' => 'file',
'id' => 'design_background-image_file')); 'id' => 'design_background-image_file'));
$this->out->element('p', 'form_guide', $this->out->element('p', 'form_guide',
// TRANS: Form guide for background image upload form on theme designer page.
sprintf(_('You can upload a background image for the site. ' . sprintf(_('You can upload a background image for the site. ' .
'The maximum file size is %1$s.'), ImageFile::maxFileSize())); 'The maximum file size is %1$s.'), ImageFile::maxFileSize()));
$this->out->element('input', array('name' => 'MAX_FILE_SIZE',
'type' => 'hidden',
'id' => 'MAX_FILE_SIZE',
'value' => ImageFile::maxFileSizeInt()));
$this->unli(); $this->unli();
if (!empty($design->backgroundimage)) { if (!empty($design->backgroundimage)) {
@ -568,11 +573,13 @@ class DesignAdminPanelForm extends AdminForm
'class' => 'radio'), 'class' => 'radio'),
// TRANS: Used as radio button label to not add a background image. // TRANS: Used as radio button label to not add a background image.
_('Off')); _('Off'));
// TRANS: Form guide for turning background image on or off on theme designer page.
$this->out->element('p', 'form_guide', _('Turn background image on or off.')); $this->out->element('p', 'form_guide', _('Turn background image on or off.'));
$this->unli(); $this->unli();
$this->li(); $this->li();
$this->out->checkbox('design_background-image_repeat', $this->out->checkbox('design_background-image_repeat',
// TRANS: Checkbox label to title background image on theme designer page.
_('Tile background image'), _('Tile background image'),
($design->disposition & BACKGROUND_TILE) ? true : false); ($design->disposition & BACKGROUND_TILE) ? true : false);
$this->unli(); $this->unli();
@ -587,7 +594,8 @@ class DesignAdminPanelForm extends AdminForm
$design = $this->out->design; $design = $this->out->design;
$this->out->elementStart('fieldset', array('id' => 'settings_design_color')); $this->out->elementStart('fieldset', array('id' => 'settings_design_color'));
$this->out->element('legend', null, _('Change colours')); // TRANS: Fieldset legend for theme colors.
$this->out->element('legend', null, _('Change colors'));
$this->out->elementStart('ul', 'form_data'); $this->out->elementStart('ul', 'form_data');
@ -597,6 +605,7 @@ class DesignAdminPanelForm extends AdminForm
$bgcolor = new WebColor($design->backgroundcolor); $bgcolor = new WebColor($design->backgroundcolor);
$this->li(); $this->li();
// TRANS: Field label for background color selector.
$this->out->element('label', array('for' => 'swatch-1'), _('Background')); $this->out->element('label', array('for' => 'swatch-1'), _('Background'));
$this->out->element('input', array('name' => 'design_background', $this->out->element('input', array('name' => 'design_background',
'type' => 'text', 'type' => 'text',
@ -610,6 +619,7 @@ class DesignAdminPanelForm extends AdminForm
$ccolor = new WebColor($design->contentcolor); $ccolor = new WebColor($design->contentcolor);
$this->li(); $this->li();
// TRANS: Field label for content color selector.
$this->out->element('label', array('for' => 'swatch-2'), _('Content')); $this->out->element('label', array('for' => 'swatch-2'), _('Content'));
$this->out->element('input', array('name' => 'design_content', $this->out->element('input', array('name' => 'design_content',
'type' => 'text', 'type' => 'text',
@ -623,6 +633,7 @@ class DesignAdminPanelForm extends AdminForm
$sbcolor = new WebColor($design->sidebarcolor); $sbcolor = new WebColor($design->sidebarcolor);
$this->li(); $this->li();
// TRANS: Field label for sidebar color selector.
$this->out->element('label', array('for' => 'swatch-3'), _('Sidebar')); $this->out->element('label', array('for' => 'swatch-3'), _('Sidebar'));
$this->out->element('input', array('name' => 'design_sidebar', $this->out->element('input', array('name' => 'design_sidebar',
'type' => 'text', 'type' => 'text',
@ -636,6 +647,7 @@ class DesignAdminPanelForm extends AdminForm
$tcolor = new WebColor($design->textcolor); $tcolor = new WebColor($design->textcolor);
$this->li(); $this->li();
// TRANS: Field label for text color selector.
$this->out->element('label', array('for' => 'swatch-4'), _('Text')); $this->out->element('label', array('for' => 'swatch-4'), _('Text'));
$this->out->element('input', array('name' => 'design_text', $this->out->element('input', array('name' => 'design_text',
'type' => 'text', 'type' => 'text',
@ -649,6 +661,7 @@ class DesignAdminPanelForm extends AdminForm
$lcolor = new WebColor($design->linkcolor); $lcolor = new WebColor($design->linkcolor);
$this->li(); $this->li();
// TRANS: Field label for link color selector.
$this->out->element('label', array('for' => 'swatch-5'), _('Links')); $this->out->element('label', array('for' => 'swatch-5'), _('Links'));
$this->out->element('input', array('name' => 'design_links', $this->out->element('input', array('name' => 'design_links',
'type' => 'text', 'type' => 'text',
@ -674,10 +687,12 @@ class DesignAdminPanelForm extends AdminForm
{ {
if (common_config('custom_css', 'enabled')) { if (common_config('custom_css', 'enabled')) {
$this->out->elementStart('fieldset', array('id' => 'settings_design_advanced')); $this->out->elementStart('fieldset', array('id' => 'settings_design_advanced'));
// TRANS: Fieldset legend for advanced theme design settings.
$this->out->element('legend', null, _('Advanced')); $this->out->element('legend', null, _('Advanced'));
$this->out->elementStart('ul', 'form_data'); $this->out->elementStart('ul', 'form_data');
$this->li(); $this->li();
// TRANS: Field label for custom CSS.
$this->out->element('label', array('for' => 'css'), _('Custom CSS')); $this->out->element('label', array('for' => 'css'), _('Custom CSS'));
$this->out->element('textarea', array('name' => 'css', $this->out->element('textarea', array('name' => 'css',
'id' => 'css', 'id' => 'css',
@ -699,17 +714,25 @@ class DesignAdminPanelForm extends AdminForm
function formActions() function formActions()
{ {
$this->out->submit('defaults', _('Use defaults'), 'submit form_action-default', // TRANS: Button text for resetting theme settings.
'defaults', _('Restore default designs')); $this->out->submit('defaults', _m('BUTTON','Use defaults'), 'submit form_action-default',
// TRANS: Title for button for resetting theme settings.
'defaults', _('Restore default designs.'));
$this->out->element('input', array('id' => 'settings_design_reset', $this->out->element('input', array('id' => 'settings_design_reset',
'type' => 'reset', 'type' => 'reset',
// TRANS: Button text for resetting theme settings.
'value' => 'Reset', 'value' => 'Reset',
'class' => 'submit form_action-primary', 'class' => 'submit form_action-primary',
'title' => _('Reset back to default'))); // TRANS: Title for button for resetting theme settings.
'title' => _('Reset back to default.')));
$this->out->submit('save', _('Save'), 'submit form_action-secondary', $this->out->submit('save',
'save', _('Save design')); // TRANS: Button text for saving theme settings.
_m('BUTTON','Save'),
'submit form_action-secondary',
'save',
// TRANS: Title for button for saving theme settings.
_('Save design.'));
} }
} }

View File

@ -1,5 +1,4 @@
<?php <?php
/** /**
* Disfavor action. * Disfavor action.
* *
@ -58,6 +57,7 @@ class DisfavorAction extends Action
{ {
parent::handle($args); parent::handle($args);
if (!common_logged_in()) { if (!common_logged_in()) {
// TRANS: Client error displayed when trying to remove a favorite while not logged in.
$this->clientError(_('Not logged in.')); $this->clientError(_('Not logged in.'));
return; return;
} }
@ -71,6 +71,7 @@ class DisfavorAction extends Action
$notice = Notice::staticGet($id); $notice = Notice::staticGet($id);
$token = $this->trimmed('token-'.$notice->id); $token = $this->trimmed('token-'.$notice->id);
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
// TRANS: Client error displayed when the session token does not match or is not given.
$this->clientError(_('There was a problem with your session token. Try again, please.')); $this->clientError(_('There was a problem with your session token. Try again, please.'));
return; return;
} }
@ -78,12 +79,14 @@ class DisfavorAction extends Action
$fave->user_id = $user->id; $fave->user_id = $user->id;
$fave->notice_id = $notice->id; $fave->notice_id = $notice->id;
if (!$fave->find(true)) { if (!$fave->find(true)) {
// TRANS: Client error displayed when trying to remove favorite status for a notice that is not a favorite.
$this->clientError(_('This notice is not a favorite!')); $this->clientError(_('This notice is not a favorite!'));
return; return;
} }
$result = $fave->delete(); $result = $fave->delete();
if (!$result) { if (!$result) {
common_log_db_error($fave, 'DELETE', __FILE__); common_log_db_error($fave, 'DELETE', __FILE__);
// TRANS: Server error displayed when removing a favorite from the database fails.
$this->serverError(_('Could not delete favorite.')); $this->serverError(_('Could not delete favorite.'));
return; return;
} }
@ -91,6 +94,7 @@ class DisfavorAction 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 for page on which favorites can be added.
$this->element('title', null, _('Add to favorites')); $this->element('title', null, _('Add to favorites'));
$this->elementEnd('head'); $this->elementEnd('head');
$this->elementStart('body'); $this->elementStart('body');
@ -105,4 +109,3 @@ class DisfavorAction extends Action
} }
} }
} }

View File

@ -1,5 +1,4 @@
<?php <?php
/** /**
* Documentation action. * Documentation action.
* *
@ -83,7 +82,6 @@ class DocAction extends Action
* *
* @return void * @return void
*/ */
function showPageTitle() function showPageTitle()
{ {
$this->element('h1', array('class' => 'entry-title'), $this->title()); $this->element('h1', array('class' => 'entry-title'), $this->title());
@ -96,7 +94,6 @@ class DocAction extends Action
* *
* @return void. * @return void.
*/ */
function showContentBlock() function showContentBlock()
{ {
$this->elementStart('div', array('id' => 'content', 'class' => 'hentry')); $this->elementStart('div', array('id' => 'content', 'class' => 'hentry'));
@ -117,7 +114,6 @@ class DocAction extends Action
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
$this->raw($this->output); $this->raw($this->output);
@ -142,7 +138,6 @@ class DocAction extends Action
* *
* @return boolean read-only flag (false) * @return boolean read-only flag (false)
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return true; return true;
@ -155,7 +150,9 @@ class DocAction extends Action
$this->filename = $this->getFilename(); $this->filename = $this->getFilename();
if (empty($this->filename)) { if (empty($this->filename)) {
throw new ClientException(sprintf(_('No such document "%s"'), $this->title), 404); // TRANS: Client exception thrown when requesting a document from the documentation that does not exist.
// TRANS: %s is the non-existing document.
throw new ClientException(sprintf(_('No such document "%s".'), $this->title), 404);
} }
$c = file_get_contents($this->filename); $c = file_get_contents($this->filename);

View File

@ -198,6 +198,7 @@ class EditApplicationAction extends OwnerDesignAction
} elseif (Oauth_application::descriptionTooLong($description)) { } elseif (Oauth_application::descriptionTooLong($description)) {
$this->showForm(sprintf( $this->showForm(sprintf(
// TRANS: Validation error shown when providing too long a description in the "Edit application" form. // TRANS: Validation error shown when providing too long a description in the "Edit application" form.
// TRANS: %d is the maximum number of allowed characters.
_m('Description is too long (maximum %d character).', _m('Description is too long (maximum %d character).',
'Description is too long (maximum %d characters).', 'Description is too long (maximum %d characters).',
Oauth_application::maxDesc()), Oauth_application::maxDesc()),
@ -223,6 +224,7 @@ class EditApplicationAction extends OwnerDesignAction
$this->showForm(_('Organization is too long (maximum 255 characters).')); $this->showForm(_('Organization is too long (maximum 255 characters).'));
return; return;
} elseif (empty($homepage)) { } elseif (empty($homepage)) {
// TRANS: Form validation error show when an organisation name has not been provided in the edit application form.
$this->showForm(_('Organization homepage is required.')); $this->showForm(_('Organization homepage is required.'));
return; return;
} elseif ((mb_strlen($homepage) > 0) } elseif ((mb_strlen($homepage) > 0)

View File

@ -177,116 +177,121 @@ class EditgroupAction extends GroupDesignAction
return; return;
} }
$nickname = Nickname::normalize($this->trimmed('nickname')); if (Event::handle('StartGroupSaveForm', array($this))) {
$fullname = $this->trimmed('fullname');
$homepage = $this->trimmed('homepage');
$description = $this->trimmed('description');
$location = $this->trimmed('location');
$aliasstring = $this->trimmed('aliases');
if ($this->nicknameExists($nickname)) { $nickname = Nickname::normalize($this->trimmed('nickname'));
// TRANS: Group edit form validation error. $fullname = $this->trimmed('fullname');
$this->showForm(_('Nickname already in use. Try another one.')); $homepage = $this->trimmed('homepage');
return; $description = $this->trimmed('description');
} else if (!User_group::allowedNickname($nickname)) { $location = $this->trimmed('location');
// TRANS: Group edit form validation error. $aliasstring = $this->trimmed('aliases');
$this->showForm(_('Not a valid nickname.'));
return; if ($this->nicknameExists($nickname)) {
} else if (!is_null($homepage) && (strlen($homepage) > 0) &&
!Validate::uri($homepage,
array('allowed_schemes' =>
array('http', 'https')))) {
// TRANS: Group edit form validation error.
$this->showForm(_('Homepage is not a valid URL.'));
return;
} else if (!is_null($fullname) && mb_strlen($fullname) > 255) {
// TRANS: Group edit form validation error.
$this->showForm(_('Full name is too long (maximum 255 characters).'));
return;
} else if (User_group::descriptionTooLong($description)) {
$this->showForm(sprintf(
// TRANS: Group edit form validation error. // TRANS: Group edit form validation error.
_m('Description is too long (maximum %d character).', $this->showForm(_('Nickname already in use. Try another one.'));
'Description is too long (maximum %d characters).', return;
User_group::maxDescription()), } else if (!User_group::allowedNickname($nickname)) {
// TRANS: Group edit form validation error.
$this->showForm(_('Not a valid nickname.'));
return;
} else if (!is_null($homepage) && (strlen($homepage) > 0) &&
!Validate::uri($homepage,
array('allowed_schemes' =>
array('http', 'https')))) {
// TRANS: Group edit form validation error.
$this->showForm(_('Homepage is not a valid URL.'));
return;
} else if (!is_null($fullname) && mb_strlen($fullname) > 255) {
// TRANS: Group edit form validation error.
$this->showForm(_('Full name is too long (maximum 255 characters).'));
return;
} else if (User_group::descriptionTooLong($description)) {
$this->showForm(sprintf(
// TRANS: Group edit form validation error.
_m('Description is too long (maximum %d character).',
'Description is too long (maximum %d characters).',
User_group::maxDescription()),
User_group::maxDescription())); User_group::maxDescription()));
return; return;
} else if (!is_null($location) && mb_strlen($location) > 255) { } else if (!is_null($location) && mb_strlen($location) > 255) {
// TRANS: Group edit form validation error.
$this->showForm(_('Location is too long (maximum 255 characters).'));
return;
}
if (!empty($aliasstring)) {
$aliases = array_map('common_canonical_nickname', array_unique(preg_split('/[\s,]+/', $aliasstring)));
} else {
$aliases = array();
}
if (count($aliases) > common_config('group', 'maxaliases')) {
// TRANS: Group edit form validation error.
// TRANS: %d is the maximum number of allowed aliases.
$this->showForm(sprintf(_m('Too many aliases! Maximum %d allowed.',
'Too many aliases! Maximum %d allowed.',
common_config('group', 'maxaliases')),
common_config('group', 'maxaliases')));
return;
}
foreach ($aliases as $alias) {
if (!Nickname::isValid($alias)) {
// TRANS: Group edit form validation error. // TRANS: Group edit form validation error.
$this->showForm(sprintf(_('Invalid alias: "%s"'), $alias)); $this->showForm(_('Location is too long (maximum 255 characters).'));
return; return;
} }
if ($this->nicknameExists($alias)) {
if (!empty($aliasstring)) {
$aliases = array_map('common_canonical_nickname', array_unique(preg_split('/[\s,]+/', $aliasstring)));
} else {
$aliases = array();
}
if (count($aliases) > common_config('group', 'maxaliases')) {
// TRANS: Group edit form validation error. // TRANS: Group edit form validation error.
$this->showForm(sprintf(_('Alias "%s" already in use. Try another one.'), // TRANS: %d is the maximum number of allowed aliases.
$alias)); $this->showForm(sprintf(_m('Too many aliases! Maximum %d allowed.',
'Too many aliases! Maximum %d allowed.',
common_config('group', 'maxaliases')),
common_config('group', 'maxaliases')));
return; return;
} }
// XXX assumes alphanum nicknames
if (strcmp($alias, $nickname) == 0) { foreach ($aliases as $alias) {
// TRANS: Group edit form validation error. if (!Nickname::isValid($alias)) {
$this->showForm(_('Alias can\'t be the same as nickname.')); // TRANS: Group edit form validation error.
return; $this->showForm(sprintf(_('Invalid alias: "%s"'), $alias));
return;
}
if ($this->nicknameExists($alias)) {
// TRANS: Group edit form validation error.
$this->showForm(sprintf(_('Alias "%s" already in use. Try another one.'),
$alias));
return;
}
// XXX assumes alphanum nicknames
if (strcmp($alias, $nickname) == 0) {
// TRANS: Group edit form validation error.
$this->showForm(_('Alias can\'t be the same as nickname.'));
return;
}
} }
$this->group->query('BEGIN');
$orig = clone($this->group);
$this->group->nickname = $nickname;
$this->group->fullname = $fullname;
$this->group->homepage = $homepage;
$this->group->description = $description;
$this->group->location = $location;
$this->group->mainpage = common_local_url('showgroup', array('nickname' => $nickname));
$result = $this->group->update($orig);
if (!$result) {
common_log_db_error($this->group, 'UPDATE', __FILE__);
// TRANS: Server error displayed when editing a group fails.
$this->serverError(_('Could not update group.'));
}
$result = $this->group->setAliases($aliases);
if (!$result) {
// TRANS: Server error displayed when group aliases could not be added.
$this->serverError(_('Could not create aliases.'));
}
if ($nickname != $orig->nickname) {
common_log(LOG_INFO, "Saving local group info.");
$local = Local_group::staticGet('group_id', $this->group->id);
$local->setNickname($nickname);
}
$this->group->query('COMMIT');
Event::handle('EndGroupSaveForm', array($this));
} }
$this->group->query('BEGIN');
$orig = clone($this->group);
$this->group->nickname = $nickname;
$this->group->fullname = $fullname;
$this->group->homepage = $homepage;
$this->group->description = $description;
$this->group->location = $location;
$this->group->mainpage = common_local_url('showgroup', array('nickname' => $nickname));
$result = $this->group->update($orig);
if (!$result) {
common_log_db_error($this->group, 'UPDATE', __FILE__);
// TRANS: Server error displayed when editing a group fails.
$this->serverError(_('Could not update group.'));
}
$result = $this->group->setAliases($aliases);
if (!$result) {
// TRANS: Server error displayed when group aliases could not be added.
$this->serverError(_('Could not create aliases.'));
}
if ($nickname != $orig->nickname) {
common_log(LOG_INFO, "Saving local group info.");
$local = Local_group::staticGet('group_id', $this->group->id);
$local->setNickname($nickname);
}
$this->group->query('COMMIT');
if ($this->group->nickname != $orig->nickname) { if ($this->group->nickname != $orig->nickname) {
common_redirect(common_local_url('editgroup', common_redirect(common_local_url('editgroup',
array('nickname' => $nickname)), array('nickname' => $nickname)),

View File

@ -54,7 +54,6 @@ class EmailsettingsAction extends SettingsAction
* *
* @return string Title of the page * @return string Title of the page
*/ */
function title() function title()
{ {
// TRANS: Title for e-mail settings. // TRANS: Title for e-mail settings.
@ -66,7 +65,6 @@ class EmailsettingsAction extends SettingsAction
* *
* @return instructions for use * @return instructions for use
*/ */
function getInstructions() function getInstructions()
{ {
// XXX: For consistency of parameters in messages, this should be a // XXX: For consistency of parameters in messages, this should be a
@ -91,7 +89,6 @@ class EmailsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
$user = common_current_user(); $user = common_current_user();
@ -118,8 +115,8 @@ class EmailsettingsAction extends SettingsAction
$confirm = $this->getConfirmation(); $confirm = $this->getConfirmation();
if ($confirm) { if ($confirm) {
$this->element('p', array('id' => 'form_unconfirmed'), $confirm->address); $this->element('p', array('id' => 'form_unconfirmed'), $confirm->address);
// TRANS: Form note in e-mail settings form.
$this->element('p', array('class' => 'form_note'), $this->element('p', array('class' => 'form_note'),
// TRANS: Form note in e-mail settings form.
_('Awaiting confirmation on this address. '. _('Awaiting confirmation on this address. '.
'Check your inbox (and spam box!) for a message '. 'Check your inbox (and spam box!) for a message '.
'with further instructions.')); 'with further instructions.'));
@ -173,7 +170,7 @@ class EmailsettingsAction extends SettingsAction
if ($user->incomingemail) { if ($user->incomingemail) {
$this->elementStart('p'); $this->elementStart('p');
$this->element('span', 'address', $user->incomingemail); $this->element('span', 'address', $user->incomingemail);
// XXX: Looks a little awkward in the UI. // @todo XXX: Looks a little awkward in the UI.
// Something like "xxxx@identi.ca Send email ..". Needs improvement. // Something like "xxxx@identi.ca Send email ..". Needs improvement.
$this->element('span', 'input_instructions', $this->element('span', 'input_instructions',
// TRANS: Form instructions for incoming e-mail form in e-mail settings. // TRANS: Form instructions for incoming e-mail form in e-mail settings.
@ -208,7 +205,7 @@ class EmailsettingsAction extends SettingsAction
$this->element('legend', null, _('Email preferences')); $this->element('legend', null, _('Email preferences'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
if (Event::handle('StartEmailFormData', array($this))) { if (Event::handle('StartEmailFormData', array($this))) {
$this->elementStart('li'); $this->elementStart('li');
$this->checkbox('emailnotifysub', $this->checkbox('emailnotifysub',
@ -262,7 +259,6 @@ class EmailsettingsAction extends SettingsAction
* *
* @return Confirm_address Email address confirmation for user, or null * @return Confirm_address Email address confirmation for user, or null
*/ */
function getConfirmation() function getConfirmation()
{ {
$user = common_current_user(); $user = common_current_user();
@ -288,7 +284,6 @@ class EmailsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function handlePost() function handlePost()
{ {
// CSRF protection // CSRF protection
@ -322,13 +317,12 @@ class EmailsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function savePreferences() function savePreferences()
{ {
$user = common_current_user(); $user = common_current_user();
if (Event::handle('StartEmailSaveForm', array($this, &$user))) { if (Event::handle('StartEmailSaveForm', array($this, &$user))) {
$emailnotifysub = $this->boolean('emailnotifysub'); $emailnotifysub = $this->boolean('emailnotifysub');
$emailnotifyfav = $this->boolean('emailnotifyfav'); $emailnotifyfav = $this->boolean('emailnotifyfav');
$emailnotifymsg = $this->boolean('emailnotifymsg'); $emailnotifymsg = $this->boolean('emailnotifymsg');
@ -336,13 +330,13 @@ class EmailsettingsAction extends SettingsAction
$emailnotifyattn = $this->boolean('emailnotifyattn'); $emailnotifyattn = $this->boolean('emailnotifyattn');
$emailmicroid = $this->boolean('emailmicroid'); $emailmicroid = $this->boolean('emailmicroid');
$emailpost = $this->boolean('emailpost'); $emailpost = $this->boolean('emailpost');
assert(!is_null($user)); // should already be checked assert(!is_null($user)); // should already be checked
$user->query('BEGIN'); $user->query('BEGIN');
$original = clone($user); $original = clone($user);
$user->emailnotifysub = $emailnotifysub; $user->emailnotifysub = $emailnotifysub;
$user->emailnotifyfav = $emailnotifyfav; $user->emailnotifyfav = $emailnotifyfav;
$user->emailnotifymsg = $emailnotifymsg; $user->emailnotifymsg = $emailnotifymsg;
@ -350,20 +344,20 @@ class EmailsettingsAction extends SettingsAction
$user->emailnotifyattn = $emailnotifyattn; $user->emailnotifyattn = $emailnotifyattn;
$user->emailmicroid = $emailmicroid; $user->emailmicroid = $emailmicroid;
$user->emailpost = $emailpost; $user->emailpost = $emailpost;
$result = $user->update($original); $result = $user->update($original);
if ($result === false) { if ($result === false) {
common_log_db_error($user, 'UPDATE', __FILE__); common_log_db_error($user, 'UPDATE', __FILE__);
// TRANS: Server error thrown on database error updating e-mail preferences. // TRANS: Server error thrown on database error updating e-mail preferences.
$this->serverError(_('Couldn\'t update user.')); $this->serverError(_('Could not update user.'));
return; return;
} }
$user->query('COMMIT'); $user->query('COMMIT');
Event::handle('EndEmailSaveForm', array($this)); Event::handle('EndEmailSaveForm', array($this));
// TRANS: Confirmation message for successful e-mail preferences save. // TRANS: Confirmation message for successful e-mail preferences save.
$this->showForm(_('Email preferences saved.'), true); $this->showForm(_('Email preferences saved.'), true);
} }
@ -374,7 +368,6 @@ class EmailsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function addAddress() function addAddress()
{ {
$user = common_current_user(); $user = common_current_user();
@ -393,7 +386,7 @@ class EmailsettingsAction extends SettingsAction
if (!$email) { if (!$email) {
// TRANS: Message given saving e-mail address that cannot be normalised. // TRANS: Message given saving e-mail address that cannot be normalised.
$this->showForm(_('Cannot normalize that email address')); $this->showForm(_('Cannot normalize that email address.'));
return; return;
} }
if (!Validate::email($email, common_config('email', 'check_domain'))) { if (!Validate::email($email, common_config('email', 'check_domain'))) {
@ -423,7 +416,7 @@ class EmailsettingsAction extends SettingsAction
if ($result === false) { if ($result === false) {
common_log_db_error($confirm, 'INSERT', __FILE__); common_log_db_error($confirm, 'INSERT', __FILE__);
// TRANS: Server error thrown on database error adding e-mail confirmation code. // TRANS: Server error thrown on database error adding e-mail confirmation code.
$this->serverError(_('Couldn\'t insert confirmation code.')); $this->serverError(_('Could not insert confirmation code.'));
return; return;
} }
@ -442,7 +435,6 @@ class EmailsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function cancelConfirmation() function cancelConfirmation()
{ {
$email = $this->arg('email'); $email = $this->arg('email');
@ -465,7 +457,7 @@ class EmailsettingsAction extends SettingsAction
if (!$result) { if (!$result) {
common_log_db_error($confirm, 'DELETE', __FILE__); common_log_db_error($confirm, 'DELETE', __FILE__);
// TRANS: Server error thrown on database error canceling e-mail address confirmation. // TRANS: Server error thrown on database error canceling e-mail address confirmation.
$this->serverError(_('Couldn\'t delete email confirmation.')); $this->serverError(_('Could not delete email confirmation.'));
return; return;
} }
@ -478,7 +470,6 @@ class EmailsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function removeAddress() function removeAddress()
{ {
$user = common_current_user(); $user = common_current_user();
@ -505,7 +496,7 @@ class EmailsettingsAction extends SettingsAction
if (!$result) { if (!$result) {
common_log_db_error($user, 'UPDATE', __FILE__); common_log_db_error($user, 'UPDATE', __FILE__);
// TRANS: Server error thrown on database error removing a registered e-mail address. // TRANS: Server error thrown on database error removing a registered e-mail address.
$this->serverError(_('Couldn\'t update user.')); $this->serverError(_('Could not update user.'));
return; return;
} }
$user->query('COMMIT'); $user->query('COMMIT');
@ -519,12 +510,12 @@ class EmailsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function removeIncoming() function removeIncoming()
{ {
$user = common_current_user(); $user = common_current_user();
if (!$user->incomingemail) { if (!$user->incomingemail) {
// TRANS: Form validation error displayed when trying to remove an incoming e-mail address while no address has been set.
$this->showForm(_('No incoming email address.')); $this->showForm(_('No incoming email address.'));
return; return;
} }
@ -537,7 +528,7 @@ class EmailsettingsAction extends SettingsAction
if (!$user->updateKeys($orig)) { if (!$user->updateKeys($orig)) {
common_log_db_error($user, 'UPDATE', __FILE__); common_log_db_error($user, 'UPDATE', __FILE__);
// TRANS: Server error thrown on database error removing incoming e-mail address. // TRANS: Server error thrown on database error removing incoming e-mail address.
$this->serverError(_("Couldn't update user record.")); $this->serverError(_('Could not update user record.'));
} }
// TRANS: Message given after successfully removing an incoming e-mail address. // TRANS: Message given after successfully removing an incoming e-mail address.
@ -549,7 +540,6 @@ class EmailsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function newIncoming() function newIncoming()
{ {
$user = common_current_user(); $user = common_current_user();
@ -562,7 +552,7 @@ class EmailsettingsAction extends SettingsAction
if (!$user->updateKeys($orig)) { if (!$user->updateKeys($orig)) {
common_log_db_error($user, 'UPDATE', __FILE__); common_log_db_error($user, 'UPDATE', __FILE__);
// TRANS: Server error thrown on database error adding incoming e-mail address. // TRANS: Server error thrown on database error adding incoming e-mail address.
$this->serverError(_("Couldn't update user record.")); $this->serverError(_('Could not update user record.'));
} }
// TRANS: Message given after successfully adding an incoming e-mail address. // TRANS: Message given after successfully adding an incoming e-mail address.

View File

@ -1,5 +1,4 @@
<?php <?php
/** /**
* Favor action. * Favor action.
* *
@ -59,6 +58,7 @@ class FavorAction extends Action
{ {
parent::handle($args); parent::handle($args);
if (!common_logged_in()) { if (!common_logged_in()) {
// TRANS: Client error displayed when trying to mark a notice as favorite without being logged in.
$this->clientError(_('Not logged in.')); $this->clientError(_('Not logged in.'));
return; return;
} }
@ -76,11 +76,13 @@ class FavorAction extends Action
return; return;
} }
if ($user->hasFave($notice)) { if ($user->hasFave($notice)) {
// TRANS: Client error displayed when trying to mark a notice as favorite that already is a favorite.
$this->clientError(_('This notice is already a favorite!')); $this->clientError(_('This notice is already a favorite!'));
return; return;
} }
$fave = Fave::addNew($user->getProfile(), $notice); $fave = Fave::addNew($user->getProfile(), $notice);
if (!$fave) { if (!$fave) {
// TRANS: Server error displayed when trying to mark a notice as favorite fails in the database.
$this->serverError(_('Could not create favorite.')); $this->serverError(_('Could not create favorite.'));
return; return;
} }
@ -89,7 +91,8 @@ class FavorAction 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');
$this->element('title', null, _('Disfavor favorite')); // TRANS: Page title for page on which favorite notices can be unfavourited.
$this->element('title', null, _('Disfavor favorite.'));
$this->elementEnd('head'); $this->elementEnd('head');
$this->elementStart('body'); $this->elementStart('body');
$disfavor = new DisFavorForm($this, $notice); $disfavor = new DisFavorForm($this, $notice);
@ -123,4 +126,3 @@ class FavorAction extends Action
} }
} }
} }

View File

@ -48,7 +48,6 @@ require_once INSTALLDIR.'/lib/noticelist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class FavoritedAction extends Action class FavoritedAction extends Action
{ {
var $page = null; var $page = null;
@ -62,8 +61,11 @@ class FavoritedAction extends Action
function title() function title()
{ {
if ($this->page == 1) { if ($this->page == 1) {
// TRANS: Page title for first page of favorited notices.
return _('Popular notices'); return _('Popular notices');
} else { } else {
// TRANS: Page title for all but first page of favorited notices.
// TRANS: %d is the page number being displayed.
return sprintf(_('Popular notices, page %d'), $this->page); return sprintf(_('Popular notices, page %d'), $this->page);
} }
} }
@ -73,9 +75,9 @@ class FavoritedAction extends Action
* *
* @return instructions for use * @return instructions for use
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Description on page displaying favorited notices.
return _('The most popular notices on the site right now.'); return _('The most popular notices on the site right now.');
} }
@ -84,7 +86,6 @@ class FavoritedAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return true; return true;
@ -99,7 +100,6 @@ class FavoritedAction extends Action
* *
* @todo move queries from showContent() to here * @todo move queries from showContent() to here
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -119,7 +119,6 @@ class FavoritedAction extends Action
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
@ -134,7 +133,6 @@ class FavoritedAction extends Action
* *
* @return void * @return void
*/ */
function showPageNotice() function showPageNotice()
{ {
$instr = $this->getInstructions(); $instr = $this->getInstructions();
@ -147,12 +145,16 @@ class FavoritedAction extends Action
function showEmptyList() function showEmptyList()
{ {
// TRANS: Text displayed instead of a list when a site does not yet have any favourited notices.
$message = _('Favorite notices appear on this page but no one has favorited one yet.') . ' '; $message = _('Favorite notices appear on this page but no one has favorited one yet.') . ' ';
if (common_logged_in()) { if (common_logged_in()) {
// TRANS: Additional text displayed instead of a list when a site does not yet have any favourited notices for logged in users.
$message .= _('Be the first to add a notice to your favorites by clicking the fave button next to any notice you like.'); $message .= _('Be the first to add a notice to your favorites by clicking the fave button next to any notice you like.');
} }
else { else {
// TRANS: Additional text displayed instead of a list when a site does not yet have any favourited notices for not logged in users.
// TRANS: %%action.register%% is a registration link. "[link text](link)" is Mark Down. Do not change the formatting.
$message .= _('Why not [register an account](%%action.register%%) and be the first to add a notice to your favorites!'); $message .= _('Why not [register an account](%%action.register%%) and be the first to add a notice to your favorites!');
} }
@ -168,7 +170,6 @@ class FavoritedAction extends Action
* *
* @return void * @return void
*/ */
function showLocalNav() function showLocalNav()
{ {
$nav = new PublicGroupNav($this); $nav = new PublicGroupNav($this);
@ -182,7 +183,6 @@ class FavoritedAction extends Action
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
$pop = new Popularity(); $pop = new Popularity();

View File

@ -1,5 +1,4 @@
<?php <?php
/** /**
* RSS feed for user favorites action class. * RSS feed for user favorites action class.
* *
@ -50,7 +49,6 @@ require_once INSTALLDIR.'/lib/rssaction.php';
*/ */
class FavoritesrssAction extends Rss10Action class FavoritesrssAction extends Rss10Action
{ {
/** The user whose favorites to display */ /** The user whose favorites to display */
var $user = null; var $user = null;
@ -62,7 +60,6 @@ class FavoritesrssAction extends Rss10Action
* *
* @return boolean success * @return boolean success
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -71,6 +68,7 @@ class FavoritesrssAction extends Rss10Action
$this->user = User::staticGet('nickname', $nickname); $this->user = User::staticGet('nickname', $nickname);
if (!$this->user) { if (!$this->user) {
// TRANS: Client error displayed when trying to get the RSS feed with favorites of a user that does not exist.
$this->clientError(_('No such user.')); $this->clientError(_('No such user.'));
return false; return false;
} else { } else {
@ -108,10 +106,14 @@ class FavoritesrssAction extends Rss10Action
$c = array('url' => common_local_url('favoritesrss', $c = array('url' => common_local_url('favoritesrss',
array('nickname' => array('nickname' =>
$user->nickname)), $user->nickname)),
// TRANS: Title of RSS feed with favourite notices of a user.
// TRANS: %s is a user's nickname.
'title' => sprintf(_("%s's favorite notices"), $user->nickname), 'title' => sprintf(_("%s's favorite notices"), $user->nickname),
'link' => common_local_url('showfavorites', 'link' => common_local_url('showfavorites',
array('nickname' => array('nickname' =>
$user->nickname)), $user->nickname)),
// TRANS: Desciption of RSS feed with favourite notices of a user.
// TRANS: %1$s is a user's nickname, %2$s is the name of the StatusNet site.
'description' => sprintf(_('Updates favored by %1$s on %2$s!'), 'description' => sprintf(_('Updates favored by %1$s on %2$s!'),
$user->nickname, common_config('site', 'name'))); $user->nickname, common_config('site', 'name')));
return $c; return $c;

View File

@ -45,7 +45,6 @@ require_once INSTALLDIR.'/lib/publicgroupnav.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class FeaturedAction extends Action class FeaturedAction extends Action
{ {
var $page = null; var $page = null;
@ -66,8 +65,11 @@ class FeaturedAction extends Action
function title() function title()
{ {
if ($this->page == 1) { if ($this->page == 1) {
// TRANS: Page title for first page of featured users.
return _('Featured users'); return _('Featured users');
} else { } else {
// TRANS: Page title for all but first page of featured users.
// TRANS: %d is the page number being displayed.
return sprintf(_('Featured users, page %d'), $this->page); return sprintf(_('Featured users, page %d'), $this->page);
} }
} }
@ -96,7 +98,8 @@ class FeaturedAction extends Action
function getInstructions() function getInstructions()
{ {
return sprintf(_('A selection of some great users on %s'), // TRANS: Description on page displaying featured users.
return sprintf(_('A selection of some great users on %s.'),
common_config('site', 'name')); common_config('site', 'name'));
} }

View File

@ -21,6 +21,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
require_once(INSTALLDIR.'/actions/shownotice.php'); require_once(INSTALLDIR.'/actions/shownotice.php');
// @todo FIXME: Add documentation.
class FileAction extends Action class FileAction extends Action
{ {
var $id = null; var $id = null;
@ -31,14 +32,17 @@ class FileAction extends Action
parent::prepare($args); parent::prepare($args);
$this->id = $this->trimmed('notice'); $this->id = $this->trimmed('notice');
if (empty($this->id)) { if (empty($this->id)) {
// TRANS: Client error displayed when no notice ID was given trying do display a file.
$this->clientError(_('No notice ID.')); $this->clientError(_('No notice ID.'));
} }
$notice = Notice::staticGet('id', $this->id); $notice = Notice::staticGet('id', $this->id);
if (empty($notice)) { if (empty($notice)) {
// TRANS: Client error displayed when an invalid notice ID was given trying do display a file.
$this->clientError(_('No notice.')); $this->clientError(_('No notice.'));
} }
$atts = $notice->attachments(); $atts = $notice->attachments();
if (empty($atts)) { if (empty($atts)) {
// TRANS: Client error displayed when trying do display a file for a notice without a file attachement.
$this->clientError(_('No attachments.')); $this->clientError(_('No attachments.'));
} }
foreach ($atts as $att) { foreach ($atts as $att) {
@ -48,6 +52,9 @@ class FileAction extends Action
} }
} }
if (empty($this->filerec)) { if (empty($this->filerec)) {
// XXX: Is this translation hint correct? If yes, please remove comment, if no, please correct and remove comment.
// TRANS: Client error displayed when trying do display a file for a notice with file attachements
// TRANS: that could not be found.
$this->clientError(_('No uploaded attachments.')); $this->clientError(_('No uploaded attachments.'));
} }
return true; return true;
@ -62,11 +69,8 @@ class FileAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return true; return true;
} }
} }

View File

@ -48,7 +48,6 @@ require_once INSTALLDIR.'/lib/omb.php';
*/ */
class FinishremotesubscribeAction extends Action class FinishremotesubscribeAction extends Action
{ {
/** /**
* Class handler. * Class handler.
* *
@ -56,7 +55,7 @@ class FinishremotesubscribeAction extends Action
* *
* @return nothing * @return nothing
* *
**/ */
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
@ -66,6 +65,7 @@ class FinishremotesubscribeAction extends Action
$service = unserialize($_SESSION['oauth_authorization_request']); $service = unserialize($_SESSION['oauth_authorization_request']);
if (!$service) { if (!$service) {
// TRANS: Client error displayed when subscribing to a remote profile and an unexpected response is received.
$this->clientError(_('Not expecting this response!')); $this->clientError(_('Not expecting this response!'));
return; return;
} }
@ -77,6 +77,7 @@ class FinishremotesubscribeAction extends Action
$user = User::staticGet('uri', $service->getListeneeURI()); $user = User::staticGet('uri', $service->getListeneeURI());
if (!$user) { if (!$user) {
// TRANS: Client error displayed when subscribing to a remote profile that does not exist.
$this->clientError(_('User being listened to does not exist.')); $this->clientError(_('User being listened to does not exist.'));
return; return;
} }
@ -84,6 +85,7 @@ class FinishremotesubscribeAction extends Action
$other = User::staticGet('uri', $service->getListenerURI()); $other = User::staticGet('uri', $service->getListenerURI());
if ($other) { if ($other) {
// TRANS: Client error displayed when subscribing to a remote profile that is a local profile.
$this->clientError(_('You can use the local subscription!')); $this->clientError(_('You can use the local subscription!'));
return; return;
} }
@ -96,6 +98,7 @@ class FinishremotesubscribeAction extends Action
$profile = Profile::staticGet($remote->id); $profile = Profile::staticGet($remote->id);
if ($user->hasBlocked($profile)) { if ($user->hasBlocked($profile)) {
// TRANS: Client error displayed when subscribing to a remote profile that is blocked form subscribing to.
$this->clientError(_('That user has blocked you from subscribing.')); $this->clientError(_('That user has blocked you from subscribing.'));
return; return;
} }
@ -107,14 +110,17 @@ class FinishremotesubscribeAction extends Action
} catch (OAuthException $e) { } catch (OAuthException $e) {
if ($e->getMessage() == 'The authorized token does not equal the ' . if ($e->getMessage() == 'The authorized token does not equal the ' .
'submitted token.') { 'submitted token.') {
// TRANS: Client error displayed when subscribing to a remote profile without providing an authorised token.
$this->clientError(_('You are not authorized.')); $this->clientError(_('You are not authorized.'));
return; return;
} else { } else {
// TRANS: Client error displayed when subscribing to a remote profile and conversion of the request token to access token fails.
$this->clientError(_('Could not convert request token to ' . $this->clientError(_('Could not convert request token to ' .
'access token.')); 'access token.'));
return; return;
} }
} catch (OMB_RemoteServiceException $e) { } catch (OMB_RemoteServiceException $e) {
// TRANS: Client error displayed when subscribing to a remote profile fails because of an unsupported version of the OMB protocol.
$this->clientError(_('Remote service uses unknown version of ' . $this->clientError(_('Remote service uses unknown version of ' .
'OMB protocol.')); 'OMB protocol.'));
return; return;
@ -135,6 +141,7 @@ class FinishremotesubscribeAction extends Action
$service->getServiceURI(OMB_ENDPOINT_UPDATEPROFILE); $service->getServiceURI(OMB_ENDPOINT_UPDATEPROFILE);
if (!$remote->update($orig_remote)) { if (!$remote->update($orig_remote)) {
// TRANS: Server error displayed when subscribing to a remote profile fails because the remote profile could not be updated.
$this->serverError(_('Error updating remote profile.')); $this->serverError(_('Error updating remote profile.'));
return; return;
} }

View File

@ -23,6 +23,7 @@ define('LISTENER', 1);
define('LISTENEE', -1); define('LISTENEE', -1);
define('BOTH', 0); define('BOTH', 0);
// @todo XXX: Documentation missing.
class FoafAction extends Action class FoafAction extends Action
{ {
function isReadOnly($args) function isReadOnly($args)
@ -37,6 +38,7 @@ class FoafAction extends Action
$nickname_arg = $this->arg('nickname'); $nickname_arg = $this->arg('nickname');
if (empty($nickname_arg)) { if (empty($nickname_arg)) {
// TRANS: Client error displayed when requesting Friends of a Friend feed without providing a user nickname.
$this->clientError(_('No such user.'), 404); $this->clientError(_('No such user.'), 404);
return false; return false;
} }
@ -55,6 +57,7 @@ class FoafAction extends Action
$this->user = User::staticGet('nickname', $this->nickname); $this->user = User::staticGet('nickname', $this->nickname);
if (!$this->user) { if (!$this->user) {
// TRANS: Client error displayed when requesting Friends of a Friend feed for an object that is not a user.
$this->clientError(_('No such user.'), 404); $this->clientError(_('No such user.'), 404);
return false; return false;
} }
@ -62,6 +65,7 @@ class FoafAction extends Action
$this->profile = $this->user->getProfile(); $this->profile = $this->user->getProfile();
if (!$this->profile) { if (!$this->profile) {
// TRANS: Server error displayed when requesting Friends of a Friend feed for a user for which the profile could not be found.
$this->serverError(_('User has no profile.'), 500); $this->serverError(_('User has no profile.'), 500);
return false; return false;
} }
@ -110,7 +114,7 @@ class FoafAction extends Action
if ($this->profile->bio) { if ($this->profile->bio) {
$this->element('bio:olb', null, $this->profile->bio); $this->element('bio:olb', null, $this->profile->bio);
} }
$location = $this->profile->getLocation(); $location = $this->profile->getLocation();
if ($location) { if ($location) {
$attr = array(); $attr = array();
@ -118,7 +122,7 @@ class FoafAction extends Action
$attr['rdf:about'] = $location->getRdfURL(); $attr['rdf:about'] = $location->getRdfURL();
} }
$location_name = $location->getName(); $location_name = $location->getName();
$this->elementStart('based_near'); $this->elementStart('based_near');
$this->elementStart('geo:SpatialThing', $attr); $this->elementStart('geo:SpatialThing', $attr);
if ($location_name) { if ($location_name) {
@ -193,7 +197,7 @@ class FoafAction extends Action
$this->element('knows', array('rdf:resource' => $uri)); $this->element('knows', array('rdf:resource' => $uri));
} }
} }
$this->elementEnd('Agent'); $this->elementEnd('Agent');
@ -239,18 +243,17 @@ class FoafAction extends Action
/** /**
* Output FOAF <account> bit for the given profile. * Output FOAF <account> bit for the given profile.
* *
* @param Profile $profile * @param Profile $profile
* @param mixed $service Root URL of this StatusNet instance for a local * @param mixed $service Root URL of this StatusNet instance for a local
* user, otherwise null. * user, otherwise null.
* @param mixed $useruri URI string for the referenced profile.. * @param mixed $useruri URI string for the referenced profile..
* @param boolean $fetchSubscriptions Should we load and list all their subscriptions? * @param boolean $fetchSubscriptions Should we load and list all their subscriptions?
* @param boolean $isSubscriber if not fetching subs, we can still mark the user as following the current page. * @param boolean $isSubscriber if not fetching subs, we can still mark the user as following the current page.
* *
* @return array if $fetchSubscribers is set, return a list of info on those * @return array if $fetchSubscribers is set, return a list of info on those
* subscriptions. * subscriptions.
*/ */
function showMicrobloggingAccount($profile, $service=null, $useruri=null, $fetchSubscriptions=false, $isSubscriber=false) function showMicrobloggingAccount($profile, $service=null, $useruri=null, $fetchSubscriptions=false, $isSubscriber=false)
{ {
$attr = array(); $attr = array();

View File

@ -27,6 +27,7 @@
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
// @todo XXX: Documentation missing.
class FoafGroupAction extends Action class FoafGroupAction extends Action
{ {
function isReadOnly($args) function isReadOnly($args)
@ -41,6 +42,7 @@ class FoafGroupAction extends Action
$nickname_arg = $this->arg('nickname'); $nickname_arg = $this->arg('nickname');
if (empty($nickname_arg)) { if (empty($nickname_arg)) {
// TRANS: Client error displayed when requesting Friends of a Friend feed without providing a group nickname.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -59,6 +61,7 @@ class FoafGroupAction extends Action
$local = Local_group::staticGet('nickname', $this->nickname); $local = Local_group::staticGet('nickname', $this->nickname);
if (!$local) { if (!$local) {
// TRANS: Client error displayed when requesting Friends of a Friend feed for a non-local group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -66,6 +69,7 @@ class FoafGroupAction extends Action
$this->group = User_group::staticGet('id', $local->group_id); $this->group = User_group::staticGet('id', $local->group_id);
if (!$this->group) { if (!$this->group) {
// TRANS: Client error displayed when requesting Friends of a Friend feed for a nickname that is not a group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }

View File

@ -68,7 +68,7 @@ class GeocodeAction extends Action
* *
* @return nothing * @return nothing
* *
**/ */
function handle($args) function handle($args)
{ {
header('Content-Type: application/json; charset=utf-8'); header('Content-Type: application/json; charset=utf-8');
@ -89,7 +89,6 @@ class GeocodeAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return true; return true;

View File

@ -47,13 +47,11 @@ require_once 'MIME/Type.php';
* @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 GetfileAction extends Action class GetfileAction extends Action
{ {
/** /**
* Path of file to return * Path of file to return
*/ */
var $path = null; var $path = null;
/** /**
@ -63,7 +61,6 @@ class GetfileAction extends Action
* *
* @return success flag * @return success flag
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -76,10 +73,12 @@ class GetfileAction extends Action
} }
if (empty($path) or !file_exists($path)) { if (empty($path) or !file_exists($path)) {
// TRANS: Client error displayed when requesting a non-existent file.
$this->clientError(_('No such file.'), 404); $this->clientError(_('No such file.'), 404);
return false; return false;
} }
if (!is_readable($path)) { if (!is_readable($path)) {
// TRANS: Client error displayed when requesting a file without having read access to it.
$this->clientError(_('Cannot read file.'), 403); $this->clientError(_('Cannot read file.'), 403);
return false; return false;
} }
@ -93,7 +92,6 @@ class GetfileAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return true; return true;
@ -104,7 +102,6 @@ class GetfileAction extends Action
* *
* @return int last-modified date as unix timestamp * @return int last-modified date as unix timestamp
*/ */
function lastModified() function lastModified()
{ {
if (common_config('site', 'use_x_sendfile')) { if (common_config('site', 'use_x_sendfile')) {
@ -122,7 +119,6 @@ class GetfileAction extends Action
* *
* @return string etag http header * @return string etag http header
*/ */
function etag() function etag()
{ {
if (common_config('site', 'use_x_sendfile')) { if (common_config('site', 'use_x_sendfile')) {
@ -151,7 +147,6 @@ class GetfileAction extends Action
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
// undo headers set by PHP sessions // undo headers set by PHP sessions

View File

@ -2,7 +2,7 @@
/** /**
* StatusNet, the distributed open-source microblogging tool * StatusNet, the distributed open-source microblogging tool
* *
* Action class to sandbox an abusive user * Action class to grant user roles.
* *
* PHP version 5 * PHP version 5
* *
@ -32,7 +32,7 @@ if (!defined('STATUSNET')) {
} }
/** /**
* Sandbox a user. * Assign role to user.
* *
* @category Action * @category Action
* @package StatusNet * @package StatusNet
@ -40,7 +40,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/ * @link http://status.net/
*/ */
class GrantRoleAction extends ProfileFormAction class GrantRoleAction extends ProfileFormAction
{ {
/** /**
@ -50,19 +49,20 @@ class GrantRoleAction extends ProfileFormAction
* *
* @return boolean success flag * @return boolean success flag
*/ */
function prepare($args) function prepare($args)
{ {
if (!parent::prepare($args)) { if (!parent::prepare($args)) {
return false; return false;
} }
$this->role = $this->arg('role'); $this->role = $this->arg('role');
if (!Profile_role::isValid($this->role)) { if (!Profile_role::isValid($this->role)) {
// TRANS: Client error displayed when trying to assign an invalid role to a user.
$this->clientError(_('Invalid role.')); $this->clientError(_('Invalid role.'));
return false; return false;
} }
if (!Profile_role::isSettable($this->role)) { if (!Profile_role::isSettable($this->role)) {
// TRANS: Client error displayed when trying to assign an reserved role to a user.
$this->clientError(_('This role is reserved and cannot be set.')); $this->clientError(_('This role is reserved and cannot be set.'));
return false; return false;
} }
@ -72,6 +72,7 @@ class GrantRoleAction extends ProfileFormAction
assert(!empty($cur)); // checked by parent assert(!empty($cur)); // checked by parent
if (!$cur->hasRight(Right::GRANTROLE)) { if (!$cur->hasRight(Right::GRANTROLE)) {
// TRANS: Client error displayed when trying to assign a role to a user while not being allowed to set roles.
$this->clientError(_('You cannot grant user roles on this site.')); $this->clientError(_('You cannot grant user roles on this site.'));
return false; return false;
} }
@ -79,6 +80,7 @@ class GrantRoleAction extends ProfileFormAction
assert(!empty($this->profile)); // checked by parent assert(!empty($this->profile)); // checked by parent
if ($this->profile->hasRole($this->role)) { if ($this->profile->hasRole($this->role)) {
// TRANS: Client error displayed when trying to assign a role to a user that already has that role.
$this->clientError(_('User already has this role.')); $this->clientError(_('User already has this role.'));
return false; return false;
} }
@ -91,7 +93,6 @@ class GrantRoleAction extends ProfileFormAction
* *
* @return void * @return void
*/ */
function handlePost() function handlePost()
{ {
$this->profile->grantRole($this->role); $this->profile->grantRole($this->role);

View File

@ -40,7 +40,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/ * @link http://status.net/
*/ */
class GroupblockAction extends RedirectingAction class GroupblockAction extends RedirectingAction
{ {
var $profile = null; var $profile = null;
@ -53,11 +52,11 @@ class GroupblockAction extends RedirectingAction
* *
* @return boolean success flag * @return boolean success flag
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
if (!common_logged_in()) { if (!common_logged_in()) {
// TRANS: Client error displayed trying to block a user from a group while not logged in.
$this->clientError(_('Not logged in.')); $this->clientError(_('Not logged in.'));
return false; return false;
} }
@ -68,35 +67,42 @@ class GroupblockAction extends RedirectingAction
} }
$id = $this->trimmed('blockto'); $id = $this->trimmed('blockto');
if (empty($id)) { if (empty($id)) {
// TRANS: Client error displayed trying to block a user from a group while not specifying a to be blocked user profile.
$this->clientError(_('No profile specified.')); $this->clientError(_('No profile specified.'));
return false; return false;
} }
$this->profile = Profile::staticGet('id', $id); $this->profile = Profile::staticGet('id', $id);
if (empty($this->profile)) { if (empty($this->profile)) {
// TRANS: Client error displayed trying to block a user from a group while specifying a non-existing profile.
$this->clientError(_('No profile with that ID.')); $this->clientError(_('No profile with that ID.'));
return false; return false;
} }
$group_id = $this->trimmed('blockgroup'); $group_id = $this->trimmed('blockgroup');
if (empty($group_id)) { if (empty($group_id)) {
// TRANS: Client error displayed trying to block a user from a group while not specifying a group to block a profile from.
$this->clientError(_('No group specified.')); $this->clientError(_('No group specified.'));
return false; return false;
} }
$this->group = User_group::staticGet('id', $group_id); $this->group = User_group::staticGet('id', $group_id);
if (empty($this->group)) { if (empty($this->group)) {
// TRANS: Client error displayed trying to block a user from a group while specifying a non-existing group.
$this->clientError(_('No such group.')); $this->clientError(_('No such group.'));
return false; return false;
} }
$user = common_current_user(); $user = common_current_user();
if (!$user->isAdmin($this->group)) { if (!$user->isAdmin($this->group)) {
// TRANS: Client error displayed trying to block a user from a group while not being an admin user.
$this->clientError(_('Only an admin can block group members.'), 401); $this->clientError(_('Only an admin can block group members.'), 401);
return false; return false;
} }
if (Group_block::isBlocked($this->group, $this->profile)) { if (Group_block::isBlocked($this->group, $this->profile)) {
// TRANS: Client error displayed trying to block a user from a group while user is already blocked from the given group.
$this->clientError(_('User is already blocked from group.')); $this->clientError(_('User is already blocked from group.'));
return false; return false;
} }
// XXX: could have proactive blocks, but we don't have UI for it. // XXX: could have proactive blocks, but we don't have UI for it.
if (!$this->profile->isMember($this->group)) { if (!$this->profile->isMember($this->group)) {
// TRANS: Client error displayed trying to block a user from a group while user is not a member of given group.
$this->clientError(_('User is not a member of group.')); $this->clientError(_('User is not a member of group.'));
return false; return false;
} }
@ -131,6 +137,7 @@ class GroupblockAction extends RedirectingAction
} }
function title() { function title() {
// TRANS: Title for block user from group page.
return _('Block user from group'); return _('Block user from group');
} }
@ -145,7 +152,6 @@ class GroupblockAction extends RedirectingAction
* *
* @return void * @return void
*/ */
function areYouSureForm() function areYouSureForm()
{ {
$id = $this->profile->id; $id = $this->profile->id;
@ -155,8 +161,11 @@ class GroupblockAction extends RedirectingAction
'action' => common_local_url('groupblock'))); 'action' => common_local_url('groupblock')));
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
// TRANS: Fieldset legend for block user from group form.
$this->element('legend', _('Block user')); $this->element('legend', _('Block user'));
$this->element('p', null, $this->element('p', null,
// TRANS: Explanatory text for block user from group form before setting the block.
// TRANS: %1$s is that to be blocked user, %2$s is the group the user will be blocked from.
sprintf(_('Are you sure you want to block user "%1$s" from the group "%2$s"? '. sprintf(_('Are you sure you want to block user "%1$s" from the group "%2$s"? '.
'They will be removed from the group, unable to post, and '. 'They will be removed from the group, unable to post, and '.
'unable to subscribe to the group in the future.'), 'unable to subscribe to the group in the future.'),
@ -179,14 +188,14 @@ class GroupblockAction extends RedirectingAction
'submit form_action-primary', 'submit form_action-primary',
'no', 'no',
// TRANS: Submit button title for 'No' when blocking a user from a group. // TRANS: Submit button title for 'No' when blocking a user from a group.
_('Do not block this user from this group')); _('Do not block this user from this group.'));
$this->submit('form_action-yes', $this->submit('form_action-yes',
// TRANS: Button label on the form to block a user from a group. // TRANS: Button label on the form to block a user from a group.
_m('BUTTON','Yes'), _m('BUTTON','Yes'),
'submit form_action-secondary', 'submit form_action-secondary',
'yes', 'yes',
// TRANS: Submit button title for 'Yes' when blocking a user from a group. // TRANS: Submit button title for 'Yes' when blocking a user from a group.
_('Block this user from this group')); _('Block this user from this group.'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }
@ -196,24 +205,24 @@ class GroupblockAction extends RedirectingAction
* *
* @return void * @return void
*/ */
function blockProfile() function blockProfile()
{ {
$block = Group_block::blockProfile($this->group, $this->profile, $block = Group_block::blockProfile($this->group, $this->profile,
common_current_user()); common_current_user());
if (empty($block)) { if (empty($block)) {
// TRANS: Server error displayed when trying to block a user from a group fails because of an application error.
$this->serverError(_("Database error blocking user from group.")); $this->serverError(_("Database error blocking user from group."));
return false; return false;
} }
$this->returnToPrevious(); $this->returnToPrevious();
} }
/** /**
* If we reached this form without returnto arguments, default to * If we reached this form without returnto arguments, default to
* the top of the group's member list. * the top of the group's member list.
* *
* @return string URL * @return string URL
*/ */
function defaultReturnTo() function defaultReturnTo()
@ -227,6 +236,4 @@ class GroupblockAction extends RedirectingAction
parent::showScripts(); parent::showScripts();
$this->autofocus('form_action-yes'); $this->autofocus('form_action-yes');
} }
} }

View File

@ -47,7 +47,6 @@ require_once INSTALLDIR.'/lib/feedlist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class GroupbyidAction extends Action class GroupbyidAction extends Action
{ {
/** group we're viewing. */ /** group we're viewing. */
@ -58,7 +57,6 @@ class GroupbyidAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return true; return true;
@ -71,6 +69,7 @@ class GroupbyidAction extends Action
$id = $this->arg('id'); $id = $this->arg('id');
if (!$id) { if (!$id) {
// TRANS: Client error displayed referring to a group's permalink without providing a group ID.
$this->clientError(_('No ID.')); $this->clientError(_('No ID.'));
return false; return false;
} }
@ -80,6 +79,7 @@ class GroupbyidAction extends Action
$this->group = User_group::staticGet('id', $id); $this->group = User_group::staticGet('id', $id);
if (!$this->group) { if (!$this->group) {
// TRANS: Client error displayed referring to a group's permalink for a non-existing group ID.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -95,9 +95,8 @@ class GroupbyidAction extends Action
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
common_redirect($this->group->homeUrl(), 303); common_redirect($this->group->homeUrl(), 303);
} }
} }

View File

@ -2,7 +2,7 @@
/** /**
* StatusNet, the distributed open-source microblogging tool * StatusNet, the distributed open-source microblogging tool
* *
* Change user password * Saves a design for a given group.
* *
* PHP version 5 * PHP version 5
* *
@ -46,7 +46,6 @@ require_once INSTALLDIR . '/lib/designsettings.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class GroupDesignSettingsAction extends DesignSettingsAction class GroupDesignSettingsAction extends DesignSettingsAction
{ {
var $group = null; var $group = null;
@ -59,12 +58,12 @@ class GroupDesignSettingsAction extends DesignSettingsAction
* *
* @return boolean true * @return boolean true
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
if (!common_logged_in()) { if (!common_logged_in()) {
// TRANS: Client error displayed trying to change group design settings while not logged in.
$this->clientError(_('You must be logged in to edit a group.')); $this->clientError(_('You must be logged in to edit a group.'));
return false; return false;
} }
@ -81,6 +80,7 @@ class GroupDesignSettingsAction extends DesignSettingsAction
} }
if (!$nickname) { if (!$nickname) {
// TRANS: Client error displayed trying to change group design settings without providing a group nickname.
$this->clientError(_('No nickname.'), 404); $this->clientError(_('No nickname.'), 404);
return false; return false;
} }
@ -97,6 +97,7 @@ class GroupDesignSettingsAction extends DesignSettingsAction
} }
if (!$this->group) { if (!$this->group) {
// TRANS: Client error displayed trying to change group design settings while providing a nickname for a non-existing group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -104,6 +105,7 @@ class GroupDesignSettingsAction extends DesignSettingsAction
$cur = common_current_user(); $cur = common_current_user();
if (!$cur->isAdmin($this->group)) { if (!$cur->isAdmin($this->group)) {
// TRANS: Client error displayed trying to change group design settings without being a (group) admin.
$this->clientError(_('You must be an admin to edit the group.'), 403); $this->clientError(_('You must be an admin to edit the group.'), 403);
return false; return false;
} }
@ -122,7 +124,6 @@ class GroupDesignSettingsAction extends DesignSettingsAction
* *
* @return Design a design object to use * @return Design a design object to use
*/ */
function getDesign() function getDesign()
{ {
@ -141,6 +142,7 @@ class GroupDesignSettingsAction extends DesignSettingsAction
function title() function title()
{ {
// TRANS: Title group design settings page.
return _('Group design'); return _('Group design');
} }
@ -149,9 +151,9 @@ class GroupDesignSettingsAction extends DesignSettingsAction
* *
* @return instructions for use * @return instructions for use
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Instructions for group design settings page.
return _('Customize the way your group looks ' . return _('Customize the way your group looks ' .
'with a background image and a colour palette of your choice.'); 'with a background image and a colour palette of your choice.');
} }
@ -161,7 +163,6 @@ class GroupDesignSettingsAction extends DesignSettingsAction
* *
* @return nothing * @return nothing
*/ */
function showLocalNav() function showLocalNav()
{ {
$nav = new GroupNav($this, $this->group); $nav = new GroupNav($this, $this->group);
@ -173,7 +174,6 @@ class GroupDesignSettingsAction extends DesignSettingsAction
* *
* @return Design * @return Design
*/ */
function getWorkingDesign() function getWorkingDesign()
{ {
$design = null; $design = null;
@ -192,7 +192,6 @@ class GroupDesignSettingsAction extends DesignSettingsAction
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
$design = $this->getWorkingDesign(); $design = $this->getWorkingDesign();
@ -209,17 +208,14 @@ class GroupDesignSettingsAction extends DesignSettingsAction
* *
* @return void * @return void
*/ */
function saveDesign() function saveDesign()
{ {
try { try {
$bgcolor = new WebColor($this->trimmed('design_background')); $bgcolor = new WebColor($this->trimmed('design_background'));
$ccolor = new WebColor($this->trimmed('design_content')); $ccolor = new WebColor($this->trimmed('design_content'));
$sbcolor = new WebColor($this->trimmed('design_sidebar')); $sbcolor = new WebColor($this->trimmed('design_sidebar'));
$tcolor = new WebColor($this->trimmed('design_text')); $tcolor = new WebColor($this->trimmed('design_text'));
$lcolor = new WebColor($this->trimmed('design_links')); $lcolor = new WebColor($this->trimmed('design_links'));
} catch (WebColorException $e) { } catch (WebColorException $e) {
$this->showForm($e->getMessage()); $this->showForm($e->getMessage());
return; return;
@ -246,7 +242,6 @@ class GroupDesignSettingsAction extends DesignSettingsAction
$design = $this->group->getDesign(); $design = $this->group->getDesign();
if (!empty($design)) { if (!empty($design)) {
// update design // update design
$original = clone($design); $original = clone($design);
@ -263,12 +258,11 @@ class GroupDesignSettingsAction extends DesignSettingsAction
if ($result === false) { if ($result === false) {
common_log_db_error($design, 'UPDATE', __FILE__); common_log_db_error($design, 'UPDATE', __FILE__);
$this->showForm(_('Couldn\'t update your design.')); // TRANS: Form validation error displayed when group design settings could not be updated because of an application issue.
$this->showForm(_('Unable to update your design settings.'));
return; return;
} }
} else { } else {
$this->group->query('BEGIN'); $this->group->query('BEGIN');
// save new design // save new design
@ -287,6 +281,7 @@ class GroupDesignSettingsAction extends DesignSettingsAction
if (empty($id)) { if (empty($id)) {
common_log_db_error($id, 'INSERT', __FILE__); common_log_db_error($id, 'INSERT', __FILE__);
// TRANS: Form validation error displayed when group design settings could not be saved because of an application issue.
$this->showForm(_('Unable to save your design settings.')); $this->showForm(_('Unable to save your design settings.'));
return; return;
} }
@ -297,18 +292,18 @@ class GroupDesignSettingsAction extends DesignSettingsAction
if (empty($result)) { if (empty($result)) {
common_log_db_error($original, 'UPDATE', __FILE__); common_log_db_error($original, 'UPDATE', __FILE__);
// TRANS: Form validation error displayed when group design settings could not be saved because of an application issue.
$this->showForm(_('Unable to save your design settings.')); $this->showForm(_('Unable to save your design settings.'));
$this->group->query('ROLLBACK'); $this->group->query('ROLLBACK');
return; return;
} }
$this->group->query('COMMIT'); $this->group->query('COMMIT');
} }
$this->saveBackgroundImage($design); $this->saveBackgroundImage($design);
// TRANS: Form text to confirm saved group design settings.
$this->showForm(_('Design preferences saved.'), true); $this->showForm(_('Design preferences saved.'), true);
} }
} }

View File

@ -49,7 +49,6 @@ define('MAX_ORIGINAL', 480);
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class GrouplogoAction extends GroupDesignAction class GrouplogoAction extends GroupDesignAction
{ {
var $mode = null; var $mode = null;
@ -61,12 +60,12 @@ class GrouplogoAction extends GroupDesignAction
/** /**
* Prepare to run * Prepare to run
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
if (!common_logged_in()) { if (!common_logged_in()) {
// TRANS: Client error displayed when trying to create a group while not logged in.
$this->clientError(_('You must be logged in to create a group.')); $this->clientError(_('You must be logged in to create a group.'));
return false; return false;
} }
@ -83,6 +82,7 @@ class GrouplogoAction extends GroupDesignAction
} }
if (!$nickname) { if (!$nickname) {
// TRANS: Client error displayed when trying to change group logo settings without providing a nickname.
$this->clientError(_('No nickname.'), 404); $this->clientError(_('No nickname.'), 404);
return false; return false;
} }
@ -99,6 +99,7 @@ class GrouplogoAction extends GroupDesignAction
} }
if (!$this->group) { if (!$this->group) {
// TRANS: Client error displayed when trying to update logo settings for a non-existing group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -106,6 +107,7 @@ class GrouplogoAction extends GroupDesignAction
$cur = common_current_user(); $cur = common_current_user();
if (!$cur->isAdmin($this->group)) { if (!$cur->isAdmin($this->group)) {
// TRANS: Client error displayed when trying to change group logo settings while not being a group admin.
$this->clientError(_('You must be an admin to edit the group.'), 403); $this->clientError(_('You must be an admin to edit the group.'), 403);
return false; return false;
} }
@ -136,9 +138,9 @@ class GrouplogoAction extends GroupDesignAction
* *
* @return string Title of the page * @return string Title of the page
*/ */
function title() function title()
{ {
// TRANS: Title for group logo settings page.
return _('Group logo'); return _('Group logo');
} }
@ -147,9 +149,10 @@ class GrouplogoAction extends GroupDesignAction
* *
* @return instructions for use * @return instructions for use
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Instructions for group logo page.
// TRANS: %s is the maximum file size for that site.
return sprintf(_('You can upload a logo image for your group. The maximum file size is %s.'), ImageFile::maxFileSize()); return sprintf(_('You can upload a logo image for your group. The maximum file size is %s.'), ImageFile::maxFileSize());
} }
@ -160,7 +163,6 @@ class GrouplogoAction extends GroupDesignAction
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
if ($this->mode == 'crop') { if ($this->mode == 'crop') {
@ -178,6 +180,7 @@ class GrouplogoAction extends GroupDesignAction
if (!$profile) { if (!$profile) {
common_log_db_error($user, 'SELECT', __FILE__); common_log_db_error($user, 'SELECT', __FILE__);
// TRANS: Server error displayed coming across a request from a user without a profile.
$this->serverError(_('User without matching profile.')); $this->serverError(_('User without matching profile.'));
return; return;
} }
@ -192,6 +195,7 @@ class GrouplogoAction extends GroupDesignAction
common_local_url('grouplogo', common_local_url('grouplogo',
array('nickname' => $this->group->nickname)))); array('nickname' => $this->group->nickname))));
$this->elementStart('fieldset'); $this->elementStart('fieldset');
// TRANS: Group logo form legend.
$this->element('legend', null, _('Group logo')); $this->element('legend', null, _('Group logo'));
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
@ -199,7 +203,8 @@ class GrouplogoAction extends GroupDesignAction
if ($original) { if ($original) {
$this->elementStart('li', array('id' => 'avatar_original', $this->elementStart('li', array('id' => 'avatar_original',
'class' => 'avatar_view')); 'class' => 'avatar_view'));
$this->element('h2', null, _("Original")); // TRANS: Uploaded original file in group logo form.
$this->element('h2', null, _('Original'));
$this->elementStart('div', array('id'=>'avatar_original_view')); $this->elementStart('div', array('id'=>'avatar_original_view'));
$this->element('img', array('src' => $this->group->original_logo, $this->element('img', array('src' => $this->group->original_logo,
'alt' => $this->group->nickname)); 'alt' => $this->group->nickname));
@ -210,7 +215,8 @@ class GrouplogoAction extends GroupDesignAction
if ($this->group->homepage_logo) { if ($this->group->homepage_logo) {
$this->elementStart('li', array('id' => 'avatar_preview', $this->elementStart('li', array('id' => 'avatar_preview',
'class' => 'avatar_view')); 'class' => 'avatar_view'));
$this->element('h2', null, _("Preview")); // TRANS: Header for preview of to be displayed group logo.
$this->element('h2', null, _('Preview'));
$this->elementStart('div', array('id'=>'avatar_preview_view')); $this->elementStart('div', array('id'=>'avatar_preview_view'));
$this->element('img', array('src' => $this->group->homepage_logo, $this->element('img', array('src' => $this->group->homepage_logo,
'width' => AVATAR_PROFILE_SIZE, 'width' => AVATAR_PROFILE_SIZE,
@ -221,25 +227,25 @@ class GrouplogoAction extends GroupDesignAction
} }
$this->elementStart('li', array ('id' => 'settings_attach')); $this->elementStart('li', array ('id' => 'settings_attach'));
$this->element('input', array('name' => 'avatarfile',
'type' => 'file',
'id' => 'avatarfile'));
$this->element('input', array('name' => 'MAX_FILE_SIZE', $this->element('input', array('name' => 'MAX_FILE_SIZE',
'type' => 'hidden', 'type' => 'hidden',
'id' => 'MAX_FILE_SIZE', 'id' => 'MAX_FILE_SIZE',
'value' => ImageFile::maxFileSizeInt())); 'value' => ImageFile::maxFileSizeInt()));
$this->element('input', array('name' => 'avatarfile',
'type' => 'file',
'id' => 'avatarfile'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->elementStart('ul', 'form_actions'); $this->elementStart('ul', 'form_actions');
$this->elementStart('li'); $this->elementStart('li');
// TRANS: Submit button for uploading a group logo.
$this->submit('upload', _('Upload')); $this->submit('upload', _('Upload'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }
function showCropForm() function showCropForm()
@ -251,6 +257,7 @@ class GrouplogoAction extends GroupDesignAction
common_local_url('grouplogo', common_local_url('grouplogo',
array('nickname' => $this->group->nickname)))); array('nickname' => $this->group->nickname))));
$this->elementStart('fieldset'); $this->elementStart('fieldset');
// TRANS: Legend for group logo settings fieldset.
$this->element('legend', null, _('Avatar settings')); $this->element('legend', null, _('Avatar settings'));
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
@ -259,7 +266,8 @@ class GrouplogoAction extends GroupDesignAction
$this->elementStart('li', $this->elementStart('li',
array('id' => 'avatar_original', array('id' => 'avatar_original',
'class' => 'avatar_view')); 'class' => 'avatar_view'));
$this->element('h2', null, _("Original")); // TRANS: Header for originally uploaded file before a crop on the group logo page.
$this->element('h2', null, _('Original'));
$this->elementStart('div', array('id'=>'avatar_original_view')); $this->elementStart('div', array('id'=>'avatar_original_view'));
$this->element('img', array('src' => Avatar::url($this->filedata['filename']), $this->element('img', array('src' => Avatar::url($this->filedata['filename']),
'width' => $this->filedata['width'], 'width' => $this->filedata['width'],
@ -271,7 +279,8 @@ class GrouplogoAction extends GroupDesignAction
$this->elementStart('li', $this->elementStart('li',
array('id' => 'avatar_preview', array('id' => 'avatar_preview',
'class' => 'avatar_view')); 'class' => 'avatar_view'));
$this->element('h2', null, _("Preview")); // TRANS: Header for the cropped group logo on the group logo page.
$this->element('h2', null, _('Preview'));
$this->elementStart('div', array('id'=>'avatar_preview_view')); $this->elementStart('div', array('id'=>'avatar_preview_view'));
$this->element('img', array('src' => Avatar::url($this->filedata['filename']), $this->element('img', array('src' => Avatar::url($this->filedata['filename']),
'width' => AVATAR_PROFILE_SIZE, 'width' => AVATAR_PROFILE_SIZE,
@ -286,13 +295,13 @@ class GrouplogoAction extends GroupDesignAction
'id' => $crop_info)); 'id' => $crop_info));
} }
// TRANS: Button text for cropping an uploaded group logo.
$this->submit('crop', _('Crop')); $this->submit('crop', _('Crop'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }
/** /**
@ -302,13 +311,13 @@ class GrouplogoAction extends GroupDesignAction
* *
* @return void * @return void
*/ */
function handlePost() function handlePost()
{ {
// CSRF protection // CSRF protection
$token = $this->trimmed('token'); $token = $this->trimmed('token');
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
// TRANS: Form validation error message.
$this->show_form(_('There was a problem with your session token. '. $this->show_form(_('There was a problem with your session token. '.
'Try again, please.')); 'Try again, please.'));
return; return;
@ -319,6 +328,7 @@ class GrouplogoAction extends GroupDesignAction
} else if ($this->arg('crop')) { } else if ($this->arg('crop')) {
$this->cropLogo(); $this->cropLogo();
} else { } else {
// TRANS: Form validation error message when an unsupported argument is used.
$this->showForm(_('Unexpected form submission.')); $this->showForm(_('Unexpected form submission.'));
} }
} }
@ -331,7 +341,6 @@ class GrouplogoAction extends GroupDesignAction
* *
* @return void * @return void
*/ */
function uploadLogo() function uploadLogo()
{ {
try { try {
@ -341,20 +350,21 @@ class GrouplogoAction extends GroupDesignAction
return; return;
} }
$type = $imagefile->preferredType();
$filename = Avatar::filename($this->group->id, $filename = Avatar::filename($this->group->id,
image_type_to_extension($imagefile->type), image_type_to_extension($type),
null, null,
'group-temp-'.common_timestamp()); 'group-temp-'.common_timestamp());
$filepath = Avatar::path($filename); $filepath = Avatar::path($filename);
move_uploaded_file($imagefile->filepath, $filepath); $imagefile->copyTo($filepath);
$filedata = array('filename' => $filename, $filedata = array('filename' => $filename,
'filepath' => $filepath, 'filepath' => $filepath,
'width' => $imagefile->width, 'width' => $imagefile->width,
'height' => $imagefile->height, 'height' => $imagefile->height,
'type' => $imagefile->type); 'type' => $type);
$_SESSION['FILEDATA'] = $filedata; $_SESSION['FILEDATA'] = $filedata;
@ -362,6 +372,7 @@ class GrouplogoAction extends GroupDesignAction
$this->mode = 'crop'; $this->mode = 'crop';
// TRANS: Form instructions on the group logo page.
$this->showForm(_('Pick a square area of the image to be the logo.'), $this->showForm(_('Pick a square area of the image to be the logo.'),
true); true);
} }
@ -371,12 +382,12 @@ class GrouplogoAction extends GroupDesignAction
* *
* @return void * @return void
*/ */
function cropLogo() function cropLogo()
{ {
$filedata = $_SESSION['FILEDATA']; $filedata = $_SESSION['FILEDATA'];
if (!$filedata) { if (!$filedata) {
// TRANS: Server error displayed trying to crop an uploaded group logo that is no longer present.
$this->serverError(_('Lost our file data.')); $this->serverError(_('Lost our file data.'));
return; return;
} }
@ -396,8 +407,10 @@ class GrouplogoAction extends GroupDesignAction
@unlink($filedata['filepath']); @unlink($filedata['filepath']);
unset($_SESSION['FILEDATA']); unset($_SESSION['FILEDATA']);
$this->mode = 'upload'; $this->mode = 'upload';
// TRANS: Form success message after updating a group logo.
$this->showForm(_('Logo updated.'), true); $this->showForm(_('Logo updated.'), true);
} else { } else {
// TRANS: Form failure message after failing to update a group logo.
$this->showForm(_('Failed updating logo.')); $this->showForm(_('Failed updating logo.'));
} }
} }
@ -422,7 +435,6 @@ class GrouplogoAction extends GroupDesignAction
* *
* @return void * @return void
*/ */
function showStylesheets() function showStylesheets()
{ {
parent::showStylesheets(); parent::showStylesheets();
@ -434,7 +446,6 @@ class GrouplogoAction extends GroupDesignAction
* *
* @return void * @return void
*/ */
function showScripts() function showScripts()
{ {
parent::showScripts(); parent::showScripts();

View File

@ -43,7 +43,6 @@ require_once INSTALLDIR.'/lib/publicgroupnav.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class GroupmembersAction extends GroupDesignAction class GroupmembersAction extends GroupDesignAction
{ {
var $page = null; var $page = null;
@ -73,6 +72,7 @@ class GroupmembersAction extends GroupDesignAction
} }
if (!$nickname) { if (!$nickname) {
// TRANS: Client error displayed when trying to view group members without providing a group nickname.
$this->clientError(_('No nickname.'), 404); $this->clientError(_('No nickname.'), 404);
return false; return false;
} }
@ -80,6 +80,7 @@ class GroupmembersAction extends GroupDesignAction
$local = Local_group::staticGet('nickname', $nickname); $local = Local_group::staticGet('nickname', $nickname);
if (!$local) { if (!$local) {
// TRANS: Client error displayed when trying to view group members for a non-existing group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -87,6 +88,7 @@ class GroupmembersAction extends GroupDesignAction
$this->group = User_group::staticGet('id', $local->group_id); $this->group = User_group::staticGet('id', $local->group_id);
if (!$this->group) { if (!$this->group) {
// TRANS: Client error displayed when trying to view group members for an object that is not a group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -119,6 +121,7 @@ class GroupmembersAction extends GroupDesignAction
function showPageNotice() function showPageNotice()
{ {
$this->element('p', 'instructions', $this->element('p', 'instructions',
// TRANS: Page notice for group members page.
_('A list of the users in this group.')); _('A list of the users in this group.'));
} }
@ -182,7 +185,8 @@ class GroupMemberListItem extends ProfileListItem
{ {
parent::showFullName(); parent::showFullName();
if ($this->profile->isAdmin($this->group)) { if ($this->profile->isAdmin($this->group)) {
$this->out->text(' '); $this->out->text(' '); // for separating the classes.
// TRANS: Indicator in group members list that this user is a group administrator.
$this->out->element('span', 'role', _('Admin')); $this->out->element('span', 'role', _('Admin'));
} }
} }
@ -254,7 +258,7 @@ class GroupMemberListItem extends ProfileListItem
/** /**
* Fetch necessary return-to arguments for the profile forms * Fetch necessary return-to arguments for the profile forms
* to return to this list when they're done. * to return to this list when they're done.
* *
* @return array * @return array
*/ */
protected function returnToArgs() protected function returnToArgs()
@ -281,7 +285,6 @@ class GroupMemberListItem extends ProfileListItem
* *
* @see BlockForm * @see BlockForm
*/ */
class GroupBlockForm extends Form class GroupBlockForm extends Form
{ {
/** /**
@ -310,7 +313,6 @@ class GroupBlockForm extends Form
* @param User_group $group group to block user from * @param User_group $group group to block user from
* @param array $args return-to args * @param array $args return-to args
*/ */
function __construct($out=null, $profile=null, $group=null, $args=null) function __construct($out=null, $profile=null, $group=null, $args=null)
{ {
parent::__construct($out); parent::__construct($out);
@ -325,7 +327,6 @@ class GroupBlockForm extends Form
* *
* @return int ID of the form * @return int ID of the form
*/ */
function id() function id()
{ {
// This should be unique for the page. // This should be unique for the page.
@ -337,7 +338,6 @@ class GroupBlockForm extends Form
* *
* @return string class of the form * @return string class of the form
*/ */
function formClass() function formClass()
{ {
return 'form_group_block'; return 'form_group_block';
@ -348,7 +348,6 @@ class GroupBlockForm extends Form
* *
* @return string URL of the action * @return string URL of the action
*/ */
function action() function action()
{ {
return common_local_url('groupblock'); return common_local_url('groupblock');
@ -361,6 +360,7 @@ class GroupBlockForm extends Form
*/ */
function formLegend() function formLegend()
{ {
// TRANS: Form legend for form to block user from a group.
$this->out->element('legend', null, _('Block user from group')); $this->out->element('legend', null, _('Block user from group'));
} }
@ -369,7 +369,6 @@ class GroupBlockForm extends Form
* *
* @return void * @return void
*/ */
function formData() function formData()
{ {
$this->out->hidden('blockto-' . $this->profile->id, $this->out->hidden('blockto-' . $this->profile->id,
@ -390,7 +389,6 @@ class GroupBlockForm extends Form
* *
* @return void * @return void
*/ */
function formActions() function formActions()
{ {
$this->out->submit( $this->out->submit(
@ -414,25 +412,21 @@ class GroupBlockForm extends Form
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class MakeAdminForm extends Form class MakeAdminForm extends Form
{ {
/** /**
* Profile of user to block * Profile of user to block
*/ */
var $profile = null; var $profile = null;
/** /**
* Group to block the user from * Group to block the user from
*/ */
var $group = null; var $group = null;
/** /**
* Return-to args * Return-to args
*/ */
var $args = null; var $args = null;
/** /**
@ -443,7 +437,6 @@ class MakeAdminForm extends Form
* @param User_group $group group to block user from * @param User_group $group group to block user from
* @param array $args return-to args * @param array $args return-to args
*/ */
function __construct($out=null, $profile=null, $group=null, $args=null) function __construct($out=null, $profile=null, $group=null, $args=null)
{ {
parent::__construct($out); parent::__construct($out);
@ -458,7 +451,6 @@ class MakeAdminForm extends Form
* *
* @return int ID of the form * @return int ID of the form
*/ */
function id() function id()
{ {
// This should be unique for the page. // This should be unique for the page.
@ -470,7 +462,6 @@ class MakeAdminForm extends Form
* *
* @return string class of the form * @return string class of the form
*/ */
function formClass() function formClass()
{ {
return 'form_make_admin'; return 'form_make_admin';
@ -481,7 +472,6 @@ class MakeAdminForm extends Form
* *
* @return string URL of the action * @return string URL of the action
*/ */
function action() function action()
{ {
return common_local_url('makeadmin', array('nickname' => $this->group->nickname)); return common_local_url('makeadmin', array('nickname' => $this->group->nickname));
@ -492,9 +482,9 @@ class MakeAdminForm extends Form
* *
* @return void * @return void
*/ */
function formLegend() function formLegend()
{ {
// TRANS: Form legend for form to make a user a group admin.
$this->out->element('legend', null, _('Make user an admin of the group')); $this->out->element('legend', null, _('Make user an admin of the group'));
} }
@ -503,7 +493,6 @@ class MakeAdminForm extends Form
* *
* @return void * @return void
*/ */
function formData() function formData()
{ {
$this->out->hidden('profileid-' . $this->profile->id, $this->out->hidden('profileid-' . $this->profile->id,
@ -524,7 +513,6 @@ class MakeAdminForm extends Form
* *
* @return void * @return void
*/ */
function formActions() function formActions()
{ {
$this->out->submit( $this->out->submit(

View File

@ -45,7 +45,6 @@ define('MEMBERS_PER_SECTION', 27);
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class groupRssAction extends Rss10Action class groupRssAction extends Rss10Action
{ {
/** group we're viewing. */ /** group we're viewing. */
@ -56,7 +55,6 @@ class groupRssAction extends Rss10Action
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return true; return true;
@ -71,7 +69,6 @@ class groupRssAction extends Rss10Action
* *
* @return boolean success flag * @return boolean success flag
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -88,6 +85,7 @@ class groupRssAction extends Rss10Action
} }
if (!$nickname) { if (!$nickname) {
// TRANS: Client error displayed when requesting a group RSS feed without providing a group nickname.
$this->clientError(_('No nickname.'), 404); $this->clientError(_('No nickname.'), 404);
return false; return false;
} }
@ -95,6 +93,7 @@ class groupRssAction extends Rss10Action
$local = Local_group::staticGet('nickname', $nickname); $local = Local_group::staticGet('nickname', $nickname);
if (!$local) { if (!$local) {
// TRANS: Client error displayed when requesting a group RSS feed for group that does not exist.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -102,6 +101,7 @@ class groupRssAction extends Rss10Action
$this->group = User_group::staticGet('id', $local->group_id); $this->group = User_group::staticGet('id', $local->group_id);
if (!$this->group) { if (!$this->group) {
// TRANS: Client error displayed when requesting a group RSS feed for an object that is not a group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -112,7 +112,6 @@ class groupRssAction extends Rss10Action
function getNotices($limit=0) function getNotices($limit=0)
{ {
$group = $this->group; $group = $this->group;
if (is_null($group)) { if (is_null($group)) {

View File

@ -45,7 +45,6 @@ require_once INSTALLDIR.'/lib/grouplist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class GroupsAction extends Action class GroupsAction extends Action
{ {
var $page = null; var $page = null;
@ -59,9 +58,12 @@ class GroupsAction extends Action
function title() function title()
{ {
if ($this->page == 1) { if ($this->page == 1) {
return _("Groups"); // TRANS: Title for first page of the groups list.
return _m('TITLE',"Groups");
} else { } else {
return sprintf(_("Groups, page %d"), $this->page); // TRANS: Title for all but the first page of the groups list.
// TRANS: %d is the page number.
return sprintf(_m('TITLE',"Groups, page %d"), $this->page);
} }
} }
@ -87,12 +89,15 @@ class GroupsAction extends Action
function showPageNotice() function showPageNotice()
{ {
$notice = $notice =
// TRANS: Page notice of group list. %%%%site.name%%%% is the StatusNet site name,
// TRANS: %%%%action.groupsearch%%%% and %%%%action.newgroup%%%% are URLs. Do not change them.
// TRANS: This message contains Markdown links in the form [link text](link).
sprintf(_('%%%%site.name%%%% groups let you find and talk with ' . sprintf(_('%%%%site.name%%%% groups let you find and talk with ' .
'people of similar interests. After you join a group ' . 'people of similar interests. After you join a group ' .
'you can send messages to all other members using the ' . 'you can send messages to all other members using the ' .
'syntax "!groupname". Don\'t see a group you like? Try ' . 'syntax "!groupname". Don\'t see a group you like? Try ' .
'[searching for one](%%%%action.groupsearch%%%%) or ' . '[searching for one](%%%%action.groupsearch%%%%) or ' .
'[start your own!](%%%%action.newgroup%%%%)')); '[start your own](%%%%action.newgroup%%%%)!'));
$this->elementStart('div', 'instructions'); $this->elementStart('div', 'instructions');
$this->raw(common_markup_to_html($notice)); $this->raw(common_markup_to_html($notice));
$this->elementEnd('div'); $this->elementEnd('div');
@ -104,6 +109,7 @@ class GroupsAction extends Action
$this->elementStart('p', array('id' => 'new_group')); $this->elementStart('p', array('id' => 'new_group'));
$this->element('a', array('href' => common_local_url('newgroup'), $this->element('a', array('href' => common_local_url('newgroup'),
'class' => 'more'), 'class' => 'more'),
// TRANS: Link to create a new group on the group list page.
_('Create a new group')); _('Create a new group'));
$this->elementEnd('p'); $this->elementEnd('p');
} }

View File

@ -49,12 +49,14 @@ class GroupsearchAction extends SearchAction
{ {
function getInstructions() function getInstructions()
{ {
// TRANS: Instructions for page where groups can be searched. %%site.name%% is the name of the StatusNet site.
return _('Search for groups on %%site.name%% by their name, location, or description. ' . return _('Search for groups on %%site.name%% by their name, location, or description. ' .
'Separate the terms by spaces; they must be 3 characters or more.'); 'Separate the terms by spaces; they must be 3 characters or more.');
} }
function title() function title()
{ {
// TRANS: Title for page where groups can be searched.
return _('Group search'); return _('Group search');
} }
@ -76,12 +78,17 @@ class GroupsearchAction extends SearchAction
$this->pagination($page > 1, $cnt > GROUPS_PER_PAGE, $this->pagination($page > 1, $cnt > GROUPS_PER_PAGE,
$page, 'groupsearch', array('q' => $q)); $page, 'groupsearch', array('q' => $q));
} else { } else {
// TRANS: Text on page where groups can be searched if no results were found for a query.
$this->element('p', 'error', _('No results.')); $this->element('p', 'error', _('No results.'));
$this->searchSuggestions($q); $this->searchSuggestions($q);
if (common_logged_in()) { if (common_logged_in()) {
$message = _('If you can\'t find the group you\'re looking for, you can [create it](%%action.newgroup%%) yourself.'); // TRANS: Additional text on page where groups can be searched if no results were found for a query for a logged in user.
// TRANS: This message contains Markdown links in the form [link text](link).
$message = _('If you cannot find the group you\'re looking for, you can [create it](%%action.newgroup%%) yourself.');
} }
else { else {
// TRANS: Additional text on page where groups can be searched if no results were found for a query for a not logged in user.
// TRANS: This message contains Markdown links in the form [link text](link).
$message = _('Why not [register an account](%%action.register%%) and [create the group](%%action.newgroup%%) yourself!'); $message = _('Why not [register an account](%%action.register%%) and [create the group](%%action.newgroup%%) yourself!');
} }
$this->elementStart('div', 'guide'); $this->elementStart('div', 'guide');
@ -116,4 +123,3 @@ class GroupSearchResults extends GroupList
return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text)); return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
} }
} }

View File

@ -79,6 +79,7 @@ class GroupunblockAction extends Action
} }
$group_id = $this->trimmed('unblockgroup'); $group_id = $this->trimmed('unblockgroup');
if (empty($group_id)) { if (empty($group_id)) {
// TRANS: Client error displayed when trying to unblock a user from a group without providing a group.
$this->clientError(_('No group specified.')); $this->clientError(_('No group specified.'));
return false; return false;
} }

View File

@ -40,7 +40,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
* @link http://status.net/ * @link http://status.net/
*/ */
class HcardAction extends Action class HcardAction extends Action
{ {
var $user; var $user;
@ -64,6 +63,7 @@ class HcardAction extends Action
$this->user = User::staticGet('nickname', $nickname); $this->user = User::staticGet('nickname', $nickname);
if (!$this->user) { if (!$this->user) {
// TRANS: Client error displayed when trying to get a user hCard for a non-existing user.
$this->clientError(_('No such user.'), 404); $this->clientError(_('No such user.'), 404);
return false; return false;
} }
@ -71,6 +71,7 @@ class HcardAction extends Action
$this->profile = $this->user->getProfile(); $this->profile = $this->user->getProfile();
if (!$this->profile) { if (!$this->profile) {
// TRANS: Server error displayed when trying to get a user hCard for a user without a profile.
$this->serverError(_('User has no profile.')); $this->serverError(_('User has no profile.'));
return false; return false;
} }
@ -117,4 +118,4 @@ class ShortUserProfile extends UserProfile
{ {
return; return;
} }
} }

View File

@ -28,9 +28,9 @@ if (!defined('STATUSNET')) {
exit(1); exit(1);
} }
// @todo XXX: Add documentation.
class HostMetaAction extends Action class HostMetaAction extends Action
{ {
/** /**
* Is read only? * Is read only?
* *

View File

@ -50,10 +50,9 @@ class ImsettingsAction extends SettingsAction
* *
* @return string Title of the page * @return string Title of the page
*/ */
function title() function title()
{ {
// TRANS: Title for instance messaging settings. // TRANS: Title for Instant Messaging settings.
return _('IM settings'); return _('IM settings');
} }
@ -62,7 +61,6 @@ class ImsettingsAction extends SettingsAction
* *
* @return instructions for use * @return instructions for use
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Instant messaging settings page instructions. // TRANS: Instant messaging settings page instructions.
@ -82,7 +80,6 @@ class ImsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
$transports = array(); $transports = array();
@ -210,8 +207,12 @@ class ImsettingsAction extends SettingsAction
* *
* @return Confirm_address address object for this user * @return Confirm_address address object for this user
*/ */
<<<<<<< HEAD
function getConfirmation($transport) function getConfirmation($transport)
=======
function getConfirmation()
>>>>>>> 0.9.x
{ {
$user = common_current_user(); $user = common_current_user();
@ -237,7 +238,6 @@ class ImsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function handlePost() function handlePost()
{ {
// CSRF protection // CSRF protection
@ -257,7 +257,7 @@ class ImsettingsAction extends SettingsAction
} else if ($this->arg('remove')) { } else if ($this->arg('remove')) {
$this->removeAddress(); $this->removeAddress();
} else { } else {
// TRANS: Message given submitting a form with an unknown action in IM settings. // TRANS: Message given submitting a form with an unknown action in Instant Messaging settings.
$this->showForm(_('Unexpected form submission.')); $this->showForm(_('Unexpected form submission.'));
} }
} }
@ -270,7 +270,6 @@ class ImsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function savePreferences() function savePreferences()
{ {
$user = common_current_user(); $user = common_current_user();
@ -312,7 +311,6 @@ class ImsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function addAddress() function addAddress()
{ {
$user = common_current_user(); $user = common_current_user();
@ -365,8 +363,8 @@ class ImsettingsAction extends SettingsAction
if ($result === false) { if ($result === false) {
common_log_db_error($confirm, 'INSERT', __FILE__); common_log_db_error($confirm, 'INSERT', __FILE__);
// TRANS: Server error thrown on database error adding IM confirmation code. // TRANS: Server error thrown on database error adding Instant Messaging confirmation code.
$this->serverError(_('Couldn\'t insert confirmation code.')); $this->serverError(_('Could not insert confirmation code.'));
return; return;
} }
@ -386,7 +384,6 @@ class ImsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function cancelConfirmation() function cancelConfirmation()
{ {
$screenname = $this->trimmed('screenname'); $screenname = $this->trimmed('screenname');
@ -395,7 +392,7 @@ class ImsettingsAction extends SettingsAction
$confirm = $this->getConfirmation($transport); $confirm = $this->getConfirmation($transport);
if (!$confirm) { if (!$confirm) {
// TRANS: Message given canceling IM address confirmation that is not pending. // TRANS: Message given canceling Instant Messaging address confirmation that is not pending.
$this->showForm(_('No pending confirmation to cancel.')); $this->showForm(_('No pending confirmation to cancel.'));
return; return;
} }
@ -425,7 +422,6 @@ class ImsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function removeAddress() function removeAddress()
{ {
$user = common_current_user(); $user = common_current_user();
@ -456,7 +452,7 @@ class ImsettingsAction extends SettingsAction
// XXX: unsubscribe to the old address // XXX: unsubscribe to the old address
// TRANS: Message given after successfully removing a registered IM address. // TRANS: Message given after successfully removing a registered Instant Messaging address.
$this->showForm(_('The IM address was removed.'), true); $this->showForm(_('The IM address was removed.'), true);
} }

View File

@ -43,7 +43,6 @@ require_once INSTALLDIR.'/lib/mailbox.php';
* @link http://status.net/ * @link http://status.net/
* @see MailboxAction * @see MailboxAction
*/ */
class InboxAction extends MailboxAction class InboxAction extends MailboxAction
{ {
@ -52,13 +51,16 @@ class InboxAction extends MailboxAction
* *
* @return string page title * @return string page title
*/ */
function title() function title()
{ {
if ($this->page > 1) { if ($this->page > 1) {
// TRANS: Title for all but the first page of the inbox page.
// TRANS: %1$s is the user's nickname, %2$s is the page number.
return sprintf(_('Inbox for %1$s - page %2$d'), $this->user->nickname, return sprintf(_('Inbox for %1$s - page %2$d'), $this->user->nickname,
$this->page); $this->page);
} else { } else {
// TRANS: Title for the first page of the inbox page.
// TRANS: %s is the user's nickname.
return sprintf(_('Inbox for %s'), $this->user->nickname); return sprintf(_('Inbox for %s'), $this->user->nickname);
} }
} }
@ -72,7 +74,6 @@ class InboxAction extends MailboxAction
* *
* @see MailboxAction::getMessages() * @see MailboxAction::getMessages()
*/ */
function getMessages() function getMessages()
{ {
$message = new Message(); $message = new Message();
@ -89,19 +90,9 @@ class InboxAction extends MailboxAction
} }
} }
/** function getMessageList($message)
* Returns the profile we want to show with the message
*
* For inboxes, we show the sender; for outboxes, the recipient.
*
* @param Message $message The message to get the profile for
*
* @return Profile The profile that matches the message
*/
function getMessageProfile($message)
{ {
return $message->getFrom(); return new InboxMessageList($this, $message);
} }
/** /**
@ -109,9 +100,30 @@ class InboxAction extends MailboxAction
* *
* @return string localised instructions for using the page * @return string localised instructions for using the page
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Instructions for user inbox page.
return _('This is your inbox, which lists your incoming private messages.'); return _('This is your inbox, which lists your incoming private messages.');
} }
} }
class InboxMessageList extends MessageList
{
function newItem($message)
{
return new InboxMessageListItem($this->out, $message);
}
}
class InboxMessageListItem extends MessageListItem
{
/**
* Returns the profile we want to show with the message
*
* @return Profile The profile that matches the message
*/
function getMessageProfile()
{
return $this->message->getFrom();
}
}

View File

@ -19,6 +19,7 @@
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
// @todo XXX: Add documentation.
class InviteAction extends CurrentUserDesignAction class InviteAction extends CurrentUserDesignAction
{ {
var $mode = null; var $mode = null;
@ -217,7 +218,7 @@ class InviteAction extends CurrentUserDesignAction
$this->textarea('addresses', _('Email addresses'), $this->textarea('addresses', _('Email addresses'),
$this->trimmed('addresses'), $this->trimmed('addresses'),
// TRANS: Tooltip for field label for a list of e-mail addresses. // TRANS: Tooltip for field label for a list of e-mail addresses.
_('Addresses of friends to invite (one per line)')); _('Addresses of friends to invite (one per line).'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
// TRANS: Field label for a personal message to send to invitees. // TRANS: Field label for a personal message to send to invitees.

View File

@ -43,7 +43,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class JoingroupAction extends Action class JoingroupAction extends Action
{ {
var $group = null; var $group = null;
@ -51,12 +50,12 @@ class JoingroupAction extends Action
/** /**
* Prepare to run * Prepare to run
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
if (!common_logged_in()) { if (!common_logged_in()) {
// TRANS: Client error displayed when trying to join a group while not logged in.
$this->clientError(_('You must be logged in to join a group.')); $this->clientError(_('You must be logged in to join a group.'));
return false; return false;
} }
@ -79,17 +78,20 @@ class JoingroupAction extends Action
$local = Local_group::staticGet('nickname', $nickname); $local = Local_group::staticGet('nickname', $nickname);
if (!$local) { if (!$local) {
// TRANS: Client error displayed when trying to join a non-local group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
$this->group = User_group::staticGet('id', $local->group_id); $this->group = User_group::staticGet('id', $local->group_id);
} else { } else {
// TRANS: Client error displayed when trying to join a group without providing a group name or group ID.
$this->clientError(_('No nickname or ID.'), 404); $this->clientError(_('No nickname or ID.'), 404);
return false; return false;
} }
if (!$this->group) { if (!$this->group) {
// TRANS: Client error displayed when trying to join a non-existing group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -97,11 +99,13 @@ class JoingroupAction extends Action
$cur = common_current_user(); $cur = common_current_user();
if ($cur->isMember($this->group)) { if ($cur->isMember($this->group)) {
// TRANS: Client error displayed when trying to join a group while already a member.
$this->clientError(_('You are already a member of that group.'), 403); $this->clientError(_('You are already a member of that group.'), 403);
return false; return false;
} }
if (Group_block::isBlocked($this->group, $cur->getProfile())) { if (Group_block::isBlocked($this->group, $cur->getProfile())) {
// TRANS: Client error displayed when trying to join a group while being blocked form joining it.
$this->clientError(_('You have been blocked from that group by the admin.'), 403); $this->clientError(_('You have been blocked from that group by the admin.'), 403);
return false; return false;
} }
@ -118,7 +122,6 @@ class JoingroupAction extends Action
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
@ -131,6 +134,8 @@ class JoingroupAction extends Action
Event::handle('EndJoinGroup', array($this->group, $cur)); Event::handle('EndJoinGroup', array($this->group, $cur));
} }
} catch (Exception $e) { } catch (Exception $e) {
// TRANS: Server error displayed when joining a group failed in the database.
// TRANS: %1$s is the joining user's nickname, $2$s is the group nickname for which the join failed.
$this->serverError(sprintf(_('Could not join user %1$s to group %2$s.'), $this->serverError(sprintf(_('Could not join user %1$s to group %2$s.'),
$cur->nickname, $this->group->nickname)); $cur->nickname, $this->group->nickname));
} }
@ -138,7 +143,8 @@ class JoingroupAction 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');
$this->element('title', null, sprintf(_('%1$s joined group %2$s'), // TRANS: Title for join group page after joining.
$this->element('title', null, sprintf(_m('TITLE','%1$s joined group %2$s'),
$cur->nickname, $cur->nickname,
$this->group->nickname)); $this->group->nickname));
$this->elementEnd('head'); $this->elementEnd('head');
@ -153,4 +159,4 @@ class JoingroupAction extends Action
303); 303);
} }
} }
} }

View File

@ -43,7 +43,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class LeavegroupAction extends Action class LeavegroupAction extends Action
{ {
var $group = null; var $group = null;
@ -51,12 +50,12 @@ class LeavegroupAction extends Action
/** /**
* Prepare to run * Prepare to run
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
if (!common_logged_in()) { if (!common_logged_in()) {
// TRANS: Client error displayed when trying to leave a group while not logged in.
$this->clientError(_('You must be logged in to leave a group.')); $this->clientError(_('You must be logged in to leave a group.'));
return false; return false;
} }
@ -79,17 +78,20 @@ class LeavegroupAction extends Action
$local = Local_group::staticGet('nickname', $nickname); $local = Local_group::staticGet('nickname', $nickname);
if (!$local) { if (!$local) {
// TRANS: Client error displayed when trying to leave a non-local group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
$this->group = User_group::staticGet('id', $local->group_id); $this->group = User_group::staticGet('id', $local->group_id);
} else { } else {
// TRANS: Client error displayed when trying to leave a group without providing a group name or group ID.
$this->clientError(_('No nickname or ID.'), 404); $this->clientError(_('No nickname or ID.'), 404);
return false; return false;
} }
if (!$this->group) { if (!$this->group) {
// TRANS: Client error displayed when trying to leave a non-existing group.
$this->clientError(_('No such group.'), 404); $this->clientError(_('No such group.'), 404);
return false; return false;
} }
@ -97,6 +99,7 @@ class LeavegroupAction extends Action
$cur = common_current_user(); $cur = common_current_user();
if (!$cur->isMember($this->group)) { if (!$cur->isMember($this->group)) {
// TRANS: Client error displayed when trying to join a group while already a member.
$this->clientError(_('You are not a member of that group.'), 403); $this->clientError(_('You are not a member of that group.'), 403);
return false; return false;
} }
@ -113,7 +116,6 @@ class LeavegroupAction extends Action
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
@ -126,6 +128,8 @@ class LeavegroupAction extends Action
Event::handle('EndLeaveGroup', array($this->group, $cur)); Event::handle('EndLeaveGroup', array($this->group, $cur));
} }
} catch (Exception $e) { } catch (Exception $e) {
// TRANS: Server error displayed when leaving a group failed in the database.
// TRANS: %1$s is the leaving user's nickname, $2$s is the group nickname for which the leave failed.
$this->serverError(sprintf(_('Could not remove user %1$s from group %2$s.'), $this->serverError(sprintf(_('Could not remove user %1$s from group %2$s.'),
$cur->nickname, $this->group->nickname)); $cur->nickname, $this->group->nickname));
return; return;
@ -134,7 +138,8 @@ class LeavegroupAction 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');
$this->element('title', null, sprintf(_('%1$s left group %2$s'), // TRANS: Title for leave group page after leaving.
$this->element('title', null, sprintf(_m('TITLE','%1$s left group %2$s'),
$cur->nickname, $cur->nickname,
$this->group->nickname)); $this->group->nickname));
$this->elementEnd('head'); $this->elementEnd('head');

View File

@ -40,7 +40,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class LicenseadminpanelAction extends AdminPanelAction class LicenseadminpanelAction extends AdminPanelAction
{ {
@ -61,7 +60,6 @@ class LicenseadminpanelAction extends AdminPanelAction
* *
* @return string instructions * @return string instructions
*/ */
function getInstructions() function getInstructions()
{ {
return _('License for this StatusNet site'); return _('License for this StatusNet site');
@ -72,7 +70,6 @@ class LicenseadminpanelAction extends AdminPanelAction
* *
* @return void * @return void
*/ */
function showForm() function showForm()
{ {
$form = new LicenseAdminPanelForm($this); $form = new LicenseAdminPanelForm($this);
@ -85,7 +82,6 @@ class LicenseadminpanelAction extends AdminPanelAction
* *
* @return void * @return void
*/ */
function saveSettings() function saveSettings()
{ {
static $settings = array( static $settings = array(
@ -128,7 +124,6 @@ class LicenseadminpanelAction extends AdminPanelAction
* *
* @return nothing * @return nothing
*/ */
function validate(&$values) function validate(&$values)
{ {
// Validate license type (shouldn't have to do it, but just in case) // Validate license type (shouldn't have to do it, but just in case)
@ -197,7 +192,6 @@ class LicenseAdminPanelForm extends AdminForm
* *
* @return int ID of the form * @return int ID of the form
*/ */
function id() function id()
{ {
return 'licenseadminpanel'; return 'licenseadminpanel';
@ -208,7 +202,6 @@ class LicenseAdminPanelForm extends AdminForm
* *
* @return string class of the form * @return string class of the form
*/ */
function formClass() function formClass()
{ {
return 'form_settings'; return 'form_settings';
@ -312,7 +305,6 @@ class LicenseAdminPanelForm extends AdminForm
* *
* @return void * @return void
*/ */
function formActions() function formActions()
{ {
$this->out->submit( $this->out->submit(

View File

@ -42,13 +42,11 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class LoginAction extends Action class LoginAction extends Action
{ {
/** /**
* Has there been an error? * Has there been an error?
*/ */
var $error = null; var $error = null;
/** /**
@ -56,12 +54,32 @@ class LoginAction extends Action
* *
* @return boolean false * @return boolean false
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return false; return false;
} }
/**
* Prepare page to run
*
*
* @param $args
* @return string title
*/
function prepare($args)
{
parent::prepare($args);
// @todo this check should really be in index.php for all sensitive actions
$ssl = common_config('site', 'ssl');
if (empty($_SERVER['HTTPS']) && ($ssl == 'always' || $ssl == 'sometimes')) {
common_redirect(common_local_url('login'));
// exit
}
return true;
}
/** /**
* Handle input, produce output * Handle input, produce output
* *
@ -71,7 +89,6 @@ class LoginAction extends Action
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
@ -95,8 +112,7 @@ class LoginAction extends Action
* *
* @return void * @return void
*/ */
function checkLogin($user_id=null, $token=null)
function checkLogin($user_id=null)
{ {
// XXX: login throttle // XXX: login throttle
@ -147,7 +163,6 @@ class LoginAction extends Action
* *
* @return void * @return void
*/ */
function showForm($error=null) function showForm($error=null)
{ {
$this->error = $error; $this->error = $error;
@ -165,7 +180,6 @@ class LoginAction extends Action
* *
* @return string title of the page * @return string title of the page
*/ */
function title() function title()
{ {
return _('Login'); return _('Login');
@ -179,7 +193,6 @@ class LoginAction extends Action
* *
* @return void * @return void
*/ */
function showPageNotice() function showPageNotice()
{ {
if ($this->error) { if ($this->error) {
@ -199,7 +212,6 @@ class LoginAction extends Action
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
$this->elementStart('form', array('method' => 'post', $this->elementStart('form', array('method' => 'post',
@ -238,7 +250,6 @@ class LoginAction extends Action
* *
* @return void * @return void
*/ */
function getInstructions() function getInstructions()
{ {
if (common_logged_in() && !common_is_real_login() && if (common_logged_in() && !common_is_real_login() &&
@ -266,7 +277,6 @@ class LoginAction extends Action
* *
* @return void * @return void
*/ */
function showLocalNav() function showLocalNav()
{ {
$nav = new LoginGroupNav($this); $nav = new LoginGroupNav($this);

View File

@ -66,6 +66,7 @@ class LogoutAction extends Action
{ {
parent::handle($args); parent::handle($args);
if (!common_logged_in()) { if (!common_logged_in()) {
// TRANS: Client error displayed trying to log out when not logged in.
$this->clientError(_('Not logged in.')); $this->clientError(_('Not logged in.'));
} else { } else {
if (Event::handle('StartLogout', array($this))) { if (Event::handle('StartLogout', array($this))) {
@ -83,5 +84,4 @@ class LogoutAction extends Action
common_real_login(false); // not logged in common_real_login(false); // not logged in
common_forgetme(); // don't log back in! common_forgetme(); // don't log back in!
} }
} }

View File

@ -55,7 +55,6 @@ class NewApplicationAction extends OwnerDesignAction
/** /**
* Prepare to run * Prepare to run
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -78,7 +77,6 @@ class NewApplicationAction extends OwnerDesignAction
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
@ -122,6 +120,7 @@ class NewApplicationAction extends OwnerDesignAction
} elseif ($this->arg('save')) { } elseif ($this->arg('save')) {
$this->trySave(); $this->trySave();
} else { } else {
// TRANS: Client error displayed when encountering an unexpected action on form submission.
$this->clientError(_('Unexpected form submission.')); $this->clientError(_('Unexpected form submission.'));
} }
} }
@ -144,6 +143,7 @@ class NewApplicationAction extends OwnerDesignAction
$this->element('p', 'error', $this->msg); $this->element('p', 'error', $this->msg);
} else { } else {
$this->element('p', 'instructions', $this->element('p', 'instructions',
// TRANS: Form instructions for registering a new application.
_('Use this form to register a new application.')); _('Use this form to register a new application.'));
} }
} }
@ -160,15 +160,19 @@ class NewApplicationAction extends OwnerDesignAction
$access_type = $this->arg('default_access_type'); $access_type = $this->arg('default_access_type');
if (empty($name)) { if (empty($name)) {
// TRANS: Validation error shown when not providing a name in the "New application" form.
$this->showForm(_('Name is required.')); $this->showForm(_('Name is required.'));
return; return;
} else if ($this->nameExists($name)) { } else if ($this->nameExists($name)) {
// TRANS: Validation error shown when providing a name for an application that already exists in the "New application" form.
$this->showForm(_('Name already in use. Try another one.')); $this->showForm(_('Name already in use. Try another one.'));
return; return;
} elseif (mb_strlen($name) > 255) { } elseif (mb_strlen($name) > 255) {
// TRANS: Validation error shown when providing too long a name in the "New application" form.
$this->showForm(_('Name is too long (maximum 255 characters).')); $this->showForm(_('Name is too long (maximum 255 characters).'));
return; return;
} elseif (empty($description)) { } elseif (empty($description)) {
// TRANS: Validation error shown when not providing a description in the "New application" form.
$this->showForm(_('Description is required.')); $this->showForm(_('Description is required.'));
return; return;
} elseif (Oauth_application::descriptionTooLong($description)) { } elseif (Oauth_application::descriptionTooLong($description)) {
@ -181,6 +185,7 @@ class NewApplicationAction extends OwnerDesignAction
Oauth_application::maxDesc())); Oauth_application::maxDesc()));
return; return;
} elseif (empty($source_url)) { } elseif (empty($source_url)) {
// TRANS: Validation error shown when not providing a source URL in the "New application" form.
$this->showForm(_('Source URL is required.')); $this->showForm(_('Source URL is required.'));
return; return;
} elseif ((strlen($source_url) > 0) } elseif ((strlen($source_url) > 0)
@ -190,15 +195,19 @@ class NewApplicationAction extends OwnerDesignAction
) )
) )
{ {
// TRANS: Validation error shown when providing an invalid source URL in the "New application" form.
$this->showForm(_('Source URL is not valid.')); $this->showForm(_('Source URL is not valid.'));
return; return;
} elseif (empty($organization)) { } elseif (empty($organization)) {
// TRANS: Validation error shown when not providing an organisation in the "New application" form.
$this->showForm(_('Organization is required.')); $this->showForm(_('Organization is required.'));
return; return;
} elseif (mb_strlen($organization) > 255) { } elseif (mb_strlen($organization) > 255) {
// TRANS: Validation error shown when providing too long an arganisation name in the "Edit application" form.
$this->showForm(_('Organization is too long (maximum 255 characters).')); $this->showForm(_('Organization is too long (maximum 255 characters).'));
return; return;
} elseif (empty($homepage)) { } elseif (empty($homepage)) {
// TRANS: Form validation error show when an organisation name has not been provided in the new application form.
$this->showForm(_('Organization homepage is required.')); $this->showForm(_('Organization homepage is required.'));
return; return;
} elseif ((strlen($homepage) > 0) } elseif ((strlen($homepage) > 0)
@ -208,9 +217,11 @@ class NewApplicationAction extends OwnerDesignAction
) )
) )
{ {
// TRANS: Validation error shown when providing an invalid homepage URL in the "New application" form.
$this->showForm(_('Homepage is not a valid URL.')); $this->showForm(_('Homepage is not a valid URL.'));
return; return;
} elseif (mb_strlen($callback_url) > 255) { } elseif (mb_strlen($callback_url) > 255) {
// TRANS: Validation error shown when providing too long a callback URL in the "New application" form.
$this->showForm(_('Callback is too long.')); $this->showForm(_('Callback is too long.'));
return; return;
} elseif (strlen($callback_url) > 0 } elseif (strlen($callback_url) > 0
@ -220,6 +231,7 @@ class NewApplicationAction extends OwnerDesignAction
) )
) )
{ {
// TRANS: Validation error shown when providing an invalid callback URL in the "New application" form.
$this->showForm(_('Callback URL is not valid.')); $this->showForm(_('Callback URL is not valid.'));
return; return;
} }
@ -263,6 +275,7 @@ class NewApplicationAction extends OwnerDesignAction
if (!$result) { if (!$result) {
common_log_db_error($consumer, 'INSERT', __FILE__); common_log_db_error($consumer, 'INSERT', __FILE__);
// TRANS: Server error displayed when an application could not be registered in the database through the "New application" form.
$this->serverError(_('Could not create application.')); $this->serverError(_('Could not create application.'));
} }
@ -272,6 +285,7 @@ class NewApplicationAction extends OwnerDesignAction
if (!$this->app_id) { if (!$this->app_id) {
common_log_db_error($app, 'INSERT', __FILE__); common_log_db_error($app, 'INSERT', __FILE__);
// TRANS: Server error displayed when an application could not be registered in the database through the "New application" form.
$this->serverError(_('Could not create application.')); $this->serverError(_('Could not create application.'));
$app->query('ROLLBACK'); $app->query('ROLLBACK');
} }
@ -281,7 +295,6 @@ class NewApplicationAction extends OwnerDesignAction
$app->query('COMMIT'); $app->query('COMMIT');
common_redirect(common_local_url('oauthappssettings'), 303); common_redirect(common_local_url('oauthappssettings'), 303);
} }
/** /**
@ -294,12 +307,9 @@ class NewApplicationAction extends OwnerDesignAction
* *
* @return boolean true if the name already exists * @return boolean true if the name already exists
*/ */
function nameExists($name) function nameExists($name)
{ {
$app = Oauth_application::staticGet('name', $name); $app = Oauth_application::staticGet('name', $name);
return !empty($app); return !empty($app);
} }
} }

View File

@ -120,105 +120,109 @@ class NewgroupAction extends Action
function trySave() function trySave()
{ {
try { if (Event::handle('StartGroupSaveForm', array($this))) {
$nickname = Nickname::normalize($this->trimmed('nickname')); try {
} catch (NicknameException $e) { $nickname = Nickname::normalize($this->trimmed('nickname'));
$this->showForm($e->getMessage()); } catch (NicknameException $e) {
} $this->showForm($e->getMessage());
$fullname = $this->trimmed('fullname'); }
$homepage = $this->trimmed('homepage'); $fullname = $this->trimmed('fullname');
$description = $this->trimmed('description'); $homepage = $this->trimmed('homepage');
$location = $this->trimmed('location'); $description = $this->trimmed('description');
$aliasstring = $this->trimmed('aliases'); $location = $this->trimmed('location');
$aliasstring = $this->trimmed('aliases');
if ($this->nicknameExists($nickname)) { if ($this->nicknameExists($nickname)) {
// TRANS: Group create form validation error.
$this->showForm(_('Nickname already in use. Try another one.'));
return;
} else if (!User_group::allowedNickname($nickname)) {
// TRANS: Group create form validation error.
$this->showForm(_('Not a valid nickname.'));
return;
} else if (!is_null($homepage) && (strlen($homepage) > 0) &&
!Validate::uri($homepage,
array('allowed_schemes' =>
array('http', 'https')))) {
// TRANS: Group create form validation error.
$this->showForm(_('Homepage is not a valid URL.'));
return;
} else if (!is_null($fullname) && mb_strlen($fullname) > 255) {
// TRANS: Group create form validation error.
$this->showForm(_('Full name is too long (maximum 255 characters).'));
return;
} else if (User_group::descriptionTooLong($description)) {
// TRANS: Group create form validation error.
// TRANS: %d is the maximum number of allowed characters.
$this->showForm(sprintf(_m('Description is too long (maximum %d character).',
'Description is too long (maximum %d characters).',
User_group::maxDescription()),
User_group::maxDescription()));
return;
} else if (!is_null($location) && mb_strlen($location) > 255) {
// TRANS: Group create form validation error.
$this->showForm(_('Location is too long (maximum 255 characters).'));
return;
}
if (!empty($aliasstring)) {
$aliases = array_map('common_canonical_nickname', array_unique(preg_split('/[\s,]+/', $aliasstring)));
} else {
$aliases = array();
}
if (count($aliases) > common_config('group', 'maxaliases')) {
// TRANS: Group create form validation error.
// TRANS: %d is the maximum number of allowed aliases.
$this->showForm(sprintf(_m('Too many aliases! Maximum %d allowed.',
'Too many aliases! Maximum %d allowed.',
common_config('group', 'maxaliases')),
common_config('group', 'maxaliases')));
return;
}
foreach ($aliases as $alias) {
if (!Nickname::isValid($alias)) {
// TRANS: Group create form validation error. // TRANS: Group create form validation error.
$this->showForm(sprintf(_('Invalid alias: "%s"'), $alias)); $this->showForm(_('Nickname already in use. Try another one.'));
return;
} else if (!User_group::allowedNickname($nickname)) {
// TRANS: Group create form validation error.
$this->showForm(_('Not a valid nickname.'));
return;
} else if (!is_null($homepage) && (strlen($homepage) > 0) &&
!Validate::uri($homepage,
array('allowed_schemes' =>
array('http', 'https')))) {
// TRANS: Group create form validation error.
$this->showForm(_('Homepage is not a valid URL.'));
return;
} else if (!is_null($fullname) && mb_strlen($fullname) > 255) {
// TRANS: Group create form validation error.
$this->showForm(_('Full name is too long (maximum 255 characters).'));
return;
} else if (User_group::descriptionTooLong($description)) {
// TRANS: Group create form validation error.
// TRANS: %d is the maximum number of allowed characters.
$this->showForm(sprintf(_m('Description is too long (maximum %d character).',
'Description is too long (maximum %d characters).',
User_group::maxDescription()),
User_group::maxDescription()));
return;
} else if (!is_null($location) && mb_strlen($location) > 255) {
// TRANS: Group create form validation error.
$this->showForm(_('Location is too long (maximum 255 characters).'));
return; return;
} }
if ($this->nicknameExists($alias)) {
if (!empty($aliasstring)) {
$aliases = array_map('common_canonical_nickname', array_unique(preg_split('/[\s,]+/', $aliasstring)));
} else {
$aliases = array();
}
if (count($aliases) > common_config('group', 'maxaliases')) {
// TRANS: Group create form validation error. // TRANS: Group create form validation error.
$this->showForm(sprintf(_('Alias "%s" already in use. Try another one.'), // TRANS: %d is the maximum number of allowed aliases.
$alias)); $this->showForm(sprintf(_m('Too many aliases! Maximum %d allowed.',
'Too many aliases! Maximum %d allowed.',
common_config('group', 'maxaliases')),
common_config('group', 'maxaliases')));
return; return;
} }
// XXX assumes alphanum nicknames
if (strcmp($alias, $nickname) == 0) { foreach ($aliases as $alias) {
// TRANS: Group create form validation error. if (!Nickname::isValid($alias)) {
$this->showForm(_('Alias can\'t be the same as nickname.')); // TRANS: Group create form validation error.
return; // TRANS: %s is the invalid alias.
$this->showForm(sprintf(_('Invalid alias: "%s"'), $alias));
return;
}
if ($this->nicknameExists($alias)) {
// TRANS: Group create form validation error. %s is the already used alias.
$this->showForm(sprintf(_('Alias "%s" already in use. Try another one.'),
$alias));
return;
}
// XXX assumes alphanum nicknames
if (strcmp($alias, $nickname) == 0) {
// TRANS: Group create form validation error.
$this->showForm(_('Alias cannot be the same as nickname.'));
return;
}
} }
$cur = common_current_user();
// Checked in prepare() above
assert(!is_null($cur));
$group = User_group::register(array('nickname' => $nickname,
'fullname' => $fullname,
'homepage' => $homepage,
'description' => $description,
'location' => $location,
'aliases' => $aliases,
'userid' => $cur->id,
'local' => true));
$this->group = $group;
Event::handle('EndGroupSaveForm', array($this));
common_redirect($group->homeUrl(), 303);
} }
$mainpage = common_local_url('showgroup', array('nickname' => $nickname));
$cur = common_current_user();
// Checked in prepare() above
assert(!is_null($cur));
$group = User_group::register(array('nickname' => $nickname,
'fullname' => $fullname,
'homepage' => $homepage,
'description' => $description,
'location' => $location,
'aliases' => $aliases,
'userid' => $cur->id,
'mainpage' => $mainpage,
'local' => true));
common_redirect($group->homeUrl(), 303);
} }
function nicknameExists($nickname) function nicknameExists($nickname)

View File

@ -48,7 +48,6 @@ require_once INSTALLDIR.'/lib/searchaction.php';
*/ */
class NoticesearchAction extends SearchAction class NoticesearchAction extends SearchAction
{ {
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -65,6 +64,8 @@ class NoticesearchAction extends SearchAction
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Instructions for Notice search page.
// TRANS: %%site.name%% is the name of the StatusNet site.
return _('Search for notices on %%site.name%% by their contents. Separate search terms by spaces; they must be 3 characters or more.'); return _('Search for notices on %%site.name%% by their contents. Separate search terms by spaces; they must be 3 characters or more.');
} }
@ -75,6 +76,7 @@ class NoticesearchAction extends SearchAction
*/ */
function title() function title()
{ {
// TRANS: Title of the page where users can search for notices.
return _('Text search'); return _('Text search');
} }
@ -88,6 +90,8 @@ class NoticesearchAction extends SearchAction
return array(new Feed(Feed::RSS1, common_local_url('noticesearchrss', return array(new Feed(Feed::RSS1, common_local_url('noticesearchrss',
array('q' => $q)), array('q' => $q)),
// TRANS: Test in RSS notice search.
// TRANS: %1$s is the query, %2$s is the StatusNet site name.
sprintf(_('Search results for "%1$s" on %2$s'), sprintf(_('Search results for "%1$s" on %2$s'),
$q, common_config('site', 'name')))); $q, common_config('site', 'name'))));
} }
@ -114,13 +118,18 @@ class NoticesearchAction extends SearchAction
$cnt = $notice->find(); $cnt = $notice->find();
} }
if ($cnt === 0) { if ($cnt === 0) {
// TRANS: Text for notice search results is the query had no results.
$this->element('p', 'error', _('No results.')); $this->element('p', 'error', _('No results.'));
$this->searchSuggestions($q); $this->searchSuggestions($q);
if (common_logged_in()) { if (common_logged_in()) {
// TRANS: Text for logged in users making a query for notices without results.
// TRANS: This message contains a Markdown link.
$message = sprintf(_('Be the first to [post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!'), urlencode($q)); $message = sprintf(_('Be the first to [post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!'), urlencode($q));
} }
else { else {
// TRANS: Text for not logged in users making a query for notices without results.
// TRANS: This message contains Markdown links.
$message = sprintf(_('Why not [register an account](%%%%action.register%%%%) and be the first to [post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!'), urlencode($q)); $message = sprintf(_('Why not [register an account](%%%%action.register%%%%) and be the first to [post on this topic](%%%%action.newnotice%%%%?status_textarea=%s)!'), urlencode($q));
} }
@ -193,14 +202,20 @@ class SearchNoticeListItem extends NoticeListItem {
$options = implode('|', array_map('preg_quote', array_map('htmlspecialchars', $terms), $options = implode('|', array_map('preg_quote', array_map('htmlspecialchars', $terms),
array_fill(0, sizeof($terms), '/'))); array_fill(0, sizeof($terms), '/')));
$pattern = "/($options)/i"; $pattern = "/($options)/i";
$result = preg_replace($pattern, '<strong>\\1</strong>', $text); $result = '';
/* Divide up into text (highlight me) and tags (don't touch) */
$chunks = preg_split('/(<[^>]+>)/', $text, 0, PREG_SPLIT_DELIM_CAPTURE);
foreach ($chunks as $i => $chunk) {
if ($i % 2 == 1) {
// odd: delimiter (tag)
$result .= $chunk;
} else {
// even: freetext between tags
$result .= preg_replace($pattern, '<strong>\\1</strong>', $chunk);
}
}
/* Remove highlighting from inside links, loop incase multiple highlights in links */
$pattern = '/(\w+="[^"]*)<strong>('.$options.')<\/strong>([^"]*")/iU';
do {
$result = preg_replace($pattern, '\\1\\2\\3', $result, -1, $count);
} while ($count);
return $result; return $result;
} }
} }

View File

@ -48,12 +48,11 @@ require_once INSTALLDIR.'/lib/rssaction.php';
*/ */
class NoticesearchrssAction extends Rss10Action class NoticesearchrssAction extends Rss10Action
{ {
function init() function init()
{ {
return true; return true;
} }
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -63,7 +62,6 @@ class NoticesearchrssAction extends Rss10Action
function getNotices($limit=0) function getNotices($limit=0)
{ {
$q = $this->trimmed('q'); $q = $this->trimmed('q');
$notices = array(); $notices = array();
@ -93,9 +91,12 @@ class NoticesearchrssAction extends Rss10Action
{ {
$q = $this->trimmed('q'); $q = $this->trimmed('q');
$c = array('url' => common_local_url('noticesearchrss', array('q' => $q)), $c = array('url' => common_local_url('noticesearchrss', array('q' => $q)),
// TRANS: RSS notice search feed title. %s is the query.
'title' => sprintf(_('Updates with "%s"'), $q), 'title' => sprintf(_('Updates with "%s"'), $q),
'link' => common_local_url('noticesearch', array('q' => $q)), 'link' => common_local_url('noticesearch', array('q' => $q)),
'description' => sprintf(_('Updates matching search term "%1$s" on %2$s!'), // TRANS: RSS notice search feed description.
// TRANS: %1$s is the query, %2$s is the StatusNet site name.
'description' => sprintf(_('Updates matching search term "%1$s" on %2$s.'),
$q, common_config('site', 'name'))); $q, common_config('site', 'name')));
return $c; return $c;
} }

View File

@ -163,6 +163,5 @@ class OauthappssettingsAction extends SettingsAction
'Try again, please.')); 'Try again, please.'));
return; return;
} }
} }
} }

View File

@ -62,7 +62,6 @@ class OauthconnectionssettingsAction extends SettingsAction
* *
* @return string Title of the page * @return string Title of the page
*/ */
function title() function title()
{ {
// TRANS: Title for OAuth connection settings. // TRANS: Title for OAuth connection settings.
@ -74,7 +73,6 @@ class OauthconnectionssettingsAction extends SettingsAction
* *
* @return instructions for use * @return instructions for use
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Instructions for OAuth connection settings. // TRANS: Instructions for OAuth connection settings.

View File

@ -61,7 +61,7 @@ class OembedAction extends Action
$proxy_args = $r->map($path); $proxy_args = $r->map($path);
if (!$proxy_args) { if (!$proxy_args) {
$this->serverError(_("$path not found."), 404); $this->serverError(sprintf(_('"%s" not found.'),$path), 404);
} }
$oembed=array(); $oembed=array();
$oembed['version']='1.0'; $oembed['version']='1.0';
@ -73,7 +73,7 @@ class OembedAction extends Action
$id = $proxy_args['notice']; $id = $proxy_args['notice'];
$notice = Notice::staticGet($id); $notice = Notice::staticGet($id);
if(empty($notice)){ if(empty($notice)){
$this->serverError(_("Notice $id not found."), 404); $this->serverError(sprintf(_("Notice %s not found."),$id), 404);
} }
$profile = $notice->getProfile(); $profile = $notice->getProfile();
if (empty($profile)) { if (empty($profile)) {
@ -92,7 +92,7 @@ class OembedAction extends Action
$id = $proxy_args['attachment']; $id = $proxy_args['attachment'];
$attachment = File::staticGet($id); $attachment = File::staticGet($id);
if(empty($attachment)){ if(empty($attachment)){
$this->serverError(_("Attachment $id not found."), 404); $this->serverError(sprintf(_('Attachment %s not found.'),$id), 404);
} }
if(empty($attachment->filename) && $file_oembed = File_oembed::staticGet('file_id', $attachment->id)){ if(empty($attachment->filename) && $file_oembed = File_oembed::staticGet('file_id', $attachment->id)){
// Proxy the existing oembed information // Proxy the existing oembed information
@ -133,7 +133,7 @@ class OembedAction extends Action
if($attachment->title) $oembed['title']=$attachment->title; if($attachment->title) $oembed['title']=$attachment->title;
break; break;
default: default:
$this->serverError(_("$path not supported for oembed requests."), 501); $this->serverError(sprintf(_('"%s" not supported for oembed requests.'),$path), 501);
} }
switch($args['format']){ switch($args['format']){
case 'xml': case 'xml':

View File

@ -1,5 +1,4 @@
<?php <?php
/** /**
* Opensearch action class. * Opensearch action class.
* *
@ -51,7 +50,7 @@ class OpensearchAction extends Action
* Class handler. * Class handler.
* *
* @param array $args query arguments * @param array $args query arguments
* *
* @return boolean false if user doesn't exist * @return boolean false if user doesn't exist
*/ */
function handle($args) function handle($args)
@ -61,8 +60,10 @@ class OpensearchAction extends Action
$short_name = ''; $short_name = '';
if ($type == 'people') { if ($type == 'people') {
$type = 'peoplesearch'; $type = 'peoplesearch';
// TRANS: ShortName in the OpenSearch interface when trying to find users.
$short_name = _('People Search'); $short_name = _('People Search');
} else { } else {
// TRANS: ShortName in the OpenSearch interface when trying to find notices.
$type = 'noticesearch'; $type = 'noticesearch';
$short_name = _('Notice Search'); $short_name = _('Notice Search');
} }
@ -89,4 +90,3 @@ class OpensearchAction extends Action
return true; return true;
} }
} }

View File

@ -45,7 +45,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
* @link http://status.net/ * @link http://status.net/
*/ */
class OtpAction extends Action class OtpAction extends Action
{ {
var $user; var $user;
@ -59,6 +58,7 @@ class OtpAction extends Action
parent::prepare($args); parent::prepare($args);
if (common_is_real_login()) { if (common_is_real_login()) {
// TRANS: Client error displayed trying to use "one time password login" when already logged in.
$this->clientError(_('Already logged in.')); $this->clientError(_('Already logged in.'));
return false; return false;
} }
@ -66,6 +66,7 @@ class OtpAction extends Action
$id = $this->trimmed('user_id'); $id = $this->trimmed('user_id');
if (empty($id)) { if (empty($id)) {
// TRANS: Client error displayed trying to use "one time password login" without specifying a user.
$this->clientError(_('No user ID specified.')); $this->clientError(_('No user ID specified.'));
return false; return false;
} }
@ -73,6 +74,7 @@ class OtpAction extends Action
$this->user = User::staticGet('id', $id); $this->user = User::staticGet('id', $id);
if (empty($this->user)) { if (empty($this->user)) {
// TRANS: Client error displayed trying to use "one time password login" without using an existing user.
$this->clientError(_('No such user.')); $this->clientError(_('No such user.'));
return false; return false;
} }
@ -80,6 +82,7 @@ class OtpAction extends Action
$this->token = $this->trimmed('token'); $this->token = $this->trimmed('token');
if (empty($this->token)) { if (empty($this->token)) {
// TRANS: Client error displayed trying to use "one time password login" without specifying a login token.
$this->clientError(_('No login token specified.')); $this->clientError(_('No login token specified.'));
return false; return false;
} }
@ -87,11 +90,13 @@ class OtpAction extends Action
$this->lt = Login_token::staticGet('user_id', $id); $this->lt = Login_token::staticGet('user_id', $id);
if (empty($this->lt)) { if (empty($this->lt)) {
// TRANS: Client error displayed trying to use "one time password login" without requesting a login token.
$this->clientError(_('No login token requested.')); $this->clientError(_('No login token requested.'));
return false; return false;
} }
if ($this->lt->token != $this->token) { if ($this->lt->token != $this->token) {
// TRANS: Client error displayed trying to use "one time password login" while specifying an invalid login token.
$this->clientError(_('Invalid login token specified.')); $this->clientError(_('Invalid login token specified.'));
return false; return false;
} }
@ -101,6 +106,7 @@ class OtpAction extends Action
//delete the token as it is useless //delete the token as it is useless
$this->lt->delete(); $this->lt->delete();
$this->lt = null; $this->lt = null;
// TRANS: Client error displayed trying to use "one time password login" while specifying an expired login token.
$this->clientError(_('Login token expired.')); $this->clientError(_('Login token expired.'));
return false; return false;
} }
@ -111,12 +117,13 @@ class OtpAction extends Action
return true; return true;
} }
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
// success! // success!
if (!common_set_user($this->user)) { if (!common_set_user($this->user)) {
// TRANS: Server error displayed when a user object could not be created trying to login using "one time password login".
$this->serverError(_('Error setting user. You are probably not authorized.')); $this->serverError(_('Error setting user. You are probably not authorized.'));
return; return;
} }

View File

@ -26,7 +26,6 @@
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
if (!defined('STATUSNET') && !defined('LACONICA')) { if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1); exit(1);
} }
@ -43,7 +42,6 @@ require_once INSTALLDIR.'/lib/mailbox.php';
* @link http://status.net/ * @link http://status.net/
* @see MailboxAction * @see MailboxAction
*/ */
class OutboxAction extends MailboxAction class OutboxAction extends MailboxAction
{ {
/** /**
@ -51,13 +49,15 @@ class OutboxAction extends MailboxAction
* *
* @return string page title * @return string page title
*/ */
function title() function title()
{ {
if ($this->page > 1) { if ($this->page > 1) {
// TRANS: Title for outbox for any but the fist page.
// TRANS: %1$s is the user nickname, %2$d is the page number.
return sprintf(_('Outbox for %1$s - page %2$d'), return sprintf(_('Outbox for %1$s - page %2$d'),
$this->user->nickname, $page); $this->user->nickname, $page);
} else { } else {
// TRANS: Title for first page of outbox.
return sprintf(_('Outbox for %s'), $this->user->nickname); return sprintf(_('Outbox for %s'), $this->user->nickname);
} }
} }
@ -71,7 +71,6 @@ class OutboxAction extends MailboxAction
* *
* @see MailboxAction::getMessages() * @see MailboxAction::getMessages()
*/ */
function getMessages() function getMessages()
{ {
$message = new Message(); $message = new Message();
@ -88,21 +87,9 @@ class OutboxAction extends MailboxAction
} }
} }
/** function getMessageList($message)
* returns the profile we want to show with the message
*
* For outboxes, we show the recipient.
*
* @param Message $message The message to get the profile for
*
* @return Profile The profile of the message recipient
*
* @see MailboxAction::getMessageProfile()
*/
function getMessageProfile($message)
{ {
return $message->getTo(); return new OutboxMessageList($this, $message);
} }
/** /**
@ -110,9 +97,30 @@ class OutboxAction extends MailboxAction
* *
* @return string localised instructions for using the page * @return string localised instructions for using the page
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Instructions for outbox.
return _('This is your outbox, which lists private messages you have sent.'); return _('This is your outbox, which lists private messages you have sent.');
} }
} }
class OutboxMessageList extends MessageList
{
function newItem($message)
{
return new OutboxMessageListItem($this->out, $message);
}
}
class OutboxMessageListItem extends MessageListItem
{
/**
* Returns the profile we want to show with the message
*
* @return Profile The profile that matches the message
*/
function getMessageProfile()
{
return $this->message->getTo();
}
}

View File

@ -106,11 +106,11 @@ class PasswordsettingsAction extends SettingsAction
} }
$this->elementStart('li'); $this->elementStart('li');
$this->password('newpassword', _('New password'), $this->password('newpassword', _('New password'),
_('6 or more characters')); _('6 or more characters.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->password('confirm', _('Confirm'), $this->password('confirm', _('Confirm'),
_('Same as password above')); _('Same as password above.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
@ -128,7 +128,6 @@ class PasswordsettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function handlePost() function handlePost()
{ {
// CSRF protection // CSRF protection
@ -183,7 +182,7 @@ class PasswordsettingsAction extends SettingsAction
} }
if (!$user->update($original)) { if (!$user->update($original)) {
$this->serverError(_('Can\'t save new password.')); $this->serverError(_('Cannot save new password.'));
return; return;
} }
Event::handle('EndChangePassword', array($user)); Event::handle('EndChangePassword', array($user));

View File

@ -49,12 +49,15 @@ class PeoplesearchAction extends SearchAction
{ {
function getInstructions() function getInstructions()
{ {
// TRANS: Instructions for the "People search" page.
// TRANS: %%site.name%% is the name of the StatusNet site.
return _('Search for people on %%site.name%% by their name, location, or interests. ' . return _('Search for people on %%site.name%% by their name, location, or interests. ' .
'Separate the terms by spaces; they must be 3 characters or more.'); 'Separate the terms by spaces; they must be 3 characters or more.');
} }
function title() function title()
{ {
// TRANS: Title of a page where users can search for other users.
return _('People search'); return _('People search');
} }
@ -80,6 +83,7 @@ class PeoplesearchAction extends SearchAction
$page, 'peoplesearch', array('q' => $q)); $page, 'peoplesearch', array('q' => $q));
} else { } else {
// TRANS: Message on the "People search" page where a query has no results.
$this->element('p', 'error', _('No results.')); $this->element('p', 'error', _('No results.'));
$this->searchSuggestions($q); $this->searchSuggestions($q);
$profile->free(); $profile->free();
@ -136,4 +140,3 @@ class PeopleSearchResultItem extends ProfileListItem
return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text)); return preg_replace($this->pattern, '<strong>\\1</strong>', htmlspecialchars($text));
} }
} }

View File

@ -54,7 +54,6 @@ class ProfilesettingsAction extends SettingsAction
* *
* @return string Title of the page * @return string Title of the page
*/ */
function title() function title()
{ {
// TRANS: Page title for profile settings. // TRANS: Page title for profile settings.
@ -66,7 +65,6 @@ class ProfilesettingsAction extends SettingsAction
* *
* @return instructions for use * @return instructions for use
*/ */
function getInstructions() function getInstructions()
{ {
// TRANS: Usage instructions for profile settings. // TRANS: Usage instructions for profile settings.
@ -87,7 +85,6 @@ class ProfilesettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
$user = common_current_user(); $user = common_current_user();
@ -165,14 +162,14 @@ class ProfilesettingsAction extends SettingsAction
$this->input('tags', _('Tags'), $this->input('tags', _('Tags'),
($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()), ($this->arg('tags')) ? $this->arg('tags') : implode(' ', $user->getSelfTags()),
// TRANS: Tooltip for field label in form for profile settings. // TRANS: Tooltip for field label in form for profile settings.
_('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated')); _('Tags for yourself (letters, numbers, -, ., and _), comma- or space- separated.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$language = common_language(); $language = common_language();
// TRANS: Dropdownlist label in form for profile settings. // TRANS: Dropdownlist label in form for profile settings.
$this->dropdown('language', _('Language'), $this->dropdown('language', _('Language'),
// TRANS: Tooltip for dropdown list label in form for profile settings. // TRANS: Tooltip for dropdown list label in form for profile settings.
get_nice_language_list(), _('Preferred language'), get_nice_language_list(), _('Preferred language.'),
false, $language); false, $language);
$this->elementEnd('li'); $this->elementEnd('li');
$timezone = common_timezone(); $timezone = common_timezone();
@ -191,7 +188,7 @@ class ProfilesettingsAction extends SettingsAction
$this->checkbox('autosubscribe', $this->checkbox('autosubscribe',
// TRANS: Checkbox label in form for profile settings. // TRANS: Checkbox label in form for profile settings.
_('Automatically subscribe to whoever '. _('Automatically subscribe to whoever '.
'subscribes to me (best for non-humans)'), 'subscribes to me (best for non-humans).'),
($this->arg('autosubscribe')) ? ($this->arg('autosubscribe')) ?
$this->boolean('autosubscribe') : $user->autosubscribe); $this->boolean('autosubscribe') : $user->autosubscribe);
$this->elementEnd('li'); $this->elementEnd('li');
@ -212,12 +209,12 @@ class ProfilesettingsAction extends SettingsAction
* *
* @return void * @return void
*/ */
function handlePost() function handlePost()
{ {
// CSRF protection // CSRF protection
$token = $this->trimmed('token'); $token = $this->trimmed('token');
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
// TRANS: Form validation error.
$this->showForm(_('There was a problem with your session token. '. $this->showForm(_('There was a problem with your session token. '.
'Try again, please.')); 'Try again, please.'));
return; return;
@ -292,7 +289,7 @@ class ProfilesettingsAction extends SettingsAction
if (!common_valid_profile_tag($tag)) { if (!common_valid_profile_tag($tag)) {
// TRANS: Validation error in form for profile settings. // TRANS: Validation error in form for profile settings.
// TRANS: %s is an invalid tag. // TRANS: %s is an invalid tag.
$this->showForm(sprintf(_('Invalid tag: "%s"'), $tag)); $this->showForm(sprintf(_('Invalid tag: "%s".'), $tag));
return; return;
} }
} }
@ -323,7 +320,7 @@ class ProfilesettingsAction extends SettingsAction
if ($result === false) { if ($result === false) {
common_log_db_error($user, 'UPDATE', __FILE__); common_log_db_error($user, 'UPDATE', __FILE__);
// TRANS: Server error thrown when user profile settings could not be updated. // TRANS: Server error thrown when user profile settings could not be updated.
$this->serverError(_('Couldn\'t update user.')); $this->serverError(_('Could not update user.'));
return; return;
} else { } else {
// Re-initialize language environment if it changed // Re-initialize language environment if it changed
@ -348,7 +345,7 @@ class ProfilesettingsAction extends SettingsAction
common_log_db_error($user, 'UPDATE', __FILE__); common_log_db_error($user, 'UPDATE', __FILE__);
// TRANS: Server error thrown when user profile settings could not be updated to // TRANS: Server error thrown when user profile settings could not be updated to
// TRANS: automatically subscribe to any subscriber. // TRANS: automatically subscribe to any subscriber.
$this->serverError(_('Couldn\'t update user for autosubscribe.')); $this->serverError(_('Could not update user for autosubscribe.'));
return; return;
} }
} }
@ -406,7 +403,7 @@ class ProfilesettingsAction extends SettingsAction
if ($result === false) { if ($result === false) {
common_log_db_error($prefs, ($exists) ? 'UPDATE' : 'INSERT', __FILE__); common_log_db_error($prefs, ($exists) ? 'UPDATE' : 'INSERT', __FILE__);
// TRANS: Server error thrown when user profile location preference settings could not be updated. // TRANS: Server error thrown when user profile location preference settings could not be updated.
$this->serverError(_('Couldn\'t save location prefs.')); $this->serverError(_('Could not save location prefs.'));
return; return;
} }
} }
@ -419,7 +416,7 @@ class ProfilesettingsAction extends SettingsAction
if ($result === false) { if ($result === false) {
common_log_db_error($profile, 'UPDATE', __FILE__); common_log_db_error($profile, 'UPDATE', __FILE__);
// TRANS: Server error thrown when user profile settings could not be saved. // TRANS: Server error thrown when user profile settings could not be saved.
$this->serverError(_('Couldn\'t save profile.')); $this->serverError(_('Could not save profile.'));
return; return;
} }
@ -428,7 +425,7 @@ class ProfilesettingsAction extends SettingsAction
if (!$result) { if (!$result) {
// TRANS: Server error thrown when user profile settings tags could not be saved. // TRANS: Server error thrown when user profile settings tags could not be saved.
$this->serverError(_('Couldn\'t save tags.')); $this->serverError(_('Could not save tags.'));
return; return;
} }
@ -458,12 +455,16 @@ class ProfilesettingsAction extends SettingsAction
$this->elementStart('div', array('id' => 'aside_primary', $this->elementStart('div', array('id' => 'aside_primary',
'class' => 'aside')); 'class' => 'aside'));
$this->elementStart('div', array('id' => 'account_actions',
'class' => 'section'));
$this->elementStart('ul'); $this->elementStart('ul');
if (Event::handle('StartProfileSettingsActions', array($this))) { if (Event::handle('StartProfileSettingsActions', array($this))) {
if ($user->hasRight(Right::BACKUPACCOUNT)) { if ($user->hasRight(Right::BACKUPACCOUNT)) {
$this->elementStart('li'); $this->elementStart('li');
$this->element('a', $this->element('a',
array('href' => common_local_url('backupaccount')), array('href' => common_local_url('backupaccount')),
// TRANS: Option in profile settings to create a backup of the account of the currently logged in user.
_('Backup account')); _('Backup account'));
$this->elementEnd('li'); $this->elementEnd('li');
} }
@ -471,6 +472,7 @@ class ProfilesettingsAction extends SettingsAction
$this->elementStart('li'); $this->elementStart('li');
$this->element('a', $this->element('a',
array('href' => common_local_url('deleteaccount')), array('href' => common_local_url('deleteaccount')),
// TRANS: Option in profile settings to delete the account of the currently logged in user.
_('Delete account')); _('Delete account'));
$this->elementEnd('li'); $this->elementEnd('li');
} }
@ -478,6 +480,7 @@ class ProfilesettingsAction extends SettingsAction
$this->elementStart('li'); $this->elementStart('li');
$this->element('a', $this->element('a',
array('href' => common_local_url('restoreaccount')), array('href' => common_local_url('restoreaccount')),
// TRANS: Option in profile settings to restore the account of the currently logged in user from a backup.
_('Restore account')); _('Restore account'));
$this->elementEnd('li'); $this->elementEnd('li');
} }
@ -485,5 +488,6 @@ class ProfilesettingsAction extends SettingsAction
} }
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->elementEnd('div'); $this->elementEnd('div');
$this->elementEnd('div');
} }
} }

View File

@ -1,5 +1,4 @@
<?php <?php
/** /**
* Public RSS action class. * Public RSS action class.
* *
@ -55,7 +54,6 @@ class PublicrssAction extends Rss10Action
* @param array $args Arguments from $_REQUEST * @param array $args Arguments from $_REQUEST
* @return boolean success * @return boolean success
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -98,11 +96,14 @@ class PublicrssAction extends Rss10Action
*/ */
function getChannel() function getChannel()
{ {
$sitename = common_config('site', 'name');
$c = array( $c = array(
'url' => common_local_url('publicrss') 'url' => common_local_url('publicrss'),
, 'title' => sprintf(_('%s public timeline'), common_config('site', 'name')) // TRANS: Public RSS feed title. %s is the StatusNet site name.
, 'link' => common_local_url('public') 'title' => sprintf(_('%s public timeline'), $sitename),
, 'description' => sprintf(_('%s updates from everyone!'), common_config('site', 'name'))); 'link' => common_local_url('public'),
// TRANS: Public RSS feed description. %s is the StatusNet site name.
'description' => sprintf(_('%s updates from everyone.'), $sitename));
return $c; return $c;
} }
@ -110,7 +111,7 @@ class PublicrssAction extends Rss10Action
* Get image. * Get image.
* *
* @return nothing * @return nothing
*/ */
function getImage() function getImage()
{ {
// nop // nop
@ -121,4 +122,3 @@ class PublicrssAction extends Rss10Action
return true; return true;
} }
} }

View File

@ -33,6 +33,7 @@ class RecoverpasswordAction extends Action
{ {
parent::handle($args); parent::handle($args);
if (common_logged_in()) { if (common_logged_in()) {
// TRANS: Client error displayed trying to recover password while already logged in.
$this->clientError(_('You are already logged in!')); $this->clientError(_('You are already logged in!'));
return; return;
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') { } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
@ -41,6 +42,7 @@ class RecoverpasswordAction extends Action
} else if ($this->arg('reset')) { } else if ($this->arg('reset')) {
$this->resetPassword(); $this->resetPassword();
} else { } else {
// TRANS: Client error displayed when unexpected data is posted in the password recovery form.
$this->clientError(_('Unexpected form submission.')); $this->clientError(_('Unexpected form submission.'));
} }
} else { } else {
@ -54,15 +56,16 @@ class RecoverpasswordAction extends Action
function checkCode() function checkCode()
{ {
$code = $this->trimmed('code'); $code = $this->trimmed('code');
$confirm = Confirm_address::staticGet('code', $code); $confirm = Confirm_address::staticGet('code', $code);
if (!$confirm) { if (!$confirm) {
// TRANS: Client error displayed when password recovery code is not correct.
$this->clientError(_('No such recovery code.')); $this->clientError(_('No such recovery code.'));
return; return;
} }
if ($confirm->address_type != 'recover') { if ($confirm->address_type != 'recover') {
// TRANS: Client error displayed when no proper password recovery code was submitted.
$this->clientError(_('Not a recovery code.')); $this->clientError(_('Not a recovery code.'));
return; return;
} }
@ -70,6 +73,7 @@ class RecoverpasswordAction extends Action
$user = User::staticGet($confirm->user_id); $user = User::staticGet($confirm->user_id);
if (!$user) { if (!$user) {
// TRANS: Server error displayed trying to recover password without providing a user.
$this->serverError(_('Recovery code for unknown user.')); $this->serverError(_('Recovery code for unknown user.'));
return; return;
} }
@ -83,6 +87,7 @@ class RecoverpasswordAction extends Action
if (!$result) { if (!$result) {
common_log_db_error($confirm, 'DELETE', __FILE__); common_log_db_error($confirm, 'DELETE', __FILE__);
// TRANS: Server error displayed removing a password recovery code from the database.
$this->serverError(_('Error with confirmation code.')); $this->serverError(_('Error with confirmation code.'));
return; return;
} }
@ -94,6 +99,7 @@ class RecoverpasswordAction extends Action
common_log(LOG_WARNING, common_log(LOG_WARNING,
'Attempted redemption on recovery code ' . 'Attempted redemption on recovery code ' .
'that is ' . $touched . ' seconds old. '); 'that is ' . $touched . ' seconds old. ');
// TRANS: Client error displayed trying to recover password with too old a recovery code.
$this->clientError(_('This confirmation code is too old. ' . $this->clientError(_('This confirmation code is too old. ' .
'Please start again.')); 'Please start again.'));
return; return;
@ -108,6 +114,7 @@ class RecoverpasswordAction extends Action
$result = $user->updateKeys($orig); $result = $user->updateKeys($orig);
if (!$result) { if (!$result) {
common_log_db_error($user, 'UPDATE', __FILE__); common_log_db_error($user, 'UPDATE', __FILE__);
// TRANS: Server error displayed when updating a user's e-mail address in the database fails while recovering a password.
$this->serverError(_('Could not update user with confirmed email address.')); $this->serverError(_('Could not update user with confirmed email address.'));
return; return;
} }
@ -149,14 +156,16 @@ class RecoverpasswordAction extends Action
$this->elementStart('div', 'instructions'); $this->elementStart('div', 'instructions');
if ($this->mode == 'recover') { if ($this->mode == 'recover') {
$this->element('p', null, $this->element('p', null,
// TRANS: Page notice for password recovery page.
_('If you have forgotten or lost your' . _('If you have forgotten or lost your' .
' password, you can get a new one sent to' . ' password, you can get a new one sent to' .
' the email address you have stored' . ' the email address you have stored' .
' in your account.')); ' in your account.'));
} else if ($this->mode == 'reset') { } else if ($this->mode == 'reset') {
// TRANS: Page notice for password change page.
$this->element('p', null, $this->element('p', null,
_('You have been identified. Enter a' . _('You have been identified. Enter a' .
' new password below. ')); ' new password below.'));
} }
$this->elementEnd('div'); $this->elementEnd('div');
} }
@ -185,19 +194,24 @@ class RecoverpasswordAction extends Action
'class' => 'form_settings', 'class' => 'form_settings',
'action' => common_local_url('recoverpassword'))); 'action' => common_local_url('recoverpassword')));
$this->elementStart('fieldset'); $this->elementStart('fieldset');
// TRANS: Fieldset legend for password recovery page.
$this->element('legend', null, _('Password recovery')); $this->element('legend', null, _('Password recovery'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
// TRANS: Field label on password recovery page.
$this->input('nicknameoremail', _('Nickname or email address'), $this->input('nicknameoremail', _('Nickname or email address'),
$this->trimmed('nicknameoremail'), $this->trimmed('nicknameoremail'),
// TRANS: Title for field label on password recovery page.
_('Your nickname on this server, ' . _('Your nickname on this server, ' .
'or your registered email address.')); 'or your registered email address.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->element('input', array('name' => 'recover', $this->element('input', array('name' => 'recover',
'type' => 'hidden', 'type' => 'hidden',
// TRANS: Field label on password recovery page.
'value' => _('Recover'))); 'value' => _('Recover')));
$this->submit('recover', _('Recover')); // TRANS: Button text on password recovery page.
$this->submit('recover', _m('BUTTON','Recover'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }
@ -205,11 +219,16 @@ class RecoverpasswordAction extends Action
function title() function title()
{ {
switch ($this->mode) { switch ($this->mode) {
// TRANS: Title for password recovery page in password reset mode.
case 'reset': return _('Reset password'); case 'reset': return _('Reset password');
// TRANS: Title for password recovery page in password recover mode.
case 'recover': return _('Recover password'); case 'recover': return _('Recover password');
// TRANS: Title for password recovery page in email sent mode.
case 'sent': return _('Password recovery requested'); case 'sent': return _('Password recovery requested');
case 'saved': return _('Password saved.'); // TRANS: Title for password recovery page in password saved mode.
case 'saved': return _('Password saved');
default: default:
// TRANS: Title for password recovery page when an unknown action has been specified.
return _('Unknown action'); return _('Unknown action');
} }
} }
@ -228,19 +247,25 @@ class RecoverpasswordAction extends Action
'class' => 'form_settings', 'class' => 'form_settings',
'action' => common_local_url('recoverpassword'))); 'action' => common_local_url('recoverpassword')));
$this->elementStart('fieldset'); $this->elementStart('fieldset');
// TRANS: Fieldset legend for password reset form.
$this->element('legend', null, _('Password change')); $this->element('legend', null, _('Password change'));
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
// TRANS: Field label for password reset form.
$this->password('newpassword', _('New password'), $this->password('newpassword', _('New password'),
_('6 or more characters, and don\'t forget it!')); // TRANS: Title for field label for password reset form.
_('6 or more characters, and do not forget it!'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
// TRANS: Field label for password reset form where the password has to be typed again.
$this->password('confirm', _('Confirm'), $this->password('confirm', _('Confirm'),
_('Same as password above')); // TRANS: Ttile for field label for password reset form where the password has to be typed again.
_('Same as password above.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->submit('reset', _('Reset')); // TRANS: Button text for password reset form.
$this->submit('reset', _m('BUTTON','Reset'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }
@ -249,6 +274,7 @@ class RecoverpasswordAction extends Action
{ {
$nore = $this->trimmed('nicknameoremail'); $nore = $this->trimmed('nicknameoremail');
if (!$nore) { if (!$nore) {
// TRANS: Form instructions for password recovery form.
$this->showForm(_('Enter a nickname or email address.')); $this->showForm(_('Enter a nickname or email address.'));
return; return;
} }
@ -279,6 +305,7 @@ class RecoverpasswordAction extends Action
} }
if (!$user) { if (!$user) {
// TRANS: Information on password recovery form if no known username or e-mail address was specified.
$this->showForm(_('No user with that email address or username.')); $this->showForm(_('No user with that email address or username.'));
return; return;
} }
@ -296,6 +323,7 @@ class RecoverpasswordAction extends Action
} }
if (!$user->email && !$confirm_email) { if (!$user->email && !$confirm_email) {
// TRANS: Client error displayed on password recovery form if a user does not have a registered e-mail address.
$this->clientError(_('No registered email address for that user.')); $this->clientError(_('No registered email address for that user.'));
return; return;
} }
@ -310,10 +338,12 @@ class RecoverpasswordAction extends Action
if (!$confirm->insert()) { if (!$confirm->insert()) {
common_log_db_error($confirm, 'INSERT', __FILE__); common_log_db_error($confirm, 'INSERT', __FILE__);
// TRANS: Server error displayed if e-mail address confirmation fails in the database on the password recovery form.
$this->serverError(_('Error saving address confirmation.')); $this->serverError(_('Error saving address confirmation.'));
return; return;
} }
// @todo FIXME: needs i18n.
$body = "Hey, $user->nickname."; $body = "Hey, $user->nickname.";
$body .= "\n\n"; $body .= "\n\n";
$body .= 'Someone just asked for a new password ' . $body .= 'Someone just asked for a new password ' .
@ -332,9 +362,11 @@ class RecoverpasswordAction extends Action
$body .= "\n"; $body .= "\n";
$headers = _mail_prepare_headers('recoverpassword', $user->nickname, $user->nickname); $headers = _mail_prepare_headers('recoverpassword', $user->nickname, $user->nickname);
// TRANS: Subject for password recovery e-mail.
mail_to_user($user, _('Password recovery requested'), $body, $headers, $confirm->address); mail_to_user($user, _('Password recovery requested'), $body, $headers, $confirm->address);
$this->mode = 'sent'; $this->mode = 'sent';
// TRANS: User notification after an e-mail with instructions was sent from the password recovery form.
$this->msg = _('Instructions for recovering your password ' . $this->msg = _('Instructions for recovering your password ' .
'have been sent to the email address registered to your ' . 'have been sent to the email address registered to your ' .
'account.'); 'account.');
@ -347,6 +379,7 @@ class RecoverpasswordAction extends Action
# CSRF protection # CSRF protection
$token = $this->trimmed('token'); $token = $this->trimmed('token');
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
// TRANS: Form validation error message.
$this->showForm(_('There was a problem with your session token. Try again, please.')); $this->showForm(_('There was a problem with your session token. Try again, please.'));
return; return;
} }
@ -354,6 +387,7 @@ class RecoverpasswordAction extends Action
$user = $this->getTempUser(); $user = $this->getTempUser();
if (!$user) { if (!$user) {
// TRANS: Client error displayed when trying to reset as password without providing a user.
$this->clientError(_('Unexpected password reset.')); $this->clientError(_('Unexpected password reset.'));
return; return;
} }
@ -362,10 +396,12 @@ class RecoverpasswordAction extends Action
$confirm = $this->trimmed('confirm'); $confirm = $this->trimmed('confirm');
if (!$newpassword || strlen($newpassword) < 6) { if (!$newpassword || strlen($newpassword) < 6) {
// TRANS: Reset password form validation error message.
$this->showPasswordForm(_('Password must be 6 characters or more.')); $this->showPasswordForm(_('Password must be 6 characters or more.'));
return; return;
} }
if ($newpassword != $confirm) { if ($newpassword != $confirm) {
// TRANS: Reset password form validation error message.
$this->showPasswordForm(_('Password and confirmation do not match.')); $this->showPasswordForm(_('Password and confirmation do not match.'));
return; return;
} }
@ -378,13 +414,15 @@ class RecoverpasswordAction extends Action
if (!$user->update($original)) { if (!$user->update($original)) {
common_log_db_error($user, 'UPDATE', __FILE__); common_log_db_error($user, 'UPDATE', __FILE__);
$this->serverError(_('Can\'t save new password.')); // TRANS: Reset password form validation error message.
$this->serverError(_('Cannot save new password.'));
return; return;
} }
$this->clearTempUser(); $this->clearTempUser();
if (!common_set_user($user->nickname)) { if (!common_set_user($user->nickname)) {
// TRANS: Server error displayed when something does wrong with the user object during password reset.
$this->serverError(_('Error setting user.')); $this->serverError(_('Error setting user.'));
return; return;
} }
@ -392,6 +430,7 @@ class RecoverpasswordAction extends Action
common_real_login(true); common_real_login(true);
$this->mode = 'saved'; $this->mode = 'saved';
// TRANS: Success message for user after password reset.
$this->msg = _('New password successfully saved. ' . $this->msg = _('New password successfully saved. ' .
'You are now logged in.'); 'You are now logged in.');
$this->success = true; $this->success = true;

View File

@ -40,25 +40,21 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class RegisterAction extends Action class RegisterAction extends Action
{ {
/** /**
* Has there been an error? * Has there been an error?
*/ */
var $error = null; var $error = null;
/** /**
* Have we registered? * Have we registered?
*/ */
var $registered = false; var $registered = false;
/** /**
* Are we processing an invite? * Are we processing an invite?
*/ */
var $invite = null; var $invite = null;
/** /**
@ -68,7 +64,6 @@ class RegisterAction extends Action
* @param $args * @param $args
* @return string title * @return string title
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -105,7 +100,6 @@ class RegisterAction extends Action
* *
* @return string title * @return string title
*/ */
function title() function title()
{ {
if ($this->registered) { if ($this->registered) {
@ -126,7 +120,6 @@ class RegisterAction extends Action
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
@ -156,7 +149,6 @@ class RegisterAction extends Action
* *
* @return void * @return void
*/ */
function tryRegister() function tryRegister()
{ {
if (Event::handle('StartRegistrationTry', array($this))) { if (Event::handle('StartRegistrationTry', array($this))) {
@ -199,7 +191,7 @@ class RegisterAction extends Action
$email = common_canonical_email($email); $email = common_canonical_email($email);
if (!$this->boolean('license')) { if (!$this->boolean('license')) {
$this->showForm(_('You can\'t register if you don\'t '. $this->showForm(_('You cannot register if you don\'t '.
'agree to the license.')); 'agree to the license.'));
} else if ($email && !Validate::email($email, common_config('email', 'check_domain'))) { } else if ($email && !Validate::email($email, common_config('email', 'check_domain'))) {
$this->showForm(_('Not a valid email address.')); $this->showForm(_('Not a valid email address.'));
@ -277,7 +269,6 @@ class RegisterAction extends Action
* *
* @return boolean true if the nickname already exists * @return boolean true if the nickname already exists
*/ */
function nicknameExists($nickname) function nicknameExists($nickname)
{ {
$user = User::staticGet('nickname', $nickname); $user = User::staticGet('nickname', $nickname);
@ -293,7 +284,6 @@ class RegisterAction extends Action
* *
* @return boolean true if the address already exists * @return boolean true if the address already exists
*/ */
function emailExists($email) function emailExists($email)
{ {
$email = common_canonical_email($email); $email = common_canonical_email($email);
@ -332,7 +322,6 @@ class RegisterAction extends Action
* *
* @return void * @return void
*/ */
function showPageNotice() function showPageNotice()
{ {
if ($this->registered) { if ($this->registered) {
@ -344,7 +333,7 @@ class RegisterAction extends Action
common_markup_to_html(_('With this form you can create '. common_markup_to_html(_('With this form you can create '.
'a new account. ' . 'a new account. ' .
'You can then post notices and '. 'You can then post notices and '.
'link up to friends and colleagues. ')); 'link up to friends and colleagues.'));
$this->elementStart('div', 'instructions'); $this->elementStart('div', 'instructions');
$this->raw($instr); $this->raw($instr);
@ -361,7 +350,6 @@ class RegisterAction extends Action
* *
* @return void * @return void
*/ */
function showForm($error=null) function showForm($error=null)
{ {
$this->error = $error; $this->error = $error;
@ -376,7 +364,6 @@ class RegisterAction extends Action
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
if ($this->registered) { if ($this->registered) {
@ -391,7 +378,6 @@ class RegisterAction extends Action
* *
* @return void * @return void
*/ */
function showFormContent() function showFormContent()
{ {
$code = $this->trimmed('code'); $code = $this->trimmed('code');
@ -423,38 +409,37 @@ class RegisterAction extends Action
if (Event::handle('StartRegistrationFormData', array($this))) { if (Event::handle('StartRegistrationFormData', array($this))) {
$this->elementStart('li'); $this->elementStart('li');
$this->input('nickname', _('Nickname'), $this->trimmed('nickname'), $this->input('nickname', _('Nickname'), $this->trimmed('nickname'),
_('1-64 lowercase letters or numbers, '. _('1-64 lowercase letters or numbers, no punctuation or spaces.'));
'no punctuation or spaces. Required.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->password('password', _('Password'), $this->password('password', _('Password'),
_('6 or more characters. Required.')); _('6 or more characters.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->password('confirm', _('Confirm'), $this->password('confirm', _('Confirm'),
_('Same as password above. Required.')); _('Same as password above.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
if ($this->invite && $this->invite->address_type == 'email') { if ($this->invite && $this->invite->address_type == 'email') {
$this->input('email', _('Email'), $this->invite->address, $this->input('email', _('Email'), $this->invite->address,
_('Used only for updates, announcements, '. _('Used only for updates, announcements, '.
'and password recovery')); 'and password recovery.'));
} else { } else {
$this->input('email', _('Email'), $this->trimmed('email'), $this->input('email', _('Email'), $this->trimmed('email'),
_('Used only for updates, announcements, '. _('Used only for updates, announcements, '.
'and password recovery')); 'and password recovery.'));
} }
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->input('fullname', _('Full name'), $this->input('fullname', _('Full name'),
$this->trimmed('fullname'), $this->trimmed('fullname'),
_('Longer name, preferably your "real" name')); _('Longer name, preferably your "real" name.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->input('homepage', _('Homepage'), $this->input('homepage', _('Homepage'),
$this->trimmed('homepage'), $this->trimmed('homepage'),
_('URL of your homepage, blog, '. _('URL of your homepage, blog, '.
'or profile on another site')); 'or profile on another site.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$maxBio = Profile::maxBio(); $maxBio = Profile::maxBio();
@ -477,7 +462,7 @@ class RegisterAction extends Action
$this->input('location', _('Location'), $this->input('location', _('Location'),
$this->trimmed('location'), $this->trimmed('location'),
_('Where you are, like "City, '. _('Where you are, like "City, '.
'State (or Region), Country"')); 'State (or Region), Country".'));
$this->elementEnd('li'); $this->elementEnd('li');
Event::handle('EndRegistrationFormData', array($this)); Event::handle('EndRegistrationFormData', array($this));
$this->elementStart('li', array('id' => 'settings_rememberme')); $this->elementStart('li', array('id' => 'settings_rememberme'));
@ -513,6 +498,7 @@ class RegisterAction extends Action
switch (common_config('license', 'type')) { switch (common_config('license', 'type')) {
case 'private': case 'private':
// TRANS: Copyright checkbox label in registration dialog, for private sites. // TRANS: Copyright checkbox label in registration dialog, for private sites.
// TRANS: %1$s is the StatusNet sitename.
$out .= htmlspecialchars(sprintf( $out .= htmlspecialchars(sprintf(
_('I understand that content and data of %1$s are private and confidential.'), _('I understand that content and data of %1$s are private and confidential.'),
common_config('site', 'name'))); common_config('site', 'name')));
@ -556,7 +542,6 @@ class RegisterAction extends Action
* *
* @return void * @return void
*/ */
function showSuccess() function showSuccess()
{ {
$this->registered = true; $this->registered = true;
@ -570,7 +555,6 @@ class RegisterAction extends Action
* *
* @return void * @return void
*/ */
function showSuccessContent() function showSuccessContent()
{ {
$nickname = $this->arg('nickname'); $nickname = $this->arg('nickname');
@ -617,11 +601,9 @@ class RegisterAction extends Action
* *
* @return void * @return void
*/ */
function showLocalNav() function showLocalNav()
{ {
$nav = new LoginGroupNav($this); $nav = new LoginGroupNav($this);
$nav->show(); $nav->show();
} }
} }

View File

@ -44,7 +44,6 @@ require_once INSTALLDIR.'/extlib/libomb/profile.php';
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/ * @link http://status.net/
*/ */
class RemotesubscribeAction extends Action class RemotesubscribeAction extends Action
{ {
var $nickname; var $nickname;
@ -127,11 +126,11 @@ class RemotesubscribeAction extends Action
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
$this->input('nickname', _('User nickname'), $this->nickname, $this->input('nickname', _('User nickname'), $this->nickname,
_('Nickname of the user you want to follow')); _('Nickname of the user you want to follow.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->input('profile_url', _('Profile URL'), $this->profile_url, $this->input('profile_url', _('Profile URL'), $this->profile_url,
_('URL of your profile on another compatible microblogging service')); _('URL of your profile on another compatible microblogging service.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->submit('submit', _('Subscribe')); $this->submit('submit', _('Subscribe'));
@ -156,7 +155,7 @@ class RemotesubscribeAction extends Action
} }
if (!common_valid_http_url($this->profile_url)) { if (!common_valid_http_url($this->profile_url)) {
$this->showForm(_('Invalid profile URL (bad format)')); $this->showForm(_('Invalid profile URL (bad format).'));
return; return;
} }
@ -173,14 +172,14 @@ class RemotesubscribeAction extends Action
if ($service->getServiceURI(OAUTH_ENDPOINT_REQUEST) == if ($service->getServiceURI(OAUTH_ENDPOINT_REQUEST) ==
common_local_url('requesttoken') || common_local_url('requesttoken') ||
User::staticGet('uri', $service->getRemoteUserURI())) { User::staticGet('uri', $service->getRemoteUserURI())) {
$this->showForm(_('Thats a local profile! Login to subscribe.')); $this->showForm(_('That is a local profile! Login to subscribe.'));
return; return;
} }
try { try {
$service->requestToken(); $service->requestToken();
} catch (OMB_RemoteServiceException $e) { } catch (OMB_RemoteServiceException $e) {
$this->showForm(_('Couldnt get a request token.')); $this->showForm(_('Could not get a request token.'));
return; return;
} }
@ -204,4 +203,3 @@ class RemotesubscribeAction extends Action
common_redirect($target_url, 303); common_redirect($target_url, 303);
} }
} }
?>

View File

@ -41,7 +41,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/ * @link http://status.net/
*/ */
class RepeatAction extends Action class RepeatAction extends Action
{ {
var $user = null; var $user = null;
@ -73,7 +72,7 @@ class RepeatAction extends Action
} }
if ($this->user->id == $this->notice->profile_id) { if ($this->user->id == $this->notice->profile_id) {
$this->clientError(_("You can't repeat your own notice.")); $this->clientError(_('You cannot repeat your own notice.'));
return false; return false;
} }
@ -101,7 +100,6 @@ class RepeatAction extends Action
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
$repeat = $this->notice->repeat($this->user->id, 'web'); $repeat = $this->notice->repeat($this->user->id, 'web');

View File

@ -25,7 +25,6 @@ require_once(INSTALLDIR.'/lib/rssaction.php');
class RepliesrssAction extends Rss10Action class RepliesrssAction extends Rss10Action
{ {
var $user = null; var $user = null;
function prepare($args) function prepare($args)
@ -35,6 +34,7 @@ class RepliesrssAction extends Rss10Action
$this->user = User::staticGet('nickname', $nickname); $this->user = User::staticGet('nickname', $nickname);
if (!$this->user) { if (!$this->user) {
// TRANS: Client error displayed when providing a non-existing nickname in a RSS 1.0 action.
$this->clientError(_('No such user.')); $this->clientError(_('No such user.'));
return false; return false;
} else { } else {
@ -45,13 +45,12 @@ class RepliesrssAction extends Rss10Action
function getNotices($limit=0) function getNotices($limit=0)
{ {
$user = $this->user; $user = $this->user;
$notice = $user->getReplies(0, ($limit == 0) ? 48 : $limit); $notice = $user->getReplies(0, ($limit == 0) ? 48 : $limit);
$notices = array(); $notices = array();
while ($notice->fetch()) { while ($notice->fetch()) {
$notices[] = clone($notice); $notices[] = clone($notice);
} }
@ -65,11 +64,14 @@ class RepliesrssAction extends Rss10Action
$c = array('url' => common_local_url('repliesrss', $c = array('url' => common_local_url('repliesrss',
array('nickname' => array('nickname' =>
$user->nickname)), $user->nickname)),
// TRANS: RSS reply feed title. %s is a user nickname.
'title' => sprintf(_("Replies to %s"), $user->nickname), 'title' => sprintf(_("Replies to %s"), $user->nickname),
'link' => common_local_url('replies', 'link' => common_local_url('replies',
array('nickname' => array('nickname' =>
$user->nickname)), $user->nickname)),
'description' => sprintf(_('Replies to %1$s on %2$s!'), // TRANS: RSS reply feed description.
// TRANS: %1$s is a user nickname, %2$s is the StatusNet site name.
'description' => sprintf(_('Replies to %1$s on %2$s.'),
$user->nickname, common_config('site', 'name'))); $user->nickname, common_config('site', 'name')));
return $c; return $c;
} }

View File

@ -1,5 +1,4 @@
<?php <?php
/** /**
* Request token action class. * Request token action class.
* *
@ -77,4 +76,3 @@ class RequesttokenAction extends Action
} }
} }
} }
?>

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc. * Copyright (C) 2010, StatusNet, Inc.
* *
* Restore a backup of your own account from the browser * Restore a backup of your own account from the browser
* *
* 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 RestoreaccountAction extends Action class RestoreaccountAction extends Action
{ {
private $success = false; private $success = false;
@ -52,13 +51,13 @@ class RestoreaccountAction extends Action
/** /**
* Returns the title of the page * Returns the title of the page
* *
* @return string page title * @return string page title
*/ */
function title() function title()
{ {
return _("Restore account"); // TRANS: Page title for page where a user account can be restored from backup.
return _('Restore account');
} }
/** /**
@ -68,7 +67,6 @@ class RestoreaccountAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function prepare($argarray) function prepare($argarray)
{ {
parent::prepare($argarray); parent::prepare($argarray);
@ -76,10 +74,12 @@ class RestoreaccountAction extends Action
$cur = common_current_user(); $cur = common_current_user();
if (empty($cur)) { if (empty($cur)) {
// TRANS: Client exception displayed when trying to restore an account while not logged in.
throw new ClientException(_('Only logged-in users can restore their account.'), 403); throw new ClientException(_('Only logged-in users can restore their account.'), 403);
} }
if (!$cur->hasRight(Right::RESTOREACCOUNT)) { if (!$cur->hasRight(Right::RESTOREACCOUNT)) {
// TRANS: Client exception displayed when trying to restore an account without having restore rights.
throw new ClientException(_('You may not restore your account.'), 403); throw new ClientException(_('You may not restore your account.'), 403);
} }
@ -93,7 +93,6 @@ class RestoreaccountAction extends Action
* *
* @return void * @return void
*/ */
function handle($argarray=null) function handle($argarray=null)
{ {
parent::handle($argarray); parent::handle($argarray);
@ -108,17 +107,17 @@ class RestoreaccountAction extends Action
/** /**
* Queue a file for restoration * Queue a file for restoration
* *
* Uses the UserActivityStream class; may take a long time! * Uses the UserActivityStream class; may take a long time!
* *
* @return void * @return void
*/ */
function restoreAccount() function restoreAccount()
{ {
$this->checkSessionToken(); $this->checkSessionToken();
if (!isset($_FILES['restorefile']['error'])) { if (!isset($_FILES['restorefile']['error'])) {
// TRANS: Client exception displayed trying to restore an account while something went wrong uploading a file.
throw new ClientException(_('No uploaded file.')); throw new ClientException(_('No uploaded file.'));
} }
@ -143,7 +142,7 @@ class RestoreaccountAction extends Action
' partially uploaded.')); ' partially uploaded.'));
return; return;
case UPLOAD_ERR_NO_FILE: case UPLOAD_ERR_NO_FILE:
// No file; probably just a non-AJAX submission. // TRANS: Client exception. No file; probably just a non-AJAX submission.
throw new ClientException(_('No uploaded file.')); throw new ClientException(_('No uploaded file.'));
return; return;
case UPLOAD_ERR_NO_TMP_DIR: case UPLOAD_ERR_NO_TMP_DIR:
@ -170,18 +169,21 @@ class RestoreaccountAction extends Action
try { try {
if (!file_exists($filename)) { if (!file_exists($filename)) {
throw new ServerException("No such file '$filename'."); // TRANS: Server exception thrown when an expected file upload could not be found.
throw new ServerException(_("No such file '$filename'."));
} }
if (!is_file($filename)) { if (!is_file($filename)) {
throw new ServerException("Not a regular file: '$filename'."); // TRANS: Server exception thrown when an expected file upload is not an actual file.
throw new ServerException(_("Not a regular file: '$filename'."));
} }
if (!is_readable($filename)) { if (!is_readable($filename)) {
throw new ServerException("File '$filename' not readable."); // TRANS: Server exception thrown when an expected file upload could not be read.
throw new ServerException(_("File '$filename' not readable."));
} }
common_debug(sprintf(_("Getting backup from file '%s'."), $filename)); common_debug(sprintf("Getting backup from file '%s'.", $filename));
$xml = file_get_contents($filename); $xml = file_get_contents($filename);
@ -201,7 +203,8 @@ class RestoreaccountAction extends Action
if (!$feed || if (!$feed ||
$feed->namespaceURI != Activity::ATOM || $feed->namespaceURI != Activity::ATOM ||
$feed->localName != 'feed') { $feed->localName != 'feed') {
throw new ClientException(_("Not an atom feed.")); // TRANS: Client exception thrown when a feed is not an Atom feed.
throw new ClientException(_("Not an Atom feed."));
} }
// Enqueue for processing. // Enqueue for processing.
@ -230,21 +233,22 @@ class RestoreaccountAction extends Action
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
if ($this->success) { if ($this->success) {
$this->element('p', null, $this->element('p', null,
// TRANS: Success message when a feed has been restored.
_('Feed has been restored. Your old posts should now appear in search and your profile page.')); _('Feed has been restored. Your old posts should now appear in search and your profile page.'));
} else if ($this->inprogress) { } else if ($this->inprogress) {
$this->element('p', null, $this->element('p', null,
// TRANS: Message when a feed restore is in progress.
_('Feed will be restored. Please wait a few minutes for results.')); _('Feed will be restored. Please wait a few minutes for results.'));
} else { } else {
$form = new RestoreAccountForm($this); $form = new RestoreAccountForm($this);
$form->show(); $form->show();
} }
} }
/** /**
* Return true if read only. * Return true if read only.
* *
@ -254,7 +258,6 @@ class RestoreaccountAction extends Action
* *
* @return boolean is read only action? * @return boolean is read only action?
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return false; return false;
@ -267,7 +270,6 @@ class RestoreaccountAction extends Action
* *
* @return string last modified http header * @return string last modified http header
*/ */
function lastModified() function lastModified()
{ {
// For comparison with If-Last-Modified // For comparison with If-Last-Modified
@ -282,7 +284,6 @@ class RestoreaccountAction extends Action
* *
* @return string etag http header * @return string etag http header
*/ */
function etag() function etag()
{ {
return null; return null;
@ -299,7 +300,6 @@ class RestoreaccountAction extends Action
* @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 RestoreAccountForm extends Form class RestoreAccountForm extends Form
{ {
function __construct($out=null) { function __construct($out=null) {
@ -312,7 +312,6 @@ class RestoreAccountForm extends Form
* *
* @return string the form's class * @return string the form's class
*/ */
function formClass() function formClass()
{ {
return 'form_profile_restore'; return 'form_profile_restore';
@ -323,7 +322,6 @@ class RestoreAccountForm extends Form
* *
* @return string the form's action URL * @return string the form's action URL
*/ */
function action() function action()
{ {
return common_local_url('restoreaccount'); return common_local_url('restoreaccount');
@ -331,19 +329,19 @@ class RestoreAccountForm extends Form
/** /**
* Output form data * Output form data
* *
* Really, just instructions for doing a backup. * Really, just instructions for doing a backup.
* *
* @return void * @return void
*/ */
function formData() function formData()
{ {
$this->out->elementStart('p', 'instructions'); $this->out->elementStart('p', 'instructions');
// TRANS: Form instructions for feed restore.
$this->out->raw(_('You can upload a backed-up stream in '. $this->out->raw(_('You can upload a backed-up stream in '.
'<a href="http://activitystrea.ms/">Activity Streams</a> format.')); '<a href="http://activitystrea.ms/">Activity Streams</a> format.'));
$this->out->elementEnd('p'); $this->out->elementEnd('p');
$this->out->elementStart('ul', 'form_data'); $this->out->elementStart('ul', 'form_data');
@ -359,18 +357,19 @@ class RestoreAccountForm extends Form
/** /**
* Buttons for the form * Buttons for the form
* *
* In this case, a single submit button * In this case, a single submit button
* *
* @return void * @return void
*/ */
function formActions() function formActions()
{ {
$this->out->submit('submit', $this->out->submit('submit',
// TRANS: Submit button to confirm upload of a user backup file for account restore.
_m('BUTTON', 'Upload'), _m('BUTTON', 'Upload'),
'submit', 'submit',
null, null,
// TRANS: Title for submit button to confirm upload of a user backup file for account restore.
_('Upload the file')); _('Upload the file'));
} }
} }

View File

@ -40,7 +40,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/ * @link http://status.net/
*/ */
class RobotstxtAction extends Action class RobotstxtAction extends Action
{ {
/** /**
@ -53,7 +52,6 @@ class RobotstxtAction extends Action
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
if (Event::handle('StartRobotsTxt', array($this))) { if (Event::handle('StartRobotsTxt', array($this))) {
@ -65,9 +63,7 @@ class RobotstxtAction extends Action
if (common_config('site', 'private')) { if (common_config('site', 'private')) {
print "Disallow: /\n"; print "Disallow: /\n";
} else { } else {
$disallow = common_config('robotstxt', 'disallow'); $disallow = common_config('robotstxt', 'disallow');
foreach ($disallow as $dir) { foreach ($disallow as $dir) {
@ -92,7 +88,6 @@ class RobotstxtAction 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

@ -68,13 +68,11 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3 * @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/ * @link http://status.net/
*/ */
class RsdAction extends Action class RsdAction extends Action
{ {
/** /**
* Optional attribute for the personal rsd.xml file. * Optional attribute for the personal rsd.xml file.
*/ */
var $user = null; var $user = null;
/** /**
@ -87,7 +85,6 @@ class RsdAction extends Action
* *
* @return boolean success flag * @return boolean success flag
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -132,7 +129,6 @@ class RsdAction extends Action
* *
* @return nothing * @return nothing
*/ */
function handle($args) function handle($args)
{ {
header('Content-Type: application/rsd+xml'); header('Content-Type: application/rsd+xml');
@ -195,7 +191,6 @@ class RsdAction extends Action
* *
* @return string date of last change of this page * @return string date of last change of this page
*/ */
function lastModified() function lastModified()
{ {
if (!empty($this->user)) { if (!empty($this->user)) {
@ -214,7 +209,6 @@ class RsdAction extends Action
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return true; return true;
@ -228,7 +222,6 @@ class RsdAction extends Action
* *
* @return string API root URI for this site * @return string API root URI for this site
*/ */
private function _apiRoot() private function _apiRoot()
{ {
if (common_config('site', 'fancy')) { if (common_config('site', 'fancy')) {

View File

@ -40,19 +40,16 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class ShowApplicationAction extends OwnerDesignAction class ShowApplicationAction extends OwnerDesignAction
{ {
/** /**
* Application to show * Application to show
*/ */
var $application = null; var $application = null;
/** /**
* User who owns the app * User who owns the app
*/ */
var $owner = null; var $owner = null;
var $msg = null; var $msg = null;
@ -68,7 +65,6 @@ class ShowApplicationAction extends OwnerDesignAction
* *
* @return success flag * @return success flag
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -105,7 +101,6 @@ class ShowApplicationAction extends OwnerDesignAction
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
@ -132,7 +127,6 @@ class ShowApplicationAction extends OwnerDesignAction
* *
* @return string title of the page * @return string title of the page
*/ */
function title() function title()
{ {
if (!empty($this->application->name)) { if (!empty($this->application->name)) {
@ -274,7 +268,6 @@ class ShowApplicationAction extends OwnerDesignAction
* *
* @return void * @return void
*/ */
function showScripts() function showScripts()
{ {
parent::showScripts(); parent::showScripts();
@ -295,7 +288,6 @@ class ShowApplicationAction extends OwnerDesignAction
* XXX: Should this be moved to its own page with a confirm? * XXX: Should this be moved to its own page with a confirm?
* *
*/ */
function resetKey() function resetKey()
{ {
$this->application->query('BEGIN'); $this->application->query('BEGIN');
@ -355,5 +347,4 @@ class ShowApplicationAction extends OwnerDesignAction
$this->msg = ('Consumer key and secret reset.'); $this->msg = ('Consumer key and secret reset.');
$this->showPage(); $this->showPage();
} }
} }

View File

@ -44,7 +44,6 @@ require_once INSTALLDIR.'/lib/feedlist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/ * @link http://status.net/
*/ */
class ShowfavoritesAction extends OwnerDesignAction class ShowfavoritesAction extends OwnerDesignAction
{ {
/** User we're getting the faves of */ /** User we're getting the faves of */
@ -57,7 +56,6 @@ class ShowfavoritesAction extends OwnerDesignAction
* *
* @return boolean true * @return boolean true
*/ */
function isReadOnly($args) function isReadOnly($args)
{ {
return true; return true;
@ -70,12 +68,15 @@ class ShowfavoritesAction extends OwnerDesignAction
* *
* @return string title of page * @return string title of page
*/ */
function title() function title()
{ {
if ($this->page == 1) { if ($this->page == 1) {
// TRANS: Title for first page of favourite notices of a user.
// TRANS: %s is the user for whom the favourite notices are displayed.
return sprintf(_('%s\'s favorite notices'), $this->user->nickname); return sprintf(_('%s\'s favorite notices'), $this->user->nickname);
} else { } else {
// TRANS: Title for all but the first page of favourite notices of a user.
// TRANS: %1$s is the user for whom the favourite notices are displayed, %2$d is the page number.
return sprintf(_('%1$s\'s favorite notices, page %2$d'), return sprintf(_('%1$s\'s favorite notices, page %2$d'),
$this->user->nickname, $this->user->nickname,
$this->page); $this->page);
@ -92,7 +93,6 @@ class ShowfavoritesAction extends OwnerDesignAction
* *
* @return boolean success flag * @return boolean success flag
*/ */
function prepare($args) function prepare($args)
{ {
parent::prepare($args); parent::prepare($args);
@ -102,6 +102,7 @@ class ShowfavoritesAction extends OwnerDesignAction
$this->user = User::staticGet('nickname', $nickname); $this->user = User::staticGet('nickname', $nickname);
if (!$this->user) { if (!$this->user) {
// TRANS: Client error displayed when trying to display favourite notices for a non-existing user.
$this->clientError(_('No such user.')); $this->clientError(_('No such user.'));
return false; return false;
} }
@ -129,6 +130,7 @@ class ShowfavoritesAction extends OwnerDesignAction
} }
if (empty($this->notice)) { if (empty($this->notice)) {
// TRANS: Server error displayed when favourite notices could not be retrieved from the database.
$this->serverError(_('Could not retrieve favorite notices.')); $this->serverError(_('Could not retrieve favorite notices.'));
return; return;
} }
@ -150,7 +152,6 @@ class ShowfavoritesAction extends OwnerDesignAction
* *
* @return void * @return void
*/ */
function handle($args) function handle($args)
{ {
parent::handle($args); parent::handle($args);
@ -162,12 +163,12 @@ class ShowfavoritesAction extends OwnerDesignAction
* *
* @return array Feed objects to show * @return array Feed objects to show
*/ */
function getFeeds() function getFeeds()
{ {
return array(new Feed(Feed::RSS1, return array(new Feed(Feed::RSS1,
common_local_url('favoritesrss', common_local_url('favoritesrss',
array('nickname' => $this->user->nickname)), array('nickname' => $this->user->nickname)),
// TRANS: Feed link text. %s is a username.
sprintf(_('Feed for favorites of %s (RSS 1.0)'), sprintf(_('Feed for favorites of %s (RSS 1.0)'),
$this->user->nickname)), $this->user->nickname)),
new Feed(Feed::RSS2, new Feed(Feed::RSS2,
@ -175,6 +176,7 @@ class ShowfavoritesAction extends OwnerDesignAction
array( array(
'id' => $this->user->nickname, 'id' => $this->user->nickname,
'format' => 'rss')), 'format' => 'rss')),
// TRANS: Feed link text. %s is a username.
sprintf(_('Feed for favorites of %s (RSS 2.0)'), sprintf(_('Feed for favorites of %s (RSS 2.0)'),
$this->user->nickname)), $this->user->nickname)),
new Feed(Feed::ATOM, new Feed(Feed::ATOM,
@ -182,6 +184,7 @@ class ShowfavoritesAction extends OwnerDesignAction
array( array(
'id' => $this->user->nickname, 'id' => $this->user->nickname,
'format' => 'atom')), 'format' => 'atom')),
// TRANS: Feed link text. %s is a username.
sprintf(_('Feed for favorites of %s (Atom)'), sprintf(_('Feed for favorites of %s (Atom)'),
$this->user->nickname))); $this->user->nickname)));
} }
@ -191,7 +194,6 @@ class ShowfavoritesAction extends OwnerDesignAction
* *
* @return void * @return void
*/ */
function showLocalNav() function showLocalNav()
{ {
$nav = new PersonalGroupNav($this); $nav = new PersonalGroupNav($this);
@ -203,12 +205,18 @@ class ShowfavoritesAction extends OwnerDesignAction
if (common_logged_in()) { if (common_logged_in()) {
$current_user = common_current_user(); $current_user = common_current_user();
if ($this->user->id === $current_user->id) { if ($this->user->id === $current_user->id) {
// TRANS: Text displayed instead of favourite notices for the current logged in user that has no favourites.
$message = _('You haven\'t chosen any favorite notices yet. Click the fave button on notices you like to bookmark them for later or shed a spotlight on them.'); $message = _('You haven\'t chosen any favorite notices yet. Click the fave button on notices you like to bookmark them for later or shed a spotlight on them.');
} else { } else {
// TRANS: Text displayed instead of favourite notices for a user that has no favourites while logged in.
// TRANS: %s is a username.
$message = sprintf(_('%s hasn\'t added any favorite notices yet. Post something interesting they would add to their favorites :)'), $this->user->nickname); $message = sprintf(_('%s hasn\'t added any favorite notices yet. Post something interesting they would add to their favorites :)'), $this->user->nickname);
} }
} }
else { else {
// TRANS: Text displayed instead of favourite notices for a user that has no favourites while not logged in.
// TRANS: %s is a username, %%%%action.register%%%% is a link to the user registration page.
// TRANS: (link text)[link] is a Mark Down link.
$message = sprintf(_('%s hasn\'t added any favorite notices yet. Why not [register an account](%%%%action.register%%%%) and then post something interesting they would add to their favorites :)'), $this->user->nickname); $message = sprintf(_('%s hasn\'t added any favorite notices yet. Why not [register an account](%%%%action.register%%%%) and then post something interesting they would add to their favorites :)'), $this->user->nickname);
} }
@ -224,7 +232,6 @@ class ShowfavoritesAction extends OwnerDesignAction
* *
* @return void * @return void
*/ */
function showContent() function showContent()
{ {
$nl = new FavoritesNoticeList($this->notice, $this); $nl = new FavoritesNoticeList($this->notice, $this);
@ -240,6 +247,7 @@ class ShowfavoritesAction extends OwnerDesignAction
} }
function showPageNotice() { function showPageNotice() {
// TRANS: Page notice for show favourites page.
$this->element('p', 'instructions', _('This is a way to share what you like.')); $this->element('p', 'instructions', _('This is a way to share what you like.'));
} }
} }

Some files were not shown because too many files have changed in this diff Show More