Merge branch '1.0.x' into qna

* 1.0.x: (23 commits)
  ModPlus plugin -- Ticket #3095: add remote profile options popup to group membership and other profile lists
  fix ModPlus 'remote profile options' popup for Realtime
  Fixes for GroupPrivateMessage, OStatus due to changes in group output events, and some internal bugs using wrong vars
  Tickets #1610, #1949: show permalinks on Popular Notices, attachments aside sections
  Localisation updates from http://translatewiki.net.
  Translator documentation added/updated. Superfluous whitespace removed. L10n update.
  Add myself to contributors array.
  i18n updates. Translator documentation added. Superfluous whitespace removed.
  Translator documentation added/updated. i18n updates. Superfluous whitespace removed.
  Fixed issues with plural handling. L10n/I18n updates. Translator documentation added. Superfluous whitespace removed.
  Translator documentation added/updates. L10n/i18n updates. Superfluous whitespace removed.
  Update/add translator documentation. L10n/i18n updates. Superfluous whitespace removed.
  * Add FIXME: $profile appears to be undefined. * Update translator documentation.
  Caching for conversation root lookup, some logic fixes in threaded view
  Use cached sources for favorites & repeats info on threaded notice lists
  ajax load for additional inline replies; /replies variant of conversationview
  Fixes for race conditions between Realtime plugin and the AJAX display of inline replies.
  Initial use of inline reply area for marking repeats...
  Initial inline listing of favoriters
  Favored lists in progress: 'foo, bar and baz'
  ...
This commit is contained in:
Zach Copley 2011-03-20 19:25:32 -07:00
commit f9cf1dddfe
1296 changed files with 18120 additions and 6800 deletions

View File

@ -95,6 +95,9 @@ class ApiTimelineRetweetedToMeAction extends ApiAuthAction
// TRANS: Title for Atom feed "repeated to me". %s is the user nickname.
$title = sprintf(_("Repeated to %s"), $this->auth_user->nickname);
$subtitle = sprintf(
// @todo FIXME: $profile is not defined.
// TRANS: Subtitle for API action that shows most recent notices that are repeats in user's inbox.
// TRANS: %1$s is the sitename, %2$s is a user nickname, %3$s is a user profile name.
_('%1$s notices that were to repeated to %2$s / %3$s.'),
$sitename, $this->user->nickname, $profile->getBestName()
);

View File

@ -99,7 +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.
// TRANS: Client error for an already confirmed email/jabber/sms address.
$this->clientError(_('That address has already been confirmed.'));
return;
}
@ -118,7 +118,8 @@ class ConfirmaddressAction extends Action
if (!$result) {
common_log_db_error($cur, 'UPDATE', __FILE__);
$this->serverError(_('Couldn\'t update user.'));
// TRANS: Server error displayed when confirming an e-mail address or IM address fails.
$this->serverError(_('Could not update user.'));
return;
}
@ -133,6 +134,7 @@ class ConfirmaddressAction extends Action
$user_im_prefs->user_id = $cur->id;
if ($user_im_prefs->find() && $user_im_prefs->fetch()) {
if($user_im_prefs->screenname == $confirm->address){
// TRANS: Client error for an already confirmed IM address.
$this->clientError(_('That address has already been confirmed.'));
return;
}
@ -141,7 +143,8 @@ class ConfirmaddressAction extends Action
if (!$result) {
common_log_db_error($user_im_prefs, 'UPDATE', __FILE__);
$this->serverError(_('Couldn\'t update user im preferences.'));
// TRANS: Server error displayed when updating IM preferences fails.
$this->serverError(_('Could not update user IM preferences.'));
return;
}
}else{
@ -153,7 +156,8 @@ class ConfirmaddressAction extends Action
if (!$result) {
common_log_db_error($user_im_prefs, 'INSERT', __FILE__);
$this->serverError(_('Couldn\'t insert user im preferences.'));
// TRANS: Server error displayed when adding IM preferences fails.
$this->serverError(_('Could not insert user IM preferences.'));
return;
}
}

View File

@ -0,0 +1,106 @@
<?php
/**
* Display a conversation in the browser
*
* PHP version 5
*
* @category Action
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2009, 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/>.
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
exit(1);
}
// XXX: not sure how to do paging yet,
// so set a 60-notice limit
require_once INSTALLDIR.'/lib/noticelist.php';
/**
* Conversation tree in the browser
*
* @category Action
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class ConversationRepliesAction extends ConversationAction
{
function handle($args)
{
if ($this->boolean('ajax')) {
$this->showAjax();
} else {
parent::handle($args);
}
}
/**
* Show content.
*
* Display a hierarchical unordered list in the content area.
* Uses ConversationTree to do most of the heavy lifting.
*
* @return void
*/
function showContent()
{
$notices = Notice::conversationStream($this->id, null, null);
$ct = new FullThreadedNoticeList($notices, $this);
$cnt = $ct->show();
}
function showAjax()
{
header('Content-Type: text/xml;charset=utf-8');
$this->xw->startDocument('1.0', 'UTF-8');
$this->elementStart('html');
$this->elementStart('head');
// TRANS: Title for conversation page.
$this->element('title', null, _m('TITLE','Notice'));
$this->elementEnd('head');
$this->elementStart('body');
$this->showContent();
$this->elementEnd('body');
$this->elementEnd('html');
}
}
class FullThreadedNoticeList extends ThreadedNoticeList
{
function newListItem($notice)
{
return new FullThreadedNoticeListItem($notice, $this->out);
}
}
class FullThreadedNoticeListItem extends ThreadedNoticeListItem
{
function initialItems()
{
return 1000; // @fixme
}
}

View File

@ -111,8 +111,8 @@ class ImsettingsAction extends SettingsAction
if ($user_im_prefs = User_im_prefs::pkeyGet( array('transport' => $transport, 'user_id' => $user->id) )) {
$user_im_prefs_by_transport[$transport] = $user_im_prefs;
$this->element('p', 'form_confirmed', $user_im_prefs->screenname);
// TRANS: Form note in IM settings form.
$this->element('p', 'form_note',
// TRANS: Form note in IM settings form. %s is the type of IM address that was confirmed.
sprintf(_('Current confirmed %s address.'),$transport_info['display']));
$this->hidden('screenname', $user_im_prefs->screenname);
// TRANS: Button label to remove a confirmed IM address.
@ -124,11 +124,11 @@ class ImsettingsAction extends SettingsAction
// TRANS: Form note in IM settings form.
$this->element('p', 'form_note',
// TRANS: Form note in IM settings form.
// TRANS: %s is the IM address set for the site.
// TRANS: %s is the IM service name, %2$s is the IM address set.
sprintf(_('Awaiting confirmation on this address. '.
'Check your %s account for a '.
'Check your %1$s account for a '.
'message with further instructions. '.
'(Did you add %s to your buddy list?)'),
'(Did you add %2$s to your buddy list?)'),
$transport_info['display'],
$transport_info['daemonScreenname']));
$this->hidden('screenname', $confirm->address);
@ -137,8 +137,10 @@ class ImsettingsAction extends SettingsAction
} else {
$this->elementStart('ul', 'form_data');
$this->elementStart('li');
// TRANS: Field label for IM address.
$this->input('screenname', _('IM address'),
($this->arg('screenname')) ? $this->arg('screenname') : null,
// TRANS: Field title for IM address. %s is the IM service name.
sprintf(_('%s screenname.'),
$transport_info['display']));
$this->elementEnd('li');
@ -288,7 +290,7 @@ class ImsettingsAction extends SettingsAction
if ($result === false) {
common_log_db_error($user, 'UPDATE', __FILE__);
// TRANS: Server error thrown on database error updating IM preferences.
$this->serverError(_('Couldn\'t update IM preferences.'));
$this->serverError(_('Could not update IM preferences.'));
return;
}
}while($user_im_prefs->fetch());
@ -322,6 +324,7 @@ class ImsettingsAction extends SettingsAction
}
if (!$transport) {
// TRANS: Form validation error when no transport is available setting an IM address.
$this->showForm(_('No transport.'));
return;
}
@ -330,14 +333,14 @@ class ImsettingsAction extends SettingsAction
if (!$screenname) {
// TRANS: Message given saving IM address that cannot be normalised.
$this->showForm(_('Cannot normalize that screenname'));
$this->showForm(_('Cannot normalize that screenname.'));
return;
}
$valid = false;
Event::handle('ValidateImScreenname', array($transport, $screenname, &$valid));
if (!$valid) {
// TRANS: Message given saving IM address that not valid.
$this->showForm(_('Not a valid screenname'));
$this->showForm(_('Not a valid screenname.'));
return;
} else if ($this->screennameExists($transport, $screenname)) {
// TRANS: Message given saving IM address that is already set for another user.
@ -402,7 +405,7 @@ class ImsettingsAction extends SettingsAction
if (!$result) {
common_log_db_error($confirm, 'DELETE', __FILE__);
// TRANS: Server error thrown on database error canceling IM address confirmation.
$this->serverError(_('Couldn\'t delete confirmation.'));
$this->serverError(_('Could not delete confirmation.'));
return;
}
@ -440,8 +443,7 @@ class ImsettingsAction extends SettingsAction
if (!$result) {
common_log_db_error($user, 'UPDATE', __FILE__);
// TRANS: Server error thrown on database error removing a registered IM address.
$this->serverError(_('Couldn\'t update user im prefs.'));
$this->serverError(_('Couldn\'t update user.'));
$this->serverError(_('Could not update user IM preferences.'));
return;
}

View File

@ -294,8 +294,9 @@ class NewApplicationAction extends OwnerDesignAction
$app->uploadLogo();
} catch (Exception $e) {
$app->query('ROLLBACK');
// TRANS: Form validation error on New application page when providing an invalid image upload.
$this->showForm(_('Invalid image.'));
return;
return;
}
$app->query('COMMIT');

View File

@ -163,7 +163,8 @@ class PasswordsettingsAction extends SettingsAction
$this->showForm(_('Password must be 6 or more characters.'));
return;
} else if (0 != strcmp($newpassword, $confirm)) {
$this->showForm(_('Passwords don\'t match.'));
// TRANS: Form validation error on password change when password confirmation does not match.
$this->showForm(_('Passwords do not match.'));
return;
}

