Merge branch '1.0.x' into schema-x

This commit is contained in:
Brion Vibber 2010-11-02 15:02:55 -07:00
commit 0229c22d23
90 changed files with 13796 additions and 6122 deletions

12
README
View File

@ -3,7 +3,7 @@ README
------
StatusNet 0.9.6 "Man on the Moon"
25 October 2010 - RELEASE CANDIDATE
29 October 2010
This is the README file for StatusNet, the Open Source microblogging
platform. It includes installation instructions, descriptions of
@ -122,6 +122,16 @@ Notable changes this version:
- Header metadata on notice pages to aid in manual reposting on Facebook
- Lots of little fixes...
Changes from 0.9.6 release candidate 1:
- fix for broken group pages when logged out
- fix for stuck ping queue entries when bad profile
- fix for bogus single-user nickname config entry error
- i18n updates
- nofollow updates
- SSL-only mode secure cookie fix
- experimental ApiLogger plugin for usage data gathering
- experimental follow-everyone plugin
A full changelog is available at http://status.net/wiki/StatusNet_0.9.6.
Prerequisites

View File

@ -42,7 +42,6 @@ require_once INSTALLDIR.'/lib/attachmentlist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class AttachmentAction extends Action
{
/**
@ -70,6 +69,7 @@ class AttachmentAction extends Action
}
if (empty($this->attachment)) {
// TRANS: Client error displayed trying to get a non-existing attachment.
$this->clientError(_('No such attachment.'), 404);
return false;
}
@ -81,7 +81,6 @@ class AttachmentAction extends Action
*
* @return boolean true
*/
function isReadOnly($args)
{
return true;
@ -129,7 +128,6 @@ class AttachmentAction extends Action
*
* @return void
*/
function handle($args)
{
parent::handle($args);
@ -150,7 +148,6 @@ class AttachmentAction extends Action
*
* @return void
*/
function showLocalNavBlock()
{
}
@ -162,7 +159,6 @@ class AttachmentAction extends Action
*
* @return void
*/
function showContent()
{
$ali = new Attachment($this->attachment, $this);
@ -174,7 +170,6 @@ class AttachmentAction extends Action
*
* @return void
*/
function showPageNoticeBlock()
{
}
@ -191,4 +186,3 @@ class AttachmentAction extends Action
$atcs->show();
}
}

View File

@ -42,7 +42,6 @@ require_once INSTALLDIR.'/actions/attachment.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class Attachment_ajaxAction extends AttachmentAction
{
/**
@ -80,4 +79,3 @@ class Attachment_ajaxAction extends AttachmentAction
$this->elementEnd('div');
}
}

View File

@ -42,10 +42,8 @@ require_once INSTALLDIR.'/actions/attachment.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class Attachment_thumbnailAction extends AttachmentAction
{
function handle($args)
{
$this->showPage();
@ -79,6 +77,4 @@ class Attachment_thumbnailAction extends AttachmentAction
}
$this->element('img', array('src' => $file_thumbnail->url, 'alt' => 'Thumbnail'));
}
}

View File

@ -48,7 +48,7 @@ class AvatarbynicknameAction extends Action
* Class handler.
*
* @param array $args query arguments
*
*
* @return boolean false if nickname or user isn't found
*/
function handle($args)
@ -56,27 +56,32 @@ class AvatarbynicknameAction extends Action
parent::handle($args);
$nickname = $this->trimmed('nickname');
if (!$nickname) {
// TRANS: Client error displayed trying to get an avatar without providing a nickname.
$this->clientError(_('No nickname.'));
return;
}
$size = $this->trimmed('size');
if (!$size) {
// TRANS: Client error displayed trying to get an avatar without providing an avatar size.
$this->clientError(_('No size.'));
return;
}
$size = strtolower($size);
if (!in_array($size, array('original', '96', '48', '24'))) {
// TRANS: Client error displayed trying to get an avatar providing an invalid avatar size.
$this->clientError(_('Invalid size.'));
return;
}
$user = User::staticGet('nickname', $nickname);
if (!$user) {
// TRANS: Client error displayed trying to get an avatar for a non-existing user.
$this->clientError(_('No such user.'));
return;
}
$profile = $user->getProfile();
if (!$profile) {
// TRANS: Client error displayed trying to get an avatar for a user without a profile.
$this->clientError(_('User has no profile.'));
return;
}
@ -103,4 +108,3 @@ class AvatarbynicknameAction extends Action
return 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
* @link http://status.net/
*/
class AvatarsettingsAction extends AccountSettingsAction
{
var $mode = null;
@ -61,9 +60,9 @@ class AvatarsettingsAction extends AccountSettingsAction
*
* @return string Title of the page
*/
function title()
{
// TRANS: Title for avatar upload page.
return _('Avatar');
}
@ -72,10 +71,12 @@ class AvatarsettingsAction extends AccountSettingsAction
*
* @return instructions for use
*/
function getInstructions()
{
return sprintf(_('You can upload your personal avatar. The maximum file size is %s.'), ImageFile::maxFileSize());
// TRANS: Instruction for avatar upload page.
// TRANS: %s is the maximum file size, for example "500b", "10kB" or "2MB".
return sprintf(_('You can upload your personal avatar. The maximum file size is %s.'),
ImageFile::maxFileSize());
}
/**
@ -103,6 +104,7 @@ class AvatarsettingsAction extends AccountSettingsAction
if (!$profile) {
common_log_db_error($user, 'SELECT', __FILE__);
// TRANS: Server error displayed in avatar upload page when no matching profile can be found for a user.
$this->serverError(_('User without matching profile.'));
return;
}
@ -116,14 +118,16 @@ class AvatarsettingsAction extends AccountSettingsAction
'action' =>
common_local_url('avatarsettings')));
$this->elementStart('fieldset');
// TRANS: Avatar upload page form legend.
$this->element('legend', null, _('Avatar settings'));
$this->hidden('token', common_session_token());
if (Event::handle('StartAvatarFormData', array($this))) {
$this->elementStart('ul', 'form_data');
if ($original) {
$this->elementStart('li', array('id' => 'avatar_original',
'class' => 'avatar_view'));
// TRANS: Header on avatar upload page for thumbnail of originally uploaded avatar (h2).
$this->element('h2', null, _("Original"));
$this->elementStart('div', array('id'=>'avatar_original_view'));
$this->element('img', array('src' => $original->url,
@ -139,6 +143,7 @@ class AvatarsettingsAction extends AccountSettingsAction
if ($avatar) {
$this->elementStart('li', array('id' => 'avatar_preview',
'class' => 'avatar_view'));
// TRANS: Header on avatar upload page for thumbnail of to be used rendition of uploaded avatar (h2).
$this->element('h2', null, _("Preview"));
$this->elementStart('div', array('id'=>'avatar_preview_view'));
$this->element('img', array('src' => $original->url,
@ -146,7 +151,8 @@ class AvatarsettingsAction extends AccountSettingsAction
'height' => AVATAR_PROFILE_SIZE,
'alt' => $user->nickname));
$this->elementEnd('div');
$this->submit('delete', _('Delete'));
// TRANS: Button on avatar upload page to delete current avatar.
$this->submit('delete', _m('BUTTON','Delete'));
$this->elementEnd('li');
}
@ -163,7 +169,8 @@ class AvatarsettingsAction extends AccountSettingsAction
$this->elementStart('ul', 'form_actions');
$this->elementStart('li');
$this->submit('upload', _('Upload'));
// TRANS: Button on avatar upload page to upload an avatar.
$this->submit('upload', _m('BUTTON','Upload'));
$this->elementEnd('li');
$this->elementEnd('ul');
}
@ -171,7 +178,6 @@ class AvatarsettingsAction extends AccountSettingsAction
$this->elementEnd('fieldset');
$this->elementEnd('form');
}
function showCropForm()
@ -182,6 +188,7 @@ class AvatarsettingsAction extends AccountSettingsAction
if (!$profile) {
common_log_db_error($user, 'SELECT', __FILE__);
// TRANS: Server error displayed in avatar upload page when no matching profile can be found for a user.
$this->serverError(_('User without matching profile.'));
return;
}
@ -194,6 +201,7 @@ class AvatarsettingsAction extends AccountSettingsAction
'action' =>
common_local_url('avatarsettings')));
$this->elementStart('fieldset');
// TRANS: Avatar upload page crop form legend.
$this->element('legend', null, _('Avatar settings'));
$this->hidden('token', common_session_token());
@ -202,6 +210,7 @@ class AvatarsettingsAction extends AccountSettingsAction
$this->elementStart('li',
array('id' => 'avatar_original',
'class' => 'avatar_view'));
// TRANS: Header on avatar upload crop form for thumbnail of originally uploaded avatar (h2).
$this->element('h2', null, _("Original"));
$this->elementStart('div', array('id'=>'avatar_original_view'));
$this->element('img', array('src' => Avatar::url($this->filedata['filename']),
@ -214,6 +223,7 @@ class AvatarsettingsAction extends AccountSettingsAction
$this->elementStart('li',
array('id' => 'avatar_preview',
'class' => 'avatar_view'));
// TRANS: Header on avatar upload crop form for thumbnail of to be used rendition of uploaded avatar (h2).
$this->element('h2', null, _("Preview"));
$this->elementStart('div', array('id'=>'avatar_preview_view'));
$this->element('img', array('src' => Avatar::url($this->filedata['filename']),
@ -228,13 +238,14 @@ class AvatarsettingsAction extends AccountSettingsAction
'type' => 'hidden',
'id' => $crop_info));
}
$this->submit('crop', _('Crop'));
// TRANS: Button on avatar upload crop form to confirm a selected crop as avatar.
$this->submit('crop', _m('BUTTON','Crop'));
$this->elementEnd('li');
$this->elementEnd('ul');
$this->elementEnd('fieldset');
$this->elementEnd('form');
}
/**
@ -244,7 +255,6 @@ class AvatarsettingsAction extends AccountSettingsAction
*
* @return void
*/
function handlePost()
{
// Workaround for PHP returning empty $_POST and $_FILES when POST
@ -271,7 +281,7 @@ class AvatarsettingsAction extends AccountSettingsAction
'Try again, please.'));
return;
}
if (Event::handle('StartAvatarSaveForm', array($this))) {
if ($this->arg('upload')) {
$this->uploadAvatar();
@ -280,6 +290,7 @@ class AvatarsettingsAction extends AccountSettingsAction
} else if ($this->arg('delete')) {
$this->deleteAvatar();
} else {
// TRANS: Unexpected validation error on avatar upload form.
$this->showForm(_('Unexpected form submission.'));
}
Event::handle('EndAvatarSaveForm', array($this));
@ -294,7 +305,6 @@ class AvatarsettingsAction extends AccountSettingsAction
*
* @return void
*/
function uploadAvatar()
{
try {
@ -304,6 +314,7 @@ class AvatarsettingsAction extends AccountSettingsAction
return;
}
if ($imagefile === null) {
// TRANS: Validation error on avatar upload form when no file was uploaded.
$this->showForm(_('No file uploaded.'));
return;
}
@ -331,6 +342,7 @@ class AvatarsettingsAction extends AccountSettingsAction
$this->mode = 'crop';
// TRANS: Avatar upload form unstruction after uploading a file.
$this->showForm(_('Pick a square area of the image to be your avatar'),
true);
}
@ -340,12 +352,12 @@ class AvatarsettingsAction extends AccountSettingsAction
*
* @return void
*/
function cropAvatar()
{
$filedata = $_SESSION['FILEDATA'];
if (!$filedata) {
// TRANS: Server error displayed if an avatar upload went wrong somehow server side.
$this->serverError(_('Lost our file data.'));
return;
}
@ -369,24 +381,25 @@ class AvatarsettingsAction extends AccountSettingsAction
@unlink($filedata['filepath']);
unset($_SESSION['FILEDATA']);
$this->mode = 'upload';
// TRANS: Success message for having updated a user avatar.
$this->showForm(_('Avatar updated.'), true);
common_broadcast_profile($profile);
} else {
// TRANS: Error displayed on the avatar upload page if the avatar could not be updated for an unknown reason.
$this->showForm(_('Failed updating avatar.'));
}
}
/**
* Get rid of the current avatar.
*
* @return void
*/
function deleteAvatar()
{
$user = common_current_user();
$profile = $user->getProfile();
$avatar = $profile->getOriginalAvatar();
if($avatar) $avatar->delete();
$avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
@ -396,6 +409,7 @@ class AvatarsettingsAction extends AccountSettingsAction
$avatar = $profile->getAvatar(AVATAR_MINI_SIZE);
if($avatar) $avatar->delete();
// TRANS: Success message for deleting a user avatar.
$this->showForm(_('Avatar deleted.'), true);
}
@ -416,7 +430,6 @@ class AvatarsettingsAction extends AccountSettingsAction
*
* @return void
*/
function showScripts()
{
parent::showScripts();

View File

@ -42,7 +42,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class BlockAction extends ProfileFormAction
{
var $profile = null;
@ -54,7 +53,6 @@ class BlockAction extends ProfileFormAction
*
* @return boolean success flag
*/
function prepare($args)
{
if (!parent::prepare($args)) {
@ -66,6 +64,7 @@ class BlockAction extends ProfileFormAction
assert(!empty($cur)); // checked by parent
if ($cur->hasBlocked($this->profile)) {
// TRANS: Client error displayed when blocking a user that has already been blocked.
$this->clientError(_('You already blocked that user.'));
return false;
}
@ -82,7 +81,6 @@ class BlockAction extends ProfileFormAction
*
* @return void
*/
function handle($args)
{
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
@ -104,6 +102,7 @@ class BlockAction extends ProfileFormAction
}
function title() {
// TRANS: Title for block user page.
return _('Block user');
}
@ -133,8 +132,10 @@ class BlockAction extends ProfileFormAction
'action' => common_local_url('block')));
$this->elementStart('fieldset');
$this->hidden('token', common_session_token());
// TRANS: Legend for block user form.
$this->element('legend', _('Block user'));
$this->element('p', null,
// TRANS: Explanation of consequences when blocking a user on the block user page.
_('Are you sure you want to block this user? '.
'Afterwards, they will be unsubscribed from you, '.
'unable to subscribe to you in the future, and '.
@ -184,6 +185,7 @@ class BlockAction extends ProfileFormAction
}
if (!$result) {
// TRANS: Server error displayed when blocking a user fails.
$this->serverError(_('Failed to save block information.'));
return;
}
@ -199,7 +201,7 @@ class BlockAction extends ProfileFormAction
* Override for form session token checks; on our first hit we're just
* requesting confirmation, which doesn't need a token. We need to be
* able to take regular GET requests from email!
*
*
* @throws ClientException if token is bad on POST request or if we have
* confirmation parameters which could trigger something.
*/
@ -216,7 +218,7 @@ class BlockAction extends ProfileFormAction
/**
* If we reached this form without returnto arguments, return to the
* current user's subscription list.
*
*
* @return string URL
*/
function defaultReturnTo()

View File

@ -40,7 +40,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
* @link http://status.net/
*/
class BlockedfromgroupAction extends GroupDesignAction
{
var $page = null;
@ -70,6 +69,7 @@ class BlockedfromgroupAction extends GroupDesignAction
}
if (!$nickname) {
// TRANS: Client error displayed when requesting a list of blocked users for a group without providing a group nickname.
$this->clientError(_('No nickname.'), 404);
return false;
}
@ -77,6 +77,7 @@ class BlockedfromgroupAction extends GroupDesignAction
$local = Local_group::staticGet('nickname', $nickname);
if (!$local) {
// TRANS: Client error displayed when requesting a list of blocked users for a non-local group.
$this->clientError(_('No such group.'), 404);
return false;
}
@ -84,6 +85,7 @@ class BlockedfromgroupAction extends GroupDesignAction
$this->group = User_group::staticGet('id', $local->group_id);
if (!$this->group) {
// TRANS: Client error displayed when requesting a list of blocked users for a non-existing group.
$this->clientError(_('No such group.'), 404);
return false;
}
@ -94,9 +96,13 @@ class BlockedfromgroupAction extends GroupDesignAction
function title()
{
if ($this->page == 1) {
// TRANS: Title for first page with list of users blocked from a group.
// TRANS: %s is a group nickname.
return sprintf(_('%s blocked profiles'),
$this->group->nickname);
} else {
// TRANS: Title for any but the first page with list of users blocked from a group.
// TRANS: %1$s is a group nickname, %2$d is a page number.
return sprintf(_('%1$s blocked profiles, page %2$d'),
$this->group->nickname,
$this->page);
@ -112,6 +118,7 @@ class BlockedfromgroupAction extends GroupDesignAction
function showPageNotice()
{
$this->element('p', 'instructions',
// TRANS: Instructions for list of users blocked from a group.
_('A list of the users blocked from joining this group.'));
}
@ -205,7 +212,6 @@ class GroupBlockListItem extends ProfileListItem
*
* @see UnblockForm
*/
class GroupUnblockForm extends Form
{
/**
@ -234,7 +240,6 @@ class GroupUnblockForm extends Form
* @param User_group $group group to block user from
* @param array $args return-to args
*/
function __construct($out=null, $profile=null, $group=null, $args=null)
{
parent::__construct($out);
@ -249,7 +254,6 @@ class GroupUnblockForm extends Form
*
* @return int ID of the form
*/
function id()
{
// This should be unique for the page.
@ -261,7 +265,6 @@ class GroupUnblockForm extends Form
*
* @return string class of the form
*/
function formClass()
{
return 'form_group_unblock';
@ -272,7 +275,6 @@ class GroupUnblockForm extends Form
*
* @return string URL of the action
*/
function action()
{
return common_local_url('groupunblock');
@ -285,6 +287,7 @@ class GroupUnblockForm extends Form
*/
function formLegend()
{
// TRANS: Form legend for unblocking a user from a group.
$this->out->element('legend', null, _('Unblock user from group'));
}
@ -293,7 +296,6 @@ class GroupUnblockForm extends Form
*
* @return void
*/
function formData()
{
$this->out->hidden('unblockto-' . $this->profile->id,
@ -314,9 +316,14 @@ class GroupUnblockForm extends Form
*
* @return void
*/
function formActions()
{
$this->out->submit('submit', _('Unblock'), 'submit', null, _('Unblock this user'));
$this->out->submit('submit',
// TRANS: Button text for unblocking a user from a group.
_m('BUTTON','Unblock'),
'submit',
null,
// TRANS: Tooltip for button for unblocking a user from a group.
_('Unblock this user'));
}
}

View File

@ -34,7 +34,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
require_once INSTALLDIR . '/actions/newnotice.php';
/**
* Action for posting a notice
* Action for posting a notice
*
* @category Bookmarklet
* @package StatusNet
@ -42,12 +42,12 @@ require_once INSTALLDIR . '/actions/newnotice.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class BookmarkletAction extends NewnoticeAction
{
function showTitle()
{
// TRANS: Title for mini-posting window loaded from bookmarklet.
// TRANS: %s is the StatusNet site name.
$this->element('title', null, sprintf(_('Post to %s'), common_config('site', 'name')));
}
@ -73,4 +73,3 @@ class BookmarkletAction extends NewnoticeAction
{
}
}

View File

@ -44,7 +44,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
* @link http://status.net/
*/
class ConfirmaddressAction extends Action
{
/** type of confirmation. */
@ -61,7 +60,6 @@ class ConfirmaddressAction extends Action
*
* @return void
*/
function handle($args)
{
parent::handle($args);
@ -72,16 +70,19 @@ class ConfirmaddressAction extends Action
}
$code = $this->trimmed('code');
if (!$code) {
// TRANS: Client error displayed when not providing a confirmation code in the contact address confirmation action.
$this->clientError(_('No confirmation code.'));
return;
}
$confirm = Confirm_address::staticGet('code', $code);
if (!$confirm) {
// TRANS: Client error displayed when providing a non-existing confirmation code in the contact address confirmation action.
$this->clientError(_('Confirmation code not found.'));
return;
}
$cur = common_current_user();
if ($cur->id != $confirm->user_id) {
// TRANS: Client error displayed when not providing a confirmation code for another user in the contact address confirmation action.
$this->clientError(_('That confirmation code is not for you!'));
return;
}
@ -98,6 +99,7 @@ class ConfirmaddressAction extends Action
if (in_array($type, array('email', 'sms')))
{
if ($cur->$type == $confirm->address) {
// TRANS: Client error for an already confirmed email/jabber/sms address.
$this->clientError(_('That address has already been confirmed.'));
return;
}
@ -162,7 +164,9 @@ class ConfirmaddressAction extends Action
if (!$result) {
common_log_db_error($confirm, 'DELETE', __FILE__);
$this->serverError(_('Couldn\'t delete email confirmation.'));
// TRANS: Server error displayed when an address confirmation code deletion from the
// TRANS: database fails in the contact address confirmation action.
$this->serverError(_('Could not delete address confirmation.'));
return;
}
@ -175,9 +179,9 @@ class ConfirmaddressAction extends Action
*
* @return string title
*/
function title()
{
// TRANS: Title for the contact address confirmation action.
return _('Confirm address');
}
@ -186,12 +190,13 @@ class ConfirmaddressAction extends Action
*
* @return void
*/
function showContent()
{
$cur = common_current_user();
$this->element('p', null,
// TRANS: Success message for the contact address confirmation action.
// TRANS: %s can be 'email', 'jabber', or 'sms'.
sprintf(_('The address "%s" has been '.
'confirmed for your account.'),
$this->address));

View File

@ -45,7 +45,6 @@ require_once INSTALLDIR.'/lib/noticelist.php';
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class ConversationAction extends Action
{
var $id = null;
@ -58,7 +57,6 @@ class ConversationAction extends Action
*
* @return boolean false if id not passed in
*/
function prepare($args)
{
parent::prepare($args);
@ -81,7 +79,6 @@ class ConversationAction extends Action
*
* @return void
*/
function handle($args)
{
parent::handle($args);
@ -93,10 +90,10 @@ class ConversationAction extends Action
*
* @return string page title
*/
function title()
{
return _("Conversation");
// TRANS: Title for page with a conversion (multiple notices in context).
return _('Conversation');
}
/**
@ -107,7 +104,6 @@ class ConversationAction extends Action
*
* @return void
*/
function showContent()
{
$notices = Notice::conversationStream($this->id, null, null);
@ -134,7 +130,6 @@ class ConversationAction extends Action
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class ConversationTree extends NoticeList
{
var $tree = null;
@ -145,12 +140,12 @@ class ConversationTree extends NoticeList
*
* @return void
*/
function show()
{
$cnt = $this->_buildTree();
$this->out->elementStart('div', array('id' =>'notices_primary'));
// TRANS: Header on conversation page. Hidden by default (h2).
$this->out->element('h2', null, _('Notices'));
$this->out->elementStart('ol', array('class' => 'notices xoxo'));
@ -200,7 +195,6 @@ class ConversationTree extends NoticeList
*
* @return void
*/
function showNoticePlus($id)
{
$notice = $this->table[$id];
@ -237,7 +231,6 @@ class ConversationTree extends NoticeList
*
* @return NoticeListItem a list item to show
*/
function newListItem($notice)
{
return new ConversationTreeItem($notice, $this->out);
@ -255,7 +248,6 @@ class ConversationTree extends NoticeList
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class ConversationTreeItem extends NoticeListItem
{
/**
@ -266,7 +258,6 @@ class ConversationTreeItem extends NoticeListItem
*
* @return void
*/
function showStart()
{
return;
@ -280,7 +271,6 @@ class ConversationTreeItem extends NoticeListItem
*
* @return void
*/
function showEnd()
{
return;
@ -293,7 +283,6 @@ class ConversationTreeItem extends NoticeListItem
*
* @return void
*/
function showContext()
{
return;

View File

@ -40,7 +40,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class DeleteapplicationAction extends Action
{
var $app = null;
@ -52,7 +51,6 @@ class DeleteapplicationAction extends Action
*
* @return boolean success flag
*/
function prepare($args)
{
if (!parent::prepare($args)) {
@ -60,6 +58,7 @@ class DeleteapplicationAction extends Action
}
if (!common_logged_in()) {
// TRANS: Client error displayed trying to delete an application while not logged in.
$this->clientError(_('You must be logged in to delete an application.'));
return false;
}
@ -68,6 +67,7 @@ class DeleteapplicationAction extends Action
$this->app = Oauth_application::staticGet('id', $id);
if (empty($this->app)) {
// TRANS: Client error displayed trying to delete an application that does not exist.
$this->clientError(_('Application not found.'));
return false;
}
@ -75,6 +75,7 @@ class DeleteapplicationAction extends Action
$cur = common_current_user();
if ($cur->id != $this->app->owner) {
// TRANS: Client error displayed trying to delete an application the current user does not own.
$this->clientError(_('You are not the owner of this application.'), 401);
return false;
}
@ -91,7 +92,6 @@ class DeleteapplicationAction extends Action
*
* @return void
*/
function handle($args)
{
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
@ -120,6 +120,7 @@ class DeleteapplicationAction extends Action
}
function title() {
// TRANS: Title for delete application page.
return _('Delete application');
}
@ -144,8 +145,10 @@ class DeleteapplicationAction extends Action
array('id' => $this->app->id))));
$this->elementStart('fieldset');
$this->hidden('token', common_session_token());
// TRANS: Fieldset legend on delete application page.
$this->element('legend', _('Delete application'));
$this->element('p', null,
// TRANS: Confirmation text on delete application page.
_('Are you sure you want to delete this application? '.
'This will clear all data about the application from the '.
'database, including all existing user connections.'));
@ -171,10 +174,8 @@ class DeleteapplicationAction extends Action
*
* @return void
*/
function handlePost()
{
$this->app->delete();
}
}

View File

@ -172,7 +172,7 @@ class DeletegroupAction extends RedirectingAction
}
function title() {
// TRANS: Title.
// TRANS: Title of delete group page.
return _('Delete group');
}
@ -201,8 +201,8 @@ class DeletegroupAction extends RedirectingAction
// TRANS: Form legend for deleting a group.
$this->element('legend', _('Delete group'));
if (Event::handle('StartDeleteGroupForm', array($this, $this->group))) {
// TRANS: Warning in form for deleleting a group.
$this->element('p', null,
// TRANS: Warning in form for deleleting a group.
_('Are you sure you want to delete this group? '.
'This will clear all data about the group from the '.
'database, without a backup. ' .

View File

@ -32,6 +32,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
// @todo FIXME: documentation needed.
class DeletenoticeAction extends Action
{
var $error = null;
@ -47,6 +48,7 @@ class DeletenoticeAction extends Action
$this->user = common_current_user();
if (!$this->user) {
// TRANS: Error message displayed trying to delete a notice while not logged in.
common_user_error(_('Not logged in.'));
exit;
}
@ -55,6 +57,7 @@ class DeletenoticeAction extends Action
$this->notice = Notice::staticGet($notice_id);
if (!$this->notice) {
// TRANS: Error message displayed trying to delete a non-existing notice.
common_user_error(_('No such notice.'));
exit;
}
@ -71,6 +74,7 @@ class DeletenoticeAction extends Action
if ($this->notice->profile_id != $this->user_profile->id &&
!$this->user->hasRight(Right::DELETEOTHERSNOTICE)) {
// 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.'));
exit;
}
@ -90,7 +94,6 @@ class DeletenoticeAction extends Action
*
* @return void
*/
function showPageNotice()
{
$instr = $this->getInstructions();
@ -103,12 +106,14 @@ class DeletenoticeAction extends Action
function getInstructions()
{
// TRANS: Instructions for deleting a notice.
return _('You are about to permanently delete a notice. ' .
'Once this is done, it cannot be undone.');
}
function title()
{
// TRANS: Page title when deleting a notice.
return _('Delete notice');
}
@ -121,7 +126,6 @@ class DeletenoticeAction extends Action
*
* @return void
*/
function showForm($error = null)
{
$this->error = $error;
@ -133,7 +137,6 @@ class DeletenoticeAction extends Action
*
* @return void
*/
function showContent()
{
$this->elementStart('form', array('id' => 'form_notice_delete',
@ -141,9 +144,11 @@ class DeletenoticeAction extends Action
'method' => 'post',
'action' => common_local_url('deletenotice')));
$this->elementStart('fieldset');
// TRANS: Fieldset legend for the delete notice form.
$this->element('legend', null, _('Delete notice'));
$this->hidden('token', common_session_token());
$this->hidden('notice', $this->trimmed('notice'));
// TRANS: Message for the delete notice form.
$this->element('p', null, _('Are you sure you want to delete this notice?'));
$this->submit('form_action-no',
// TRANS: Button label on the delete notice form.

View File

@ -185,7 +185,7 @@ class EditApplicationAction extends OwnerDesignAction
return;
} elseif (mb_strlen($name) > 255) {
// TRANS: Validation error shown when providing too long a name in the "Edit application" form.
$this->showForm(_('Name is too long (max 255 characters).'));
$this->showForm(_('Name is too long (maximum 255 characters).'));
return;
} else if ($this->nameExists($name)) {
// TRANS: Validation error shown when providing a name for an application that already exists in the "Edit application" form.

View File

@ -45,14 +45,13 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class EditgroupAction extends GroupDesignAction
{
var $msg;
function title()
{
// TRANS: Title for form to edit a group. %s is a group nickname.
return sprintf(_('Edit %s group'), $this->group->nickname);
}
@ -65,6 +64,7 @@ class EditgroupAction extends GroupDesignAction
parent::prepare($args);
if (!common_logged_in()) {
// TRANS: Client error displayed trying to edit a group while not logged in.
$this->clientError(_('You must be logged in to create a group.'));
return false;
}
@ -81,6 +81,7 @@ class EditgroupAction extends GroupDesignAction
}
if (!$nickname) {
// TRANS: Client error displayed trying to edit a group while not proving a nickname for the group to edit.
$this->clientError(_('No nickname.'), 404);
return false;
}
@ -97,6 +98,7 @@ class EditgroupAction extends GroupDesignAction
}
if (!$this->group) {
// TRANS: Client error displayed trying to edit a non-existing group.
$this->clientError(_('No such group.'), 404);
return false;
}
@ -104,6 +106,7 @@ class EditgroupAction extends GroupDesignAction
$cur = common_current_user();
if (!$cur->isAdmin($this->group)) {
// TRANS: Client error displayed trying to edit a group while not being a group admin.
$this->clientError(_('You must be an admin to edit the group.'), 403);
return false;
}
@ -120,7 +123,6 @@ class EditgroupAction extends GroupDesignAction
*
* @return void
*/
function handle($args)
{
parent::handle($args);
@ -155,6 +157,7 @@ class EditgroupAction extends GroupDesignAction
$this->element('p', 'error', $this->msg);
} else {
$this->element('p', 'instructions',
// TRANS: Form instructions for group edit form.
_('Use this form to edit the group.'));
}
}
@ -169,6 +172,7 @@ class EditgroupAction extends GroupDesignAction
{
$cur = common_current_user();
if (!$cur->isAdmin($this->group)) {
// TRANS: Client error displayed trying to edit a group while not being a group admin.
$this->clientError(_('You must be an admin to edit the group.'), 403);
return;
}
@ -183,28 +187,39 @@ class EditgroupAction extends GroupDesignAction
if (!Validate::string($nickname, array('min_length' => 1,
'max_length' => 64,
'format' => NICKNAME_FMT))) {
// TRANS: Group edit form validation error.
$this->showForm(_('Nickname must have only lowercase letters '.
'and numbers and no spaces.'));
return;
} else if ($this->nicknameExists($nickname)) {
// TRANS: Group edit form validation error.
$this->showForm(_('Nickname already in use. Try another one.'));
return;
} 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(_('Description is too long (max %d chars).'), User_group::maxDescription()));
$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()));
return;
} 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;
}
@ -216,7 +231,11 @@ class EditgroupAction extends GroupDesignAction
}
if (count($aliases) > common_config('group', 'maxaliases')) {
$this->showForm(sprintf(_('Too many aliases! Maximum %d.'),
// 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;
}
@ -225,16 +244,19 @@ class EditgroupAction extends GroupDesignAction
if (!Validate::string($alias, array('min_length' => 1,
'max_length' => 64,
'format' => NICKNAME_FMT))) {
// TRANS: Group edit form validation error.
$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;
}
@ -255,12 +277,14 @@ class EditgroupAction extends GroupDesignAction
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.'));
}
@ -277,6 +301,7 @@ class EditgroupAction extends GroupDesignAction
array('nickname' => $nickname)),
303);
} else {
// TRANS: Group edit form success message.
$this->showForm(_('Options saved.'));
}
}
@ -300,4 +325,3 @@ class EditgroupAction extends GroupDesignAction
return false;
}
}

View File

@ -32,7 +32,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
}
/**
* Unlock a user from a group
* Unblock a user from a group
*
* @category Action
* @package StatusNet
@ -40,7 +40,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class GroupunblockAction extends Action
{
var $profile = null;
@ -53,11 +52,11 @@ class GroupunblockAction extends Action
*
* @return boolean success flag
*/
function prepare($args)
{
parent::prepare($args);
if (!common_logged_in()) {
// TRANS: Client error displayed when trying to unblock a user from a group while not logged in.
$this->clientError(_('Not logged in.'));
return false;
}
@ -68,11 +67,13 @@ class GroupunblockAction extends Action
}
$id = $this->trimmed('unblockto');
if (empty($id)) {
// TRANS: Client error displayed when trying to unblock a user from a group without providing a profile.
$this->clientError(_('No profile specified.'));
return false;
}
$this->profile = Profile::staticGet('id', $id);
if (empty($this->profile)) {
// TRANS: Client error displayed when trying to unblock a user from a group without providing an existing profile.
$this->clientError(_('No profile with that ID.'));
return false;
}
@ -83,15 +84,18 @@ class GroupunblockAction extends Action
}
$this->group = User_group::staticGet('id', $group_id);
if (empty($this->group)) {
// TRANS: Client error displayed when trying to unblock a user from a non-existing group.
$this->clientError(_('No such group.'));
return false;
}
$user = common_current_user();
if (!$user->isAdmin($this->group)) {
// TRANS: Client error displayed when trying to unblock a user from a group without being an administrator for the group.
$this->clientError(_('Only an admin can unblock group members.'), 401);
return false;
}
if (!Group_block::isBlocked($this->group, $this->profile)) {
// TRANS: Client error displayed when trying to unblock a non-blocked user from a group.
$this->clientError(_('User is not blocked from group.'));
return false;
}
@ -105,7 +109,6 @@ class GroupunblockAction extends Action
*
* @return void
*/
function handle($args)
{
parent::handle($args);
@ -119,12 +122,12 @@ class GroupunblockAction extends Action
*
* @return void
*/
function unblockProfile()
{
$result = Group_block::unblockProfile($this->group, $this->profile);
if (!$result) {
// TRANS: Server error displayed when unblocking a user from a group fails because of an unknown error.
$this->serverError(_('Error removing the block.'));
return;
}
@ -146,4 +149,3 @@ class GroupunblockAction extends Action
}
}
}

View File

@ -153,7 +153,7 @@ class LicenseadminpanelAction extends AdminPanelAction
// Make sure the license title is not too long
if (mb_strlen($values['license']['type']) > 255) {
$this->clientError(
_("Invalid license title. Max length is 255 characters.")
_('Invalid license title. Maximum length is 255 characters.')
);
}

View File

@ -166,7 +166,7 @@ class NewApplicationAction extends OwnerDesignAction
$this->showForm(_('Name already in use. Try another one.'));
return;
} elseif (mb_strlen($name) > 255) {
$this->showForm(_('Name is too long (maximum 255 chars).'));
$this->showForm(_('Name is too long (maximum 255 characters).'));
return;
} elseif (empty($description)) {
$this->showForm(_('Description is required.'));
@ -196,7 +196,7 @@ class NewApplicationAction extends OwnerDesignAction
$this->showForm(_('Organization is required.'));
return;
} elseif (mb_strlen($organization) > 255) {
$this->showForm(_('Organization is too long (maximum 255 chars).'));
$this->showForm(_('Organization is too long (maximum 255 characters).'));
return;
} elseif (empty($homepage)) {
$this->showForm(_('Organization homepage is required.'));

View File

@ -43,25 +43,25 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class NewgroupAction extends Action
{
var $msg;
function title()
{
// TRANS: Title for form to create a group.
return _('New group');
}
/**
* Prepare to run
*/
function prepare($args)
{
parent::prepare($args);
if (!common_logged_in()) {
// TRANS: Client error displayed trying to create a group while not logged in.
$this->clientError(_('You must be logged in to create a group.'));
return false;
}
@ -78,7 +78,6 @@ class NewgroupAction extends Action
*
* @return void
*/
function handle($args)
{
parent::handle($args);
@ -107,6 +106,7 @@ class NewgroupAction extends Action
$this->element('p', 'error', $this->msg);
} else {
$this->element('p', 'instructions',
// TRANS: Form instructions for group create form.
_('Use this form to create a new group.'));
}
}
@ -123,33 +123,39 @@ class NewgroupAction extends Action
if (!Validate::string($nickname, array('min_length' => 1,
'max_length' => 64,
'format' => NICKNAME_FMT))) {
// TRANS: Group create form validation error.
$this->showForm(_('Nickname must have only lowercase letters '.
'and numbers and no spaces.'));
return;
} else 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: Form validation error creating a new group because the description is too long.
// 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()),
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;
}
@ -161,7 +167,7 @@ class NewgroupAction extends Action
}
if (count($aliases) > common_config('group', 'maxaliases')) {
// TRANS: Client error shown when providing too many aliases during group creation.
// 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.',
@ -174,16 +180,19 @@ class NewgroupAction extends Action
if (!Validate::string($alias, array('min_length' => 1,
'max_length' => 64,
'format' => NICKNAME_FMT))) {
// TRANS: Group create form validation error.
$this->showForm(sprintf(_('Invalid alias: "%s"'), $alias));
return;
}
if ($this->nicknameExists($alias)) {
// TRANS: Group create 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 create form validation error.
$this->showForm(_('Alias can\'t be the same as nickname.'));
return;
}
@ -227,4 +236,3 @@ class NewgroupAction extends Action
return false;
}
}

View File

@ -156,8 +156,11 @@ class NewnoticeAction extends Action
$content_shortened = common_shorten_links($content);
if (Notice::contentTooLong($content_shortened)) {
$this->clientError(sprintf(_('That\'s too long. '.
'Max notice size is %d chars.'),
// TRANS: Client error displayed when the parameter "status" is missing.
// TRANS: %d is the maximum number of character for a notice.
$this->clientError(sprintf(_m('That\'s too long. Maximum notice size is %d character.',
'That\'s too long. Maximum notice size is %d characters.',
Notice::maxContent()),
Notice::maxContent()));
}
@ -178,12 +181,10 @@ class NewnoticeAction extends Action
if (Notice::contentTooLong($content_shortened)) {
$upload->delete();
$this->clientError(
sprintf(
_('Max notice size is %d chars, including attachment URL.'),
Notice::maxContent()
)
);
$this->clientError(sprintf(_m('Maximum notice size is %d character, including attachment URL.',
'Maximum notice size is %d characters, including attachment URL.',
Notice::maxContent()),
Notice::maxContent()));
}
}

View File

@ -46,7 +46,6 @@ require_once INSTALLDIR.'/lib/accountsettingsaction.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class OthersettingsAction extends AccountSettingsAction
{
/**
@ -54,9 +53,9 @@ class OthersettingsAction extends AccountSettingsAction
*
* @return string Title of the page
*/
function title()
{
// Page title for a tab in user profile settings.
return _('Other settings');
}
@ -68,6 +67,7 @@ class OthersettingsAction extends AccountSettingsAction
function getInstructions()
{
// TRANS: Instructions for tab "Other" in user profile settings.
return _('Manage various other options.');
}
@ -107,6 +107,9 @@ class OthersettingsAction extends AccountSettingsAction
{
$services[$name]=$name;
if($value['freeService']){
// TRANS: Used as a suffix for free URL shorteners in a dropdown list in the tab "Other" of a
// TRANS: user's profile settings. This message has one space at the beginning. Use your
// TRANS: language's word separator here if it has one (most likely a single space).
$services[$name].=_(' (free service)');
}
}
@ -115,7 +118,9 @@ class OthersettingsAction extends AccountSettingsAction
asort($services);
$this->elementStart('li');
// TRANS: Label for dropdown with URL shortener services.
$this->dropdown('urlshorteningservice', _('Shorten URLs with'),
// TRANS: Tooltip for for dropdown with URL shortener services.
$services, _('Automatic shortening service to use.'),
false, $user->urlshorteningservice);
$this->elementEnd('li');
@ -135,11 +140,13 @@ class OthersettingsAction extends AccountSettingsAction
_('URLs in notices longer than this will be shortened.'));
$this->elementEnd('li');
$this->elementStart('li');
// TRANS: Label for checkbox.
$this->checkbox('viewdesigns', _('View profile designs'),
- $user->viewdesigns, _('Show or hide profile designs.'));
$this->elementEnd('li');
$this->elementEnd('ul');
$this->submit('save', _('Save'));
// TRANS: Button text for saving "Other settings" in profile.
$this->submit('save', _m('BUTTON','Save'));
$this->elementEnd('fieldset');
$this->elementEnd('form');
}
@ -166,7 +173,8 @@ class OthersettingsAction extends AccountSettingsAction
$urlshorteningservice = $this->trimmed('urlshorteningservice');
if (!is_null($urlshorteningservice) && strlen($urlshorteningservice) > 50) {
$this->showForm(_('URL shortening service is too long (max 50 chars).'));
// TRANS: Form validation error for form "Other settings" in user profile.
$this->showForm(_('URL shortening service is too long (maximum 50 characters).'));
return;
}
@ -199,6 +207,7 @@ class OthersettingsAction extends AccountSettingsAction
if ($result === false) {
common_log_db_error($user, 'UPDATE', __FILE__);
// TRANS: Server error displayed when "Other" settings in user profile could not be updated on the server.
$this->serverError(_('Couldn\'t update user.'));
return;
}

View File

@ -362,7 +362,7 @@ class RecoverpasswordAction extends Action
$confirm = $this->trimmed('confirm');
if (!$newpassword || strlen($newpassword) < 6) {
$this->showPasswordForm(_('Password must be 6 chars or more.'));
$this->showPasswordForm(_('Password must be 6 characters or more.'));
return;
}
if ($newpassword != $confirm) {

View File

@ -46,10 +46,8 @@ define('MEMBERS_PER_SECTION', 27);
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class ShowgroupAction extends GroupDesignAction
{
/** page we're viewing. */
var $page = null;
@ -58,7 +56,6 @@ class ShowgroupAction extends GroupDesignAction
*
* @return boolean true
*/
function isReadOnly($args)
{
return true;
@ -69,18 +66,21 @@ class ShowgroupAction extends GroupDesignAction
*
* @return string page title, with page number
*/
function title()
{
if (!empty($this->group->fullname)) {
// @todo FIXME: Needs proper i18n. Maybe use a generic method for this?
$base = $this->group->fullname . ' (' . $this->group->nickname . ')';
} else {
$base = $this->group->nickname;
}
if ($this->page == 1) {
// TRANS: Page title for first group page. %s is a group name.
return sprintf(_('%s group'), $base);
} else {
// TRANS: Page title for any but first group page.
// TRANS: %1$s is a group name, $2$s is a page number.
return sprintf(_('%1$s group, page %2$d'),
$base,
$this->page);
@ -96,7 +96,6 @@ class ShowgroupAction extends GroupDesignAction
*
* @return boolean success flag
*/
function prepare($args)
{
parent::prepare($args);
@ -118,6 +117,7 @@ class ShowgroupAction extends GroupDesignAction
}
if (!$nickname) {
// TRANS: Client error displayed if no nickname argument was given requesting a group page.
$this->clientError(_('No nickname.'), 404);
return false;
}
@ -135,6 +135,7 @@ class ShowgroupAction extends GroupDesignAction
return false;
} else {
common_log(LOG_NOTICE, "Couldn't find local group for nickname '$nickname'");
// TRANS: Client error displayed if no remote group with a given name was found requesting group page.
$this->clientError(_('No such group.'), 404);
return false;
}
@ -143,6 +144,7 @@ class ShowgroupAction extends GroupDesignAction
$this->group = User_group::staticGet('id', $local->group_id);
if (!$this->group) {
// TRANS: Client error displayed if no local group with a given name was found requesting group page.
$this->clientError(_('No such group.'), 404);
return false;
}
@ -160,7 +162,6 @@ class ShowgroupAction extends GroupDesignAction
*
* @return void
*/
function handle($args)
{
$this->showPage();
@ -171,7 +172,6 @@ class ShowgroupAction extends GroupDesignAction
*
* @return void
*/
function showLocalNav()
{
$nav = new GroupNav($this, $this->group);
@ -183,7 +183,6 @@ class ShowgroupAction extends GroupDesignAction
*
* Shows a group profile and a list of group notices
*/
function showContent()
{
$this->showGroupProfile();
@ -195,7 +194,6 @@ class ShowgroupAction extends GroupDesignAction
*
* @return void
*/
function showGroupNotices()
{
$notice = $this->group->getNotices(($this->page-1)*NOTICES_PER_PAGE,
@ -218,15 +216,16 @@ class ShowgroupAction extends GroupDesignAction
*
* @return void
*/
function showGroupProfile()
{
$this->elementStart('div', array('id' => 'i',
'class' => 'entity_profile vcard author'));
// TRANS: Group profile header (h2). Text hidden by default.
$this->element('h2', null, _('Group profile'));
$this->elementStart('dl', 'entity_depiction');
// TRANS: Label for group avatar (dt). Text hidden by default.
$this->element('dt', null, _('Avatar'));
$this->elementStart('dd');
@ -242,6 +241,7 @@ class ShowgroupAction extends GroupDesignAction
$this->elementEnd('dl');
$this->elementStart('dl', 'entity_nickname');
// TRANS: Label for group nickname (dt). Text hidden by default.
$this->element('dt', null, _('Nickname'));
$this->elementStart('dd');
$hasFN = ($this->group->fullname) ? 'nickname url uid' : 'fn org nickname url uid';
@ -253,6 +253,7 @@ class ShowgroupAction extends GroupDesignAction
if ($this->group->fullname) {
$this->elementStart('dl', 'entity_fn');
// TRANS: Label for full group name (dt). Text hidden by default.
$this->element('dt', null, _('Full name'));
$this->elementStart('dd');
$this->element('span', 'fn org', $this->group->fullname);
@ -262,6 +263,7 @@ class ShowgroupAction extends GroupDesignAction
if ($this->group->location) {
$this->elementStart('dl', 'entity_location');
// TRANS: Label for group location (dt). Text hidden by default.
$this->element('dt', null, _('Location'));
$this->element('dd', 'label', $this->group->location);
$this->elementEnd('dl');
@ -269,6 +271,7 @@ class ShowgroupAction extends GroupDesignAction
if ($this->group->homepage) {
$this->elementStart('dl', 'entity_url');
// TRANS: Label for group URL (dt). Text hidden by default.
$this->element('dt', null, _('URL'));
$this->elementStart('dd');
$this->element('a', array('href' => $this->group->homepage,
@ -280,6 +283,7 @@ class ShowgroupAction extends GroupDesignAction
if ($this->group->description) {
$this->elementStart('dl', 'entity_note');
// TRANS: Label for group description or group note (dt). Text hidden by default.
$this->element('dt', null, _('Note'));
$this->element('dd', 'note', $this->group->description);
$this->elementEnd('dl');
@ -290,6 +294,7 @@ class ShowgroupAction extends GroupDesignAction
if (!empty($aliases)) {
$this->elementStart('dl', 'entity_aliases');
// TRANS: Label for group aliases (dt). Text hidden by default.
$this->element('dt', null, _('Aliases'));
$this->element('dd', 'aliases', implode(' ', $aliases));
$this->elementEnd('dl');
@ -300,6 +305,7 @@ class ShowgroupAction extends GroupDesignAction
$cur = common_current_user();
$this->elementStart('div', 'entity_actions');
// TRANS: Group actions header (h2). Text hidden by default.
$this->element('h2', null, _('Group actions'));
$this->elementStart('ul');
$this->elementStart('li', 'entity_subscribe');
@ -331,7 +337,6 @@ class ShowgroupAction extends GroupDesignAction
*
* @return void
*/
function getFeeds()
{
$url =
@ -341,23 +346,27 @@ class ShowgroupAction extends GroupDesignAction
return array(new Feed(Feed::RSS1,
common_local_url('grouprss',
array('nickname' => $this->group->nickname)),
// TRANS: Tooltip for feed link. %s is a group nickname.
sprintf(_('Notice feed for %s group (RSS 1.0)'),
$this->group->nickname)),
new Feed(Feed::RSS2,
common_local_url('ApiTimelineGroup',
array('format' => 'rss',
'id' => $this->group->id)),
// TRANS: Tooltip for feed link. %s is a group nickname.
sprintf(_('Notice feed for %s group (RSS 2.0)'),
$this->group->nickname)),
new Feed(Feed::ATOM,
common_local_url('ApiTimelineGroup',
array('format' => 'atom',
'id' => $this->group->id)),
// TRANS: Tooltip for feed link. %s is a group nickname.
sprintf(_('Notice feed for %s group (Atom)'),
$this->group->nickname)),
new Feed(Feed::FOAF,
common_local_url('foafgroup',
array('nickname' => $this->group->nickname)),
// TRANS: Tooltip for feed link. %s is a group nickname.
sprintf(_('FOAF for %s group'),
$this->group->nickname)));
}
@ -367,7 +376,6 @@ class ShowgroupAction extends GroupDesignAction
*
* @return void
*/
function showSections()
{
$this->showMembers();
@ -382,7 +390,6 @@ class ShowgroupAction extends GroupDesignAction
*
* @return void
*/
function showMembers()
{
$member = $this->group->getMembers(0, MEMBERS_PER_SECTION);
@ -396,17 +403,22 @@ class ShowgroupAction extends GroupDesignAction
if (Event::handle('StartShowGroupMembersMiniList', array($this))) {
// TRANS: Header for mini list of group members on a group page (h2).
$this->element('h2', null, _('Members'));
$gmml = new GroupMembersMiniList($member, $this);
$cnt = $gmml->show();
if ($cnt == 0) {
// TRANS: Description for mini list of group members on a group page when the group has no members.
$this->element('p', null, _('(None)'));
}
// @todo FIXME: Should be shown if a group has more than 27 members, but I do not see it displayed at
// for example http://identi.ca/group/statusnet. Broken?
if ($cnt > MEMBERS_PER_SECTION) {
$this->element('a', array('href' => common_local_url('groupmembers',
array('nickname' => $this->group->nickname))),
// TRANS: Link to all group members from mini list of group members if group has more than n members.
_('All members'));
}
@ -421,7 +433,6 @@ class ShowgroupAction extends GroupDesignAction
*
* @return void
*/
function showAdmins()
{
$adminSection = new GroupAdminSection($this, $this->group);
@ -433,22 +444,26 @@ class ShowgroupAction extends GroupDesignAction
*
* @return void
*/
function showStatistics()
{
$this->elementStart('div', array('id' => 'entity_statistics',
'class' => 'section'));
// TRANS: Header for group statistics on a group page (h2).
$this->element('h2', null, _('Statistics'));
$this->elementStart('dl', 'entity_created');
$this->element('dt', null, _('Created'));
// @todo FIXME: i18n issue. This label gets a colon added from somewhere. Should be part of the message.
// TRANS: Label for creation date in statistics on group page.
$this->element('dt', null, _m('LABEL','Created'));
$this->element('dd', null, date('j M Y',
strtotime($this->group->created)));
$this->elementEnd('dl');
$this->elementStart('dl', 'entity_members');
$this->element('dt', null, _('Members'));
// @todo FIXME: i18n issue. This label gets a colon added from somewhere. Should be part of the message.
// TRANS: Label for member count in statistics on group page.
$this->element('dt', null, _m('LABEL','Members'));
$this->element('dd', null, $this->group->getMemberCount());
$this->elementEnd('dl');
@ -458,12 +473,21 @@ class ShowgroupAction extends GroupDesignAction
function showAnonymousMessage()
{
if (!(common_config('site','closed') || common_config('site','inviteonly'))) {
// @todo FIXME: use group full name here if available instead of (uglier) primary alias.
// TRANS: Notice on group pages for anonymous users for StatusNet sites that accept new registrations.
// TRANS: **%s** is the group alias, %%%%site.name%%%% is the site name,
// TRANS: %%%%action.register%%%% is the URL for registration, %%%%doc.help%%%% is a URL to help.
// TRANS: This message contains Markdown links. Ensure they are formatted correctly: [Description](link).
$m = sprintf(_('**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
'based on the Free Software [StatusNet](http://status.net/) tool. Its members share ' .
'short messages about their life and interests. '.
'[Join now](%%%%action.register%%%%) to become part of this group and many more! ([Read more](%%%%doc.help%%%%))'),
$this->group->nickname);
} else {
// @todo FIXME: use group full name here if available instead of (uglier) primary alias.
// TRANS: Notice on group pages for anonymous users for StatusNet sites that accept no new registrations.
// TRANS: **%s** is the group alias, %%%%site.name%%%% is the site name,
// TRANS: This message contains Markdown links. Ensure they are formatted correctly: [Description](link).
$m = sprintf(_('**%s** is a user group on %%%%site.name%%%%, a [micro-blogging](http://en.wikipedia.org/wiki/Micro-blogging) service ' .
'based on the Free Software [StatusNet](http://status.net/) tool. Its members share ' .
'short messages about their life and interests. '),
@ -492,6 +516,7 @@ class GroupAdminSection extends ProfileSection
function title()
{
// TRANS: Header for list of group administrators on a group page (h2).
return _('Admins');
}
@ -527,4 +552,3 @@ class GroupMembersMiniListItem extends ProfileMiniListItem
return $aAttrs;
}
}

View File

@ -26,8 +26,8 @@
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
require_once INSTALLDIR.'/lib/mailbox.php';
@ -36,26 +36,24 @@ require_once INSTALLDIR.'/lib/mailbox.php';
* Show a single message
*
* // XXX: It is totally weird how this works!
*
*
* @category Personal
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class ShowmessageAction extends MailboxAction
{
/**
* Message object to show
*/
var $message = null;
/**
* The current user
*/
var $user = null;
/**
@ -67,17 +65,17 @@ class ShowmessageAction extends MailboxAction
*
* @return success flag
*/
function prepare($args)
{
parent::prepare($args);
$this->page = 1;
$id = $this->trimmed('message');
$this->message = Message::staticGet('id', $id);
if (!$this->message) {
// TRANS: Client error displayed requesting a single message that does not exist.
$this->clientError(_('No such message.'), 404);
return false;
}
@ -90,40 +88,47 @@ class ShowmessageAction extends MailboxAction
function handle($args)
{
Action::handle($args);
if ($this->user && ($this->user->id == $this->message->from_profile ||
if ($this->user && ($this->user->id == $this->message->from_profile ||
$this->user->id == $this->message->to_profile)) {
$this->showPage();
} else {
// TRANS: Client error displayed requesting a single direct message the requesting user was not a party in.
$this->clientError(_('Only the sender and recipient ' .
'may read this message.'), 403);
return;
}
}
function title()
{
{
if ($this->user->id == $this->message->from_profile) {
$to = $this->message->getTo();
return sprintf(_("Message to %1\$s on %2\$s"),
// @todo FIXME: Might be nice if the timestamp could be localised.
// TRANS: Page title for single direct message display when viewing user is the sender.
// TRANS: %1$s is the addressed user's nickname, $2$s is a timestamp.
return sprintf(_('Message to %1$s on %2$s'),
$to->nickname,
common_exact_date($this->message->created));
} else if ($this->user->id == $this->message->to_profile) {
$from = $this->message->getFrom();
return sprintf(_("Message from %1\$s on %2\$s"),
// @todo FIXME: Might be nice if the timestamp could be localised.
// TRANS: Page title for single message display.
// TRANS: %1$s is the sending user's nickname, $2$s is a timestamp.
return sprintf(_('Message from %1$s on %2$s'),
$from->nickname,
common_exact_date($this->message->created));
}
}
function getMessages()
{
function getMessages()
{
$message = new Message();
$message->id = $this->message->id;
$message->find();
return $message;
}
function getMessageProfile()
{
if ($this->user->id == $this->message->from_profile) {
@ -135,23 +140,21 @@ class ShowmessageAction extends MailboxAction
return null;
}
}
/**
* Don't show local navigation
*
* @return void
*/
function showLocalNavBlock()
{
}
/**
* Don't show page notice
*
* @return void
*/
function showPageNoticeBlock()
{
}
@ -161,17 +164,15 @@ class ShowmessageAction extends MailboxAction
*
* @return void
*/
function showAside()
function showAside()
{
}
/**
* Don't show any instructions
*
* @return string
*/
function getInstructions()
{
return '';

View File

@ -63,21 +63,24 @@ class ShowstreamAction extends ProfileAction
function title()
{
if (!empty($this->profile->fullname)) {
$base = $this->profile->fullname . ' (' . $this->user->nickname . ') ';
} else {
$base = $this->user->nickname;
}
$base = $this->profile->getFancyName();
if (!empty($this->tag)) {
$base .= sprintf(_(' tagged %s'), $this->tag);
}
if ($this->page == 1) {
return $base;
if ($this->page == 1) {
// TRANS: Page title showing tagged notices in one user's stream. Param 1 is the username, 2 is the hash tag.
return sprintf(_('%1$s tagged %2$s'), $base, $this->tag);
} else {
// TRANS: Page title showing tagged notices in one user's stream. Param 1 is the username, 2 is the hash tag, 3 is the page number.
return sprintf(_('%1$s tagged %2$s, page %3$d'), $base, $this->tag, $this->page);
}
} else {
return sprintf(_('%1$s, page %2$d'),
$base,
$this->page);
if ($this->page == 1) {
return $base;
} else {
// TRANS: Extended page title showing tagged notices in one user's stream. Param 1 is the username, param 2 is the page number.
return sprintf(_('%1$s, page %2$d'),
$base,
$this->page);
}
}
}

View File

@ -42,7 +42,6 @@ require_once INSTALLDIR.'/extlib/htmLawed/htmLawed.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class SitenoticeadminpanelAction extends AdminPanelAction
{
/**
@ -50,9 +49,9 @@ class SitenoticeadminpanelAction extends AdminPanelAction
*
* @return string page title
*/
function title()
{
// TRANS: Page title for site-wide notice tab in admin panel.
return _('Site Notice');
}
@ -61,9 +60,9 @@ class SitenoticeadminpanelAction extends AdminPanelAction
*
* @return string instructions
*/
function getInstructions()
{
// TRANS: Instructions for site-wide notice tab in admin panel.
return _('Edit site-wide message');
}
@ -72,7 +71,6 @@ class SitenoticeadminpanelAction extends AdminPanelAction
*
* @return void
*/
function showForm()
{
$form = new SiteNoticeAdminPanelForm($this);
@ -85,7 +83,6 @@ class SitenoticeadminpanelAction extends AdminPanelAction
*
* @return void
*/
function saveSettings()
{
$siteNotice = $this->trimmed('site-notice');
@ -100,6 +97,7 @@ class SitenoticeadminpanelAction extends AdminPanelAction
$result = Config::save('site', 'notice', $siteNotice);
if (!$result) {
// TRANS: Server error displayed when saving a site-wide notice was impossible.
$this->ServerError(_("Unable to save site notice."));
}
}
@ -110,7 +108,8 @@ class SitenoticeadminpanelAction extends AdminPanelAction
if (mb_strlen($siteNotice) > 255) {
$this->clientError(
_('Max length for the site-wide notice is 255 chars.')
// TRANS: Client error displayed when a site-wide notice was longer than allowed.
_('Maximum length for the site-wide notice is 255 characters.')
);
}
@ -173,9 +172,11 @@ class SiteNoticeAdminPanelForm extends AdminForm
$this->out->elementStart('li');
$this->out->textarea(
'site-notice',
// TRANS: Label for site-wide notice text field in admin panel.
_('Site notice text'),
common_config('site', 'notice'),
_('Site-wide notice text (255 chars max; HTML okay)')
// TRANS: Tooltip for site-wide notice text field in admin panel.
_('Site-wide notice text (255 characters maximum; HTML allowed)')
);
$this->out->elementEnd('li');
@ -192,9 +193,11 @@ class SiteNoticeAdminPanelForm extends AdminForm
{
$this->out->submit(
'submit',
_('Save'),
// TRANS: Button text for saving site notice in admin panel.
_m('BUTTON','Save'),
'submit',
null,
// TRANS: Title for button to save site notice in admin panel.
_('Save site notice')
);
}

View File

@ -19,6 +19,7 @@
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
// @todo FIXME: Documentation needed.
class SubeditAction extends Action
{
var $profile = null;
@ -28,6 +29,7 @@ class SubeditAction extends Action
parent::prepare($args);
if (!common_logged_in()) {
// TRANS: Client error displayed trying a change a subscription while not logged in.
$this->clientError(_('Not logged in.'));
return false;
}
@ -43,6 +45,7 @@ class SubeditAction extends Action
$id = $this->trimmed('profile');
if (!$id) {
// TRANS: Client error displayed trying a change a subscription without providing a profile.
$this->clientError(_('No profile specified.'));
return false;
}
@ -50,6 +53,7 @@ class SubeditAction extends Action
$this->profile = Profile::staticGet('id', $id);
if (!$this->profile) {
// TRANS: Client error displayed trying a change a subscription for a non-existant profile ID.
$this->clientError(_('No profile with that ID.'));
return false;
}
@ -67,6 +71,7 @@ class SubeditAction extends Action
'subscribed' => $this->profile->id));
if (!$sub) {
// TRANS: Client error displayed trying a change a subscription for a non-subscribed profile.
$this->clientError(_('You are not subscribed to that profile.'));
return false;
}
@ -80,6 +85,7 @@ class SubeditAction extends Action
if (!$result) {
common_log_db_error($sub, 'UPDATE', __FILE__);
// TRANS: Server error displayed when updating a subscription fails with a database error.
$this->serverError(_('Could not save subscription.'));
return false;
}

View File

@ -45,7 +45,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class UseradminpanelAction extends AdminPanelAction
{
/**
@ -53,7 +52,6 @@ class UseradminpanelAction extends AdminPanelAction
*
* @return string page title
*/
function title()
{
// TRANS: User admin panel title
@ -65,9 +63,9 @@ class UseradminpanelAction extends AdminPanelAction
*
* @return string instructions
*/
function getInstructions()
{
// TRANS: Instruction for user admin panel.
return _('User settings for this StatusNet site');
}
@ -76,7 +74,6 @@ class UseradminpanelAction extends AdminPanelAction
*
* @return void
*/
function showForm()
{
$form = new UserAdminPanelForm($this);
@ -89,7 +86,6 @@ class UseradminpanelAction extends AdminPanelAction
*
* @return void
*/
function saveSettings()
{
static $settings = array(
@ -147,13 +143,15 @@ class UseradminpanelAction extends AdminPanelAction
// Validate biolimit
if (!Validate::number($values['profile']['biolimit'])) {
$this->clientError(_("Invalid bio limit. Must be numeric."));
// TRANS: Form validation error in user admin panel when a non-numeric character limit was set.
$this->clientError(_('Invalid bio limit. Must be numeric.'));
}
// Validate welcome text
if (mb_strlen($values['newuser']['welcome']) > 255) {
$this->clientError(_("Invalid welcome text. Max length is 255 characters."));
// TRANS: Form validation error in user admin panel when welcome text is too long.
$this->clientError(_('Invalid welcome text. Maximum length is 255 characters.'));
}
// Validate default subscription
@ -163,7 +161,9 @@ class UseradminpanelAction extends AdminPanelAction
if (empty($defuser)) {
$this->clientError(
sprintf(
_('Invalid default subscripton: \'%1$s\' is not user.'),
// TRANS: Client error displayed when trying to set a non-existing user as default subscription for new
// TRANS: users in user admin panel. %1$s is the invalid nickname.
_('Invalid default subscripton: \'%1$s\' is not a user.'),
$values['newuser']['default']
)
);
@ -179,7 +179,6 @@ class UserAdminPanelForm extends AdminForm
*
* @return int ID of the form
*/
function id()
{
return 'useradminpanel';
@ -190,7 +189,6 @@ class UserAdminPanelForm extends AdminForm
*
* @return string class of the form
*/
function formClass()
{
return 'form_settings';
@ -201,7 +199,6 @@ class UserAdminPanelForm extends AdminForm
*
* @return string URL of the action
*/
function action()
{
return common_local_url('useradminpanel');
@ -212,7 +209,6 @@ class UserAdminPanelForm extends AdminForm
*
* @return void
*/
function formData()
{
$this->out->elementStart('fieldset', array('id' => 'settings_user-profile'));
@ -220,7 +216,9 @@ class UserAdminPanelForm extends AdminForm
$this->out->elementStart('ul', 'form_data');
$this->li();
// TRANS: Field label in user admin panel for setting the character limit for the bio field.
$this->input('biolimit', _('Bio Limit'),
// TRANS: Tooltip in user admin panel for setting the character limit for the bio field.
_('Maximum length of a profile bio in characters.'),
'profile');
$this->unli();
@ -229,17 +227,22 @@ class UserAdminPanelForm extends AdminForm
$this->out->elementEnd('fieldset');
$this->out->elementStart('fieldset', array('id' => 'settings_user-newusers'));
// TRANS: Form legend in user admin panel.
$this->out->element('legend', null, _('New users'));
$this->out->elementStart('ul', 'form_data');
$this->li();
// TRANS: Field label in user admin panel for setting new user welcome text.
$this->input('welcome', _('New user welcome'),
_('Welcome text for new users (Max 255 chars).'),
// TRANS: Tooltip in user admin panel for setting new user welcome text.
_('Welcome text for new users (maximum 255 characters).'),
'newuser');
$this->unli();
$this->li();
// TRANS: Field label in user admin panel for setting default subscription for new users.
$this->input('default', _('Default subscription'),
// TRANS: Tooltip in user admin panel for setting default subscription for new users.
_('Automatically subscribe new users to this user.'),
'newuser');
$this->unli();
@ -249,21 +252,21 @@ class UserAdminPanelForm extends AdminForm
$this->out->elementEnd('fieldset');
$this->out->elementStart('fieldset', array('id' => 'settings_user-invitations'));
// TRANS: Form legend in user admin panel.
$this->out->element('legend', null, _('Invitations'));
$this->out->elementStart('ul', 'form_data');
$this->li();
// TRANS: Field label for checkbox in user admin panel for allowing users to invite friend using site e-mail.
$this->out->checkbox('invite-enabled', _('Invitations enabled'),
(bool) $this->value('enabled', 'invite'),
// TRANS: Tooltip for checkbox in user admin panel for allowing users to invite friend using site e-mail.
_('Whether to allow users to invite new users.'));
$this->unli();
$this->out->elementEnd('ul');
$this->out->elementEnd('fieldset');
}
/**
@ -278,7 +281,6 @@ class UserAdminPanelForm extends AdminForm
*
* @return void
*/
function input($setting, $title, $instructions, $section='site')
{
$this->out->input("$section-$setting", $title, $this->value($setting, $section), $instructions);
@ -289,9 +291,14 @@ class UserAdminPanelForm extends AdminForm
*
* @return void
*/
function formActions()
{
$this->out->submit('submit', _('Save'), 'submit', null, _('Save user settings'));
$this->out->submit('submit',
// TRANS: Button text to save user settings in user admin panel.
_m('BUTTON','Save'),
'submit',
null,
// TRANS: Title for button to save user settings in user admin panel.
_('Save user settings'));
}
}

View File

@ -141,11 +141,32 @@ class Profile extends Memcached_DataObject
return true;
}
/**
* Gets either the full name (if filled) or the nickname.
*
* @return string
*/
function getBestName()
{
return ($this->fullname) ? $this->fullname : $this->nickname;
}
/**
* Gets the full name (if filled) with nickname as a parenthetical, or the nickname alone
* if no fullname is provided.
*
* @return string
*/
function getFancyName()
{
if ($this->fullname) {
// TRANS: Full name of a profile or group followed by nickname in parens
return sprintf(_('%1$s (%2$s)'), $this->fullname, $this->nickname);
} else {
return $this->nickname;
}
}
/**
* Get the most recent notice posted by this user, if any.
*

View File

@ -56,6 +56,15 @@ var SN = { // StatusNet
NoticeDataGeoCookie: 'NoticeDataGeo',
NoticeDataGeoSelected: 'notice_data-geo_selected',
StatusNetInstance:'StatusNetInstance'
},
},
messages: {},
msg: function(key) {
if (typeof SN.messages[key] == "undefined") {
return '[' + key + ']';
} else {
return SN.messages[key];
}
},
@ -416,7 +425,7 @@ var SN = { // StatusNet
});
return false;
});
}).attr('title', SN.msg('showmore_tooltip'));
}
else {
$.fn.jOverlay.options = {

View File

@ -283,6 +283,7 @@ class Action extends HTMLOutputter // lawsuit
if (Event::handle('StartShowStatusNetScripts', array($this)) &&
Event::handle('StartShowLaconicaScripts', array($this))) {
$this->script('util.js');
$this->showScriptMessages();
// Frame-busting code to avoid clickjacking attacks.
$this->inlineScript('if (window.top !== window.self) { window.top.location.href = window.self.location.href; }');
Event::handle('EndShowStatusNetScripts', array($this));
@ -292,6 +293,54 @@ class Action extends HTMLOutputter // lawsuit
}
}
/**
* Exports a map of localized text strings to JavaScript code.
*
* Plugins can add to what's exported by hooking the StartScriptMessages or EndScriptMessages
* events and appending to the array. Try to avoid adding strings that won't be used, as
* they'll be added to HTML output.
*/
function showScriptMessages()
{
$messages = array();
if (Event::handle('StartScriptMessages', array($this, &$messages))) {
// Common messages needed for timeline views etc...
// TRANS: Localized tooltip for '...' expansion button on overlong remote messages.
$messages['showmore_tooltip'] = _m('TOOLTIP', 'Show more');
$messages = array_merge($messages, $this->getScriptMessages());
}
Event::handle('EndScriptMessages', array($this, &$messages));
if ($messages) {
$this->inlineScript('SN.messages=' . json_encode($messages));
}
return $messages;
}
/**
* If the action will need localizable text strings, export them here like so:
*
* return array('pool_deepend' => _('Deep end'),
* 'pool_shallow' => _('Shallow end'));
*
* The exported map will be available via SN.msg() to JS code:
*
* $('#pool').html('<div class="deepend"></div><div class="shallow"></div>');
* $('#pool .deepend').text(SN.msg('pool_deepend'));
* $('#pool .shallow').text(SN.msg('pool_shallow'));
*
* Exports a map of localized text strings to JavaScript code.
*
* Plugins can add to what's exported on any action by hooking the StartScriptMessages or
* EndScriptMessages events and appending to the array. Try to avoid adding strings that won't
* be used, as they'll be added to HTML output.
*/
function getScriptMessages()
{
return array();
}
/**
* Show OpenSearch headers
*

View File

@ -483,9 +483,11 @@ class MessageCommand extends Command
if (Message::contentTooLong($this->text)) {
// XXX: i18n. Needs plural support.
// TRANS: Message given if content is too long.
// TRANS: Message given if content is too long. %1$sd is used for plural.
// TRANS: %1$d is the maximum number of characters, %2$d is the number of submitted characters.
$channel->error($this->user, sprintf(_('Message too long - maximum is %1$d characters, you sent %2$d.'),
$channel->error($this->user, sprintf(_m('Message too long - maximum is %1$d character, you sent %2$d.',
'Message too long - maximum is %1$d characters, you sent %2$d.',
Message::maxContent()),
Message::maxContent(), mb_strlen($this->text)));
return;
}
@ -584,9 +586,11 @@ class ReplyCommand extends Command
if (Notice::contentTooLong($this->text)) {
// XXX: i18n. Needs plural support.
// TRANS: Message given if content of a notice for a reply is too long.
// TRANS: Message given if content of a notice for a reply is too long. %1$d is used for plural.
// TRANS: %1$d is the maximum number of characters, %2$d is the number of submitted characters.
$channel->error($this->user, sprintf(_('Notice too long - maximum is %1$d characters, you sent %2$d.'),
$channel->error($this->user, sprintf(_m('Notice too long - maximum is %1$d character, you sent %2$d.',
'Notice too long - maximum is %1$d characters, you sent %2$d.',
Notice::maxContent()),
Notice::maxContent(), mb_strlen($this->text)));
return;
}

View File

@ -62,6 +62,7 @@ class FeedList extends Widget
if (!empty($feeds)) {
$this->out->elementStart('div', array('id' => 'export_data',
'class' => 'section'));
// TRANS: Header for feed links (h2).
$this->out->element('h2', null, _('Feeds'));
$this->out->elementStart('ul', array('class' => 'xoxo'));

View File

@ -160,14 +160,17 @@ class GroupEditForm extends Form
$this->out->elementStart('li');
$this->out->input('homepage', _('Homepage'),
($this->out->arg('homepage')) ? $this->out->arg('homepage') : $homepage,
_('URL of the homepage or blog of the group or topic'));
_('URL of the homepage or blog of the group or topic.'));
$this->out->elementEnd('li');
$this->out->elementStart('li');
$desclimit = User_group::maxDescription();
if ($desclimit == 0) {
$descinstr = _('Describe the group or topic');
} else {
$descinstr = sprintf(_('Describe the group or topic in %d characters'), $desclimit);
$descinstr = sprintf(_m('Describe the group or topic in %d character or less',
'Describe the group or topic in %d characters or less',
$desclimit),
$desclimit);
}
$this->out->textarea('description', _('Description'),
($this->out->arg('description')) ? $this->out->arg('description') : $description,
@ -176,7 +179,7 @@ class GroupEditForm extends Form
$this->out->elementStart('li');
$this->out->input('location', _('Location'),
($this->out->arg('location')) ? $this->out->arg('location') : $location,
_('Location for the group, if any, like "City, State (or Region), Country"'));
_('Location for the group, if any, like "City, State (or Region), Country".'));
$this->out->elementEnd('li');
if (common_config('group', 'maxaliases') > 0) {
$aliases = (empty($this->group)) ? array() : $this->group->getAliases();
@ -184,7 +187,9 @@ class GroupEditForm extends Form
$this->out->input('aliases', _('Aliases'),
($this->out->arg('aliases')) ? $this->out->arg('aliases') :
(!empty($aliases)) ? implode(' ', $aliases) : '',
sprintf(_('Extra nicknames for the group, comma- or space- separated, max %d'),
sprintf(_m('Extra nicknames for the group, separated with commas or spaces. Maximum %d alias allowed.',
'Extra nicknames for the group, separated with commas or spaces. Maximum %d aliases allowed.',
common_config('group', 'maxaliases')),
common_config('group', 'maxaliases')));;
$this->out->elementEnd('li');
}
@ -199,6 +204,6 @@ class GroupEditForm extends Form
function formActions()
{
$this->out->submit('submit', _('Save'));
$this->out->submit('submit', _m('BUTTON','Save'));
}
}

View File

@ -85,6 +85,8 @@ class ImageFile
break;
case UPLOAD_ERR_INI_SIZE:
case UPLOAD_ERR_FORM_SIZE:
// TRANS: Exception thrown when too large a file is uploaded.
// TRANS: %s is the maximum file size, for example "500b", "10kB" or "2MB".
throw new Exception(sprintf(_('That file is too big. The maximum file size is %s.'),
ImageFile::maxFileSize()));
return;
@ -241,11 +243,16 @@ class ImageFile
$value = ImageFile::maxFileSizeInt();
if ($value > 1024 * 1024) {
return ($value/(1024*1024)) . _('MB');
$value = $value/(1024*1024);
// TRANS: Number of megabytes. %d is the number.
return sprintf(_m('%dMB','%dMB',$value),$value);
} else if ($value > 1024) {
return ($value/(1024)) . _('kB');
$value = $value/1024;
// TRANS: Number of kilobytes. %d is the number.
return sprintf(_m('%dkB','%dkB',$value),$value);
} else {
return $value;
// TRANS: Number of bytes. %d is the number.
return sprintf(_m('%dB','%dB',$value),$value);
}
}

View File

@ -57,8 +57,9 @@ class MailHandler
$msg = $this->cleanup_msg($msg);
$msg = common_shorten_links($msg);
if (Notice::contentTooLong($msg)) {
$this->error($from, sprintf(_('That\'s too long. '.
'Max notice size is %d chars.'),
$this->error($from, sprintf(_('That\'s too long. Maximum notice size is %d character.',
'That\'s too long. Maximum notice size is %d characters.',
Notice::maxContent()),
Notice::maxContent()));
}

View File

@ -20,13 +20,12 @@
if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
function ping_broadcast_notice($notice) {
if ($notice->is_local != Notice::LOCAL_PUBLIC && $notice->is_local != Notice::LOCAL_NONPUBLIC) {
return true;
}
if ($notice->is_local != Notice::LOCAL_PUBLIC && $notice->is_local != Notice::LOCAL_NONPUBLIC) {
return true;
}
# Array of servers, URL => type
$notify = common_config('ping', 'notify');
# Array of servers, URL => type
$notify = common_config('ping', 'notify');
try {
$profile = $notice->getProfile();
} catch (Exception $e) {
@ -35,21 +34,21 @@ function ping_broadcast_notice($notice) {
common_log(LOG_ERR, "Exception getting notice profile: " . $e->getMessage());
return true;
}
$tags = ping_notice_tags($notice);
$tags = ping_notice_tags($notice);
foreach ($notify as $notify_url => $type) {
switch ($type) {
case 'xmlrpc':
case 'extended':
$req = xmlrpc_encode_request('weblogUpdates.ping',
array($profile->nickname, # site name
common_local_url('showstream',
array('nickname' => $profile->nickname)),
common_local_url('shownotice',
array('notice' => $notice->id)),
common_local_url('userrss',
array('nickname' => $profile->nickname)),
$tags));
foreach ($notify as $notify_url => $type) {
switch ($type) {
case 'xmlrpc':
case 'extended':
$req = xmlrpc_encode_request('weblogUpdates.ping',
array($profile->nickname, # site name
common_local_url('showstream',
array('nickname' => $profile->nickname)),
common_local_url('shownotice',
array('notice' => $notice->id)),
common_local_url('userrss',
array('nickname' => $profile->nickname)),
$tags));
$request = HTTPClient::start();
$request->setConfig('connect_timeout', common_config('ping', 'timeout'));
@ -79,9 +78,8 @@ function ping_broadcast_notice($notice) {
"Ping success for $notify_url $notice->id");
}
break;
case 'get':
case 'post':
case 'get':
case 'post':
$args = array('name' => $profile->nickname,
'url' => common_local_url('showstream',
array('nickname' => $profile->nickname)),
@ -108,26 +106,25 @@ function ping_broadcast_notice($notice) {
"'$result->body'");
}
break;
default:
common_log(LOG_WARNING, 'Unknown notify type for ' . $notify_url . ': ' . $type);
default:
common_log(LOG_WARNING, 'Unknown notify type for ' . $notify_url . ': ' . $type);
}
}
}
return true;
}
function ping_notice_tags($notice) {
$tag = new Notice_tag();
$tag->notice_id = $notice->id;
$tags = array();
if ($tag->find()) {
while ($tag->fetch()) {
$tags[] = $tag->tag;
}
$tag->free();
unset($tag);
return implode('|', $tags);
}
return NULL;
$tag = new Notice_tag();
$tag->notice_id = $notice->id;
$tags = array();
if ($tag->find()) {
while ($tag->fetch()) {
$tags[] = $tag->tag;
}
$tag->free();
unset($tag);
return implode('|', $tags);
}
return NULL;
}

View File

@ -70,7 +70,6 @@ class SearchAction extends Action
* @return void
* @see SearchGroupNav
*/
function showLocalNav()
{
$nav = new SearchGroupNav($this, $this->trimmed('q'));
@ -127,6 +126,7 @@ class SearchAction extends Action
// TRANS: Used as a field label for the field where one or more keywords
// TRANS: for searching can be entered.
$this->input('q', _('Keyword(s)'), $q);
// TRANS: Button text for searching site.
$this->submit('search', _m('BUTTON','Search'));
$this->elementEnd('li');
$this->elementEnd('ul');
@ -138,7 +138,7 @@ class SearchAction extends Action
}
function searchSuggestions($q) {
// @todo FIXME: This formatting does not make this string get picked up by gettext.
// @todo FIXME: i18n issue: This formatting does not make this string get picked up by gettext.
// TRANS: Standard search suggestions shown when a search does not give any results.
$message = _(<<<E_O_T
* Make sure all words are spelled correctly.
@ -150,7 +150,7 @@ E_O_T
);
if (!common_config('site', 'private')) {
$qe = urlencode($q);
// @todo FIXME: This formatting does not make this string get picked up by gettext.
// @todo FIXME: i18n issue: This formatting does not make this string get picked up by gettext.
// TRANS: Standard search suggestions shown when a search does not give any results.
$message .= sprintf(_(<<<E_O_T

View File

@ -163,9 +163,10 @@ class ThemeUploader
$estSize = $blockSize * max(1, intval(ceil($size / $blockSize)));
$totalSize += $estSize;
if ($totalSize > $sizeLimit) {
$msg = sprintf(_("Uploaded theme is too large; " .
"must be less than %d bytes uncompressed."),
$sizeLimit);
$msg = sprintf(_m('Uploaded theme is too large; must be less than %d byte uncompressed.',
'Uploaded theme is too large; must be less than %d bytes uncompressed.',
$sizeLimit),
$sizeLimit);
throw new ClientException($msg);
}

View File

@ -51,7 +51,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
* @link http://status.net/
*/
abstract class UAPPlugin extends Plugin
{
public $mediumRectangle = null;
@ -66,7 +65,6 @@ abstract class UAPPlugin extends Plugin
*
* @return boolean hook flag
*/
function onEndShowStatusNetStyles($action)
{
// XXX: allow override by theme
@ -81,7 +79,6 @@ abstract class UAPPlugin extends Plugin
*
* @return boolean hook flag
*/
function onStartShowAside($action)
{
if (!is_null($this->mediumRectangle)) {
@ -95,6 +92,24 @@ abstract class UAPPlugin extends Plugin
$action->elementEnd('div');
}
// XXX: Hack to force ads to show on single-notice pages
if (!is_null($this->rectangle) &&
$action->trimmed('action') == 'shownotice') {
$action->elementStart('div', array('id' => 'aside_primary',
'class' => 'aside'));
if (Event::handle('StartShowSections', array($action))) {
$action->showSections();
Event::handle('EndShowSections', array($action));
}
$action->elementEnd('div');
return false;
}
return true;
}
@ -126,7 +141,6 @@ abstract class UAPPlugin extends Plugin
*
* @return boolean hook flag
*/
function onStartShowSections($action)
{
if (!is_null($this->rectangle)) {
@ -147,7 +161,6 @@ abstract class UAPPlugin extends Plugin
*
* @return boolean hook flag
*/
function onEndShowAside($action)
{
if (!is_null($this->wideSkyscraper)) {
@ -169,7 +182,6 @@ abstract class UAPPlugin extends Plugin
*
* @return void
*/
abstract protected function showMediumRectangle($action);
/**
@ -179,7 +191,6 @@ abstract class UAPPlugin extends Plugin
*
* @return void
*/
abstract protected function showRectangle($action);
/**
@ -189,7 +200,6 @@ abstract class UAPPlugin extends Plugin
*
* @return void
*/
abstract protected function showWideSkyscraper($action);
/**
@ -199,6 +209,5 @@ abstract class UAPPlugin extends Plugin
*
* @return void
*/
abstract protected function showLeaderboard($action);
}

View File

@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
*
* @see BlockForm
*/
class UnblockForm extends ProfileActionForm
{
/**
@ -52,7 +51,6 @@ class UnblockForm extends ProfileActionForm
*
* @return string Name of the action, lowercased.
*/
function target()
{
return 'unblock';
@ -63,11 +61,10 @@ class UnblockForm extends ProfileActionForm
*
* @return string Title of the form, internationalized
*/
function title()
{
// TRANS: Title for the form to unblock a user.
return _('Unblock');
return _m('TITLE','Unblock');
}
/**
@ -75,7 +72,6 @@ class UnblockForm extends ProfileActionForm
*
* @return string description of the form, internationalized
*/
function description()
{
// TRANS: Description of the form to unblock a user.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -10,14 +10,14 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-10-27 23:43+0000\n"
"PO-Revision-Date: 2010-10-27 23:46:09+0000\n"
"POT-Creation-Date: 2010-10-30 23:18+0000\n"
"PO-Revision-Date: 2010-10-30 23:20:58+0000\n"
"Language-Team: Brazilian Portuguese <http://translatewiki.net/wiki/Portal:pt-"
"br>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2010-10-20 17:58:21+0000\n"
"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n"
"X-POT-Import-Date: 2010-10-29 16:11:50+0000\n"
"X-Generator: MediaWiki 1.17alpha (r75708); Translate extension (2010-09-17)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: pt-br\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"
@ -80,7 +80,7 @@ msgstr "Código colocado dentro de um retângulo."
#: adsenseadminpanel.php:188
msgid "Leaderboard"
msgstr ""
msgstr "Classificação"
#: adsenseadminpanel.php:189
msgid "Leaderboard slot code"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Facebook\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-10-27 23:43+0000\n"
"PO-Revision-Date: 2010-10-27 23:46:35+0000\n"
"POT-Creation-Date: 2010-10-30 23:18+0000\n"
"PO-Revision-Date: 2010-10-30 23:21:30+0000\n"
"Language-Team: Dutch <http://translatewiki.net/wiki/Portal:nl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2010-10-23 18:57:01+0000\n"
"X-Generator: MediaWiki 1.17alpha (r75590); Translate extension (2010-09-17)\n"
"X-POT-Import-Date: 2010-10-29 16:12:45+0000\n"
"X-Generator: MediaWiki 1.17alpha (r75708); Translate extension (2010-09-17)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: nl\n"
"X-Message-Group: #out-statusnet-plugin-facebook\n"
@ -37,7 +37,7 @@ msgid ""
msgstr ""
"Hallo %1$s.\n"
"\n"
"Het spijt ons je te moeten meedelen dat het niet mogelijk is uw "
"Het spijt ons u te moeten meedelen dat het niet mogelijk is uw "
"Facebookstatus bij te werken vanuit %2$s. De Facebookapplicatie is "
"uitgeschakeld voor uw gebruiker. Dit kan komen doordat u de toegangsrechten "
"voor de Facebookapplicatie hebt ingetrokken of omdat u uw Facebookgebruiker "

View File

@ -550,7 +550,8 @@ class Ostatus_profile extends Managed_DataObject
// We mark up the attachment link specially for the HTML output
// so we can fold-out the full version inline.
// TRANS: Shown when a notice is longer than supported and/or when attachments are present.
// @fixme I18N this tooltip will be saved with the site's default language
// TRANS: Shown when a notice is longer than supported and/or when attachments are present. At runtime this will usually be replaced with localized text from StatusNet core messages.
$showMoreText = _m('Show more');
$attachUrl = common_local_url('attachment',
array('attachment' => $attachment->id));

View File

@ -5,6 +5,6 @@
* Pause ~ retain up to 50-100 most recent notices
* Add geo data
* Make it work for Conversation page (perhaps a little tricky)
* IE is updating the counter in document title all the time (Not sure if this is still an issue)
* IE is updating the counter in document title all the time (Not sure if this
is still an issue)
* Reconsider the timestamp approach

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
* @link http://status.net/
*/
class RealtimePlugin extends Plugin
{
protected $replyurl = null;
@ -326,6 +325,32 @@ class RealtimePlugin extends Plugin
return array('plugins/Realtime/realtimeupdate.js');
}
/**
* Export any i18n messages that need to be loaded at runtime...
*
* @param Action $action
* @param array $messages
*
* @return boolean hook return value
*/
function onEndScriptMessages($action, &$messages)
{
// TRANS: Text label for realtime view "play" button, usually replaced by an icon.
$messages['realtime_play'] = _m('BUTTON', 'Play');
// TRANS: Tooltip for realtime view "play" button.
$messages['realtime_play_tooltip'] = _m('TOOLTIP', 'Play');
// TRANS: Text label for realtime view "pause" button
$messages['realtime_pause'] = _m('BUTTON', 'Pause');
// TRANS: Tooltip for realtime view "pause" button
$messages['realtime_pause_tooltip'] = _m('TOOLTIP', 'Pause');
// TRANS: Text label for realtime view "popup" button, usually replaced by an icon.
$messages['realtime_popup'] = _m('BUTTON', 'Pop up');
// TRANS: Tooltip for realtime view "popup" button.
$messages['realtime_popup_tooltip'] = _m('TOOLTIP', 'Pop up in a window');
return true;
}
function _updateInitialize($timeline, $user_id)
{
return "RealtimeUpdate.init($user_id, \"$this->replyurl\", \"$this->favorurl\", \"$this->repeaturl\", \"$this->deleteurl\"); ";

View File

@ -0,0 +1,53 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-11-02 19:46+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#. TRANS: Text label for realtime view "play" button, usually replaced by an icon.
#: RealtimePlugin.php:339
msgctxt "BUTTON"
msgid "Play"
msgstr ""
#. TRANS: Tooltip for realtime view "play" button.
#: RealtimePlugin.php:341
msgctxt "TOOLTIP"
msgid "Play"
msgstr ""
#. TRANS: Text label for realtime view "pause" button
#: RealtimePlugin.php:343
msgctxt "BUTTON"
msgid "Pause"
msgstr ""
#. TRANS: Tooltip for realtime view "pause" button
#: RealtimePlugin.php:345
msgctxt "TOOLTIP"
msgid "Pause"
msgstr ""
#. TRANS: Text label for realtime view "popup" button, usually replaced by an icon.
#: RealtimePlugin.php:347
msgctxt "BUTTON"
msgid "Pop up"
msgstr ""
#. TRANS: Tooltip for realtime view "popup" button.
#: RealtimePlugin.php:349
msgctxt "TOOLTIP"
msgid "Pop up in a window"
msgstr ""

View File

@ -35,7 +35,6 @@ width:70%;
margin-left:1%;
}
#notices_primary {
position:relative;
}
@ -75,4 +74,3 @@ line-height:1.2;
#showstream #notices_primary {
margin-top: 18px;
}

View File

@ -261,9 +261,10 @@ RealtimeUpdate = {
RealtimeUpdate.addNoticesHover();
$('#realtime_playpause').remove();
$('#realtime_actions').prepend('<li id="realtime_playpause"><button id="realtime_pause" class="pause" title="Pause">Pause</button></li>');
$('#realtime_pause').bind('click', function() {
$('#realtime_actions').prepend('<li id="realtime_playpause"><button id="realtime_pause" class="pause"></button></li>');
$('#realtime_pause').text(SN.msg('realtime_pause'))
.attr('title', SN.msg('realtime_pause_tooltip'))
.bind('click', function() {
RealtimeUpdate.removeNoticesHover();
RealtimeUpdate.showPlay();
return false;
@ -274,9 +275,10 @@ RealtimeUpdate = {
{
RealtimeUpdate.setPause(true);
$('#realtime_playpause').remove();
$('#realtime_actions').prepend('<li id="realtime_playpause"><span id="queued_counter"></span> <button id="realtime_play" class="play" title="Play">Play</button></li>');
$('#realtime_play').bind('click', function() {
$('#realtime_actions').prepend('<li id="realtime_playpause"><span id="queued_counter"></span> <button id="realtime_play" class="play"></button></li>');
$('#realtime_play').text(SN.msg('realtime_play'))
.attr('title', SN.msg('realtime_play_tooltip'))
.bind('click', function() {
RealtimeUpdate.showPause();
return false;
});
@ -334,10 +336,11 @@ RealtimeUpdate = {
initAddPopup: function(url, timeline, path)
{
$('#realtime_timeline').append('<button id="realtime_popup" title="Pop up in a window">Pop up</button>');
$('#realtime_popup').bind('click', function() {
window.open(url,
$('#realtime_timeline').append('<button id="realtime_popup"></button>');
$('#realtime_popup').text(SN.msg('realtime_popup'))
.attr('title', SN.msg('realtime_popup_tooltip'))
.bind('click', function() {
window.open(url,
'',
'toolbar=no,resizable=yes,scrollbars=yes,status=no,menubar=no,personalbar=no,location=no,width=500,height=550');

View File

@ -0,0 +1,30 @@
# Translation of StatusNet - XCache to Finnish (Suomi)
# Expored from translatewiki.net
#
# Author: Centerlink
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - XCache\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2010-10-30 23:18+0000\n"
"PO-Revision-Date: 2010-10-30 23:23:06+0000\n"
"Language-Team: Finnish <http://translatewiki.net/wiki/Portal:fi>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2010-10-29 16:14:46+0000\n"
"X-Generator: MediaWiki 1.17alpha (r75708); Translate extension (2010-09-17)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: fi\n"
"X-Message-Group: #out-statusnet-plugin-xcache\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: XCachePlugin.php:120
msgid ""
"Use the <a href=\"http://xcache.lighttpd.net/\">XCache</a> variable cache to "
"cache query results."
msgstr ""
"Käytä <a href=\"http://xcache.lighttpd.net/\">XCache</a>-muuttujavälimuistia "
"kyselyn tulosten tallentamiseksi välimuistiin."

57
scripts/make-release.php Normal file
View File

@ -0,0 +1,57 @@
#!/usr/bin/env php
<?php
/*
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2010, StatusNet, Inc.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
# Abort if called from a web server
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
require_once INSTALLDIR.'/scripts/commandline.inc';
$base = INSTALLDIR;
$encBase = escapeshellarg($base);
$ver = STATUSNET_VERSION;
// @fixme hack
if (preg_match('/^(\d+)\.(\d+)\.(\d+)/', $ver, $matches)) {
list(, $a, $b, $c) = $matches;
if ($c > '0') {
$cprime = $c - 1;
$prev = "$a.$b.$cprime";
} else {
die("This is a .0 release; you need to provide a thingy.\n");
}
}
$tag = $ver;
$prefix = "statusnet-$tag";
$target = "$prefix.tar.gz";
$cmd = <<<END
(cd $encBase && git archive --prefix=$prefix/ $tag | gzip > /tmp/$target) && \
(cd /tmp && tar zxf $target && cd $prefix && make) && \
(cd $encBase && git log --oneline {$prev}..{$tag} > /tmp/$prefix/Changelog) && \
(cd /tmp && tar zcf $target $prefix) && \
(cd /tmp && rm -rf $prefix) && \
(mv /tmp/$target .)
END;
echo $cmd;
echo "\n";