We are no longer offering accounts on this server. Consider https://gitlab.freedesktop.org/ as a place to host projects.

Commit 0925b968 authored by Evan Prodromou's avatar Evan Prodromou

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

parents 8df3fcd1 aad3372d
......@@ -189,7 +189,7 @@ class ApiListsAction extends ApiBareAuthAction
// there is no argument named count
$count = 20;
$profile = $this->user->getProfile();
$fn = array($profile, 'getOwnedTags');
$fn = array($profile, 'getLists');
list($this->lists,
$this->next_cursor,
......
......@@ -47,12 +47,12 @@ class EditpeopletagAction extends OwnerDesignAction
function title()
{
if ($_SERVER['REQUEST_METHOD'] == 'POST' && $this->boolean('delete')) {
// TRANS: Title for edit people tag page after deleting a tag.
// TRANS: %s is a tag.
// TRANS: Title for edit list page after deleting a tag.
// TRANS: %s is a list.
return sprintf(_('Delete %s list'), $this->peopletag->tag);
}
// TRANS: Title for edit people tag page.
// TRANS: %s is a tag.
// TRANS: Title for edit list page.
// TRANS: %s is a list.
return sprintf(_('Edit list %s'), $this->peopletag->tag);
}
......@@ -105,7 +105,7 @@ class EditpeopletagAction extends OwnerDesignAction
}
if (!$this->peopletag) {
// TRANS: Client error displayed when referring to a non-exsting people tag.
// TRANS: Client error displayed when referring to a non-exsting list.
$this->clientError(_('No such list.'), 404);
return false;
}
......@@ -215,7 +215,7 @@ class EditpeopletagAction extends OwnerDesignAction
$this->element('p', 'instructions', $this->confirm);
} else {
$this->element('p', 'instructions',
// TRANS: Form instruction for edit people tag form.
// TRANS: Form instruction for edit list form.
_('Use this form to edit the list.'));
}
}
......@@ -293,7 +293,7 @@ class EditpeopletagAction extends OwnerDesignAction
if (!$result) {
common_log_db_error($this->group, 'UPDATE', __FILE__);
// TRANS: TRANS: Server error displayed when updating a people tag fails.
// TRANS: TRANS: Server error displayed when updating a list fails.
$this->serverError(_('Could not update list.'));
}
......
......@@ -70,7 +70,7 @@ class PeopletagautocompleteAction extends Action
}
$profile = $this->user->getProfile();
$tags = $profile->getOwnedTags(common_current_user());
$tags = $profile->getLists(common_current_user());
$this->tags = array();
while ($tags->fetch()) {
......@@ -88,7 +88,7 @@ class PeopletagautocompleteAction extends Action
$this->tags[] = $arr;
}
$tags->free();
$tags = NULL;
return true;
}
......
......@@ -92,7 +92,7 @@ class PeopletaggedAction extends OwnerDesignAction
$this->peopletag = Profile_list::pkeyGet(array('tagger' => $user->id, 'tag' => $tag));
if (!$this->peopletag) {
// TRANS: Client error displayed when referring to non-existing people tag.
// TRANS: Client error displayed when referring to a non-existing list.
$this->clientError(_('No such list.'), 404);
return false;
}
......@@ -103,13 +103,13 @@ class PeopletaggedAction extends OwnerDesignAction
function title()
{
if ($this->page == 1) {
// TRANS: Title for list of people tagged by the user with a tag.
// TRANS: %1$s is a tag, %2$s is a username.
// TRANS: Title for list of people listed by the user.
// TRANS: %1$s is a list, %2$s is a username.
return sprintf(_('People listed in %1$s by %2$s'),
$this->peopletag->tag, $this->tagger->nickname);
} else {
// TRANS: Title for list of people tagged by the user with a tag.
// TRANS: %1$s is a tag, %2$s is a username, %2$s is a page number.
// TRANS: Title for list of people listed by the user.
// TRANS: %1$s is a list, %2$s is a username, %2$s is a page number.
return sprintf(_('People listed in %1$s by %2$s, page %3$d'),
$this->peopletag->tag, $this->user->nickname,
$this->page);
......
......@@ -114,7 +114,7 @@ class PeopletagsbyuserAction extends OwnerDesignAction
$user = common_current_user();
if ($this->arg('public')) {
$this->tags = $this->tagger->getOwnedTags(false, $offset, $limit);
$this->tags = $this->tagger->getLists(false, $offset, $limit);
} else if ($this->arg('private')) {
if (empty($user)) {
// TRANS: Error message displayed when trying to perform an action that requires a logged in user.
......@@ -128,7 +128,7 @@ class PeopletagsbyuserAction extends OwnerDesignAction
$this->clientError(_('You cannot view others\' private lists'), 403);
}
} else {
$this->tags = $this->tagger->getOwnedTags(common_current_user(), $offset, $limit);
$this->tags = $this->tagger->getLists(common_current_user(), $offset, $limit);
}
return true;
}
......
......@@ -102,7 +102,7 @@ class PeopletagsforuserAction extends OwnerDesignAction
function showAnonymousMessage()
{
$notice =
// TRANS: Message displayed for anonymous users on page that displays people tags for a user.
// TRANS: Message displayed for anonymous users on page that displays lists for a user.
// TRANS: This message contains Markdown links in the form [description](links).
// TRANS: %s is a tagger nickname.
sprintf(_('These are lists for **%s**. ' .
......@@ -138,7 +138,7 @@ class PeopletagsforuserAction extends OwnerDesignAction
function showEmptyListMessage()
{
// TRANS: Message displayed on page that displays people tags for a user when there are none.
// TRANS: Message displayed on page that displays lists for a user when there are none.
// TRANS: This message contains Markdown links in the form [description](links).
// TRANS: %s is a tagger nickname.
$message = sprintf(_('%s has not been [listed](%%%%doc.lists%%%%) by anyone yet.'), $this->tagged->nickname);
......
......@@ -46,11 +46,11 @@ class PeopletagsubscriptionsAction extends OwnerDesignAction
function title()
{
if ($this->page == 1) {
// TRANS: Title for page that displays people tags subscribed to by a user.
// TRANS: Title for page that displays lists subscribed to by a user.
// TRANS: %s is a profile nickname.
return sprintf(_('Lists subscribed to by %s'), $this->profile->nickname);
} else {
// TRANS: Title for page that displays people tags subscribed to by a user.
// TRANS: Title for page that displays lists subscribed to by a user.
// TRANS: %1$s is a profile nickname, %2$d is a page number.
return sprintf(_('Lists subscribed to by %1$s, page %2$d'), $this->profile->nickname, $this->page);
}
......@@ -104,7 +104,7 @@ class PeopletagsubscriptionsAction extends OwnerDesignAction
function showAnonymousMessage()
{
$notice =
// TRANS: Message displayed for anonymous users on page that displays people tags subscribed to by a user.
// TRANS: Message displayed for anonymous users on page that displays lists subscribed to by a user.
// TRANS: This message contains Markdown links in the form [description](links).
// TRANS: %s is a profile nickname.
sprintf(_('These are lists subscribed to by **%s**. ' .
......
......@@ -606,7 +606,6 @@ class RegisterAction extends Action
function showSuccessContent()
{
if (Event::handle('onStartRegisterSuccess', array($this))) {
$nickname = $this->arg('nickname');
$profileurl = common_local_url('showstream',
......
......@@ -120,7 +120,7 @@ class ShowprofiletagAction extends Action
{
if ($this->page > 1) {
if($this->peopletag->private) {
// TRANS: Title for private people tag timeline.
// TRANS: Title for private list timeline.
// TRANS: %1$s is a people tag, %2$s is a page number.
return sprintf(_('Private timeline for %1$s list by you, page %2$d'),
$this->peopletag->tag, $this->page);
......@@ -128,13 +128,13 @@ class ShowprofiletagAction extends Action
$current = common_current_user();
if (!empty($current) && $current->id == $this->peopletag->tagger) {
// TRANS: Title for public people tag timeline where the viewer is the tagger.
// TRANS: Title for public list timeline where the viewer is the tagger.
// TRANS: %1$s is a people tag, %2$s is a page number.
return sprintf(_('Timeline for %1$s list by you, page %2$d'),
$this->peopletag->tag, $this->page);
}
// TRANS: Title for private people tag timeline.
// TRANS: Title for private list timeline.
// TRANS: %1$s is a people tag, %2$s is the tagger's nickname, %3$d is a page number.
return sprintf(_('Timeline for %1$s list by %2$s, page %3$d'),
$this->peopletag->tag,
......@@ -143,22 +143,22 @@ class ShowprofiletagAction extends Action
);
} else {
if($this->peopletag->private) {
// TRANS: Title for private people tag timeline.
// TRANS: %s is a people tag.
// TRANS: Title for private list timeline.
// TRANS: %s is a list.
return sprintf(_('Private timeline of %s list by you'),
$this->peopletag->tag);
}
$current = common_current_user();
if (!empty($current) && $current->id == $this->peopletag->tagger) {
// TRANS: Title for public people tag timeline where the viewer is the tagger.
// TRANS: %s is a people tag.
// TRANS: Title for public list timeline where the viewer is the tagger.
// TRANS: %s is a list.
return sprintf(_('Timeline for %s list by you'),
$this->peopletag->tag);
}
// TRANS: Title for private people tag timeline.
// TRANS: %1$s is a people tag, %2$s is the tagger's nickname.
// TRANS: Title for private list timeline.
// TRANS: %1$s is a list, %2$s is the tagger's nickname.
return sprintf(_('Timeline for %1$s list by %2$s'),
$this->peopletag->tag,
$this->tagger->nickname
......@@ -189,7 +189,7 @@ class ShowprofiletagAction extends Action
)
),
// TRANS: Feed title.
// TRANS: %1$s is a people tag, %2$s is tagger's nickname.
// TRANS: %1$s is a list, %2$s is tagger's nickname.
sprintf(_('Feed for %1$s list by %2$s (Atom)'),
$this->peopletag->tag, $this->tagger->nickname
)
......@@ -205,8 +205,8 @@ class ShowprofiletagAction extends Action
function showEmptyListMessage()
{
// TRANS: Empty list message for people tag timeline.
// TRANS: %1$s is a people tag, %2$s is a tagger's nickname.
// TRANS: Empty list message for list timeline.
// TRANS: %1$s is a list, %2$s is a tagger's nickname.
$message = sprintf(_('This is the timeline for %1$s list by %2$s but no one has posted anything yet.'),
$this->peopletag->tag,
$this->tagger->nickname) . ' ';
......@@ -287,20 +287,8 @@ class ShowprofiletagAction extends Action
if (Event::handle('StartShowTaggedProfilesMiniList', array($this))) {
$title = '';
$current = common_current_user();
if(!empty($current) && $this->peopletag->tagger == $current->id) {
// TRANS: Header on show profile tag page.
// TRANS: %s is a people tag.
$title = sprintf(_('Listed'), $this->peopletag->tag);
} else {
// TRANS: Header on show profile tag page.
// TRANS: %1$s is a people tag, %2$s is a tagger's nickname.
$title = sprintf(_('Listed'),
$this->peopletag->tag,
$this->tagger->nickname);
}
$this->element('h2', null, $title);
// TRANS: Header on show list page.
$this->element('h2', null, _('Listed'));
$cnt = 0;
......@@ -308,7 +296,7 @@ class ShowprofiletagAction extends Action
$pml = new ProfileMiniList($profile, $this);
$cnt = $pml->show();
if ($cnt == 0) {
// TRANS: Content of "People tagged x by a user" if there are no tagged users.
// TRANS: Content of "Listed" page if there are no listed users.
$this->element('p', null, _('(None)'));
}
}
......
......@@ -227,8 +227,8 @@ class SubscriptionsListItem extends SubscriptionListItem
}
$this->out->element('input', $attrs);
// TRANS: Checkbox label for enabling Jabber messages for a profile in a subscriptions list.
$this->out->element('label', array('for' => 'jabber-'.$this->profile->id), _('IM'));
// TRANS: Checkbox label for enabling IM messages for a profile in a subscriptions list.
$this->out->element('label', array('for' => 'jabber-'.$this->profile->id), _m('LABEL','IM'));
} else {
$this->out->hidden('jabber', $sub->jabber);
}
......
......@@ -321,36 +321,66 @@ class Profile extends Memcached_DataObject
return false;
}
function getOwnedTags($auth_user, $offset=0, $limit=null, $since_id=0, $max_id=0)
function getLists($auth_user, $offset=0, $limit=null, $since_id=0, $max_id=0)
{
$tags = new Profile_list();
$tags->tagger = $this->id;
$ids = array();
if (($auth_user instanceof User || $auth_user instanceof Profile) &&
$auth_user->id === $this->id) {
// no condition, get both private and public tags
$keypart = sprintf('profile:lists:%d', $this->id);
$idstr = self::cacheGet($keypart);
if ($idstr !== false) {
$ids = explode(',', $idstr);
} else {
$tags->private = false;
}
$list = new Profile_list();
$list->selectAdd();
$list->selectAdd('id');
$list->tagger = $this->id;
$list->selectAdd('id as "cursor"');
$tags->selectAdd('id as "cursor"');
if ($since_id>0) {
$list->whereAdd('id > '.$since_id);
}
if ($since_id>0) {
$tags->whereAdd('id > '.$since_id);
}
if ($max_id>0) {
$list->whereAdd('id <= '.$max_id);
}
if ($max_id>0) {
$tags->whereAdd('id <= '.$max_id);
}
if($offset>=0 && !is_null($limit)) {
$list->limit($offset, $limit);
}
if($offset>=0 && !is_null($limit)) {
$tags->limit($offset, $limit);
$list->orderBy('id DESC');
if ($list->find()) {
while ($list->fetch()) {
$ids[] = $list->id;
}
}
self::cacheSet($keypart, implode(',', $ids));
}
$tags->orderBy('id DESC');
$tags->find();
$showPrivate = (($auth_user instanceof User ||
$auth_user instanceof Profile) &&
$auth_user->id === $this->id);
return $tags;
$lists = array();
foreach ($ids as $id) {
$list = Profile_list::staticGet('id', $id);
if (!empty($list) &&
($showPrivate || !$list->private)) {
if (!isset($list->cursor)) {
$list->cursor = $list->id;
}
$lists[] = $list;
}
}
return new ArrayWrapper($lists);
}
function getOtherTags($auth_user=null, $offset=0, $limit=null, $since_id=0, $max_id=0)
......@@ -1323,42 +1353,4 @@ class Profile extends Memcached_DataObject
}
return $profile;
}
function getLists()
{
$ids = array();
$keypart = sprintf('profile:lists:%d', $this->id);
$idstr = self::cacheGet($keypart);
if ($idstr !== false) {
$ids = explode(',', $idstr);
} else {
$list = new Profile_list();
$list->selectAdd();
$list->selectAdd('id');
$list->tagger = $this->id;
if ($list->find()) {
while ($list->fetch()) {
$ids[] = $list->id;
}
}
self::cacheSet($keypart, implode(',', $ids));
}
$lists = array();
foreach ($ids as $id) {
$list = Profile_list::staticGet('id', $id);
if (!empty($list) &&
($showPrivate || !$list->private)) {
$lists[] = $list;
}
}
return new ArrayWrapper($lists);
}
}
......@@ -28,8 +28,9 @@ Here are some documents that you might find helpful in understanding
* [Contact](%%doc.contact%%) - who to contact with questions about the service
* [IM](%%doc.im%%) - using the instant-message (IM) features of %%site.name%%
* [SMS](%%doc.sms%%) - tying your cellphone to %%site.name%%
* [tags](%%doc.tags%%) - different ways to use tagging
* [Tags](%%doc.tags%%) - different ways to use tagging
* [Groups](%%doc.groups%%) - joining together in groups
* [Lists](%%doc.lists%%) - organize your contacts
* [OpenMicroBlogging](%%doc.openmublog%%) - subscribing to remote users
* [Privacy](%%doc.privacy%%) - %%site.name%%'s privacy policy
* [Source](%%doc.source%%) - How to get the StatusNet source code
......
<!-- Copyright 2008-2010 StatusNet Inc. and contributors. -->
<!-- Document licensed under Creative Commons Attribution 3.0 Unported. See -->
<!-- http://creativecommons.org/licenses/by/3.0/ for details. -->
%%site.name%% supports
[tags](http://en.wikipedia.org/wiki/Tag_(metadata)) to help you
organize your activities here. You can use tags for people and for
notices.
Tagging a notice
----------------
You can tag a notice using a *hashtag*; a # character followed by
letters and numbers as well as '.', '-', and '_'. Note that accented
latin characters are not supported, and non-roman scripts are right out.
The HTML for the notice will link to a stream of all the other notices
with that tag. This can be a great way to keep track of a conversation.
The most popular current tags on the site can be found in the [public
tag cloud](%%action.publictagcloud%%). Their size shows their
popularity and recency.
Tagging yourself
----------------
You can also add tags for yourself on your [profile
settings](%%action.profilesettings%%) page or by using the edit tags
button on your profile page. Use single words to
describe yourself, your experiences and your interest. The tags will
become links on your profile page to a list of all the users on the
site who use that same tag. It can be a nice way to find people who
are related to you geographically or who have a common interest.
Tagging others
--------------
You can also tag other users by using the edit tags button next to
their profile. Such tags are called *people tags*. Once you have
created a people tag, you can add or remove users from it using the
tag's edit form. This makes it easy to organize your subscriptions
into groups and sort through them separately. Also, it will let
you create custom lists of people that others can subscribe to.
You can also send a notice "to the attention of" your subscribers
whom you've marked with a particular tag (note: *not* people who've
marked themselves with that tag). "@#family hello" will send a
notice to all your subscribers you've marked with the tag 'family'.
Private and public people tags
------------------------------
A private people tag is only visible to the creator, it cannot be
subscribed to, but the timeline can be viewed. To create a new
private prepend a '.' to the tag in the tags editing box. To set
an existing public tag as private or vice-versa, go to the tag's
edit page.
The most used public tags are displayed in the
[public people tag cloud](%%action.publicpeopletagcloud%%). Their
size shows their frequency of use.
Remote people tags
------------------
You can even [tag remote users](%%action.profilesettings%%). Just
enter the remote profile's URI and click on the "Fetch" button to
fetch the profile, you can then add tags and save them.
Subscribing to the timeline of a people tag on another server also
works. Just copy the URL of the people tag's timeline page to the
[OStatus subscription](%%action.ostatussub%%) form.
......@@ -44,7 +44,6 @@ define('GROUPS_PER_MINILIST', 8);
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class GroupMiniList extends GroupList
{
function show()
......
......@@ -4,7 +4,7 @@
* Copyright (C) 2011, StatusNet, Inc.
*
* Section for an invite button
*
*
* PHP version 5
*
* This program is free software: you can redistribute it and/or modify
......@@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0
* @link http://status.net/
*/
class InviteButtonSection extends Section
{
function showTitle()
......@@ -54,10 +53,11 @@ class InviteButtonSection extends Section
function showContent()
{
$this->out->element('a',
$this->out->element('a',
array('href' => common_local_url('invite'),
'class' => 'invite_button'),
_('Invite more colleagues'));
// TRANS: Button text for inviting more users to the StatusNet instance.
_m('BUTTON','Invite more colleagues'));
return false;
}
}
\ No newline at end of file
}
......@@ -51,7 +51,7 @@ class ListsNav extends Menu
$user = common_current_user();
$this->lists = $profile->getOwnedTags($user);
$this->lists = $profile->getLists($user);
}
function show()
......
......@@ -105,8 +105,8 @@ class PeopletagEditForm extends Form
*/
function formLegend()
{
// TRANS: Form legend for people tag edit form.
// TRANS: %s is a people tag.
// TRANS: Form legend for list edit form.
// TRANS: %s is a list.
$this->out->element('legend', null, sprintf(_('Edit list %s'), $this->peopletag->tag));
}
......@@ -137,21 +137,21 @@ class PeopletagEditForm extends Form
$this->out->elementStart('li');
$desclimit = Profile_list::maxDescription();
if ($desclimit == 0) {
// TRANS: Field title for description of people tag.
// TRANS: Field title for description of list.
$descinstr = _('Describe the list or topic.');
} else {
// TRANS: Field title for description of people tag.
// TRANS: Field title for description of list.
// TRANS: %d is the maximum number of characters for the description.
$descinstr = sprintf(_m('Describe the list or topic in %d character.',
'Describe the list or topic in %d characters.',
$desclimit),
$desclimit);
}
// TRANS: Field label for description of people tag.
// TRANS: Field label for description of list.
$this->out->textarea('description', _('Description'),
($this->out->arg('description')) ? $this->out->arg('description') : $description,
$descinstr);
// TRANS: Checkbox label to mark a people tag private.
// TRANS: Checkbox label to mark a list private.
$this->out->checkbox('private', _('Private'), $private);
$this->out->elementEnd('li');
$this->out->elementEnd('ul');
......@@ -167,11 +167,11 @@ class PeopletagEditForm extends Form
// TRANS: Button text to save a people tag.
$this->out->submit('submit', _('Save'));
$this->out->submit('form_action-yes',
// TRANS: Button text to delete a people tag.
// TRANS: Button text to delete a list.
_m('BUTTON','Delete'),
'submit',
'delete',
// TRANS: Button title to delete a people tag.
// TRANS: Button title to delete a list.
_('Delete this list.'));
}
......
......@@ -103,10 +103,10 @@ class PeopletagGroupNav extends Widget
// People tag timeline
$this->out->menuItem(common_local_url('showprofiletag', array('tagger' => $user_profile->nickname,
'tag' => $tag->tag)),
// TRANS: Menu item in people tag navigation panel.
// TRANS: Menu item in list navigation panel.
_m('MENU','List'),
// TRANS: Menu item title in people tag navigation panel.
// TRANS: %1$s is a tag, %2$s is a nickname.
// TRANS: Menu item title in list navigation panel.
// TRANS: %1$s is a list, %2$s is a nickname.
sprintf(_('%1$s list by %2$s.'), $tag->tag,
(($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
$action == 'showprofiletag', 'nav_timeline_peopletag');
......@@ -114,10 +114,10 @@ class PeopletagGroupNav extends Widget
// Tagged
$this->out->menuItem(common_local_url('peopletagged', array('tagger' => $user->nickname,
'tag' => $tag->tag)),
// TRANS: Menu item in people tag navigation panel.
// TRANS: Menu item in list navigation panel.
_m('MENU','Listed'),
// TRANS: Menu item title in people tag navigation panel.
// TRANS: %1$s is a tag, %2$s is a nickname.
// TRANS: Menu item title in list navigation panel.
// TRANS: %1$s is a list, %2$s is a nickname.
sprintf(_('%1$s list by %2$s.'), $tag->tag,
(($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
$action == 'peopletagged', 'nav_peopletag_tagged');
......@@ -125,10 +125,10 @@ class PeopletagGroupNav extends Widget
// Subscribers
$this->out->menuItem(common_local_url('peopletagsubscribers', array('tagger' => $user->nickname,
'tag' => $tag->tag)),
// TRANS: Menu item in people tag navigation panel.
// TRANS: Menu item in list navigation panel.
_m('MENU','Subscribers'),
// TRANS: Menu item title in people tag navigation panel.
// TRANS: %1$s is a tag, %2$s is a nickname.
// TRANS: Menu item title in list navigation panel.
// TRANS: %1$s is a list, %2$s is a nickname.
sprintf(_('Subscribers to %1$s list by %2$s.'), $tag->tag,
(($user_profile && $user_profile->fullname) ? $user_profile->fullname : $nickname)),
$action == 'peopletagsubscribers', 'nav_peopletag_subscribers');
......@@ -140,8 +140,8 @@ class PeopletagGroupNav extends Widget
'tag' => $tag->tag)),
// TRANS: Menu item in people tag navigation panel.