View File

@ -485,8 +485,8 @@ class PathsAdminPanelForm extends AdminForm
// TRANS: Drop down option in Paths admin panel (option for "When to use SSL").
'always' => _('Always'));
// TRANS: Drop down label in Paths admin panel.
$this->out->dropdown('site-ssl',
// TRANS: Drop down label in Paths admin panel.
_('Use SSL'),
// TRANS: Tooltip for field label in Paths admin panel.
$ssl, _('When to use SSL.'),

View File

@ -162,8 +162,8 @@ class RecoverpasswordAction extends Action
' the email address you have stored' .
' in your account.'));
} else if ($this->mode == 'reset') {
// TRANS: Page notice for password change page.
$this->element('p', null,
// TRANS: Page notice for password change page.
_('You have been identified. Enter a' .
' new password below.'));
}

View File

@ -4,7 +4,7 @@
* Copyright (C) 2010, StatusNet, Inc.
*
* Redirect to the given URL
*
*
* PHP version 5
*
* This program is free software: you can redistribute it and/or modify
@ -59,21 +59,23 @@ class RedirecturlAction extends Action
*
* @return boolean true
*/
function prepare($argarray)
{
parent::prepare($argarray);
$this->id = $this->trimmed('id');
if (empty($this->id)) {
throw new ClientException(_('No id parameter'));
// TRANS: Client exception thrown when no ID parameter was provided.
throw new ClientException(_('No id parameter.'));
}
$this->file = File::staticGet('id', $this->id);
if (empty($this->file)) {
throw new ClientException(sprintf(_('No such file "%d"'),
// TRANS: Client exception thrown when an invalid ID parameter was provided for a file.
// TRANS: %d is the provided ID for which the file is not present (number).
throw new ClientException(sprintf(_('No such file "%d".'),
$this->id),
404);
}
@ -88,7 +90,6 @@ class RedirecturlAction extends Action
*
* @return void
*/
function handle($argarray=null)
{
common_redirect($this->file->url, 307);
@ -104,7 +105,6 @@ class RedirecturlAction extends Action
*
* @return boolean is read only action?
*/
function isReadOnly($args)
{
return true;
@ -117,7 +117,6 @@ class RedirecturlAction extends Action
*
* @return string last modified http header
*/
function lastModified()
{
// For comparison with If-Last-Modified
@ -133,7 +132,6 @@ class RedirecturlAction extends Action
*
* @return string etag http header
*/
function etag()
{
return 'W/"' . implode(':', array($this->arg('action'),

View File

@ -77,6 +77,7 @@ class RegisterAction extends Action
}
if (common_config('site', 'inviteonly') && empty($this->code)) {
// TRANS: Client error displayed when trying to register to an invite-only site without an invitation.
$this->clientError(_('Sorry, only invited people can register.'));
return false;
}
@ -84,6 +85,7 @@ class RegisterAction extends Action
if (!empty($this->code)) {
$this->invite = Invitation::staticGet('code', $this->code);
if (empty($this->invite)) {
// TRANS: Client error displayed when trying to register to an invite-only site without a valid invitation.
$this->clientError(_('Sorry, invalid invitation code.'));
return false;
}
@ -103,9 +105,11 @@ class RegisterAction extends Action
function title()
{
if ($this->registered) {
// TRANS: Title for registration page after a succesful registration.
return _('Registration successful');
} else {
return _('Register');
// TRANS: Title for registration page.
return _m('TITLE','Register');
}
}
@ -125,8 +129,10 @@ class RegisterAction extends Action
parent::handle($args);
if (common_config('site', 'closed')) {
// TRANS: Client error displayed when trying to register to a closed site.
$this->clientError(_('Registration not allowed.'));
} else if (common_logged_in()) {
// TRANS: Client error displayed when trying to register while already logged in.
$this->clientError(_('Already logged in.'));
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$this->tryRegister();
@ -178,6 +184,7 @@ class RegisterAction extends Action
}
if (common_config('site', 'inviteonly') && !($code && $invite)) {
// TRANS: Client error displayed when trying to register to an invite-only site without an invitation.
$this->clientError(_('Sorry, only invited people can register.'));
return;
}
@ -191,13 +198,17 @@ class RegisterAction extends Action
$email = common_canonical_email($email);
if (!$this->boolean('license')) {
$this->showForm(_('You cannot register if you don\'t '.
// TRANS: Form validation error displayed when trying to register without agreeing to the site license.
$this->showForm(_('You cannot register if you do not '.
'agree to the license.'));
} else if ($email && !Validate::email($email, common_config('email', 'check_domain'))) {
// TRANS: Form validation error displayed when trying to register without a valid e-mail address.
$this->showForm(_('Not a valid email address.'));
} else if ($this->nicknameExists($nickname)) {
// TRANS: Form validation error displayed when trying to register with an existing nickname.
$this->showForm(_('Nickname already in use. Try another one.'));
} else if (!User::allowed_nickname($nickname)) {
// TRANS: Form validation error displayed when trying to register with an invalid nickname.
$this->showForm(_('Not a valid nickname.'));
} else if ($this->emailExists($email)) {
$this->showForm(_('Email address already exists.'));
@ -205,25 +216,32 @@ class RegisterAction extends Action
!Validate::uri($homepage,
array('allowed_schemes' =>
array('http', 'https')))) {
// TRANS: Form validation error displayed when trying to register with an invalid homepage URL.
$this->showForm(_('Homepage is not a valid URL.'));
return;
} else if (!is_null($fullname) && mb_strlen($fullname) > 255) {
// TRANS: Form validation error displayed when trying to register with a too long full name.
$this->showForm(_('Full name is too long (maximum 255 characters).'));
return;
} else if (Profile::bioTooLong($bio)) {
// TRANS: Form validation error on registration page when providing too long a bio text.
// TRANS: %d is the maximum number of characters for bio; used for plural.
$this->showForm(sprintf(_m('Bio is too long (maximum %d character).',
'Bio is too long (maximum %d characters).',
Profile::maxBio()),
Profile::maxBio()));
return;
} else if (!is_null($location) && mb_strlen($location) > 255) {
// TRANS: Form validation error displayed when trying to register with a too long location.
$this->showForm(_('Location is too long (maximum 255 characters).'));
return;
} else if (strlen($password) < 6) {
// TRANS: Form validation error displayed when trying to register with too short a password.
$this->showForm(_('Password must be 6 or more characters.'));
return;
} else if ($password != $confirm) {
$this->showForm(_('Passwords don\'t match.'));
// TRANS: Form validation error displayed when trying to register with non-matching passwords.
$this->showForm(_('Passwords do not match.'));
} else if ($user = User::register(array('nickname' => $nickname,
'password' => $password,
'email' => $email,
@ -233,11 +251,13 @@ class RegisterAction extends Action
'location' => $location,
'code' => $code))) {
if (!$user) {
// TRANS: Form validation error displayed when trying to register with an invalid username or password.
$this->showForm(_('Invalid username or password.'));
return;
}
// success!
if (!common_set_user($user)) {
// TRANS: Server error displayed when saving fails during user registration.
$this->serverError(_('Error setting user.'));
return;
}
@ -255,6 +275,7 @@ class RegisterAction extends Action
$this->showSuccess();
} else {
// TRANS: Form validation error displayed when trying to register with an invalid username or password.
$this->showForm(_('Invalid username or password.'));
}
}
@ -330,6 +351,7 @@ class RegisterAction extends Action
$this->element('p', 'error', $this->error);
} else {
$instr =
// TRANS: Page notice on registration page.
common_markup_to_html(_('With this form you can create '.
'a new account. ' .
'You can then post notices and '.
@ -389,6 +411,7 @@ class RegisterAction extends Action
}
if (common_config('site', 'inviteonly') && !($code && $invite)) {
// TRANS: Client error displayed when trying to register to an invite-only site without an invitation.
$this->clientError(_('Sorry, only invited people can register.'));
return;
}
@ -398,6 +421,7 @@ class RegisterAction extends Action
'class' => 'form_settings',
'action' => common_local_url('register')));
$this->elementStart('fieldset');
// TRANS: Fieldset legend on accout registration page.
$this->element('legend', null, 'Account settings');
$this->hidden('token', common_session_token());
@ -408,66 +432,86 @@ class RegisterAction extends Action
$this->elementStart('ul', 'form_data');
if (Event::handle('StartRegistrationFormData', array($this))) {
$this->elementStart('li');
// TRANS: Field label on account registration page.
$this->input('nickname', _('Nickname'), $this->trimmed('nickname'),
// TRANS: Field title on account registration page.
_('1-64 lowercase letters or numbers, no punctuation or spaces.'));
$this->elementEnd('li');
$this->elementStart('li');
// TRANS: Field label on account registration page.
$this->password('password', _('Password'),
// TRANS: Field title on account registration page.
_('6 or more characters.'));
$this->elementEnd('li');
$this->elementStart('li');
$this->password('confirm', _('Confirm'),
_('Same as password above.'));
// TRANS: Field label on account registration page. In this field the password has to be entered a second time.
$this->password('confirm', _m('PASSWORD','Confirm'),
// TRANS: Field title on account registration page.
_('Same as password above.'));
$this->elementEnd('li');
$this->elementStart('li');
if ($this->invite && $this->invite->address_type == 'email') {
$this->input('email', _('Email'), $this->invite->address,
// TRANS: Field label on account registration page.
$this->input('email', _m('LABEL','Email'), $this->invite->address,
// TRANS: Field title on account registration page.
_('Used only for updates, announcements, '.
'and password recovery.'));
} else {
$this->input('email', _('Email'), $this->trimmed('email'),
// TRANS: Field label on account registration page.
$this->input('email', _m('LABEL','Email'), $this->trimmed('email'),
// TRANS: Field title on account registration page.
_('Used only for updates, announcements, '.
'and password recovery.'));
}
$this->elementEnd('li');
$this->elementStart('li');
// TRANS: Field label on account registration page.
$this->input('fullname', _('Full name'),
$this->trimmed('fullname'),
_('Longer name, preferably your "real" name.'));
// TRANS: Field title on account registration page.
_('Longer name, preferably your "real" name.'));
$this->elementEnd('li');
$this->elementStart('li');
// TRANS: Field label on account registration page.
$this->input('homepage', _('Homepage'),
$this->trimmed('homepage'),
// TRANS: Field title on account registration page.
_('URL of your homepage, blog, '.
'or profile on another site.'));
$this->elementEnd('li');
$this->elementStart('li');
$maxBio = Profile::maxBio();
if ($maxBio > 0) {
// TRANS: Tooltip for field label in form for profile settings. Plural
// TRANS: Text area title in form for account registration. Plural
// TRANS: is decided by the number of characters available for the
// TRANS: biography (%d).
$bioInstr = sprintf(_m('Describe yourself and your interests in %d character',
'Describe yourself and your interests in %d characters',
$bioInstr = sprintf(_m('Describe yourself and your interests in %d character.',
'Describe yourself and your interests in %d characters.',
$maxBio),
$maxBio);
} else {
$bioInstr = _('Describe yourself and your interests');
// TRANS: Text area title on account registration page.
$bioInstr = _('Describe yourself and your interests.');
}
// TRANS: Text area label on account registration page.
$this->textarea('bio', _('Bio'),
$this->trimmed('bio'),
$bioInstr);
$this->elementEnd('li');
$this->elementStart('li');
// TRANS: Field label on account registration page.
$this->input('location', _('Location'),
$this->trimmed('location'),
// TRANS: Field title on account registration page.
_('Where you are, like "City, '.
'State (or Region), Country".'));
$this->elementEnd('li');
Event::handle('EndRegistrationFormData', array($this));
$this->elementStart('li', array('id' => 'settings_rememberme'));
// TRANS: Checkbox label on account registration page.
$this->checkbox('rememberme', _('Remember me'),
$this->boolean('rememberme'),
// TRANS: Checkbox title on account registration page.
_('Automatically login in the future; '.
'not for shared computers!'));
$this->elementEnd('li');
@ -487,7 +531,8 @@ class RegisterAction extends Action
$this->elementEnd('li');
}
$this->elementEnd('ul');
$this->submit('submit', _('Register'));
// TRANS: Field label on account registration page.
$this->submit('submit', _m('BUTTON','Register'));
$this->elementEnd('fieldset');
$this->elementEnd('form');
}
@ -497,9 +542,9 @@ class RegisterAction extends Action
$out = '';
switch (common_config('license', 'type')) {
case 'private':
// TRANS: Copyright checkbox label in registration dialog, for private sites.
// TRANS: %1$s is the StatusNet sitename.
$out .= htmlspecialchars(sprintf(
// TRANS: Copyright checkbox label in registration dialog, for private sites.
// TRANS: %1$s is the StatusNet sitename.
_('I understand that content and data of %1$s are private and confidential.'),
common_config('site', 'name')));
// fall through
@ -508,8 +553,9 @@ class RegisterAction extends Action
$out .= ' ';
}
if (common_config('license', 'owner')) {
// TRANS: Copyright checkbox label in registration dialog, for all rights reserved with a specified copyright owner.
$out .= htmlspecialchars(sprintf(
// TRANS: Copyright checkbox label in registration dialog, for all rights reserved with a specified copyright owner.
// TRANS: %1$s is the license owner.
_('My text and files are copyright by %1$s.'),
common_config('license', 'owner')));
} else {
@ -563,6 +609,10 @@ class RegisterAction extends Action
array('nickname' => $nickname));
$this->elementStart('div', 'success');
// TRANS: Text displayed after successful account registration.
// TRANS: %1$s is the registered nickname, %2$s is the profile URL.
// TRANS: This message contains Markdown links in the form [link text](link)
// TRANS: and variables in the form %%%%variable%%%%. Please mind the syntax.
$instr = sprintf(_('Congratulations, %1$s! And welcome to %%%%site.name%%%%. '.
'From here, you may want to...'. "\n\n" .
'* Go to [your profile](%2$s) '.
@ -587,6 +637,7 @@ class RegisterAction extends Action
$have_email = $this->trimmed('email');
if ($have_email) {
// TRANS: Instruction text on how to deal with the e-mail address confirmation e-mail.
$emailinstr = _('(You should receive a message by email '.
'momentarily, with ' .
'instructions on how to confirm '.

View File

@ -55,6 +55,7 @@ class RemotesubscribeAction extends Action
parent::prepare($args);
if (common_logged_in()) {
// TRANS: Client error displayed when using remote subscribe for a local entity.
$this->clientError(_('You can use the local subscription!'));
return false;
}
@ -94,6 +95,8 @@ class RemotesubscribeAction extends Action
if ($this->err) {
$this->element('div', 'error', $this->err);
} else {
// TRANS: Page notice for remote subscribe. This message contains Markdown links.
// TRANS: Ensure to keep the correct markup of [link description](link).
$inst = _('To subscribe, you can [login](%%action.login%%),' .
' or [register](%%action.register%%) a new ' .
' account. If you already have an account ' .
@ -108,6 +111,7 @@ class RemotesubscribeAction extends Action
function title()
{
// TRANS: Page title for Remote subscribe.
return _('Remote subscribe');
}
@ -120,20 +124,26 @@ class RemotesubscribeAction extends Action
'class' => 'form_settings',
'action' => common_local_url('remotesubscribe')));
$this->elementStart('fieldset');
// TRANS: Field legend on page for remote subscribe.
$this->element('legend', _('Subscribe to a remote user'));
$this->hidden('token', common_session_token());
$this->elementStart('ul', 'form_data');
$this->elementStart('li');
// TRANS: Field label on page for remote subscribe.
$this->input('nickname', _('User nickname'), $this->nickname,
// TRANS: Field title on page for remote subscribe.
_('Nickname of the user you want to follow.'));
$this->elementEnd('li');
$this->elementStart('li');
// TRANS: Field label on page for remote subscribe.
$this->input('profile_url', _('Profile URL'), $this->profile_url,
// TRANS: Field title on page for remote subscribe.
_('URL of your profile on another compatible microblogging service.'));
$this->elementEnd('li');
$this->elementEnd('ul');
$this->submit('submit', _('Subscribe'));
// TRANS: Button text on page for remote subscribe.
$this->submit('submit', _m('BUTTON','Subscribe'));
$this->elementEnd('fieldset');
$this->elementEnd('form');
}
@ -141,6 +151,7 @@ class RemotesubscribeAction extends Action
function remoteSubscription()
{
if (!$this->nickname) {
// TRANS: Form validation error on page for remote subscribe when no user was provided.
$this->showForm(_('No such user.'));
return;
}
@ -150,11 +161,13 @@ class RemotesubscribeAction extends Action
$this->profile_url = $this->trimmed('profile_url');
if (!$this->profile_url) {
// TRANS: Form validation error on page for remote subscribe when no user profile was found.
$this->showForm(_('No such user.'));
return;
}
if (!common_valid_http_url($this->profile_url)) {
// TRANS: Form validation error on page for remote subscribe when an invalid profile URL was provided.
$this->showForm(_('Invalid profile URL (bad format).'));
return;
}
@ -164,6 +177,8 @@ class RemotesubscribeAction extends Action
common_root_url(),
omb_oauth_datastore());
} catch (OMB_InvalidYadisException $e) {
// TRANS: Form validation error on page for remote subscribe when no the provided profile URL
// TRANS: does not contain expected data.
$this->showForm(_('Not a valid profile URL (no YADIS document or ' .
'invalid XRDS defined).'));
return;
@ -172,6 +187,7 @@ class RemotesubscribeAction extends Action
if ($service->getServiceURI(OAUTH_ENDPOINT_REQUEST) ==
common_local_url('requesttoken') ||
User::staticGet('uri', $service->getRemoteUserURI())) {
// TRANS: Form validation error on page for remote subscribe.
$this->showForm(_('That is a local profile! Login to subscribe.'));
return;
}
@ -179,6 +195,7 @@ class RemotesubscribeAction extends Action
try {
$service->requestToken();
} catch (OMB_RemoteServiceException $e) {
// TRANS: Form validation error on page for remote subscribe when the remote service is not providing a request token.
$this->showForm(_('Could not get a request token.'));
return;
}
@ -187,6 +204,7 @@ class RemotesubscribeAction extends Action
$profile = $user->getProfile();
if (!$profile) {
common_log_db_error($user, 'SELECT', __FILE__);
// TRANS: Server error displayed on page for remote subscribe when user does not have a matching profile.
$this->serverError(_('User without matching profile.'));
return;
}

View File

@ -1,5 +1,4 @@
<?php
/**
* Repeat action.
*
@ -53,6 +52,7 @@ class RepeatAction extends Action
$this->user = common_current_user();
if (empty($this->user)) {
// TRANS: Client error displayed when trying to repeat a notice while not logged in.
$this->clientError(_('Only logged-in users can repeat notices.'));
return false;
}
@ -60,6 +60,7 @@ class RepeatAction extends Action
$id = $this->trimmed('notice');
if (empty($id)) {
// TRANS: Client error displayed when trying to repeat a notice while not providing a notice ID.
$this->clientError(_('No notice specified.'));
return false;
}
@ -67,11 +68,13 @@ class RepeatAction extends Action
$this->notice = Notice::staticGet('id', $id);
if (empty($this->notice)) {
// TRANS: Client error displayed when trying to repeat a non-existing notice.
$this->clientError(_('No notice specified.'));
return false;
}
if ($this->user->id == $this->notice->profile_id) {
// TRANS: Client error displayed when trying to repeat an own notice.
$this->clientError(_('You cannot repeat your own notice.'));
return false;
}
@ -86,6 +89,7 @@ class RepeatAction extends Action
$profile = $this->user->getProfile();
if ($profile->hasRepeated($id)) {
// TRANS: Client error displayed when trying to repeat an already repeated notice.
$this->clientError(_('You already repeated that notice.'));
return false;
}
@ -104,21 +108,21 @@ class RepeatAction extends Action
{
$repeat = $this->notice->repeat($this->user->id, 'web');
if ($this->boolean('ajax')) {
$this->startHTML('text/xml;charset=utf-8');
$this->elementStart('head');
// TRANS: Title after repeating a notice.
$this->element('title', null, _('Repeated'));
$this->elementEnd('head');
$this->elementStart('body');
$this->element('p', array('id' => 'repeat_response',
'class' => 'repeated'),
// TRANS: Confirmation text after repeating a notice.
_('Repeated!'));
$this->elementEnd('body');
$this->elementEnd('html');
} else {
// FIXME!
// @todo FIXME!
}
}
}

View File

@ -44,7 +44,6 @@ require_once INSTALLDIR.'/lib/feedlist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class RepliesAction extends OwnerDesignAction
{
var $page = null;
@ -60,7 +59,6 @@ class RepliesAction extends OwnerDesignAction
*
* @return boolean success flag
*/
function prepare($args)
{
parent::prepare($args);
@ -70,6 +68,7 @@ class RepliesAction extends OwnerDesignAction
$this->user = User::staticGet('nickname', $nickname);
if (!$this->user) {
// TRANS: Client error displayed when trying to reply to a non-exsting user.
$this->clientError(_('No such user.'));
return false;
}
@ -77,6 +76,7 @@ class RepliesAction extends OwnerDesignAction
$profile = $this->user->getProfile();
if (!$profile) {
// TRANS: Server error displayed when trying to reply to a user without a profile.
$this->serverError(_('User has no profile.'));
return false;
}
@ -105,7 +105,6 @@ class RepliesAction extends OwnerDesignAction
*
* @return void
*/
function handle($args)
{
parent::handle($args);
@ -119,12 +118,15 @@ class RepliesAction extends OwnerDesignAction
*
* @return string title of page
*/
function title()
{
if ($this->page == 1) {
// TRANS: Title for first page of replies for a user.
// TRANS: %s is a user nickname.
return sprintf(_("Replies to %s"), $this->user->nickname);
} else {
// TRANS: Title for all but the first page of replies for a user.
// TRANS: %1$s is a user nickname, %2$d is a page number.
return sprintf(_('Replies to %1$s, page %2$d'),
$this->user->nickname,
$this->page);
@ -136,12 +138,13 @@ class RepliesAction extends OwnerDesignAction
*
* @return void
*/
function getFeeds()
{
return array(new Feed(Feed::RSS1,
common_local_url('repliesrss',
array('nickname' => $this->user->nickname)),
// TRANS: Link for feed with replies for a user.
// TRANS: %s is a user nickname.
sprintf(_('Replies feed for %s (RSS 1.0)'),
$this->user->nickname)),
new Feed(Feed::RSS2,
@ -149,6 +152,8 @@ class RepliesAction extends OwnerDesignAction
array(
'id' => $this->user->nickname,
'format' => 'rss')),
// TRANS: Link for feed with replies for a user.
// TRANS: %s is a user nickname.
sprintf(_('Replies feed for %s (RSS 2.0)'),
$this->user->nickname)),
new Feed(Feed::ATOM,
@ -156,6 +161,8 @@ class RepliesAction extends OwnerDesignAction
array(
'id' => $this->user->nickname,
'format' => 'atom')),
// TRANS: Link for feed with replies for a user.
// TRANS: %s is a user nickname.
sprintf(_('Replies feed for %s (Atom)'),
$this->user->nickname)));
}
@ -167,7 +174,6 @@ class RepliesAction extends OwnerDesignAction
*
* @return void
*/
function showContent()
{
$nl = new NoticeList($this->notice, $this);
@ -184,17 +190,27 @@ class RepliesAction extends OwnerDesignAction
function showEmptyListMessage()
{
$message = sprintf(_('This is the timeline showing replies to %1$s but %2$s hasn\'t received a notice to them yet.'), $this->user->nickname, $this->user->nickname) . ' ';
// TRANS: Empty list message for page with replies for a user.
// TRANS: %1$s and %s$s are the user nickname.
$message = sprintf(_('This is the timeline showing replies to %1$s but %2$s hasn\'t received a notice to them yet.'),
$this->user->nickname,
$this->user->nickname) . ' ';
if (common_logged_in()) {
$current_user = common_current_user();
if ($this->user->id === $current_user->id) {
// TRANS: Empty list message for page with replies for a user for the logged in user.
// TRANS: This message contains a Markdown link in the form [link text](link).
$message .= _('You can engage other users in a conversation, subscribe to more people or [join groups](%%action.groups%%).');
} else {
// TRANS: Empty list message for page with replies for a user for all logged in users but the user themselves.
// TRANS: %1$s, %2$s and %3$s are a user nickname. This message contains a Markdown link in the form [link text](link).
$message .= sprintf(_('You can try to [nudge %1$s](../%2$s) or [post something to them](%%%%action.newnotice%%%%?status_textarea=%3$s).'), $this->user->nickname, $this->user->nickname, '@' . $this->user->nickname);
}
}
else {
// TRANS: Empty list message for page with replies for a user for not logged in users.
// TRANS: %1$s is a user nickname. This message contains a Markdown link in the form [link text](link).
$message .= sprintf(_('Why not [register an account](%%%%action.register%%%%) and then nudge %s or post a notice to them.'), $this->user->nickname);
}

View File

@ -40,7 +40,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl.html AGPLv3
* @link http://status.net/
*/
class RevokeRoleAction extends ProfileFormAction
{
/**
@ -50,19 +49,20 @@ class RevokeRoleAction extends ProfileFormAction
*
* @return boolean success flag
*/
function prepare($args)
{
if (!parent::prepare($args)) {
return false;
}
$this->role = $this->arg('role');
if (!Profile_role::isValid($this->role)) {
// TRANS: Client error displayed when trying to revoke an invalid role.
$this->clientError(_('Invalid role.'));
return false;
}
if (!Profile_role::isSettable($this->role)) {
// TRANS: Client error displayed when trying to revoke a reserved role.
$this->clientError(_('This role is reserved and cannot be set.'));
return false;
}
@ -72,6 +72,7 @@ class RevokeRoleAction extends ProfileFormAction
assert(!empty($cur)); // checked by parent
if (!$cur->hasRight(Right::REVOKEROLE)) {
// TRANS: Client error displayed when trying to revoke a role without having the right to do that.
$this->clientError(_('You cannot revoke user roles on this site.'));
return false;
}
@ -79,7 +80,8 @@ class RevokeRoleAction extends ProfileFormAction
assert(!empty($this->profile)); // checked by parent
if (!$this->profile->hasRole($this->role)) {
$this->clientError(_("User doesn't have this role."));
// TRANS: Client error displayed when trying to revoke a role that is not set.
$this->clientError(_('User does not have this role.'));
return false;
}
@ -91,7 +93,6 @@ class RevokeRoleAction extends ProfileFormAction
*
* @return void
*/
function handlePost()
{
$this->profile->revokeRole($this->role);

View File

@ -110,6 +110,7 @@ class RsdAction extends Action
$this->user = User::staticGet('nickname', $nickname);
if (empty($this->user)) {
// TRANS: Client error.
$this->clientError(_('No such user.'), 404);
return false;
}
@ -139,6 +140,7 @@ class RsdAction extends Action
$this->elementStart('rsd', array('version' => '1.0',
'xmlns' => $rsdNS));
$this->elementStart('service');
// TRANS: Engine name for RSD.
$this->element('engineName', null, _('StatusNet'));
$this->element('engineLink', null, 'http://status.net/');
$this->elementStart('apis');

View File

@ -142,6 +142,7 @@ class UserauthorizationAction extends Action
'alt' => $nickname));
}
// TRANS: Label for nickname on user authorisation page.
$this->element('div', 'entity_nickname', _('Nickname'));
$hasFN = ($fullname !== '') ? 'nickname' : 'fn nickname';
@ -196,12 +197,14 @@ class UserauthorizationAction extends Action
'userauthorization')));
$this->hidden('token', common_session_token());
// TRANS: Button text on Authorise Subscription page.
$this->submit('accept', _m('BUTTON','Accept'), 'submit accept', null,
$this->submit('accept',
// TRANS: Button text on Authorise Subscription page.
_m('BUTTON','Accept'), 'submit accept', null,
// TRANS: Title for button on Authorise Subscription page.
_('Subscribe to this user.'));
// TRANS: Button text on Authorise Subscription page.
$this->submit('reject', _m('BUTTON','Reject'), 'submit reject', null,
$this->submit('reject',
// TRANS: Button text on Authorise Subscription page.
_m('BUTTON','Reject'), 'submit reject', null,
// TRANS: Title for button on Authorise Subscription page.
_('Reject this subscription.'));
$this->elementEnd('form');

View File

@ -71,6 +71,7 @@ class UserDesignSettingsAction extends DesignSettingsAction
*/
function title()
{
// TRANS: Title for profile design page.
return _('Profile design');
}
@ -81,6 +82,7 @@ class UserDesignSettingsAction extends DesignSettingsAction
*/
function getInstructions()
{
// TRANS: Instructions for Profile design page.
return _('Customize the way your profile looks ' .
'with a background image and a colour palette of your choice.');
}
@ -193,6 +195,7 @@ class UserDesignSettingsAction extends DesignSettingsAction
if ($result === false) {
common_log_db_error($design, 'UPDATE', __FILE__);
// TRANS: Form validation error on Profile design page when updating design settings has failed.
$this->showForm(_('Could not update your design.'));
return;
}
@ -215,6 +218,7 @@ class UserDesignSettingsAction extends DesignSettingsAction
if (empty($id)) {
common_log_db_error($id, 'INSERT', __FILE__);
// TRANS: Form validation error on Profile design page when saving design settings has failed.
$this->showForm(_('Unable to save your design settings.'));
return;
}
@ -225,6 +229,7 @@ class UserDesignSettingsAction extends DesignSettingsAction
if (empty($result)) {
common_log_db_error($original, 'UPDATE', __FILE__);
// TRANS: Form validation error on Profile design page when saving design settings has failed.
$this->showForm(_('Unable to save your design settings.'));
$user->query('ROLLBACK');
return;
@ -236,6 +241,7 @@ class UserDesignSettingsAction extends DesignSettingsAction
$this->saveBackgroundImage($design);
// TRANS: Confirmation message on Profile design page when saving design settings has succeeded.
$this->showForm(_('Design preferences saved.'), true);
}
@ -246,7 +252,6 @@ class UserDesignSettingsAction extends DesignSettingsAction
*/
function sethd()
{
$user = common_current_user();
$design = $user->getDesign();
@ -267,6 +272,7 @@ class UserDesignSettingsAction extends DesignSettingsAction
if (empty($id)) {
common_log_db_error($id, 'INSERT', __FILE__);
// TRANS: Form validation error on Profile design page when saving design settings has failed.
$this->showForm(_('Unable to save your design settings.'));
return;
}
@ -277,6 +283,7 @@ class UserDesignSettingsAction extends DesignSettingsAction
if (empty($result)) {
common_log_db_error($original, 'UPDATE', __FILE__);
// TRANS: Form validation error on Profile design page when updating design settings has failed.
$this->showForm(_('Unable to save your design settings.'));
$user->query('ROLLBACK');
return;
@ -286,6 +293,7 @@ class UserDesignSettingsAction extends DesignSettingsAction
$this->saveBackgroundImage($design);
// TRANS: Succes message on Profile design page when finding an easter egg.
$this->showForm(_('Enjoy your hotdog!'), true);
}
@ -303,7 +311,8 @@ class UserDesignSettingsAction extends DesignSettingsAction
if ($result === false) {
common_log_db_error($user, 'UPDATE', __FILE__);
throw new ServerException(_('Couldn\'t update user.'));
// TRANS: Server exception thrown on Profile design page when updating design settings fails.
throw new ServerException(_('Could not update user.'));
}
}
}
@ -322,6 +331,7 @@ class UserDesignForm extends DesignForm
*/
function formLegend()
{
// TRANS: Form legend on Profile design page.
$this->out->element('legend', null, _('Design settings'));
}
@ -337,7 +347,9 @@ class UserDesignForm extends DesignForm
$this->out->elementStart('ul', 'form_data');
$this->out->elementStart('li');
// TRANS: Checkbox label on Profile design page.
$this->out->checkbox('viewdesigns', _('View profile designs'),
// TRANS: Title for checkbox on Profile design page.
- $user->viewdesigns, _('Show or hide profile designs.'));
$this->out->elementEnd('li');
$this->out->elementEnd('ul');
@ -345,6 +357,7 @@ class UserDesignForm extends DesignForm
$this->out->elementEnd('fieldset');
$this->out->elementStart('fieldset');
// TRANS: Form legend on Profile design page for form to choose a background image.
$this->out->element('legend', null, _('Background file'));
parent::formData();

View File

@ -45,7 +45,6 @@ require_once INSTALLDIR.'/lib/grouplist.php';
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
* @link http://status.net/
*/
class UsergroupsAction extends OwnerDesignAction
{
var $page = null;
@ -59,10 +58,12 @@ class UsergroupsAction extends OwnerDesignAction
function title()
{
if ($this->page == 1) {
// TRANS: Message is used as a page title. %s is a nick name.
// TRANS: Page title for first page of groups for a user.
// TRANS: %s is a nickname.
return sprintf(_('%s groups'), $this->user->nickname);
} else {
// TRANS: Message is used as a page title. %1$s is a nick name, %2$d is a page number.
// TRANS: Page title for all but the first page of groups for a user.
// TRANS: %1$s is a nickname, %2$d is a page number.
return sprintf(_('%1$s groups, page %2$d'),
$this->user->nickname,
$this->page);
@ -90,6 +91,7 @@ class UsergroupsAction extends OwnerDesignAction
$this->user = User::staticGet('nickname', $nickname);
if (!$this->user) {
// TRANS: Client error displayed requesting groups for a non-existing user.
$this->clientError(_('No such user.'), 404);
return false;
}
@ -97,6 +99,7 @@ class UsergroupsAction extends OwnerDesignAction
$this->profile = $this->user->getProfile();
if (!$this->profile) {
// TRANS: Server error displayed requesting groups for a user without a profile.
$this->serverError(_('User has no profile.'));
return false;
}
@ -123,12 +126,14 @@ class UsergroupsAction extends OwnerDesignAction
$this->elementStart('p', array('id' => 'new_group'));
$this->element('a', array('href' => common_local_url('newgroup'),
'class' => 'more'),
// TRANS: Link text on group page to create a new group.
_('Create a new group'));
$this->elementEnd('p');
$this->elementStart('p', array('id' => 'group_search'));
$this->element('a', array('href' => common_local_url('groupsearch'),
'class' => 'more'),
// TRANS: Link text on group page to search for groups.
_('Search for more groups'));
$this->elementEnd('p');
@ -156,11 +161,15 @@ class UsergroupsAction extends OwnerDesignAction
function showEmptyListMessage()
{
// TRANS: Text on group page for a user that is not a member of any group.
// TRANS: %s is a user nickname.
$message = sprintf(_('%s is not a member of any group.'), $this->user->nickname) . ' ';
if (common_logged_in()) {
$current_user = common_current_user();
if ($this->user->id === $current_user->id) {
// TRANS: Text on group page for a user that is not a member of any group. This message contains
// TRANS: a Markdown link in the form [link text](link) and a variable that should not be changed.
$message .= _('Try [searching for groups](%%action.groupsearch%%) and joining them.');
}
}

View File

@ -46,7 +46,6 @@ if (!defined('STATUSNET')) {
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
* @link http://status.net/
*/
class VersionAction extends Action
{
var $pluginVersions = array();
@ -58,7 +57,6 @@ class VersionAction extends Action
*
* @return boolean is read only action?
*/
function isReadOnly($args)
{
return true;
@ -69,9 +67,9 @@ class VersionAction extends Action
*
* @return string page title
*/
function title()
{
// TRANS: Title for version page. %s is the StatusNet version.
return sprintf(_("StatusNet %s"), STATUSNET_VERSION);
}
@ -85,7 +83,6 @@ class VersionAction extends Action
*
* @return boolean true
*/
function prepare($args)
{
parent::prepare($args);
@ -105,7 +102,6 @@ class VersionAction extends Action
*
* @return void
*/
function handle($args)
{
parent::handle($args);
@ -131,7 +127,6 @@ class VersionAction extends Action
$this->elementEnd('div');
}
/*
* Overrride to add entry-title class
*
@ -147,38 +142,46 @@ class VersionAction extends Action
*
* @return void
*/
function showContent()
{
$this->elementStart('p');
// TRANS: Content part of StatusNet version page.
// TRANS: %1$s is the engine name (StatusNet) and %2$s is the StatusNet version.
$this->raw(sprintf(_('This site is powered by %1$s version %2$s, '.
'Copyright 2008-2010 StatusNet, Inc. '.
'and contributors.'),
XMLStringer::estring('a', array('href' => 'http://status.net/'),
// TRANS: Engine name.
_('StatusNet')),
STATUSNET_VERSION));
$this->elementEnd('p');
// TRANS: Header for StatusNet contributors section on the version page.
$this->element('h2', null, _('Contributors'));
$this->element('p', null, implode(', ', $this->contributors));
// TRANS: Header for StatusNet license section on the version page.
$this->element('h2', null, _('License'));
$this->element('p', null,
// TRANS: Content part of StatusNet version page.
_('StatusNet 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->element('p', null,
// TRANS: Content part of StatusNet version page.
_('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. '));
$this->elementStart('p');
// TRANS: Content part of StatusNet version page.
// TRANS: %s is a link to the AGPL license with link description "http://www.gnu.org/licenses/agpl.html".
$this->raw(sprintf(_('You should have received a copy of the GNU Affero General Public License '.
'along with this program. If not, see %s.'),
XMLStringer::estring('a', array('href' => 'http://www.gnu.org/licenses/agpl.html'),
@ -188,16 +191,21 @@ class VersionAction extends Action
// XXX: Theme information?
if (count($this->pluginVersions)) {
// TRANS: Header for StatusNet plugins section on the version page.
$this->element('h2', null, _('Plugins'));
$this->elementStart('table', array('id' => 'plugins_enabled'));
$this->elementStart('thead');
$this->elementStart('tr');
$this->element('th', array('id' => 'plugin_name'), _('Name'));
$this->element('th', array('id' => 'plugin_version'), _('Version'));
$this->element('th', array('id' => 'plugin_authors'), _('Author(s)'));
$this->element('th', array('id' => 'plugin_description'), _('Description'));
// TRANS: Column header for plugins table on version page.
$this->element('th', array('id' => 'plugin_name'), _m('HEADER','Name'));
// TRANS: Column header for plugins table on version page.
$this->element('th', array('id' => 'plugin_version'), _m('HEADER','Version'));
// TRANS: Column header for plugins table on version page.
$this->element('th', array('id' => 'plugin_authors'), _m('HEADER','Author(s)'));
// TRANS: Column header for plugins table on version page.
$this->element('th', array('id' => 'plugin_description'), _m('HEADER','Description'));
$this->elementEnd('tr');
$this->elementEnd('thead');
@ -269,5 +277,6 @@ class VersionAction extends Action
'mEDI',
'Brett Taylor',
'Brigitte Schuster',
'Brion Vibber');
'Brion Vibber',
'Siebrand Mazeland');
}

View File

@ -44,6 +44,7 @@ class Fave extends Memcached_DataObject
common_log_db_error($fave, 'INSERT', __FILE__);
return false;
}
self::blow('fave:by_notice:%d', $fave->notice_id);
Event::handle('EndFavorNotice', array($profile, $notice));
}
@ -61,6 +62,7 @@ class Fave extends Memcached_DataObject
if (Event::handle('StartDisfavorNotice', array($profile, $notice, &$result))) {
$result = parent::delete();
self::blow('fave:by_notice:%d', $this->notice_id);
if ($result) {
Event::handle('EndDisfavorNotice', array($profile, $notice));
@ -208,4 +210,31 @@ class Fave extends Memcached_DataObject
return $fav;
}
/**
* Grab a list of profile who have favored this notice.
*
* @return ArrayWrapper masquerading as a Fave
*/
static function byNotice($noticeId)
{
$c = self::memcache();
$key = Cache::key('fave:by_notice:' . $noticeId);
$wrapper = $c->get($key);
if (!$wrapper) {
// @fixme caching & scalability!
$fave = new Fave();
$fave->notice_id = $noticeId;
$fave->find();
$list = array();
while ($fave->fetch()) {
$list[] = clone($fave);
}
$wrapper = new ArrayWrapper($list);
$c->set($key, $wrapper);
}
return $wrapper;
}
}

View File

@ -496,6 +496,13 @@ class Notice extends Memcached_DataObject
if ($this->isPublic()) {
self::blow('public;last');
}
self::blow('fave:by_notice', $this->id);
if ($this->conversation) {
// In case we're the first, will need to calc a new root.
self::blow('notice:conversation_root:%d', $this->conversation);
}
}
/** save all urls in the notice to the db
@ -774,6 +781,35 @@ class Notice extends Memcached_DataObject
return false;
}
/**
* Grab the earliest notice from this conversation.
*
* @return Notice or null
*/
function conversationRoot()
{
if (!empty($this->conversation)) {
$c = self::memcache();
$key = Cache::key('notice:conversation_root:' . $this->conversation);
$notice = $c->get($key);
if ($notice) {
return $notice;
}
$notice = new Notice();
$notice->conversation = $this->conversation;
$notice->orderBy('CREATED');
$notice->limit(1);
$notice->find(true);
if ($notice->N) {
$c->set($key, $notice);
return $notice;
}
}
return null;
}
/**
* Pull up a full list of local recipients who will be getting
* this notice in their inbox. Results will be cached, so don't

View File

@ -412,16 +412,20 @@ var SN = { // StatusNet
var replyItem = form.closest('li.notice-reply');
if (replyItem.length > 0) {
// If this is an inline reply, insert it in place.
// If this is an inline reply, remove the form...
var list = form.closest('.threaded-replies');
var placeholder = list.find('.notice-reply-placeholder');
replyItem.remove();
var id = $(notice).attr('id');
if ($("#"+id).length == 0) {
var parentNotice = replyItem.closest('li.notice');
replyItem.replaceWith(notice);
SN.U.NoticeInlineReplyPlaceholder(parentNotice);
$(notice).insertBefore(placeholder);
} else {
// Realtime came through before us...
replyItem.remove();
}
// ...and show the placeholder form.
placeholder.show();
} else if (notices.length > 0 && SN.U.belongsOnTimeline(notice)) {
// Not a reply. If on our timeline, show it at the top!
@ -604,8 +608,8 @@ var SN = { // StatusNet
// Update the existing form...
nextStep();
} else {
// Remove placeholder if any
list.find('li.notice-reply-placeholder').remove();
// Hide the placeholder...
var placeholder = list.find('li.notice-reply-placeholder').hide();
// Create the reply form entry at the end
var replyItem = $('li.notice-reply', list);
@ -615,7 +619,7 @@ var SN = { // StatusNet
var intermediateStep = function(formMaster) {
var formEl = document._importNode(formMaster, true);
replyItem.append(formEl);
list.append(replyItem);
list.append(replyItem); // *after* the placeholder
var form = replyForm = $(formEl);
SN.Init.NoticeFormSetup(form);
@ -662,6 +666,18 @@ var SN = { // StatusNet
SN.U.NoticeInlineReplyTrigger(notice);
return false;
});
$('li.notice-reply-comments a')
.live('click', function() {
var url = $(this).attr('href');
var area = $(this).closest('.threaded-replies');
$.get(url, {ajax: 1}, function(data, textStatus, xhr) {
var replies = $('.threaded-replies', data);
if (replies.length) {
area.replaceWith(document._importNode(replies[0], true));
}
});
return false;
});
},
/**
@ -1360,7 +1376,7 @@ var SN = { // StatusNet
if (cur == '' || cur == textarea.data('initialText')) {
var parentNotice = replyItem.closest('li.notice');
replyItem.remove();
SN.U.NoticeInlineReplyPlaceholder(parentNotice);
parentNotice.find('li.notice-reply-placeholder').show();
}
}
});

2
js/util.min.js vendored

File diff suppressed because one or more lines are too long

View File

@ -39,6 +39,8 @@ define('NOTICES_PER_SECTION', 6);
* These are the widgets that show interesting data about a person
* group, or site.
*
* @todo migrate this to use a variant of NoticeList
*
* @category Widget
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
@ -97,38 +99,14 @@ class NoticeSection extends Section
$this->out->elementStart('p', 'entry-content');
$this->out->raw($notice->rendered);
$notice_link_cfg = common_config('site', 'notice_link');
if ('direct' === $notice_link_cfg) {
$this->out->text(' (');
$this->out->element('a', array('href' => $notice->uri), 'see');
$this->out->text(')');
} elseif ('attachment' === $notice_link_cfg) {
if ($count = $notice->hasAttachments()) {
// link to attachment(s) pages
if (1 === $count) {
$f2p = File_to_post::staticGet('post_id', $notice->id);
$href = common_local_url('attachment', array('attachment' => $f2p->file_id));
$att_class = 'attachment';
} else {
$href = common_local_url('attachments', array('notice' => $notice->id));
$att_class = 'attachments';
}
$clip = Theme::path('images/icons/clip.png', 'base');
$this->out->elementStart('a', array('class' => $att_class, 'style' => "font-style: italic;", 'href' => $href, 'title' => "# of attachments: $count"));
$this->out->raw(" ($count&nbsp");
$this->out->element('img', array('style' => 'display: inline', 'align' => 'top', 'width' => 20, 'height' => 20, 'src' => $clip, 'alt' => 'alt'));
$this->out->text(')');
$this->out->elementEnd('a');
} else {
$this->out->text(' (');
$this->out->element('a', array('href' => $notice->uri), 'see');
$this->out->text(')');
}
}
$this->out->elementEnd('p');
$this->out->elementStart('div', 'entry_content');
get_class('NoticeList');
$nli = new NoticeListItem($notice, $this->out);
$nli->showNoticeLink();
$this->out->elementEnd('div');
if (!empty($notice->value)) {
$this->out->elementStart('p');
$this->out->text($notice->value);

View File

@ -333,6 +333,9 @@ class Router
$m->connect('conversation/:id',
array('action' => 'conversation'),
array('id' => '[0-9]+'));
$m->connect('conversation/:id/replies',
array('action' => 'conversationreplies'),
array('id' => '[0-9]+'));
$m->connect('message/new', array('action' => 'newmessage'));
$m->connect('message/new?to=:to', array('action' => 'newmessage'), array('to' => Nickname::DISPLAY_FMT));

View File

@ -48,7 +48,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
* @see NoticeListItem
* @see ProfileNoticeList
*/
class ThreadedNoticeList extends NoticeList
{
/**
@ -59,11 +58,11 @@ class ThreadedNoticeList extends NoticeList
*
* @return int count of notices listed.
*/
function show()
{
$this->out->elementStart('div', array('id' =>'notices_primary'));
$this->out->element('h2', null, _('Notices'));
// TRANS: Header for Notices section.
$this->out->element('h2', null, _m('HEADER','Notices'));
$this->out->elementStart('ol', array('class' => 'notices threaded-notices xoxo'));
$cnt = 0;
@ -75,7 +74,15 @@ class ThreadedNoticeList extends NoticeList
break;
}
$convo = $this->notice->conversation;
// Collapse repeats into their originals...
$notice = $this->notice;
if ($notice->repeat_of) {
$orig = Notice::staticGet('id', $notice->repeat_of);
if ($orig) {
$notice = $orig;
}
}
$convo = $notice->conversation;
if (!empty($conversations[$convo])) {
// Seen this convo already -- skip!
continue;
@ -83,14 +90,10 @@ class ThreadedNoticeList extends NoticeList
$conversations[$convo] = true;
// Get the convo's root notice
// @fixme stream goes in wrong direction, this needs sane caching
//$notice = Notice::conversationStream($convo, 0, 1);
//$notice->fetch();
$notice = new Notice();
$notice->conversation = $this->notice->conversation;
$notice->orderBy('CREATED');
$notice->limit(1);
$notice->find(true);
$root = $notice->conversationRoot();
if ($root) {
$notice = $root;
}
try {
$item = $this->newListItem($notice);
@ -118,7 +121,6 @@ class ThreadedNoticeList extends NoticeList
*
* @return NoticeListItem a list item for displaying the notice
*/
function newListItem($notice)
{
return new ThreadedNoticeListItem($notice, $this->out);
@ -142,10 +144,12 @@ class ThreadedNoticeList extends NoticeList
* @see NoticeList
* @see ProfileNoticeListItem
*/
class ThreadedNoticeListItem extends NoticeListItem
{
const INITIAL_ITEMS = 3;
function initialItems()
{
return 3;
}
function showContext()
{
@ -159,11 +163,11 @@ class ThreadedNoticeListItem extends NoticeListItem
*
* @return void
*/
function showEnd()
{
$max = $this->initialItems();
if (!$this->repeat) {
$notice = Notice::conversationStream($this->notice->conversation, 0, self::INITIAL_ITEMS + 2);
$notice = Notice::conversationStream($this->notice->conversation, 0, $max + 2);
$notices = array();
$cnt = 0;
$moreCutoff = null;
@ -173,7 +177,7 @@ class ThreadedNoticeListItem extends NoticeListItem
continue;
}
$cnt++;
if ($cnt > self::INITIAL_ITEMS) {
if ($cnt > $max) {
// boo-yah
$moreCutoff = clone($notice);
break;
@ -181,8 +185,15 @@ class ThreadedNoticeListItem extends NoticeListItem
$notices[] = clone($notice); // *grumble* inefficient as hell
}
$this->out->elementStart('ul', 'notices threaded-replies xoxo');
$item = new ThreadedNoticeListFavesItem($this->notice, $this->out);
$hasFaves = $item->show();
$item = new ThreadedNoticeListRepeatsItem($this->notice, $this->out);
$hasRepeats = $item->show();
if ($notices) {
$this->out->elementStart('ul', 'notices threaded-replies xoxo');
if ($moreCutoff) {
$item = new ThreadedNoticeListMoreItem($moreCutoff, $this->out);
$item->show();
@ -191,23 +202,25 @@ class ThreadedNoticeListItem extends NoticeListItem
$item = new ThreadedNoticeListSubItem($notice, $this->out);
$item->show();
}
}
if ($notices || $hasFaves || $hasRepeats) {
// @fixme do a proper can-post check that's consistent
// with the JS side
if (common_current_user()) {
$item = new ThreadedNoticeListReplyItem($notice, $this->out);
$item = new ThreadedNoticeListReplyItem($this->notice, $this->out);
$item->show();
}
$this->out->elementEnd('ul');
}
$this->out->elementEnd('ul');
}
parent::showEnd();
}
}
// @todo FIXME: needs documentation.
class ThreadedNoticeListSubItem extends NoticeListItem
{
function avatarSize()
{
return AVATAR_STREAM_SIZE; // @fixme would like something in between
@ -227,6 +240,13 @@ class ThreadedNoticeListSubItem extends NoticeListItem
{
//
}
function showEnd()
{
$item = new ThreadedNoticeListInlineFavesItem($this->notice, $this->out);
$hasFaves = $item->show();
parent::showEnd();
}
}
/**
@ -234,7 +254,6 @@ class ThreadedNoticeListSubItem extends NoticeListItem
*/
class ThreadedNoticeListMoreItem extends NoticeListItem
{
/**
* recipe function for displaying a single notice.
*
@ -243,7 +262,6 @@ class ThreadedNoticeListMoreItem extends NoticeListItem
*
* @return void
*/
function show()
{
$this->showStart();
@ -256,7 +274,6 @@ class ThreadedNoticeListMoreItem extends NoticeListItem
*
* @return void
*/
function showStart()
{
$this->out->elementStart('li', array('class' => 'notice-reply-comments'));
@ -265,25 +282,25 @@ class ThreadedNoticeListMoreItem extends NoticeListItem
function showMiniForm()
{
$id = $this->notice->conversation;
$url = common_local_url('conversation', array('id' => $id)) . '#notice-' . $this->notice->id;
$url = common_local_url('conversationreplies', array('id' => $id));
$notice = new Notice();
$notice->conversation = $id;
$n = $notice->count() - 1;
$msg = sprintf(_m('Show %d reply', 'Show all %d replies', $n), $n);
// TRANS: Link to show replies for a notice.
// TRANS: %d is the number of replies to a notice and used for plural.
$msg = sprintf(_m('Show reply', 'Show all %d replies', $n), $n);
$this->out->element('a', array('href' => $url), $msg);
}
}
/**
* Placeholder for reply form...
* Same as get added at runtime via SN.U.NoticeInlineReplyPlaceholder
*/
class ThreadedNoticeListReplyItem extends NoticeListItem
{
/**
* recipe function for displaying a single notice.
*
@ -292,7 +309,6 @@ class ThreadedNoticeListReplyItem extends NoticeListItem
*
* @return void
*/
function show()
{
$this->showStart();
@ -305,7 +321,6 @@ class ThreadedNoticeListReplyItem extends NoticeListItem
*
* @return void
*/
function showStart()
{
$this->out->elementStart('li', array('class' => 'notice-reply-placeholder'));
@ -314,6 +329,176 @@ class ThreadedNoticeListReplyItem extends NoticeListItem
function showMiniForm()
{
$this->out->element('input', array('class' => 'placeholder',
// TRANS: Field label for reply mini form.
'value' => _('Write a reply...')));
}
}
}
/**
* Placeholder for showing faves...
*/
abstract class NoticeListActorsItem extends NoticeListItem
{
/**
* @return array of profile IDs
*/
abstract function getProfiles();
abstract function getListMessage($count, $you);
function show()
{
$links = array();
$you = false;
$cur = common_current_user();
foreach ($this->getProfiles() as $id) {
if ($cur && $cur->id == $id) {
$you = true;
// TRANS: Reference to the logged in user in favourite list.
array_unshift($links, _m('FAVELIST', 'You'));
} else {
$profile = Profile::staticGet('id', $id);
if ($profile) {
$links[] = sprintf('<a href="%s" title="%s">%s</a>',
htmlspecialchars($profile->profileurl),
htmlspecialchars($profile->getBestName()),
htmlspecialchars($profile->nickname));
}
}
}
if ($links) {
$count = count($links);
$msg = $this->getListMessage($count, $you);
$out = sprintf($msg, $this->magicList($links));
$this->showStart();
$this->out->raw($out);
$this->showEnd();
return $count;
} else {
return 0;
}
}
function magicList($items)
{
if (count($items) == 0) {
return '';
} else if (count($items) == 1) {
return $items[0];
} else {
$first = array_slice($items, 0, -1);
$last = array_slice($items, -1, 1);
// TRANS: Separator in list of user names like "You, Bob, Mary".
$sepataror = _(', ');
// TRANS: For building a list such as "You, bob, mary and 5 others have favored this notice".
// TRANS: %1$s is a list of users, separated by a separator (default: ", "), %2$s is the last user in the list.
return sprintf(_m('FAVELIST', '%1$s and %2$s'), implode($separator, $first), implode($separator, $last));
}
}
}
/**
* Placeholder for showing faves...
*/
class ThreadedNoticeListFavesItem extends NoticeListActorsItem
{
function getProfiles()
{
$fave = Fave::byNotice($this->notice->id);
$profiles = array();
while ($fave->fetch()) {
$profiles[] = $fave->user_id;
}
return $profiles;
}
function getListMessage($count, $you)
{
if ($count == 1 && $you) {
// darn first person being different from third person!
// TRANS: List message for notice favoured by logged in user.
return _m('FAVELIST', 'You have favored this notice.');
} else {
// TRANS: List message for favoured notices.
// TRANS: %d is the number of users that have favoured a notice.
return sprintf(_m(
'FAVELIST',
'One person has favored this notice.',
'%d people have favored this notice.',
$count),
$count);
}
}
function showStart()
{
$this->out->elementStart('li', array('class' => 'notice-data notice-faves'));
}
function showEnd()
{
$this->out->elementEnd('li');
}
}
// @todo FIXME: needs documentation.
class ThreadedNoticeListInlineFavesItem extends ThreadedNoticeListFavesItem
{
function showStart()
{
$this->out->elementStart('div', array('class' => 'entry-content notice-faves'));
}
function showEnd()
{
$this->out->elementEnd('div');
}
}
/**
* Placeholder for showing faves...
*/
class ThreadedNoticeListRepeatsItem extends NoticeListActorsItem
{
function getProfiles()
{
$rep = $this->notice->repeatStream();
$profiles = array();
while ($rep->fetch()) {
$profiles[] = $rep->profile_id;
}
return $profiles;
}
function getListMessage($count, $you)
{
if ($count == 1 && $you) {
// darn first person being different from third person!
// TRANS: List message for notice repeated by logged in user.
return _m('REPEATLIST', 'You have repeated this notice.');
} else {
// TRANS: List message for repeated notices.
// TRANS: %d is the number of users that have repeated a notice.
return sprintf(_m(
'REPEATLIST',
'One person has repeated this notice.',
'%d people have repeated this notice.',
$count),
$count);
}
}
function showStart()
{
$this->out->elementStart('li', array('class' => 'notice-data notice-repeats'));
}
function showEnd()
{
$this->out->elementEnd('li');
}
}

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 TopPostersSection extends ProfileSection
{
function getProfiles()
@ -71,6 +70,7 @@ class TopPostersSection extends ProfileSection
function title()
{
// TRANS: Title for top posters section.
return _('Top posters');
}

View File

@ -44,7 +44,6 @@ if (!defined('STATUSNET')) {
*
* @see UnSandboxForm
*/
class UnsandboxForm extends ProfileActionForm
{
/**
@ -52,7 +51,6 @@ class UnsandboxForm extends ProfileActionForm
*
* @return string Name of the action, lowercased.
*/
function target()
{
return 'unsandbox';
@ -63,10 +61,10 @@ class UnsandboxForm extends ProfileActionForm
*
* @return string Title of the form, internationalized
*/
function title()
{
return _('Unsandbox');
// TRANS: Title for unsandbox form.
return _m('TITLE','Unsandbox');
}
/**
@ -74,9 +72,9 @@ class UnsandboxForm extends ProfileActionForm
*
* @return string description of the form, internationalized
*/
function description()
{
// TRANS: Description for unsandbox form.
return _('Unsandbox this user');
}
}

View File

@ -42,7 +42,6 @@ if (!defined('STATUSNET')) {
*
* @see SilenceForm
*/
class UnSilenceForm extends ProfileActionForm
{
/**
@ -50,7 +49,6 @@ class UnSilenceForm extends ProfileActionForm
*
* @return string Name of the action, lowercased.
*/
function target()
{
return 'unsilence';
@ -61,9 +59,9 @@ class UnSilenceForm extends ProfileActionForm
*
* @return string Title of the form, internationalized
*/
function title()
{
// TRANS: Title for unsilence form.
return _('Unsilence');
}
@ -72,9 +70,9 @@ class UnSilenceForm extends ProfileActionForm
*
* @return string description of the form, internationalized
*/
function description()
{
// TRANS: Form description for unsilence form.
return _('Unsilence this user');
}
}

View File

@ -46,7 +46,6 @@ require_once INSTALLDIR.'/lib/form.php';
*
* @see SubscribeForm
*/
class UnsubscribeForm extends Form
{
/**
@ -61,7 +60,6 @@ class UnsubscribeForm extends Form
* @param HTMLOutputter $out output channel
* @param Profile $profile profile of user to unsub from
*/
function __construct($out=null, $profile=null)
{
parent::__construct($out);
@ -74,7 +72,6 @@ class UnsubscribeForm extends Form
*
* @return int ID of the form
*/
function id()
{
return 'unsubscribe-' . $this->profile->id;
@ -86,7 +83,6 @@ class UnsubscribeForm extends Form
*
* @return string of the form class
*/
function formClass()
{
return 'form_user_unsubscribe ajax';
@ -97,7 +93,6 @@ class UnsubscribeForm extends Form
*
* @return string URL of the action
*/
function action()
{
return common_local_url('unsubscribe');
@ -110,6 +105,7 @@ class UnsubscribeForm extends Form
*/
function formLegend()
{
// TRANS: Form legend on unsubscribe form.
$this->out->element('legend', null, _('Unsubscribe from this user'));
}
@ -118,7 +114,6 @@ class UnsubscribeForm extends Form
*
* @return void
*/
function formData()
{
$this->out->hidden('unsubscribeto-' . $this->profile->id,
@ -131,9 +126,11 @@ class UnsubscribeForm extends Form
*
* @return void
*/
function formActions()
{
$this->out->submit('submit', _('Unsubscribe'), 'submit', null, _('Unsubscribe from this user'));
// TRANS: Button text on unsubscribe form.
$this->out->submit('submit', _m('BUTTON','Unsubscribe'), 'submit', null,
// TRANS: Button title on unsubscribe form.
_('Unsubscribe from this user'));
}
}

View File

@ -318,6 +318,7 @@ function common_set_user($user)
if (Event::handle('StartSetUser', array(&$user))) {
if (!empty($user)) {
if (!$user->hasRight(Right::WEBLOGIN)) {
// TRANS: Authorisation exception thrown when a user a not allowed to login.
throw new AuthorizationException(_('Not allowed to log in.'));
}
common_ensure_session();
@ -867,7 +868,7 @@ function common_replace_urls_callback($text, $callback, $arg = null) {
* @param callable $callback
* @param mixed $arg optional argument to pass on as second param to callback
* @return string
*
*
* @access private
*/
function callback_helper($matches, $callback, $arg=null) {
@ -1335,28 +1336,28 @@ function common_date_string($dt)
} else if ($diff < 3300) {
$minutes = round($diff/60);
// TRANS: Used in notices to indicate when the notice was made compared to now.
return sprintf( ngettext('about one minute ago', 'about %d minutes ago', $minutes), $minutes);
return sprintf( _m('about one minute ago', 'about %d minutes ago', $minutes), $minutes);
} else if ($diff < 5400) {
// TRANS: Used in notices to indicate when the notice was made compared to now.
return _('about an hour ago');
} else if ($diff < 22 * 3600) {
$hours = round($diff/3600);
// TRANS: Used in notices to indicate when the notice was made compared to now.
return sprintf( ngettext('about one hour ago', 'about %d hours ago', $hours), $hours);
return sprintf( _m('about one hour ago', 'about %d hours ago', $hours), $hours);
} else if ($diff < 37 * 3600) {
// TRANS: Used in notices to indicate when the notice was made compared to now.
return _('about a day ago');
} else if ($diff < 24 * 24 * 3600) {
$days = round($diff/(24*3600));
// TRANS: Used in notices to indicate when the notice was made compared to now.
return sprintf( ngettext('about one day ago', 'about %d days ago', $days), $days);
return sprintf( _m('about one day ago', 'about %d days ago', $days), $days);
} else if ($diff < 46 * 24 * 3600) {
// TRANS: Used in notices to indicate when the notice was made compared to now.
return _('about a month ago');
} else if ($diff < 330 * 24 * 3600) {
$months = round($diff/(30*24*3600));
// TRANS: Used in notices to indicate when the notice was made compared to now.
return sprintf( ngettext('about one month ago', 'about %d months ago',$months), $months);
return sprintf( _m('about one month ago', 'about %d months ago',$months), $months);
} else if ($diff < 480 * 24 * 3600) {
// TRANS: Used in notices to indicate when the notice was made compared to now.
return _('about a year ago');
@ -2075,7 +2076,7 @@ function common_shorten_url($long_url, User $user=null, $force = false)
$shortenerName = User_urlshortener_prefs::urlShorteningService($user);
if (Event::handle('StartShortenUrl',
if (Event::handle('StartShortenUrl',
array($long_url, $shortenerName, &$shortenedUrl))) {
if ($shortenerName == 'internal') {
$f = File::processNew($long_url);

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

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"POT-Creation-Date: 2011-03-18 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"

View File

@ -9,14 +9,14 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:47+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: Belarusian (Taraškievica orthography) <http://translatewiki."
"net/wiki/Portal:be-tarask>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: be-tarask\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:47+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: br\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:47+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: de\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: Spanish <http://translatewiki.net/wiki/Portal:es>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: es\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: French <http://translatewiki.net/wiki/Portal:fr>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: fr\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: Galician <http://translatewiki.net/wiki/Portal:gl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: gl\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: Hebrew <http://translatewiki.net/wiki/Portal:he>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: he\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ia\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: Indonesian <http://translatewiki.net/wiki/Portal:id>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: id\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: mk\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+0000\n"
"Language-Team: Norwegian (bokmål) <http://translatewiki.net/wiki/Portal:no>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: no\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:14+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: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: nl\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:15+0000\n"
"Language-Team: Polish <http://translatewiki.net/wiki/Portal:pl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: pl\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:15+0000\n"
"Language-Team: Portuguese <http://translatewiki.net/wiki/Portal:pt>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: pt\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,14 +9,14 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:15+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: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: pt-br\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:15+0000\n"
"Language-Team: Russian <http://translatewiki.net/wiki/Portal:ru>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ru\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:15+0000\n"
"Language-Team: Tagalog <http://translatewiki.net/wiki/Portal:tl>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: tl\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:15+0000\n"
"Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: uk\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -9,14 +9,14 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - APC\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:48+0000\n"
"POT-Creation-Date: 2011-03-18 19:46+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:15+0000\n"
"Language-Team: Simplified Chinese <http://translatewiki.net/wiki/Portal:zh-"
"hans>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:39+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:49+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: zh-hans\n"
"X-Message-Group: #out-statusnet-plugin-apc\n"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"POT-Creation-Date: 2011-03-18 19:45+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"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - AccountManager\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:43+0000\n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:09+0000\n"
"Language-Team: Afrikaans <http://translatewiki.net/wiki/Portal:af>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 20:42:06+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-11 18:51:35+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: af\n"
"X-Message-Group: #out-statusnet-plugin-accountmanager\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - AccountManager\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-11 18:15+0000\n"
"PO-Revision-Date: 2011-03-11 18:17:33+0000\n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:09+0000\n"
"Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-08 01:21:58+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83703); Translate extension (2011-03-11)\n"
"X-POT-Import-Date: 2011-03-11 18:51:35+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: de\n"
"X-Message-Group: #out-statusnet-plugin-accountmanager\n"

View File

@ -0,0 +1,26 @@
# Translation of StatusNet - AccountManager to Finnish (Suomi)
# Exported from translatewiki.net
#
# Author: XTL
# --
# This file is distributed under the same license as the StatusNet package.
#
msgid ""
msgstr ""
"Project-Id-Version: StatusNet - AccountManager\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:09+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: 2011-03-11 18:51:35+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: fi\n"
"X-Message-Group: #out-statusnet-plugin-accountmanager\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
msgid ""
"The Account Manager plugin implements the Account Manager specification."
msgstr "Account Manager plugin toteuttaa Account Manager -määrityksen."

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - AccountManager\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:43+0000\n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:09+0000\n"
"Language-Team: Interlingua <http://translatewiki.net/wiki/Portal:ia>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 20:42:06+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-11 18:51:35+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: ia\n"
"X-Message-Group: #out-statusnet-plugin-accountmanager\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - AccountManager\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:43+0000\n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:09+0000\n"
"Language-Team: Macedonian <http://translatewiki.net/wiki/Portal:mk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 20:42:06+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-11 18:51:35+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: mk\n"
"X-Message-Group: #out-statusnet-plugin-accountmanager\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - AccountManager\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:43+0000\n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:09+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: 2011-03-03 20:42:06+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-11 18:51:35+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: nl\n"
"X-Message-Group: #out-statusnet-plugin-accountmanager\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - AccountManager\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-08 01:03+0000\n"
"PO-Revision-Date: 2011-03-08 01:05:36+0000\n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:09+0000\n"
"Language-Team: Portuguese <http://translatewiki.net/wiki/Portal:pt>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-06 02:12:46+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
"X-POT-Import-Date: 2011-03-11 18:51:35+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: pt\n"
"X-Message-Group: #out-statusnet-plugin-accountmanager\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - AccountManager\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-08 01:03+0000\n"
"PO-Revision-Date: 2011-03-08 01:05:36+0000\n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:09+0000\n"
"Language-Team: Ukrainian <http://translatewiki.net/wiki/Portal:uk>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-06 02:12:46+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83429); Translate extension (2011-03-07)\n"
"X-POT-Import-Date: 2011-03-11 18:51:35+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: uk\n"
"X-Message-Group: #out-statusnet-plugin-accountmanager\n"

View File

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"POT-Creation-Date: 2011-03-18 19:45+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"

View File

@ -10,14 +10,14 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:44+0000\n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:10+0000\n"
"Language-Team: Belarusian (Taraškievica orthography) <http://translatewiki."
"net/wiki/Portal:be-tarask>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:37+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:47+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: be-tarask\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"

View File

@ -9,13 +9,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:44+0000\n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:11+0000\n"
"Language-Team: Breton <http://translatewiki.net/wiki/Portal:br>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:37+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:47+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: br\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"

View File

@ -11,13 +11,13 @@ msgid ""
msgstr ""
"Project-Id-Version: StatusNet - Adsense\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-06 02:34+0100\n"
"PO-Revision-Date: 2011-03-06 01:36:44+0000\n"
"POT-Creation-Date: 2011-03-18 19:45+0000\n"
"PO-Revision-Date: 2011-03-18 19:48:11+0000\n"
"Language-Team: German <http://translatewiki.net/wiki/Portal:de>\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-POT-Import-Date: 2011-03-03 17:42:37+0000\n"
"X-Generator: MediaWiki 1.18alpha (r83348); Translate extension (2011-03-04)\n"
"X-POT-Import-Date: 2011-03-06 02:12:47+0000\n"
"X-Generator: MediaWiki 1.18alpha (r84232); Translate extension (2011-03-11)\n"
"X-Translation-Project: translatewiki.net at http://translatewiki.net\n"
"X-Language-Code: de\n"
"X-Message-Group: #out-statusnet-plugin-adsense\n"

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