GitHost.io will be shut down on June 1, 2019. At that point this instance will be unreachable and all data will be irrevocably deleted. More details at https://about.gitlab.com/gitlab-hosted/#githost-is-shutting-down-on-june-1st-2019

Commit 2640232c authored by Siebrand Mazeland's avatar Siebrand Mazeland

Update translator documentation.

L10n and i18n updates.
Break long lines in README before or at 80 characters.
Superfluous whitespace removed.
parent f9f437f5
......@@ -108,6 +108,7 @@ class EchoPlugin extends Plugin
'author' => 'Zach Copley',
'homepage' => 'http://status.net/wiki/Plugin:Echo',
'rawdescription' =>
// TRANS: Plugin description.
_m('Use <a href="http://aboutecho.com/">Echo</a>'.
' to add commenting to notice pages.'));
return true;
......
......@@ -57,6 +57,7 @@ class EmailAuthenticationPlugin extends Plugin
'author' => 'Craig Andrews',
'homepage' => 'http://status.net/wiki/Plugin:EmailAuthentication',
'rawdescription' =>
// TRANS: Plugin description.
_m('The Email Authentication plugin allows users to login using their email address.'));
return true;
}
......
The Email Authentication plugin allows users to login using their email address.
The provided email address is used to lookup the user's nickname, then that nickname and the provided password is checked.
The provided email address is used to lookup the user's nickname, then that
nickname and the provided password is checked.
Installation
============
add "addPlugin('emailAuthentication');" to the bottom of your config.php
add "addPlugin('emailAuthentication');" to the bottom of your config.php.
......@@ -43,7 +43,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
class EmailSummaryPlugin extends Plugin
{
/**
......@@ -51,13 +50,11 @@ class EmailSummaryPlugin extends Plugin
*
* @return boolean hook value
*/
function onCheckSchema()
{
$schema = Schema::get();
// For storing user-submitted flags on profiles
$schema->ensureTable('email_summary_status',
array(new ColumnDef('user_id', 'integer', null,
false, 'PRI'),
......@@ -80,9 +77,8 @@ class EmailSummaryPlugin extends Plugin
* @param string $cls Name of the class to be loaded
*
* @return boolean hook value; true means continue processing, false means stop.
*
*
*/
function onAutoload($cls)
{
$dir = dirname(__FILE__);
......@@ -107,9 +103,7 @@ class EmailSummaryPlugin extends Plugin
* @param array &$versions array of version data
*
* @return boolean hook value; true means continue processing, false means stop.
*
*/
function onPluginVersion(&$versions)
{
$versions[] = array('name' => 'EmailSummary',
......@@ -117,86 +111,84 @@ class EmailSummaryPlugin extends Plugin
'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:EmailSummary',
'rawdescription' =>
// TRANS: Plugin description.
_m('Send an email summary of the inbox to users.'));
return true;
}
/**
* Register our queue handlers
*
*
* @param QueueManager $qm Current queue manager
*
*
* @return boolean hook value
*/
function onEndInitializeQueueManager($qm)
{
$qm->connect('sitesum', 'SiteEmailSummaryHandler');
$qm->connect('usersum', 'UserEmailSummaryHandler');
return true;
}
/**
* Add a checkbox to turn off email summaries
*
*
* @param Action $action Action being executed (emailsettings)
*
*
* @return boolean hook value
*/
function onEndEmailFormData($action)
{
$user = common_current_user();
$action->elementStart('li');
$action->checkbox('emailsummary',
// TRANS: Checkbox label in e-mail preferences form.
_m('Send me a periodic summary of updates from my network.'),
_m('Send me a periodic summary of updates from my network'),
Email_summary_status::getSendSummary($user->id));
$action->elementEnd('li');
return true;
}
/**
* Add a checkbox to turn off email summaries
*
*
* @param Action $action Action being executed (emailsettings)
*
*
* @return boolean hook value
*/
function onEndEmailSaveForm($action)
{
$sendSummary = $action->boolean('emailsummary');
$user = common_current_user();
if (!empty($user)) {
$ess = Email_summary_status::staticGet('user_id', $user->id);
if (empty($ess)) {
$ess = new Email_summary_status();
$ess->user_id = $user->id;
$ess->send_summary = $sendSummary;
$ess->created = common_sql_now();
$ess->modified = common_sql_now();
$ess->insert();
} else {
$orig = clone($ess);
$ess->send_summary = $sendSummary;
$ess->modified = common_sql_now();
$ess->update($orig);
}
}
return true;
}
}
......@@ -35,7 +35,7 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
/**
* Data class for email summaries
*
*
* Email summary information for users
*
* @category Action
......@@ -46,7 +46,6 @@ require_once INSTALLDIR . '/classes/Memcached_DataObject.php';
*
* @see DB_DataObject
*/
class Email_summary_status extends Memcached_DataObject
{
public $__table = 'email_summary_status'; // table name
......@@ -78,7 +77,6 @@ class Email_summary_status extends Memcached_DataObject
*
* @return array array of column definitions
*/
function table()
{
return array('user_id' => DB_DATAOBJECT_INT + DB_DATAOBJECT_NOTNULL,
......@@ -93,7 +91,6 @@ class Email_summary_status extends Memcached_DataObject
*
* @return array list of key field names
*/
function keys()
{
return array_keys($this->keyTypes());
......@@ -121,7 +118,6 @@ class Email_summary_status extends Memcached_DataObject
*
* @return array magic three-false array that stops auto-incrementing.
*/
function sequenceKey()
{
return array(false, false, false);
......@@ -134,7 +130,6 @@ class Email_summary_status extends Memcached_DataObject
*
* @return int flag for whether to send this user a summary email
*/
static function getSendSummary($user_id)
{
$ess = Email_summary_status::staticGet('user_id', $user_id);
......@@ -153,11 +148,10 @@ class Email_summary_status extends Memcached_DataObject
*
* @return Email_summary_status instance for this user, with count already incremented.
*/
static function getLastSummaryID($user_id)
{
$ess = Email_summary_status::staticGet('user_id', $user_id);
if (!empty($ess)) {
return $ess->last_summary_id;
} else {
......
<?php
/*
* StatusNet - the distributed open-source microblogging tool
*
*
* Handler for queue items of type 'sitesum', sends email summaries
* to all users on the site.
*
......@@ -31,7 +31,7 @@ if (!defined('STATUSNET')) {
}
/**
*
*
* Handler for queue items of type 'sitesum', sends email summaries
* to all users on the site.
*
......@@ -42,7 +42,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
class SiteEmailSummaryHandler extends QueueHandler
{
......@@ -55,7 +54,6 @@ class SiteEmailSummaryHandler extends QueueHandler
*
* @return string
*/
function transport()
{
return 'sitesum';
......@@ -63,21 +61,20 @@ class SiteEmailSummaryHandler extends QueueHandler
/**
* Handle the site
*
*
* @param mixed $object
* @return boolean true on success, false on failure
*/
function handle($object)
{
$qm = QueueManager::get();
try {
// Enqueue a summary for all users
$user = new User();
$user->find();
while ($user->fetch()) {
try {
$qm->enqueue($user->id, 'usersum');
......@@ -89,8 +86,7 @@ class SiteEmailSummaryHandler extends QueueHandler
} catch (Exception $e) {
common_log(LOG_WARNING, $e->getMessage());
}
return true;
}
}
<?php
/**
* StatusNet - the distributed open-source microblogging tool
*
*
* Handler for queue items of type 'usersum', sends an email summaries
* to a particular user.
*
......@@ -41,13 +41,11 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
class UserEmailSummaryHandler extends QueueHandler
{
// Maximum number of notices to include by default. This is probably too much.
const MAX_NOTICES = 200;
/**
* Return transport keyword which identifies items this queue handler
* services; must be defined for all subclasses.
......@@ -57,7 +55,6 @@ class UserEmailSummaryHandler extends QueueHandler
*
* @return string
*/
function transport()
{
return 'sitesum';
......@@ -65,47 +62,46 @@ class UserEmailSummaryHandler extends QueueHandler
/**
* Send a summary email to the user
*
*
* @param mixed $object
* @return boolean true on success, false on failure
*/
function handle($user_id)
{
// Skip if they've asked not to get summaries
$ess = Email_summary_status::staticGet('user_id', $user_id);
if (!empty($ess) && !$ess->send_summary) {
common_log(LOG_INFO, sprintf('Not sending email summary for user %s by request.', $user_id));
return true;
}
$since_id = null;
if (!empty($ess)) {
$since_id = $ess->last_summary_id;
}
$user = User::staticGet('id', $user_id);
if (empty($user)) {
common_log(LOG_INFO, sprintf('Not sending email summary for user %s; no such user.', $user_id));
return true;
}
if (empty($user->email)) {
common_log(LOG_INFO, sprintf('Not sending email summary for user %s; no email address.', $user_id));
return true;
}
$profile = $user->getProfile();
if (empty($profile)) {
common_log(LOG_WARNING, sprintf('Not sending email summary for user %s; no profile.', $user_id));
return true;
}
$notice = $user->ownFriendsTimeline(0, self::MAX_NOTICES, $since_id);
if (empty($notice) || $notice->N == 0) {
......@@ -117,18 +113,20 @@ class UserEmailSummaryHandler extends QueueHandler
// figuring out a better way. -ESP
$new_top = null;
if ($notice instanceof ArrayWrapper) {
$new_top = $notice->_items[0]->id;
}
$out = new XMLStringer();
$out->elementStart('div', array('width' => '100%',
'style' => 'background-color: #ffffff; border: 4px solid #4c609a; padding: 10px;'));
$out->elementStart('div', array('style' => 'color: #ffffff; background-color: #4c609a; font-weight: bold; margin-bottom: 10px; padding: 4px;'));
$out->raw(sprintf(_m('Recent updates from %1s for %2s:'),
// TRANS: Text in e-mail summary.
// TRANS: %1$s is the StatusNet sitename, %2$s is the recipient's profile name.
$out->raw(sprintf(_m('Recent updates from %1$s for %2s:'),
common_config('site', 'name'),
$profile->getBestName()));
$out->elementEnd('div');
......@@ -137,13 +135,12 @@ class UserEmailSummaryHandler extends QueueHandler
'style' => 'border: none; border-collapse: collapse;', 'cellpadding' => '6'));
while ($notice->fetch()) {
$profile = Profile::staticGet('id', $notice->profile_id);
if (empty($profile)) {
continue;
}
$avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
$out->elementStart('tr');
......@@ -191,7 +188,7 @@ class UserEmailSummaryHandler extends QueueHandler
$out->elementEnd('td');
$out->elementEnd('tr');
}
$out->elementEnd('table');
$out->raw(sprintf(_m('<p><a href="%1s">change your email settings for %2s</a></p>'),
......@@ -199,35 +196,32 @@ class UserEmailSummaryHandler extends QueueHandler
common_config('site', 'name')));
$out->elementEnd('div');
$body = $out->getString();
// FIXME: do something for people who don't like HTML email
mail_to_user($user, _m('Updates from your network'), $body,
array('Content-Type' => 'text/html; charset=UTF-8'));
if (empty($ess)) {
$ess = new Email_summary_status();
$ess->user_id = $user_id;
$ess->created = common_sql_now();
$ess->last_summary_id = $new_top;
$ess->modified = common_sql_now();
$ess->insert();
} else {
$orig = clone($ess);
$ess->last_summary_id = $new_top;
$ess->modified = common_sql_now();
$ess->update($orig);
}
return true;
}
}
......@@ -23,7 +23,7 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
/**
* Queue handler for watching new notices and posting to enjit.
* @fixme is this actually being used/functional atm?
* @todo FIXME: Is this actually being used/functional atm?
*/
class EnjitQueueHandler extends QueueHandler
{
......
......@@ -105,7 +105,6 @@ class EventPlugin extends MicroappPlugin
*
* @return boolean hook value; true means continue processing, false means stop.
*/
function onRouterInitialized($m)
{
$m->connect('main/event/new',
......@@ -130,12 +129,14 @@ class EventPlugin extends MicroappPlugin
'author' => 'Evan Prodromou',
'homepage' => 'http://status.net/wiki/Plugin:Event',
'description' =>
// TRANS: Plugin description.
_m('Event invitations and RSVPs.'));
return true;
}
function appTitle() {
return _m('Event');
// TRANS: Title for event application.
return _m('TITLE','Event');
}
function tag() {
......@@ -162,12 +163,13 @@ class EventPlugin extends MicroappPlugin
function saveNoticeFromActivity($activity, $actor, $options=array())
{
if (count($activity->objects) != 1) {
throw new Exception('Too many activity objects.');
throw new Exception(_('Too many activity objects.'));
}
$happeningObj = $activity->objects[0];
if ($happeningObj->type != Happening::OBJECT_TYPE) {
// TRANS: Exception thrown when event plugin comes across a non-event type object.
throw new Exception(_m('Wrong type for object.'));
}
......@@ -175,8 +177,8 @@ class EventPlugin extends MicroappPlugin
switch ($activity->verb) {
case ActivityVerb::POST:
$notice = Happening::saveNew($actor,
$start_time,
$notice = Happening::saveNew($actor,
$start_time,
$end_time,
$happeningObj->title,
null,
......@@ -189,12 +191,14 @@ class EventPlugin extends MicroappPlugin
$happening = Happening::staticGet('uri', $happeningObj->id);
if (empty($happening)) {
// FIXME: save the event
// TRANS: Exception thrown when trying to RSVP for an unknown event.
throw new Exception(_m('RSVP for unknown event.'));
}
$notice = RSVP::saveNew($actor, $happening, $activity->verb, $options);
break;
default:
throw new Exception(_m('Unknown verb for events'));
// TRANS: Exception thrown when event plugin comes across a undefined verb.
throw new Exception(_m('Unknown verb for events.'));
}
return $notice;
......@@ -207,7 +211,6 @@ class EventPlugin extends MicroappPlugin
*
* @return ActivityObject
*/
function activityObjectFromNotice($notice)
{
$happening = null;
......@@ -225,12 +228,14 @@ class EventPlugin extends MicroappPlugin
}
if (empty($happening)) {
// TRANS: Exception thrown when event plugin comes across a unknown object type.
throw new Exception(_m('Unknown object type.'));
}
$notice = $happening->getNotice();
if (empty($notice)) {
// TRANS: Exception thrown when referring to a notice that is not an event an in event context.
throw new Exception(_m('Unknown event notice.'));
}
......@@ -264,7 +269,6 @@ class EventPlugin extends MicroappPlugin
*
* @return ActivityObject
*/
function onEndNoticeAsActivity($notice, &$act) {
switch ($notice->object_type) {
case RSVP::POSITIVE:
......@@ -282,7 +286,6 @@ class EventPlugin extends MicroappPlugin
* @param Notice $notice
* @param HTMLOutputter $out
*/
function showNotice($notice, $out)
{
switch ($notice->object_type) {
......@@ -365,6 +368,7 @@ class EventPlugin extends MicroappPlugin
$out->elementStart('div', 'event-times'); // VEVENT/EVENT-TIMES IN
// TRANS: Field label for event description.
$out->element('strong', null, _m('Time:'));
$out->element('abbr', array('class' => 'dtstart',
......@@ -385,6 +389,7 @@ class EventPlugin extends MicroappPlugin
if (!empty($event->location)) {
$out->elementStart('div', 'event-location');
// TRANS: Field label for event description.
$out->element('strong', null, _m('Location:'));
$out->element('span', 'location', $event->location);
$out->elementEnd('div');
......@@ -392,6 +397,7 @@ class EventPlugin extends MicroappPlugin
if (!empty($event->description)) {
$out->elementStart('div', 'event-description');
// TRANS: Field label for event description.
$out->element('strong', null, _m('Description:'));
$out->element('span', 'description', $event->description);
$out->elementEnd('div');
......@@ -400,6 +406,7 @@ class EventPlugin extends MicroappPlugin
$rsvps = $event->getRSVPs();
$out->elementStart('div', 'event-rsvps');
// TRANS: Field label for event description.
$out->element('strong', null, _m('Attending:'));
$out->element('span', 'event-rsvps',
// TRANS: RSVP counts.
......@@ -433,7 +440,6 @@ class EventPlugin extends MicroappPlugin
* @param HTMLOutputter $out
* @return Widget
*/
function entryForm($out)
{
return new EventForm($out);
......@@ -444,7 +450,6 @@ class EventPlugin extends MicroappPlugin
*
* @param Notice $notice
*/
function deleteRelated($notice)
{
switch ($notice->object_type) {
......
......@@ -47,7 +47,6 @@ if (!defined('STATUSNET')) {
*
* @see Managed_DataObject
*/
class Happening extends Managed_DataObject
{
const OBJECT_TYPE = 'http://activitystrea.ms/schema/1.0/event';
......@@ -122,6 +121,7 @@ class Happening extends Managed_DataObject
if (array_key_exists('uri', $options)) {
$other = Happening::staticGet('uri', $options['uri']);
if (!empty($other)) {
// TRANS: Client exception thrown when trying to create an event that already exists.
throw new ClientException(_m('Event already exists.'));
}
}
......@@ -163,6 +163,9 @@ class Happening extends Managed_DataObject
$location,
$description);
// TRANS: Rendered event description. %1$s is a title, %2$s is start time, %3$s is start time,
// TRANS: %4$s is end time, %5$s is end time, %6$s is location, %7$s is description.
// TRANS: Class names should not be translated.
$rendered = sprintf(_m('<span class="vevent">'.
'<span class="summary">%1$s</span> '.
'<abbr class="dtstart" title="%2$s">%3$s</a> - '.
......
......@@ -42,7 +42,6 @@ if (!defined('STATUSNET')) {
*
* @see Managed_DataObject
*/
class RSVP extends Managed_DataObject
{
const POSITIVE = 'http://activitystrea.ms/schema/1.0/rsvp-yes';
......@@ -64,7 +63,6 @@ class RSVP extends Managed_DataObject
* @param mixed $v Value to lookup
*
* @return RSVP object found, or null for no hits
*
*/
function staticGet($k, $v=null)
{
......@@ -77,7 +75,6 @@ class RSVP extends Managed_DataObject
* @param array $kv array of key-value mappings
*
* @return Bookmark object found, or null for no hits
*
*/
function pkeyGet($kv)
......@@ -141,6 +138,7 @@ class RSVP extends Managed_DataObject
if (array_key_exists('uri', $options)) {
$other = RSVP::staticGet('uri', $options['uri']);
if (!empty($other)) {
// TRANS: Client exception thrown when trying to save an already existing RSVP ("please respond").
throw new ClientException(_m('RSVP already exists.'));
}
}
......@@ -149,6 +147,7 @@ class RSVP extends Managed_DataObject
'event_id' => $event->id));
if (!empty($other)) {
// TRANS: Client exception thrown when trying to save an already existing RSVP ("please respond").
throw new ClientException(_m('RSVP already exists.'));
}
......@@ -179,7 +178,7 @@ class RSVP extends Managed_DataObject
// XXX: come up with something sexier
$content = $rsvp->asString();
$rendered = $rsvp->asHTML();
$options = array_merge(array('object_type' => $verb),
......@@ -217,7 +216,8 @@ class RSVP extends Managed_DataObject
return '?';
break;
default:
throw new Exception(sprintf(_m('Unknown verb "%s"'),$verb));
// TRANS: Exception thrown when requesting an undefined verb for RSVP.
throw new Exception(sprintf(_m('Unknown verb "%s".'),$verb));
}
}
......@@ -234,6 +234,7 @@ class RSVP extends Managed_DataObject
return RSVP::POSSIBLE;
break;
default:
// TRANS: Exception thrown when requesting an undefined code for RSVP.
throw new Exception(sprintf(_m('Unknown code "%s".'),$code));
}
}
......@@ -242,6 +243,8 @@ class RSVP extends Managed_DataObject
{
$notice = Notice::staticGet('uri', $this->uri);
if (empty($notice)) {
// TRANS: Server exception thrown when requesting a non-exsting notice for an RSVP ("please respond").
// TRANS: %s is the RSVP with the missing notice.
throw new ServerException(sprintf(_m('RSVP %s does not correspond to a notice in the database.'),$this->id));
}
return $notice;
......@@ -297,6 +300,8 @@ class RSVP extends Managed_DataObject
{
$profile = Profile::staticGet('id', $this->profile_id);
if (empty($profile)) {
// TRANS: Exception thrown when requesting a non-existing profile.
// TRANS: %s is the ID of the non-existing profile.
throw new Exception(sprintf(_m('No profile with ID %s.'),$this->profile_id));
}
return $profile;
......@@ -306,6 +311,8 @@ class RSVP extends Managed_DataObject
{
$event = Happening::staticGet('id', $this->event_id);
if (empty($event)) {
// TRANS: Exception thrown when requesting a non-existing event.
// TRANS: %s is the ID of the non-existing event.
throw new Exception(sprintf(_m('No event with ID %s.'),$this->event_id));