Merge branch '0.9.x' into testing

This commit is contained in:
Evan Prodromou 2009-12-11 09:55:47 -05:00
commit e9b733e7f0
66 changed files with 2549 additions and 526 deletions

View File

@ -290,6 +290,18 @@ StartRegistrationTry: before validating and saving a new user
EndRegistrationTry: after saving a new user (note: no profile or user object!) EndRegistrationTry: after saving a new user (note: no profile or user object!)
- $action: action object being shown - $action: action object being shown
StartAvatarFormData: before displaying avatar form
- $action: action object being shown
EndAvatarFormData: after displaying avatar form
- $action: action object being shown
StartAvatarSaveForm: before saving the avatar
- $action: action object being shown
EndAvatarSaveForm: after saving the avatar
- $action: action object being shown
StartNewQueueManager: before trying to start a new queue manager; good for plugins implementing new queue manager classes StartNewQueueManager: before trying to start a new queue manager; good for plugins implementing new queue manager classes
- $qm: empty queue manager to set - $qm: empty queue manager to set

18
Makefile Normal file
View File

@ -0,0 +1,18 @@
# Warning: do not transform tabs to spaces in this file.
all : translations
core_mo = $(patsubst %.po,%.mo,$(wildcard locale/*/LC_MESSAGES/statusnet.po))
plugin_mo = $(patsubst %.po,%.mo,$(wildcard plugins/*/locale/*/LC_MESSAGES/*.po))
translations : $(core_mo) $(plugin_mo)
clean :
rm -f $(core_mo) $(plugin_mo)
updatepo :
php scripts/update_po_templates.php --all
%.mo : %.po
msgfmt -o $@ $<

View File

@ -167,5 +167,4 @@ class AllAction extends ProfileAction
$this->element('h1', null, sprintf(_('%s and friends'), $this->user->nickname)); $this->element('h1', null, sprintf(_('%s and friends'), $this->user->nickname));
} }
} }
} }

View File

@ -118,53 +118,56 @@ class AvatarsettingsAction extends AccountSettingsAction
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->element('legend', null, _('Avatar settings')); $this->element('legend', null, _('Avatar settings'));
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
if (Event::handle('StartAvatarFormData', array($this))) {
$this->elementStart('ul', 'form_data');
if ($original) {
$this->elementStart('li', array('id' => 'avatar_original',
'class' => 'avatar_view'));
$this->element('h2', null, _("Original"));
$this->elementStart('div', array('id'=>'avatar_original_view'));
$this->element('img', array('src' => $original->url,
'width' => $original->width,
'height' => $original->height,
'alt' => $user->nickname));
$this->elementEnd('div');
$this->elementEnd('li');
}
$this->elementStart('ul', 'form_data'); $avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
if ($original) {
$this->elementStart('li', array('id' => 'avatar_original', if ($avatar) {
'class' => 'avatar_view')); $this->elementStart('li', array('id' => 'avatar_preview',
$this->element('h2', null, _("Original")); 'class' => 'avatar_view'));
$this->elementStart('div', array('id'=>'avatar_original_view')); $this->element('h2', null, _("Preview"));
$this->element('img', array('src' => $original->url, $this->elementStart('div', array('id'=>'avatar_preview_view'));
'width' => $original->width, $this->element('img', array('src' => $original->url,
'height' => $original->height, 'width' => AVATAR_PROFILE_SIZE,
'alt' => $user->nickname)); 'height' => AVATAR_PROFILE_SIZE,
$this->elementEnd('div'); 'alt' => $user->nickname));
$this->elementEnd('div');
$this->submit('delete', _('Delete'));
$this->elementEnd('li');
}
$this->elementStart('li', array ('id' => 'settings_attach'));
$this->element('input', array('name' => 'avatarfile',
'type' => 'file',
'id' => 'avatarfile'));
$this->element('input', array('name' => 'MAX_FILE_SIZE',
'type' => 'hidden',
'id' => 'MAX_FILE_SIZE',
'value' => ImageFile::maxFileSizeInt()));
$this->elementEnd('li'); $this->elementEnd('li');
} $this->elementEnd('ul');
$avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE); $this->elementStart('ul', 'form_actions');
$this->elementStart('li');
if ($avatar) { $this->submit('upload', _('Upload'));
$this->elementStart('li', array('id' => 'avatar_preview',
'class' => 'avatar_view'));
$this->element('h2', null, _("Preview"));
$this->elementStart('div', array('id'=>'avatar_preview_view'));
$this->element('img', array('src' => $original->url,
'width' => AVATAR_PROFILE_SIZE,
'height' => AVATAR_PROFILE_SIZE,
'alt' => $user->nickname));
$this->elementEnd('div');
$this->submit('delete', _('Delete'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul');
} }
Event::handle('EndAvatarFormData', array($this));
$this->elementStart('li', array ('id' => 'settings_attach'));
$this->element('input', array('name' => 'avatarfile',
'type' => 'file',
'id' => 'avatarfile'));
$this->element('input', array('name' => 'MAX_FILE_SIZE',
'type' => 'hidden',
'id' => 'MAX_FILE_SIZE',
'value' => ImageFile::maxFileSizeInt()));
$this->elementEnd('li');
$this->elementEnd('ul');
$this->elementStart('ul', 'form_actions');
$this->elementStart('li');
$this->submit('upload', _('Upload'));
$this->elementEnd('li');
$this->elementEnd('ul');
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
@ -266,15 +269,18 @@ class AvatarsettingsAction extends AccountSettingsAction
'Try again, please.')); 'Try again, please.'));
return; return;
} }
if ($this->arg('upload')) { if (Event::handle('StartAvatarSaveForm', array($this))) {
$this->uploadAvatar(); if ($this->arg('upload')) {
} else if ($this->arg('crop')) { $this->uploadAvatar();
$this->cropAvatar(); } else if ($this->arg('crop')) {
} else if ($this->arg('delete')) { $this->cropAvatar();
$this->deleteAvatar(); } else if ($this->arg('delete')) {
} else { $this->deleteAvatar();
$this->showForm(_('Unexpected form submission.')); } else {
$this->showForm(_('Unexpected form submission.'));
}
Event::handle('EndAvatarSaveForm', array($this));
} }
} }

View File

@ -77,12 +77,13 @@ class LoginAction extends Action
parent::handle($args); parent::handle($args);
$disabled = common_config('logincommand','disabled'); $disabled = common_config('logincommand','disabled');
$disabled = isset($disabled) && $disabled;
if (common_is_real_login()) { if (common_is_real_login()) {
$this->clientError(_('Already logged in.')); $this->clientError(_('Already logged in.'));
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') { } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$this->checkLogin(); $this->checkLogin();
} else if (!isset($disabled) && isset($args['user_id']) && isset($args['token'])){ } else if (!$disabled && isset($args['user_id']) && isset($args['token'])){
$this->checkLogin($args['user_id'],$args['token']); $this->checkLogin($args['user_id'],$args['token']);
} else { } else {
common_ensure_session(); common_ensure_session();

View File

@ -39,4 +39,17 @@ class Login_token extends Memcached_DataObject
/* the code above is auto generated do not remove the tag below */ /* the code above is auto generated do not remove the tag below */
###END_AUTOCODE ###END_AUTOCODE
/*
DB_DataObject calculates the sequence key(s) by taking the first key returned by the keys() function.
In this case, the keys() function returns user_id as the first key. user_id is not a sequence, but
DB_DataObject's sequenceKey() will incorrectly think it is. Then, since the sequenceKey() is a numeric
type, but is not set to autoincrement in the database, DB_DataObject will create a _seq table and
manage the sequence itself. This is not the correct behavior for the user_id in this class.
So we override that incorrect behavior, and simply say there is no sequence key.
*/
function sequenceKey()
{
return array(false,false);
}
} }

View File

@ -788,10 +788,24 @@ class Notice extends Memcached_DataObject
return $notice; return $notice;
} }
$notice->whereAdd('id in (' . implode(', ', $ids) . ')'); $notice->whereAdd('id in (' . implode(', ', $ids) . ')');
$notice->orderBy('id DESC');
$notice->find(); $notice->find();
return $notice;
$temp = array();
while ($notice->fetch()) {
$temp[$notice->id] = clone($notice);
}
$wrapped = array();
foreach ($ids as $id) {
if (array_key_exists($id, $temp)) {
$wrapped[] = $temp[$id];
}
}
return new ArrayWrapper($wrapped);
} }
} }
@ -948,39 +962,7 @@ class Notice extends Memcached_DataObject
} }
} }
$cnt = 0; Notice_inbox::bulkInsert($this->id, $this->created, $ni);
$qryhdr = 'INSERT INTO notice_inbox (user_id, notice_id, source, created) VALUES ';
$qry = $qryhdr;
foreach ($ni as $id => $source) {
if ($cnt > 0) {
$qry .= ', ';
}
$qry .= '('.$id.', '.$this->id.', '.$source.", '".$this->created. "') ";
$cnt++;
if (rand() % NOTICE_INBOX_SOFT_LIMIT == 0) {
// FIXME: Causes lag in replicated servers
// Notice_inbox::gc($id);
}
if ($cnt >= MAX_BOXCARS) {
$inbox = new Notice_inbox();
$result = $inbox->query($qry);
if (PEAR::isError($result)) {
common_log_db_error($inbox, $qry);
}
$qry = $qryhdr;
$cnt = 0;
}
}
if ($cnt > 0) {
$inbox = new Notice_inbox();
$result = $inbox->query($qry);
if (PEAR::isError($result)) {
common_log_db_error($inbox, $qry);
}
}
return; return;
} }

View File

@ -32,6 +32,7 @@ define('NOTICE_INBOX_SOFT_LIMIT', 1000);
define('NOTICE_INBOX_SOURCE_SUB', 1); define('NOTICE_INBOX_SOURCE_SUB', 1);
define('NOTICE_INBOX_SOURCE_GROUP', 2); define('NOTICE_INBOX_SOURCE_GROUP', 2);
define('NOTICE_INBOX_SOURCE_REPLY', 3); define('NOTICE_INBOX_SOURCE_REPLY', 3);
define('NOTICE_INBOX_SOURCE_FORWARD', 4);
define('NOTICE_INBOX_SOURCE_GATEWAY', -1); define('NOTICE_INBOX_SOURCE_GATEWAY', -1);
class Notice_inbox extends Memcached_DataObject class Notice_inbox extends Memcached_DataObject
@ -83,7 +84,7 @@ class Notice_inbox extends Memcached_DataObject
$inbox->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\''); $inbox->whereAdd('created > \'' . date('Y-m-d H:i:s', $since) . '\'');
} }
$inbox->orderBy('notice_id DESC'); $inbox->orderBy('created DESC');
if (!is_null($offset)) { if (!is_null($offset)) {
$inbox->limit($offset, $limit); $inbox->limit($offset, $limit);
@ -141,4 +142,43 @@ class Notice_inbox extends Memcached_DataObject
'WHERE user_id = ' . $user_id . ' ' . 'WHERE user_id = ' . $user_id . ' ' .
'AND notice_id in ('.implode(',', $notices).')'); 'AND notice_id in ('.implode(',', $notices).')');
} }
static function bulkInsert($notice_id, $created, $ni)
{
$cnt = 0;
$qryhdr = 'INSERT INTO notice_inbox (user_id, notice_id, source, created) VALUES ';
$qry = $qryhdr;
foreach ($ni as $id => $source) {
if ($cnt > 0) {
$qry .= ', ';
}
$qry .= '('.$id.', '.$notice_id.', '.$source.", '".$created. "') ";
$cnt++;
if (rand() % NOTICE_INBOX_SOFT_LIMIT == 0) {
// FIXME: Causes lag in replicated servers
// Notice_inbox::gc($id);
}
if ($cnt >= MAX_BOXCARS) {
$inbox = new Notice_inbox();
$result = $inbox->query($qry);
if (PEAR::isError($result)) {
common_log_db_error($inbox, $qry);
}
$qry = $qryhdr;
$cnt = 0;
}
}
if ($cnt > 0) {
$inbox = new Notice_inbox();
$result = $inbox->query($qry);
if (PEAR::isError($result)) {
common_log_db_error($inbox, $qry);
}
}
return;
}
} }

View File

@ -260,7 +260,6 @@ modified = 384
[login_token__keys] [login_token__keys]
user_id = K user_id = K
token = K
[message] [message]
id = 129 id = 129

View File

@ -39,6 +39,16 @@ create table profile_role (
); );
create table location_namespace (
id integer /*comment 'identity for this namespace'*/,
description text /* comment 'description of the namespace'*/ ,
created integer not null /*comment 'date the record was created*/ ,
/* modified timestamp comment 'date this record was modified',*/
primary key (id)
);
create table login_token ( create table login_token (
user_id integer not null /* comment 'user owning this token'*/ references "user" (id), user_id integer not null /* comment 'user owning this token'*/ references "user" (id),
token char(32) not null /* comment 'token useable for logging in'*/, token char(32) not null /* comment 'token useable for logging in'*/,
@ -69,3 +79,4 @@ ALTER TABLE profile ADD COLUMN lat decimal(10,7) /*comment 'latitude'*/ ;
ALTER TABLE profile ADD COLUMN lon decimal(10,7) /*comment 'longitude'*/; ALTER TABLE profile ADD COLUMN lon decimal(10,7) /*comment 'longitude'*/;
ALTER TABLE profile ADD COLUMN location_id integer /* comment 'location id if possible'*/; ALTER TABLE profile ADD COLUMN location_id integer /* comment 'location id if possible'*/;
ALTER TABLE profile ADD COLUMN location_ns integer /* comment 'namespace for location'*/; ALTER TABLE profile ADD COLUMN location_ns integer /* comment 'namespace for location'*/;

View File

@ -64,7 +64,7 @@ create table "user" (
emailnotifyfav integer default 1 /* comment 'Notify by email of favorites' */, emailnotifyfav integer default 1 /* comment 'Notify by email of favorites' */,
emailnotifynudge integer default 1 /* comment 'Notify by email of nudges' */, emailnotifynudge integer default 1 /* comment 'Notify by email of nudges' */,
emailnotifymsg integer default 1 /* comment 'Notify by email of direct messages' */, emailnotifymsg integer default 1 /* comment 'Notify by email of direct messages' */,
emailnotifyattn integer default 1 /* command 'Notify by email of @-replies' */, emailnotifyattn integer default 1 /* command 'Notify by email of @-replies' */,
emailmicroid integer default 1 /* comment 'whether to publish email microid' */, emailmicroid integer default 1 /* comment 'whether to publish email microid' */,
language varchar(50) /* comment 'preferred language' */, language varchar(50) /* comment 'preferred language' */,
timezone varchar(50) /* comment 'timezone' */, timezone varchar(50) /* comment 'timezone' */,
@ -82,7 +82,7 @@ create table "user" (
uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */, uri varchar(255) unique /* comment 'universally unique identifier, usually a tag URI' */,
autosubscribe integer default 0 /* comment 'automatically subscribe to users who subscribe to us' */, autosubscribe integer default 0 /* comment 'automatically subscribe to users who subscribe to us' */,
urlshorteningservice varchar(50) default 'ur1.ca' /* comment 'service to use for auto-shortening URLs' */, urlshorteningservice varchar(50) default 'ur1.ca' /* comment 'service to use for auto-shortening URLs' */,
inboxed integer default 0 /* comment 'has an inbox been created for this user?' */, inboxed integer default 0 /* comment 'has an inbox been created for this user?' */,
design_id integer /* comment 'id of a design' */references design(id), design_id integer /* comment 'id of a design' */references design(id),
viewdesigns integer default 1 /* comment 'whether to view user-provided designs'*/, viewdesigns integer default 1 /* comment 'whether to view user-provided designs'*/,
created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */,
@ -298,7 +298,7 @@ create table foreign_user (
nickname varchar(255) /* comment 'nickname on foreign service' */, nickname varchar(255) /* comment 'nickname on foreign service' */,
created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */,
modified timestamp /* comment 'date this record was modified' */, modified timestamp /* comment 'date this record was modified' */,
primary key (id, service) primary key (id, service)
); );
@ -308,7 +308,7 @@ create table foreign_link (
service int not null /* comment 'foreign key to service' */ references foreign_service (id), service int not null /* comment 'foreign key to service' */ references foreign_service (id),
credentials varchar(255) /* comment 'authc credentials, typically a password' */, credentials varchar(255) /* comment 'authc credentials, typically a password' */,
noticesync int not null default 1 /* comment 'notice synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies' */, noticesync int not null default 1 /* comment 'notice synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming, bit 3 = filter local replies' */,
friendsync int not null default 2 /* comment 'friend synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming */, friendsync int not null default 2 /* comment 'friend synchronisation, bit 1 = sync outgoing, bit 2 = sync incoming */,
profilesync int not null default 1 /* comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming' */, profilesync int not null default 1 /* comment 'profile synchronization, bit 1 = sync outgoing, bit 2 = sync incoming' */,
last_noticesync timestamp default null /* comment 'last time notices were imported' */, last_noticesync timestamp default null /* comment 'last time notices were imported' */,
last_friendsync timestamp default null /* comment 'last time friends were imported' */, last_friendsync timestamp default null /* comment 'last time friends were imported' */,
@ -324,7 +324,7 @@ create table foreign_subscription (
subscriber int not null /* comment 'subscriber on foreign service' */ , subscriber int not null /* comment 'subscriber on foreign service' */ ,
subscribed int not null /* comment 'subscribed user' */ , subscribed int not null /* comment 'subscribed user' */ ,
created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */,
primary key (service, subscriber, subscribed) primary key (service, subscriber, subscribed)
); );
create index foreign_subscription_subscriber_idx on foreign_subscription using btree(subscriber); create index foreign_subscription_subscriber_idx on foreign_subscription using btree(subscriber);
@ -354,7 +354,7 @@ create table message (
created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */,
modified timestamp /* comment 'date this record was modified' */, modified timestamp /* comment 'date this record was modified' */,
source varchar(32) /* comment 'source of comment, like "web", "im", or "clientname"' */ source varchar(32) /* comment 'source of comment, like "web", "im", or "clientname"' */
); );
create index message_from_idx on message using btree(from_profile); create index message_from_idx on message using btree(from_profile);
create index message_to_idx on message using btree(to_profile); create index message_to_idx on message using btree(to_profile);
@ -409,7 +409,6 @@ create table user_group (
mini_logo varchar(255) /* comment 'mini logo' */, mini_logo varchar(255) /* comment 'mini logo' */,
design_id integer /*comment 'id of a design' */ references design(id), design_id integer /*comment 'id of a design' */ references design(id),
created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */, created timestamp not null default CURRENT_TIMESTAMP /* comment 'date this record was created' */,
modified timestamp /* comment 'date this record was modified' */ modified timestamp /* comment 'date this record was modified' */
@ -447,16 +446,15 @@ create table group_inbox (
); );
create index group_inbox_created_idx on group_inbox using btree(created); create index group_inbox_created_idx on group_inbox using btree(created);
/*attachments and URLs stuff */ /*attachments and URLs stuff */
create sequence file_seq; create sequence file_seq;
create table file ( create table file (
id bigint default nextval('file_seq') primary key /* comment 'unique identifier' */, id bigint default nextval('file_seq') primary key /* comment 'unique identifier' */,
url varchar(255) unique, url varchar(255) unique,
mimetype varchar(50), mimetype varchar(50),
size integer, size integer,
title varchar(255), title varchar(255),
date integer, date integer,
protected integer, protected integer,
filename text /* comment 'if a local file, name of the file' */, filename text /* comment 'if a local file, name of the file' */,
modified timestamp default CURRENT_TIMESTAMP /* comment 'date this record was modified'*/ modified timestamp default CURRENT_TIMESTAMP /* comment 'date this record was modified'*/
@ -467,38 +465,38 @@ create table file_oembed (
file_id bigint default nextval('file_oembed_seq') primary key /* comment 'unique identifier' */, file_id bigint default nextval('file_oembed_seq') primary key /* comment 'unique identifier' */,
version varchar(20), version varchar(20),
type varchar(20), type varchar(20),
mimetype varchar(50), mimetype varchar(50),
provider varchar(50), provider varchar(50),
provider_url varchar(255), provider_url varchar(255),
width integer, width integer,
height integer, height integer,
html text, html text,
title varchar(255), title varchar(255),
author_name varchar(50), author_name varchar(50),
author_url varchar(255), author_url varchar(255),
url varchar(255) url varchar(255)
); );
create sequence file_redirection_seq; create sequence file_redirection_seq;
create table file_redirection ( create table file_redirection (
url varchar(255) primary key, url varchar(255) primary key,
file_id bigint, file_id bigint,
redirections integer, redirections integer,
httpcode integer httpcode integer
); );
create sequence file_thumbnail_seq; create sequence file_thumbnail_seq;
create table file_thumbnail ( create table file_thumbnail (
file_id bigint primary key, file_id bigint primary key,
url varchar(255) unique, url varchar(255) unique,
width integer, width integer,
height integer height integer
); );
create sequence file_to_post_seq; create sequence file_to_post_seq;
create table file_to_post ( create table file_to_post (
file_id bigint, file_id bigint,
post_id bigint, post_id bigint,
primary key (file_id, post_id) primary key (file_id, post_id)
); );
@ -527,7 +525,7 @@ create table session (
id varchar(32) primary key /* comment 'session ID'*/, id varchar(32) primary key /* comment 'session ID'*/,
session_data text /* comment 'session data'*/, session_data text /* comment 'session data'*/,
created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created'*/, created timestamp not null DEFAULT CURRENT_TIMESTAMP /* comment 'date this record was created'*/,
modified integer DEFAULT extract(epoch from CURRENT_TIMESTAMP) /* comment 'date this record was modified'*/ modified integer DEFAULT extract(epoch from CURRENT_TIMESTAMP) /* comment 'date this record was modified'*/
); );
create index session_modified_idx on session (modified); create index session_modified_idx on session (modified);
@ -543,7 +541,6 @@ create table deleted_notice (
CREATE index deleted_notice_profile_id_idx on deleted_notice (profile_id); CREATE index deleted_notice_profile_id_idx on deleted_notice (profile_id);
/* Textsearch stuff */ /* Textsearch stuff */
create index textsearch_idx on profile using gist(textsearch); create index textsearch_idx on profile using gist(textsearch);
@ -551,7 +548,6 @@ create index noticecontent_idx on notice using gist(to_tsvector('english',conten
create trigger textsearchupdate before insert or update on profile for each row create trigger textsearchupdate before insert or update on profile for each row
execute procedure tsvector_update_trigger(textsearch, 'pg_catalog.english', nickname, fullname, location, bio, homepage); execute procedure tsvector_update_trigger(textsearch, 'pg_catalog.english', nickname, fullname, location, bio, homepage);
create table config ( create table config (
section varchar(32) /* comment 'configuration section'*/, section varchar(32) /* comment 'configuration section'*/,
@ -572,6 +568,16 @@ create table profile_role (
); );
create table location_namespace (
id integer /*comment 'identity for this namespace'*/,
description text /* comment 'description of the namespace'*/ ,
created integer not null /*comment 'date the record was created*/ ,
/* modified timestamp comment 'date this record was modified',*/
primary key (id)
);
create table login_token ( create table login_token (
user_id integer not null /* comment 'user owning this token'*/ references "user" (id), user_id integer not null /* comment 'user owning this token'*/ references "user" (id),
token char(32) not null /* comment 'token useable for logging in'*/, token char(32) not null /* comment 'token useable for logging in'*/,

View File

@ -15,7 +15,7 @@
* @author Alan Knowles <alan@akbkhome.com> * @author Alan Knowles <alan@akbkhome.com>
* @copyright 1997-2006 The PHP Group * @copyright 1997-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01 * @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: DataObject.php 284150 2009-07-15 23:27:59Z alan_k $ * @version CVS: $Id: DataObject.php 291349 2009-11-27 09:15:18Z alan_k $
* @link http://pear.php.net/package/DB_DataObject * @link http://pear.php.net/package/DB_DataObject
*/ */
@ -235,7 +235,7 @@ class DB_DataObject extends DB_DataObject_Overload
* @access private * @access private
* @var string * @var string
*/ */
var $_DB_DataObject_version = "1.8.12"; var $_DB_DataObject_version = "1.9.0";
/** /**
* The Database table (used by table extends) * The Database table (used by table extends)
@ -309,7 +309,8 @@ class DB_DataObject extends DB_DataObject_Overload
/** /**
* An autoloading, caching static get method using key, value (based on get) * An autoloading, caching static get method using key, value (based on get)
* * (depreciated - use ::get / and your own caching method)
*
* Usage: * Usage:
* $object = DB_DataObject::staticGet("DbTable_mytable",12); * $object = DB_DataObject::staticGet("DbTable_mytable",12);
* or * or
@ -942,9 +943,13 @@ class DB_DataObject extends DB_DataObject_Overload
} }
$this->$key = $keyvalue; $this->$key = $keyvalue;
} }
// if we haven't set disable_null_strings to "full"
$ignore_null = !isset($options['disable_null_strings'])
|| !is_string($options['disable_null_strings'])
|| strtolower($options['disable_null_strings']) !== 'full' ;
foreach($items as $k => $v) { foreach($items as $k => $v) {
// if we are using autoincrement - skip the column... // if we are using autoincrement - skip the column...
@ -953,7 +958,10 @@ class DB_DataObject extends DB_DataObject_Overload
} }
if (!isset($this->$k)) {
// Ignore variables which aren't set to a value
if ( !isset($this->$k) && $ignore_null) {
continue; continue;
} }
// dont insert data into mysql timestamps // dont insert data into mysql timestamps
@ -980,8 +988,7 @@ class DB_DataObject extends DB_DataObject_Overload
} }
if (!($v & DB_DATAOBJECT_NOTNULL) && DB_DataObject::_is_null($this,$k)) {
if (!isset($options['disable_null_strings']) && is_string($this->$k) && (strtolower($this->$k) === 'null') && !($v & DB_DATAOBJECT_NOTNULL)) {
$rightq .= " NULL "; $rightq .= " NULL ";
continue; continue;
} }
@ -1194,8 +1201,14 @@ class DB_DataObject extends DB_DataObject_Overload
$options = $_DB_DATAOBJECT['CONFIG']; $options = $_DB_DATAOBJECT['CONFIG'];
$ignore_null = !isset($options['disable_null_strings'])
|| !is_string($options['disable_null_strings'])
|| strtolower($options['disable_null_strings']) !== 'full' ;
foreach($items as $k => $v) { foreach($items as $k => $v) {
if (!isset($this->$k)) {
if (!isset($this->$k) && $ignore_null) {
continue; continue;
} }
// ignore stuff thats // ignore stuff thats
@ -1234,7 +1247,7 @@ class DB_DataObject extends DB_DataObject_Overload
} }
// special values ... at least null is handled... // special values ... at least null is handled...
if (!isset($options['disable_null_strings']) && (strtolower($this->$k) === 'null') && !($v & DB_DATAOBJECT_NOTNULL)) { if (!($v & DB_DATAOBJECT_NOTNULL) && DB_DataObject::_is_null($this,$k)) {
$settings .= "$kSql = NULL "; $settings .= "$kSql = NULL ";
continue; continue;
} }
@ -1796,10 +1809,15 @@ class DB_DataObject extends DB_DataObject_Overload
} }
$_DB_DATAOBJECT['INI'][$this->_database] = array();
foreach ($schemas as $ini) { foreach ($schemas as $ini) {
if (file_exists($ini) && is_file($ini)) { if (file_exists($ini) && is_file($ini)) {
$_DB_DATAOBJECT['INI'][$this->_database] = parse_ini_file($ini, true);
$_DB_DATAOBJECT['INI'][$this->_database] = array_merge(
$_DB_DATAOBJECT['INI'][$this->_database],
parse_ini_file($ini, true)
);
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) { if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
if (!is_readable ($ini)) { if (!is_readable ($ini)) {
$this->debug("ini file is not readable: $ini","databaseStructure",1); $this->debug("ini file is not readable: $ini","databaseStructure",1);
@ -2478,7 +2496,8 @@ class DB_DataObject extends DB_DataObject_Overload
$x = new DB_DataObject; $x = new DB_DataObject;
$this->_query= $x->_query; $this->_query= $x->_query;
} }
foreach($keys as $k => $v) { foreach($keys as $k => $v) {
// index keys is an indexed array // index keys is an indexed array
/* these filter checks are a bit suspicious.. /* these filter checks are a bit suspicious..
@ -2519,7 +2538,7 @@ class DB_DataObject extends DB_DataObject_Overload
continue; continue;
} }
if (!isset($options['disable_null_strings']) && (strtolower($this->$k) === 'null') && !($v & DB_DATAOBJECT_NOTNULL)) { if (!($v & DB_DATAOBJECT_NOTNULL) && DB_DataObject::_is_null($this,$k)) {
$this->whereAdd(" $kSql IS NULL"); $this->whereAdd(" $kSql IS NULL");
continue; continue;
} }
@ -2624,15 +2643,31 @@ class DB_DataObject extends DB_DataObject_Overload
} }
// does this need multi db support?? // does this need multi db support??
$p = isset($_DB_DATAOBJECT['CONFIG']['class_prefix']) ? $cp = isset($_DB_DATAOBJECT['CONFIG']['class_prefix']) ?
$_DB_DATAOBJECT['CONFIG']['class_prefix'] : ''; explode(PATH_SEPARATOR, $_DB_DATAOBJECT['CONFIG']['class_prefix']) : '';
$class = $p . preg_replace('/[^A-Z0-9]/i','_',ucfirst($table));
$ce = substr(phpversion(),0,1) > 4 ? class_exists($class,false) : class_exists($class);
$class = $ce ? $class : DB_DataObject::_autoloadClass($class); // multiprefix support.
$tbl = preg_replace('/[^A-Z0-9]/i','_',ucfirst($table));
if (is_array($cp)) {
$class = array();
foreach($cp as $cpr) {
$ce = substr(phpversion(),0,1) > 4 ? class_exists($cpr . $tbl,false) : class_exists($cpr . $tbl);
if ($ce) {
$class = $cpr . $tbl;
break;
}
$class[] = $cpr . $tbl;
}
} else {
$class = $tbl;
$ce = substr(phpversion(),0,1) > 4 ? class_exists($class,false) : class_exists($class);
}
$rclass = $ce ? $class : DB_DataObject::_autoloadClass($class, $table);
// proxy = full|light // proxy = full|light
if (!$class && isset($_DB_DATAOBJECT['CONFIG']['proxy'])) { if (!$rclass && isset($_DB_DATAOBJECT['CONFIG']['proxy'])) {
DB_DataObject::debug("FAILED TO Autoload $database.$table - using proxy.","FACTORY",1); DB_DataObject::debug("FAILED TO Autoload $database.$table - using proxy.","FACTORY",1);
@ -2653,12 +2688,14 @@ class DB_DataObject extends DB_DataObject_Overload
return $x->$proxyMethod( $d->_database, $table); return $x->$proxyMethod( $d->_database, $table);
} }
if (!$class) { if (!$rclass) {
return DB_DataObject::raiseError( return DB_DataObject::raiseError(
"factory could not find class $class from $table", "factory could not find class " .
(is_array($class) ? implode(PATH_SEPARATOR, $class) : $class ).
"from $table",
DB_DATAOBJECT_ERROR_INVALIDCONFIG); DB_DATAOBJECT_ERROR_INVALIDCONFIG);
} }
$ret = new $class; $ret = new $rclass;
if (!empty($database)) { if (!empty($database)) {
DB_DataObject::debug("Setting database to $database","FACTORY",1); DB_DataObject::debug("Setting database to $database","FACTORY",1);
$ret->database($database); $ret->database($database);
@ -2668,11 +2705,12 @@ class DB_DataObject extends DB_DataObject_Overload
/** /**
* autoload Class * autoload Class
* *
* @param string $class Class * @param string|array $class Class
* @param string $table Table trying to load.
* @access private * @access private
* @return string classname on Success * @return string classname on Success
*/ */
function _autoloadClass($class) function _autoloadClass($class, $table=false)
{ {
global $_DB_DATAOBJECT; global $_DB_DATAOBJECT;
@ -2682,32 +2720,62 @@ class DB_DataObject extends DB_DataObject_Overload
$class_prefix = empty($_DB_DATAOBJECT['CONFIG']['class_prefix']) ? $class_prefix = empty($_DB_DATAOBJECT['CONFIG']['class_prefix']) ?
'' : $_DB_DATAOBJECT['CONFIG']['class_prefix']; '' : $_DB_DATAOBJECT['CONFIG']['class_prefix'];
$table = substr($class,strlen($class_prefix)); $table = $table ? $table : substr($class,strlen($class_prefix));
// only include the file if it exists - and barf badly if it has parse errors :) // only include the file if it exists - and barf badly if it has parse errors :)
if (!empty($_DB_DATAOBJECT['CONFIG']['proxy']) || empty($_DB_DATAOBJECT['CONFIG']['class_location'])) { if (!empty($_DB_DATAOBJECT['CONFIG']['proxy']) || empty($_DB_DATAOBJECT['CONFIG']['class_location'])) {
return false; return false;
} }
// support for:
// class_location = mydir/ => maps to mydir/Tablename.php
// class_location = mydir/myfile_%s.php => maps to mydir/myfile_Tablename
// with directory sepr
// class_location = mydir/:mydir2/: => tries all of thes locations.
$cl = $_DB_DATAOBJECT['CONFIG']['class_location'];
if (strpos($_DB_DATAOBJECT['CONFIG']['class_location'],'%s') !== false) { switch (true) {
$file = sprintf($_DB_DATAOBJECT['CONFIG']['class_location'], preg_replace('/[^A-Z0-9]/i','_',ucfirst($table))); case (strpos($cl ,'%s') !== false):
} else { $file = sprintf($cl , preg_replace('/[^A-Z0-9]/i','_',ucfirst($table)));
$file = $_DB_DATAOBJECT['CONFIG']['class_location'].'/'.preg_replace('/[^A-Z0-9]/i','_',ucfirst($table)).".php"; break;
case (strpos($cl , PATH_SEPARATOR) !== false):
$file = array();
foreach(explode(PATH_SEPARATOR, $cl ) as $p) {
$file[] = $p .'/'.preg_replace('/[^A-Z0-9]/i','_',ucfirst($table)).".php";
}
break;
default:
$file = $cl .'/'.preg_replace('/[^A-Z0-9]/i','_',ucfirst($table)).".php";
break;
} }
if (!file_exists($file)) { $cls = is_array($class) ? $class : array($class);
if (is_array($file) || !file_exists($file)) {
$found = false; $found = false;
foreach(explode(PATH_SEPARATOR, ini_get('include_path')) as $p) {
if (file_exists("$p/$file")) { $file = is_array($file) ? $file : array($file);
$file = "$p/$file"; $search = implode(PATH_SEPARATOR, $file);
$found = true; foreach($file as $f) {
foreach(explode(PATH_SEPARATOR, '' . PATH_SEPARATOR . ini_get('include_path')) as $p) {
$ff = empty($p) ? $f : "$p/$f";
if (file_exists($ff)) {
$file = $ff;
$found = true;
break;
}
}
if ($found) {
break; break;
} }
} }
if (!$found) { if (!$found) {
DB_DataObject::raiseError( DB_DataObject::raiseError(
"autoload:Could not find class {$class} using class_location value", "autoload:Could not find class " . implode(',', $cls) .
" using class_location value :" . $search .
" using include_path value :" . ini_get('include_path'),
DB_DATAOBJECT_ERROR_INVALIDCONFIG); DB_DATAOBJECT_ERROR_INVALIDCONFIG);
return false; return false;
} }
@ -2715,12 +2783,18 @@ class DB_DataObject extends DB_DataObject_Overload
include_once $file; include_once $file;
$ce = substr(phpversion(),0,1) > 4 ? class_exists($class,false) : class_exists($class); $ce = false;
foreach($cls as $c) {
$ce = substr(phpversion(),0,1) > 4 ? class_exists($c,false) : class_exists($c);
if ($ce) {
$class = $c;
break;
}
}
if (!$ce) { if (!$ce) {
DB_DataObject::raiseError( DB_DataObject::raiseError(
"autoload:Could not autoload {$class}", "autoload:Could not autoload " . implode(',', $cls) ,
DB_DATAOBJECT_ERROR_INVALIDCONFIG); DB_DATAOBJECT_ERROR_INVALIDCONFIG);
return false; return false;
} }
@ -2786,7 +2860,7 @@ class DB_DataObject extends DB_DataObject_Overload
} }
$_DB_DATAOBJECT['LINKS'][$this->_database] = array();
foreach ($schemas as $ini) { foreach ($schemas as $ini) {
$links = $links =
@ -2794,9 +2868,13 @@ class DB_DataObject extends DB_DataObject_Overload
$_DB_DATAOBJECT['CONFIG']["links_{$this->_database}"] : $_DB_DATAOBJECT['CONFIG']["links_{$this->_database}"] :
str_replace('.ini','.links.ini',$ini); str_replace('.ini','.links.ini',$ini);
if (empty($_DB_DATAOBJECT['LINKS'][$this->_database]) && file_exists($links) && is_file($links)) { if (file_exists($links) && is_file($links)) {
/* not sure why $links = ... here - TODO check if that works */ /* not sure why $links = ... here - TODO check if that works */
$_DB_DATAOBJECT['LINKS'][$this->_database] = parse_ini_file($links, true); $_DB_DATAOBJECT['LINKS'][$this->_database] = array_merge(
$_DB_DATAOBJECT['LINKS'][$this->_database],
parse_ini_file($links, true)
);
if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) { if (!empty($_DB_DATAOBJECT['CONFIG']['debug'])) {
$this->debug("Loaded links.ini file: $links","links",1); $this->debug("Loaded links.ini file: $links","links",1);
} }
@ -2977,14 +3055,12 @@ class DB_DataObject extends DB_DataObject_Overload
} }
if ($link) { if ($link) {
if ($obj->get($link, $this->$row)) { if ($obj->get($link, $this->$row)) {
$obj->free();
return $obj; return $obj;
} }
return false; return false;
} }
if ($obj->get($this->$row)) { if ($obj->get($this->$row)) {
$obj->free();
return $obj; return $obj;
} }
return false; return false;
@ -3315,14 +3391,23 @@ class DB_DataObject extends DB_DataObject_Overload
DB_DATAOBJECT_ERROR_INVALIDCONFIG); DB_DATAOBJECT_ERROR_INVALIDCONFIG);
return false; return false;
} }
$ignore_null = !isset($options['disable_null_strings'])
|| !is_string($options['disable_null_strings'])
|| strtolower($options['disable_null_strings']) !== 'full' ;
foreach($items as $k => $v) { foreach($items as $k => $v) {
if (!isset($obj->$k)) { if (!isset($obj->$k) && $ignore_null) {
continue; continue;
} }
$kSql = ($quoteIdentifiers ? $DB->quoteIdentifier($k) : $k); $kSql = ($quoteIdentifiers ? $DB->quoteIdentifier($k) : $k);
if (DB_DataObject::_is_null($obj,$k)) {
$obj->whereAdd("{$joinAs}.{$kSql} IS NULL");
continue;
}
if ($v & DB_DATAOBJECT_STR) { if ($v & DB_DATAOBJECT_STR) {
$obj->whereAdd("{$joinAs}.{$kSql} = " . $this->_quote((string) ( $obj->whereAdd("{$joinAs}.{$kSql} = " . $this->_quote((string) (
@ -3344,14 +3429,9 @@ class DB_DataObject extends DB_DataObject_Overload
if (PEAR::isError($value)) { if (PEAR::isError($value)) {
$this->raiseError($value->getMessage() ,DB_DATAOBJECT_ERROR_INVALIDARG); $this->raiseError($value->getMessage() ,DB_DATAOBJECT_ERROR_INVALIDARG);
return false; return false;
} }
if (!isset($options['disable_null_strings']) && strtolower($value) === 'null') { $obj->whereAdd("{$joinAs}.{$kSql} = $value");
$obj->whereAdd("{$joinAs}.{$kSql} IS NULL"); continue;
continue;
} else {
$obj->whereAdd("{$joinAs}.{$kSql} = $value");
continue;
}
} }
@ -3514,7 +3594,7 @@ class DB_DataObject extends DB_DataObject_Overload
continue; continue;
} }
if (!isset($from[sprintf($format,$k)])) { if (!isset($from[sprintf($format,$k)]) && !DB_DataObject::_is_null($from, sprintf($format,$k))) {
continue; continue;
} }
@ -3643,7 +3723,7 @@ class DB_DataObject extends DB_DataObject_Overload
// if not null - and it's not set....... // if not null - and it's not set.......
if (!isset($this->$key) && ($val & DB_DATAOBJECT_NOTNULL)) { if ($val & DB_DATAOBJECT_NOTNULL && DB_DataObject::_is_null($this, $key)) {
// dont check empty sequence key values.. // dont check empty sequence key values..
if (($key == $seq[0]) && ($seq[1] == true)) { if (($key == $seq[0]) && ($seq[1] == true)) {
continue; continue;
@ -3653,7 +3733,7 @@ class DB_DataObject extends DB_DataObject_Overload
} }
if (!isset($options['disable_null_strings']) && is_string($this->$key) && (strtolower($this->$key) == 'null')) { if (DB_DataObject::_is_null($this, $key)) {
if ($val & DB_DATAOBJECT_NOTNULL) { if ($val & DB_DATAOBJECT_NOTNULL) {
$this->debug("'null' field used for '$key', but it is defined as NOT NULL", 'VALIDATION', 4); $this->debug("'null' field used for '$key', but it is defined as NOT NULL", 'VALIDATION', 4);
$ret[$key] = false; $ret[$key] = false;
@ -3868,13 +3948,14 @@ class DB_DataObject extends DB_DataObject_Overload
//echo "FROM VALUE $col, {$cols[$col]}, $value\n"; //echo "FROM VALUE $col, {$cols[$col]}, $value\n";
switch (true) { switch (true) {
// set to null and column is can be null... // set to null and column is can be null...
case (!isset($options['disable_null_strings']) && (strtolower($value) == 'null') && (!($cols[$col] & DB_DATAOBJECT_NOTNULL))): case ((!($cols[$col] & DB_DATAOBJECT_NOTNULL)) && DB_DataObject::_is_null($value, false)):
case (is_object($value) && is_a($value,'DB_DataObject_Cast')): case (is_object($value) && is_a($value,'DB_DataObject_Cast')):
$this->$col = $value; $this->$col = $value;
return true; return true;
// fail on setting null on a not null field.. // fail on setting null on a not null field..
case (!isset($options['disable_null_strings']) && (strtolower($value) == 'null') && ($cols[$col] & DB_DATAOBJECT_NOTNULL)): case (($cols[$col] & DB_DATAOBJECT_NOTNULL) && DB_DataObject::_is_null($value,false)):
return false; return false;
case (($cols[$col] & DB_DATAOBJECT_DATE) && ($cols[$col] & DB_DATAOBJECT_TIME)): case (($cols[$col] & DB_DATAOBJECT_DATE) && ($cols[$col] & DB_DATAOBJECT_TIME)):
@ -4189,9 +4270,65 @@ class DB_DataObject extends DB_DataObject_Overload
if (isset($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5])) { if (isset($_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5])) {
$_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]->num_rows = array(); $_DB_DATAOBJECT['CONNECTIONS'][$this->_database_dsn_md5]->num_rows = array();
} }
if (is_array($this->_link_loaded)) {
foreach ($this->_link_loaded as $do) {
$do->free();
}
}
} }
/**
* Evaluate whether or not a value is set to null, taking the 'disable_null_strings' option into account.
* If the value is a string set to "null" and the "disable_null_strings" option is not set to
* true, then the value is considered to be null.
* If the value is actually a PHP NULL value, and "disable_null_strings" has been set to
* the value "full", then it will also be considered null. - this can not differenticate between not set
*
*
* @param object|array $obj_or_ar
* @param string|false $prop prperty
* @access private
* @return bool object
*/
function _is_null($obj_or_ar , $prop)
{
global $_DB_DATAOBJECT;
$isset = $prop === false ? isset($obj_or_ar) :
(is_array($obj_or_ar) ? isset($obj_or_ar[$prop]) : isset($obj_or_ar->$prop));
$value = $isset ?
($prop === false ? $obj_or_ar :
(is_array($obj_or_ar) ? $obj_or_ar[$prop] : $obj_or_ar->$prop))
: null;
$options = $_DB_DATAOBJECT['CONFIG'];
$null_strings = !isset($options['disable_null_strings'])
|| $options['disable_null_strings'] === false;
$crazy_null = isset($options['disable_null_strings'])
&& is_string($options['disable_null_strings'])
&& strtolower($options['disable_null_strings'] === 'full');
if ( $null_strings && $isset && is_string($value) && (strtolower($value) === 'null') ) {
return true;
}
if ( $crazy_null && !$isset ) {
return true;
}
return false;
}
/* ---- LEGACY BC METHODS - NOT DOCUMENTED - See Documentation on New Methods. ---*/ /* ---- LEGACY BC METHODS - NOT DOCUMENTED - See Documentation on New Methods. ---*/
@ -4214,3 +4351,4 @@ if (!defined('DB_DATAOBJECT_NO_OVERLOAD')) {
} }
} }

View File

@ -15,7 +15,7 @@
* @author Alan Knowles <alan@akbkhome.com> * @author Alan Knowles <alan@akbkhome.com>
* @copyright 1997-2006 The PHP Group * @copyright 1997-2006 The PHP Group
* @license http://www.php.net/license/3_01.txt PHP License 3.01 * @license http://www.php.net/license/3_01.txt PHP License 3.01
* @version CVS: $Id: Generator.php 284150 2009-07-15 23:27:59Z alan_k $ * @version CVS: $Id: Generator.php 289384 2009-10-09 00:17:26Z alan_k $
* @link http://pear.php.net/package/DB_DataObject * @link http://pear.php.net/package/DB_DataObject
*/ */
@ -33,7 +33,7 @@
/** /**
* *
* Config _$ptions * Config _$ptions
* [DB_DataObject_Generator] * [DB_DataObject]
* ; optional default = DB/DataObject.php * ; optional default = DB/DataObject.php
* extends_location = * extends_location =
* ; optional default = DB_DataObject * ; optional default = DB_DataObject
@ -775,11 +775,9 @@ class DB_DataObject_Generator extends DB_DataObject
//echo "Generating Class files: \n"; //echo "Generating Class files: \n";
$options = &PEAR::getStaticProperty('DB_DataObject','options'); $options = &PEAR::getStaticProperty('DB_DataObject','options');
$this->_extends = empty($options['extends']) ? $this->_extends : $options['extends'];
if ($extends = @$options['extends']) { $this->_extendsFile = empty($options['extends_location']) ? $this->_extendsFile : $options['extends_location'];
$this->_extends = $extends;
$this->_extendsFile = $options['extends_location'];
}
foreach($this->tables as $this->table) { foreach($this->tables as $this->table) {
$this->table = trim($this->table); $this->table = trim($this->table);
@ -814,7 +812,7 @@ class DB_DataObject_Generator extends DB_DataObject
} }
/** /**
* class being extended (can be overridden by [DB_DataObject_Generator] extends=xxxx * class being extended (can be overridden by [DB_DataObject] extends=xxxx
* *
* @var string * @var string
* @access private * @access private
@ -1142,10 +1140,9 @@ class DB_DataObject_Generator extends DB_DataObject
$options = &PEAR::getStaticProperty('DB_DataObject','options'); $options = &PEAR::getStaticProperty('DB_DataObject','options');
$class_prefix = empty($options['class_prefix']) ? '' : $options['class_prefix']; $class_prefix = empty($options['class_prefix']) ? '' : $options['class_prefix'];
if ($extends = @$options['extends']) { $this->_extends = empty($options['extends']) ? $this->_extends : $options['extends'];
$this->_extends = $extends; $this->_extendsFile = empty($options['extends_location']) ? $this->_extendsFile : $options['extends_location'];
$this->_extendsFile = $options['extends_location'];
}
$classname = $this->classname = $this->getClassNameFromTableName($this->table); $classname = $this->classname = $this->getClassNameFromTableName($this->table);
$out = $this->_generateClassTable(); $out = $this->_generateClassTable();

View File

@ -57,21 +57,31 @@ var SN = { // StatusNet
U: { // Utils U: { // Utils
FormNoticeEnhancements: function(form) { FormNoticeEnhancements: function(form) {
form_id = form.attr('id'); form_id = form.attr('id');
$('#'+form_id+' #'+SN.C.S.NoticeDataText).unbind('keyup');
$('#'+form_id+' #'+SN.C.S.NoticeDataText).unbind('keydown'); if (jQuery.data(form[0], 'ElementData') === undefined) {
if (maxLength > 0) { MaxLength = $('#'+form_id+' #'+SN.C.S.NoticeTextCount).text();
$('#'+form_id+' #'+SN.C.S.NoticeDataText).bind('keyup', function(e) { if (typeof(MaxLength) == 'undefined') {
MaxLength = SN.C.I.MaxLength;
}
jQuery.data(form[0], 'ElementData', {MaxLength:MaxLength});
SN.U.Counter(form);
NDT = $('#'+form_id+' #'+SN.C.S.NoticeDataText);
NDT.bind('keyup', function(e) {
SN.U.Counter(form); SN.U.Counter(form);
}); });
// run once in case there's something in there
SN.U.Counter(form); NDT.bind('keydown', function(e) {
SN.U.SubmitOnReturn(e, form);
});
}
else {
$('#'+form_id+' #'+SN.C.S.NoticeTextCount).text(jQuery.data(form[0], 'ElementData').MaxLength);
} }
$('#'+form_id+' #'+SN.C.S.NoticeDataText).bind('keydown', function(e) { if ($('body')[0].id != 'conversation') {
SN.U.SubmitOnReturn(e, form);
});
if($('body')[0].id != 'conversation') {
$('#'+form_id+' textarea').focus(); $('#'+form_id+' textarea').focus();
} }
}, },
@ -91,15 +101,14 @@ var SN = { // StatusNet
Counter: function(form) { Counter: function(form) {
SN.C.I.FormNoticeCurrent = form; SN.C.I.FormNoticeCurrent = form;
form_id = form.attr('id'); form_id = form.attr('id');
if (typeof(maxLength) == "undefined") {
maxLength = SN.C.I.MaxLength;
}
if (maxLength <= 0) { var MaxLength = jQuery.data(form[0], 'ElementData').MaxLength;
if (MaxLength <= 0) {
return; return;
} }
var remaining = maxLength - $('#'+form_id+' #'+SN.C.S.NoticeDataText).val().length; var remaining = MaxLength - $('#'+form_id+' #'+SN.C.S.NoticeDataText).val().length;
var counter = $('#'+form_id+' #'+SN.C.S.NoticeTextCount); var counter = $('#'+form_id+' #'+SN.C.S.NoticeTextCount);
if (remaining.toString() != counter.text()) { if (remaining.toString() != counter.text()) {
@ -208,7 +217,7 @@ var SN = { // StatusNet
$('#'+form_id+' .form_response').remove(); $('#'+form_id+' .form_response').remove();
var result; var result;
if ($('#'+SN.C.S.Error, data).length > 0) { if ($('#'+SN.C.S.Error, data).length > 0) {
result = document._importNode($('p', data)[0], true); result = document._importNode($('p', data)[0], true);
result = result.textContent || result.innerHTML; result = result.textContent || result.innerHTML;
form.append('<p class="form_response error">'+result+'</p>'); form.append('<p class="form_response error">'+result+'</p>');
} }
@ -307,7 +316,7 @@ var SN = { // StatusNet
}, },
NoticeAttachments: function() { NoticeAttachments: function() {
$('.notice a.attachment').each(function() { $('.notice a.attachment').each(function() {
SN.U.NoticeWithAttachment($(this).closest('.notice')); SN.U.NoticeWithAttachment($(this).closest('.notice'));
}); });
}, },
@ -439,7 +448,6 @@ var SN = { // StatusNet
Notices: function() { Notices: function() {
if ($('body.user_in').length > 0) { if ($('body.user_in').length > 0) {
SN.U.NoticeFavor(); SN.U.NoticeFavor();
SN.U.NoticeReply(); SN.U.NoticeReply();
} }
@ -453,6 +461,8 @@ var SN = { // StatusNet
$('.form_group_join').each(function() { SN.U.FormXHR($(this)); }); $('.form_group_join').each(function() { SN.U.FormXHR($(this)); });
$('.form_group_leave').each(function() { SN.U.FormXHR($(this)); }); $('.form_group_leave').each(function() { SN.U.FormXHR($(this)); });
$('.form_user_nudge').each(function() { SN.U.FormXHR($(this)); }); $('.form_user_nudge').each(function() { SN.U.FormXHR($(this)); });
SN.U.NewDirectMessage();
} }
} }
} }

View File

@ -584,7 +584,8 @@ class LoginCommand extends Command
function execute($channel) function execute($channel)
{ {
$disabled = common_config('logincommand','disabled'); $disabled = common_config('logincommand','disabled');
if(isset($disabled)) { $disabled = isset($disabled) && $disabled;
if($disabled) {
$channel->error($this->user, _('Login command is disabled')); $channel->error($this->user, _('Login command is disabled'));
return; return;
} }

View File

@ -36,6 +36,33 @@ if (!function_exists('gettext')) {
require_once("php-gettext/gettext.inc"); require_once("php-gettext/gettext.inc");
} }
if (!function_exists('dpgettext')) {
/**
* Context-aware dgettext wrapper; use when messages in different contexts
* won't be distinguished from the English source but need different translations.
* The context string will appear as msgctxt in the .po files.
*
* Not currently exposed in PHP's gettext module; implemented to be compat
* with gettext.h's macros.
*
* @param string $domain domain identifier, or null for default domain
* @param string $context context identifier, should be some key like "menu|file"
* @param string $msgid English source text
* @return string original or translated message
*/
function dpgettext($domain, $context, $msg)
{
$msgid = $context . "\004" . $msg;
$out = dcgettext($domain, $msgid, LC_MESSAGES);
if ($out == $msgid) {
return $msg;
} else {
return $out;
}
}
}
if (!function_exists('pgettext')) { if (!function_exists('pgettext')) {
/** /**
* Context-aware gettext wrapper; use when messages in different contexts * Context-aware gettext wrapper; use when messages in different contexts
@ -50,9 +77,31 @@ if (!function_exists('pgettext')) {
* @return string original or translated message * @return string original or translated message
*/ */
function pgettext($context, $msg) function pgettext($context, $msg)
{
return dpgettext(textdomain(NULL), $context, $msg);
}
}
if (!function_exists('dnpgettext')) {
/**
* Context-aware dngettext wrapper; use when messages in different contexts
* won't be distinguished from the English source but need different translations.
* The context string will appear as msgctxt in the .po files.
*
* Not currently exposed in PHP's gettext module; implemented to be compat
* with gettext.h's macros.
*
* @param string $domain domain identifier, or null for default domain
* @param string $context context identifier, should be some key like "menu|file"
* @param string $msg singular English source text
* @param string $plural plural English source text
* @param int $n number of items to control plural selection
* @return string original or translated message
*/
function dnpgettext($domain, $context, $msg, $plural, $n)
{ {
$msgid = $context . "\004" . $msg; $msgid = $context . "\004" . $msg;
$out = dcgettext(textdomain(NULL), $msgid, LC_MESSAGES); $out = dcngettext($domain, $msgid, $plural, $n, LC_MESSAGES);
if ($out == $msgid) { if ($out == $msgid) {
return $msg; return $msg;
} else { } else {
@ -78,14 +127,78 @@ if (!function_exists('npgettext')) {
*/ */
function npgettext($context, $msg, $plural, $n) function npgettext($context, $msg, $plural, $n)
{ {
$msgid = $context . "\004" . $msg; return dnpgettext(textdomain(NULL), $msgid, $plural, $n, LC_MESSAGES);
$out = dcngettext(textdomain(NULL), $msgid, $plural, $n, LC_MESSAGES); }
if ($out == $msgid) { }
return $msg;
/**
* Shortcut for *gettext functions with smart domain detection.
*
* If calling from a plugin, this function checks which plugin was
* being called from and uses that as text domain, which will have
* been set up during plugin initialization.
*
* Also handles plurals and contexts depending on what parameters
* are passed to it:
*
* gettext -> _m($msg)
* ngettext -> _m($msg1, $msg2, $n)
* pgettext -> _m($ctx, $msg)
* npgettext -> _m($ctx, $msg1, $msg2, $n)
*
* @fixme may not work properly in eval'd code
*
* @param string $msg
* @return string
*/
function _m($msg/*, ...*/)
{
$domain = _mdomain(debug_backtrace());
$args = func_get_args();
switch(count($args)) {
case 1: return dgettext($domain, $msg);
case 2: return dpgettext($domain, $args[0], $args[1]);
case 3: return dngettext($domain, $args[0], $args[1], $args[2]);
case 4: return dnpgettext($domain, $args[0], $args[1], $args[2], $args[3]);
default: throw new Exception("Bad parameter count to _m()");
}
}
/**
* Looks for which plugin we've been called from to set the gettext domain.
*
* @param array $backtrace debug_backtrace() output
* @return string
* @private
* @fixme could explode if SN is under a 'plugins' folder or share name.
*/
function _mdomain($backtrace)
{
/*
0 =>
array
'file' => string '/var/www/mublog/plugins/FeedSub/FeedSubPlugin.php' (length=49)
'line' => int 77
'function' => string '_m' (length=2)
'args' =>
array
0 => &string 'Feeds' (length=5)
*/
static $cached;
$path = $backtrace[0]['file'];
if (!isset($cached[$path])) {
if (DIRECTORY_SEPARATOR !== '/') {
$path = strtr($path, DIRECTORY_SEPARATOR, '/');
}
$cut = strpos($path, '/plugins/') + 9;
$cut2 = strpos($path, '/', $cut);
if ($cut && $cut2) {
$cached[$path] = substr($path, $cut, $cut2 - $cut);
} else { } else {
return $out; return null;
} }
} }
return $cached[$path];
} }

View File

@ -154,8 +154,6 @@ class MessageForm extends Form
$contentLimit = Message::maxContent(); $contentLimit = Message::maxContent();
$this->out->inlineScript('maxLength = ' . $contentLimit . ';');
if ($contentLimit > 0) { if ($contentLimit > 0) {
$this->out->elementStart('dl', 'form_note'); $this->out->elementStart('dl', 'form_note');
$this->out->element('dt', null, _('Available characters')); $this->out->element('dt', null, _('Available characters'));

View File

@ -178,8 +178,6 @@ class NoticeForm extends Form
$contentLimit = Notice::maxContent(); $contentLimit = Notice::maxContent();
$this->out->inlineScript('maxLength = ' . $contentLimit . ';');
if ($contentLimit > 0) { if ($contentLimit > 0) {
$this->out->elementStart('dl', 'form_note'); $this->out->elementStart('dl', 'form_note');
$this->out->element('dt', null, _('Available characters')); $this->out->element('dt', null, _('Available characters'));

View File

@ -65,6 +65,8 @@ class Plugin
Event::addHandler(mb_substr($method, 2), array($this, $method)); Event::addHandler(mb_substr($method, 2), array($this, $method));
} }
} }
$this->setupGettext();
} }
function initialize() function initialize()
@ -77,6 +79,22 @@ class Plugin
return true; return true;
} }
/**
* Checks if this plugin has localization that needs to be set up.
* Gettext localizations can be called via the _m() helper function.
*/
protected function setupGettext()
{
$class = get_class($this);
if (substr($class, -6) == 'Plugin') {
$name = substr($class, 0, -6);
$path = INSTALLDIR . "/plugins/$name/locale";
if (file_exists($path) && is_dir($path)) {
bindtextdomain($name, $path);
}
}
}
protected function log($level, $msg) protected function log($level, $msg)
{ {
common_log($level, get_class($this) . ': '.$msg); common_log($level, get_class($this) . ': '.$msg);
@ -87,3 +105,4 @@ class Plugin
$this->log(LOG_DEBUG, $msg); $this->log(LOG_DEBUG, $msg);
} }
} }

View File

@ -43,4 +43,19 @@ class User_username extends Memcached_DataObject
return false; return false;
} }
} }
function table() {
return array(
'user_id' => DB_DATAOBJECT_INT,
'username' => DB_DATAOBJECT_STR,
'provider_name' => DB_DATAOBJECT_STR ,
'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME
);
}
// now define the keys.
function keys() {
return array('provider_name', 'username');
}
} }

View File

@ -48,8 +48,8 @@ class FBConnectauthAction extends Action
common_log(LOG_WARNING, 'Facebook Connect Plugin - ' . common_log(LOG_WARNING, 'Facebook Connect Plugin - ' .
"Failed auth attempt, proxy = $proxy, ip = $ip."); "Failed auth attempt, proxy = $proxy, ip = $ip.");
$this->clientError(_('You must be logged into Facebook to ' . $this->clientError(_m('You must be logged into Facebook to ' .
'use Facebook Connect.')); 'use Facebook Connect.'));
} }
return true; return true;
@ -74,7 +74,7 @@ class FBConnectauthAction extends Action
// We don't want these cookies // We don't want these cookies
getFacebook()->clear_cookie_state(); getFacebook()->clear_cookie_state();
$this->clientError(_('There is already a local user linked with this Facebook.')); $this->clientError(_m('There is already a local user linked with this Facebook.'));
} else { } else {
@ -87,12 +87,12 @@ class FBConnectauthAction extends Action
$token = $this->trimmed('token'); $token = $this->trimmed('token');
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
$this->showForm(_('There was a problem with your session token. Try again, please.')); $this->showForm(_m('There was a problem with your session token. Try again, please.'));
return; return;
} }
if ($this->arg('create')) { if ($this->arg('create')) {
if (!$this->boolean('license')) { if (!$this->boolean('license')) {
$this->showForm(_('You can\'t register if you don\'t agree to the license.'), $this->showForm(_m('You can\'t register if you don\'t agree to the license.'),
$this->trimmed('newname')); $this->trimmed('newname'));
return; return;
} }
@ -102,7 +102,7 @@ class FBConnectauthAction extends Action
} else { } else {
common_debug('Facebook Connect Plugin - ' . common_debug('Facebook Connect Plugin - ' .
print_r($this->args, true)); print_r($this->args, true));
$this->showForm(_('Something weird happened.'), $this->showForm(_m('Something weird happened.'),
$this->trimmed('newname')); $this->trimmed('newname'));
} }
} else { } else {
@ -116,13 +116,13 @@ class FBConnectauthAction extends Action
$this->element('div', array('class' => 'error'), $this->error); $this->element('div', array('class' => 'error'), $this->error);
} else { } else {
$this->element('div', 'instructions', $this->element('div', 'instructions',
sprintf(_('This is the first time you\'ve logged into %s so we must connect your Facebook to a local account. You can either create a new account, or connect with your existing account, if you have one.'), common_config('site', 'name'))); sprintf(_m('This is the first time you\'ve logged into %s so we must connect your Facebook to a local account. You can either create a new account, or connect with your existing account, if you have one.'), common_config('site', 'name')));
} }
} }
function title() function title()
{ {
return _('Facebook Account Setup'); return _m('Facebook Account Setup');
} }
function showForm($error=null, $username=null) function showForm($error=null, $username=null)
@ -150,7 +150,7 @@ class FBConnectauthAction extends Action
'class' => 'form_settings', 'class' => 'form_settings',
'action' => common_local_url('FBConnectAuth'))); 'action' => common_local_url('FBConnectAuth')));
$this->elementStart('fieldset', array('id' => 'settings_facebook_connect_options')); $this->elementStart('fieldset', array('id' => 'settings_facebook_connect_options'));
$this->element('legend', null, _('Connection options')); $this->element('legend', null, _m('Connection options'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
$this->element('input', array('type' => 'checkbox', $this->element('input', array('type' => 'checkbox',
@ -159,10 +159,10 @@ class FBConnectauthAction extends Action
'name' => 'license', 'name' => 'license',
'value' => 'true')); 'value' => 'true'));
$this->elementStart('label', array('class' => 'checkbox', 'for' => 'license')); $this->elementStart('label', array('class' => 'checkbox', 'for' => 'license'));
$this->text(_('My text and files are available under ')); $this->text(_m('My text and files are available under '));
$this->element('a', array('href' => common_config('license', 'url')), $this->element('a', array('href' => common_config('license', 'url')),
common_config('license', 'title')); common_config('license', 'title'));
$this->text(_(' except this private data: password, email address, IM address, phone number.')); $this->text(_m(' except this private data: password, email address, IM address, phone number.'));
$this->elementEnd('label'); $this->elementEnd('label');
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
@ -170,33 +170,33 @@ class FBConnectauthAction extends Action
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
$this->element('legend', null, $this->element('legend', null,
_('Create new account')); _m('Create new account'));
$this->element('p', null, $this->element('p', null,
_('Create a new user with this nickname.')); _m('Create a new user with this nickname.'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
$this->input('newname', _('New nickname'), $this->input('newname', _m('New nickname'),
($this->username) ? $this->username : '', ($this->username) ? $this->username : '',
_('1-64 lowercase letters or numbers, no punctuation or spaces')); _m('1-64 lowercase letters or numbers, no punctuation or spaces'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->submit('create', _('Create')); $this->submit('create', _m('Create'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->element('legend', null, $this->element('legend', null,
_('Connect existing account')); _m('Connect existing account'));
$this->element('p', null, $this->element('p', null,
_('If you already have an account, login with your username and password to connect it to your Facebook.')); _m('If you already have an account, login with your username and password to connect it to your Facebook.'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
$this->input('nickname', _('Existing nickname')); $this->input('nickname', _m('Existing nickname'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->password('password', _('Password')); $this->password('password', _m('Password'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->submit('connect', _('Connect')); $this->submit('connect', _m('Connect'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
@ -212,7 +212,7 @@ class FBConnectauthAction extends Action
function createNewUser() function createNewUser()
{ {
if (common_config('site', 'closed')) { if (common_config('site', 'closed')) {
$this->clientError(_('Registration not allowed.')); $this->clientError(_m('Registration not allowed.'));
return; return;
} }
@ -221,14 +221,14 @@ class FBConnectauthAction extends Action
if (common_config('site', 'inviteonly')) { if (common_config('site', 'inviteonly')) {
$code = $_SESSION['invitecode']; $code = $_SESSION['invitecode'];
if (empty($code)) { if (empty($code)) {
$this->clientError(_('Registration not allowed.')); $this->clientError(_m('Registration not allowed.'));
return; return;
} }
$invite = Invitation::staticGet($code); $invite = Invitation::staticGet($code);
if (empty($invite)) { if (empty($invite)) {
$this->clientError(_('Not a valid invitation code.')); $this->clientError(_m('Not a valid invitation code.'));
return; return;
} }
} }
@ -238,17 +238,17 @@ class FBConnectauthAction extends Action
if (!Validate::string($nickname, array('min_length' => 1, if (!Validate::string($nickname, array('min_length' => 1,
'max_length' => 64, 'max_length' => 64,
'format' => NICKNAME_FMT))) { 'format' => NICKNAME_FMT))) {
$this->showForm(_('Nickname must have only lowercase letters and numbers and no spaces.')); $this->showForm(_m('Nickname must have only lowercase letters and numbers and no spaces.'));
return; return;
} }
if (!User::allowed_nickname($nickname)) { if (!User::allowed_nickname($nickname)) {
$this->showForm(_('Nickname not allowed.')); $this->showForm(_m('Nickname not allowed.'));
return; return;
} }
if (User::staticGet('nickname', $nickname)) { if (User::staticGet('nickname', $nickname)) {
$this->showForm(_('Nickname already in use. Try another one.')); $this->showForm(_m('Nickname already in use. Try another one.'));
return; return;
} }
@ -266,7 +266,7 @@ class FBConnectauthAction extends Action
$result = $this->flinkUser($user->id, $this->fbuid); $result = $this->flinkUser($user->id, $this->fbuid);
if (!$result) { if (!$result) {
$this->serverError(_('Error connecting user to Facebook.')); $this->serverError(_m('Error connecting user to Facebook.'));
return; return;
} }
@ -286,7 +286,7 @@ class FBConnectauthAction extends Action
$password = $this->trimmed('password'); $password = $this->trimmed('password');
if (!common_check_user($nickname, $password)) { if (!common_check_user($nickname, $password)) {
$this->showForm(_('Invalid username or password.')); $this->showForm(_m('Invalid username or password.'));
return; return;
} }
@ -300,7 +300,7 @@ class FBConnectauthAction extends Action
$result = $this->flinkUser($user->id, $this->fbuid); $result = $this->flinkUser($user->id, $this->fbuid);
if (!$result) { if (!$result) {
$this->serverError(_('Error connecting user to Facebook.')); $this->serverError(_m('Error connecting user to Facebook.'));
return; return;
} }
@ -320,7 +320,7 @@ class FBConnectauthAction extends Action
$result = $this->flinkUser($user->id, $this->fbuid); $result = $this->flinkUser($user->id, $this->fbuid);
if (empty($result)) { if (empty($result)) {
$this->serverError(_('Error connecting user to Facebook.')); $this->serverError(_m('Error connecting user to Facebook.'));
return; return;
} }

View File

@ -30,7 +30,7 @@ class FBConnectLoginAction extends Action
parent::handle($args); parent::handle($args);
if (common_is_real_login()) { if (common_is_real_login()) {
$this->clientError(_('Already logged in.')); $this->clientError(_m('Already logged in.'));
} }
$this->showPage(); $this->showPage();
@ -38,7 +38,7 @@ class FBConnectLoginAction extends Action
function getInstructions() function getInstructions()
{ {
return _('Login with your Facebook Account'); return _m('Login with your Facebook Account');
} }
function showPageNotice() function showPageNotice()
@ -52,7 +52,7 @@ class FBConnectLoginAction extends Action
function title() function title()
{ {
return _('Facebook Login'); return _m('Facebook Login');
} }
function showContent() { function showContent() {

View File

@ -53,7 +53,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction
function title() function title()
{ {
return _('Facebook Connect Settings'); return _m('Facebook Connect Settings');
} }
/** /**
@ -64,7 +64,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction
function getInstructions() function getInstructions()
{ {
return _('Manage how your account connects to Facebook'); return _m('Manage how your account connects to Facebook');
} }
/** /**
@ -89,7 +89,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction
if (!$flink) { if (!$flink) {
$this->element('p', 'instructions', $this->element('p', 'instructions',
_('There is no Facebook user connected to this account.')); _m('There is no Facebook user connected to this account.'));
$this->element('fb:login-button', array('onlogin' => 'goto_login()', $this->element('fb:login-button', array('onlogin' => 'goto_login()',
'length' => 'long')); 'length' => 'long'));
@ -97,7 +97,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction
} else { } else {
$this->element('p', 'form_note', $this->element('p', 'form_note',
_('Connected Facebook user')); _m('Connected Facebook user'));
$this->elementStart('p', array('class' => 'facebook-user-display')); $this->elementStart('p', array('class' => 'facebook-user-display'));
$this->elementStart('fb:profile-pic', $this->elementStart('fb:profile-pic',
@ -116,18 +116,18 @@ class FBConnectSettingsAction extends ConnectSettingsAction
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->element('legend', null, _('Disconnect my account from Facebook')); $this->element('legend', null, _m('Disconnect my account from Facebook'));
if (!$user->password) { if (!$user->password) {
$this->elementStart('p', array('class' => 'form_guide')); $this->elementStart('p', array('class' => 'form_guide'));
$this->text(_('Disconnecting your Faceboook ' . $this->text(_m('Disconnecting your Faceboook ' .
'would make it impossible to log in! Please ')); 'would make it impossible to log in! Please '));
$this->element('a', $this->element('a',
array('href' => common_local_url('passwordsettings')), array('href' => common_local_url('passwordsettings')),
_('set a password')); _m('set a password'));
$this->text(_(' first.')); $this->text(_m(' first.'));
$this->elementEnd('p'); $this->elementEnd('p');
} else { } else {
@ -139,7 +139,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction
$this->element('p', 'instructions', $this->element('p', 'instructions',
sprintf($note, $site, $site)); sprintf($note, $site, $site));
$this->submit('disconnect', _('Disconnect')); $this->submit('disconnect', _m('Disconnect'));
} }
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
@ -161,8 +161,8 @@ class FBConnectSettingsAction extends ConnectSettingsAction
// CSRF protection // CSRF protection
$token = $this->trimmed('token'); $token = $this->trimmed('token');
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
$this->showForm(_('There was a problem with your session token. '. $this->showForm(_m('There was a problem with your session token. '.
'Try again, please.')); 'Try again, please.'));
return; return;
} }
@ -175,7 +175,7 @@ class FBConnectSettingsAction extends ConnectSettingsAction
if ($result === false) { if ($result === false) {
common_log_db_error($user, 'DELETE', __FILE__); common_log_db_error($user, 'DELETE', __FILE__);
$this->serverError(_('Couldn\'t delete link to Facebook.')); $this->serverError(_m('Couldn\'t delete link to Facebook.'));
return; return;
} }
@ -191,10 +191,10 @@ class FBConnectSettingsAction extends ConnectSettingsAction
$e->getMessage()); $e->getMessage());
} }
$this->showForm(_('You have disconnected from Facebook.'), true); $this->showForm(_m('You have disconnected from Facebook.'), true);
} else { } else {
$this->showForm(_('Not sure what you\'re trying to do.')); $this->showForm(_m('Not sure what you\'re trying to do.'));
return; return;
} }

View File

@ -406,9 +406,9 @@ class FacebookPlugin extends Plugin
$action_name = $action->trimmed('action'); $action_name = $action->trimmed('action');
$action->menuItem(common_local_url('FBConnectLogin'), $action->menuItem(common_local_url('FBConnectLogin'),
_('Facebook'), _m('Facebook'),
_('Login or register using Facebook'), _m('Login or register using Facebook'),
'FBConnectLogin' === $action_name); 'FBConnectLogin' === $action_name);
return true; return true;
} }
@ -426,8 +426,8 @@ class FacebookPlugin extends Plugin
$action_name = $action->trimmed('action'); $action_name = $action->trimmed('action');
$action->menuItem(common_local_url('FBConnectSettings'), $action->menuItem(common_local_url('FBConnectSettings'),
_('Facebook'), _m('Facebook'),
_('Facebook Connect Settings'), _m('Facebook Connect Settings'),
$action_name === 'FBConnectSettings'); $action_name === 'FBConnectSettings');
return true; return true;

View File

@ -168,7 +168,7 @@ class FacebookAction extends Action
$this->elementStart('li', array('class' => $this->elementStart('li', array('class' =>
($this->action == 'facebookhome') ? 'current' : 'facebook_home')); ($this->action == 'facebookhome') ? 'current' : 'facebook_home'));
$this->element('a', $this->element('a',
array('href' => 'index.php', 'title' => _('Home')), _('Home')); array('href' => 'index.php', 'title' => _m('Home')), _m('Home'));
$this->elementEnd('li'); $this->elementEnd('li');
if (common_config('invite', 'enabled')) { if (common_config('invite', 'enabled')) {
@ -176,7 +176,7 @@ class FacebookAction extends Action
array('class' => array('class' =>
($this->action == 'facebookinvite') ? 'current' : 'facebook_invite')); ($this->action == 'facebookinvite') ? 'current' : 'facebook_invite'));
$this->element('a', $this->element('a',
array('href' => 'invite.php', 'title' => _('Invite')), _('Invite')); array('href' => 'invite.php', 'title' => _m('Invite')), _m('Invite'));
$this->elementEnd('li'); $this->elementEnd('li');
} }
@ -185,7 +185,7 @@ class FacebookAction extends Action
($this->action == 'facebooksettings') ? 'current' : 'facebook_settings')); ($this->action == 'facebooksettings') ? 'current' : 'facebook_settings'));
$this->element('a', $this->element('a',
array('href' => 'settings.php', array('href' => 'settings.php',
'title' => _('Settings')), _('Settings')); 'title' => _m('Settings')), _m('Settings'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
@ -225,15 +225,15 @@ class FacebookAction extends Action
$this->elementStart('dl', array('class' => 'system_notice')); $this->elementStart('dl', array('class' => 'system_notice'));
$this->element('dt', null, 'Page Notice'); $this->element('dt', null, 'Page Notice');
$loginmsg_part1 = _('To use the %s Facebook Application you need to login ' . $loginmsg_part1 = _m('To use the %s Facebook Application you need to login ' .
'with your username and password. Don\'t have a username yet? '); 'with your username and password. Don\'t have a username yet? ');
$loginmsg_part2 = _(' a new account.'); $loginmsg_part2 = _m(' a new account.');
$this->elementStart('dd'); $this->elementStart('dd');
$this->elementStart('p'); $this->elementStart('p');
$this->text(sprintf($loginmsg_part1, common_config('site', 'name'))); $this->text(sprintf($loginmsg_part1, common_config('site', 'name')));
$this->element('a', $this->element('a',
array('href' => common_local_url('register')), _('Register')); array('href' => common_local_url('register')), _m('Register'));
$this->text($loginmsg_part2); $this->text($loginmsg_part2);
$this->elementEnd('p'); $this->elementEnd('p');
$this->elementEnd('dd'); $this->elementEnd('dd');
@ -246,7 +246,7 @@ class FacebookAction extends Action
{ {
$this->elementStart('div', array('id' => 'content')); $this->elementStart('div', array('id' => 'content'));
$this->element('h1', null, _('Login')); $this->element('h1', null, _m('Login'));
if ($msg) { if ($msg) {
$this->element('fb:error', array('message' => $msg)); $this->element('fb:error', array('message' => $msg));
@ -265,20 +265,20 @@ class FacebookAction extends Action
$this->elementStart('ul', array('class' => 'form_datas')); $this->elementStart('ul', array('class' => 'form_datas'));
$this->elementStart('li'); $this->elementStart('li');
$this->input('nickname', _('Nickname')); $this->input('nickname', _m('Nickname'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->password('password', _('Password')); $this->password('password', _m('Password'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->submit('submit', _('Login')); $this->submit('submit', _m('Login'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
$this->elementStart('p'); $this->elementStart('p');
$this->element('a', array('href' => common_local_url('recoverpassword')), $this->element('a', array('href' => common_local_url('recoverpassword')),
_('Lost or forgotten password?')); _m('Lost or forgotten password?'));
$this->elementEnd('p'); $this->elementEnd('p');
$this->elementEnd('div'); $this->elementEnd('div');
@ -383,7 +383,7 @@ class FacebookAction extends Action
// Does a little before-after block for next/prev page // Does a little before-after block for next/prev page
if ($have_before || $have_after) { if ($have_before || $have_after) {
$this->elementStart('dl', 'pagination'); $this->elementStart('dl', 'pagination');
$this->element('dt', null, _('Pagination')); $this->element('dt', null, _m('Pagination'));
$this->elementStart('dd', null); $this->elementStart('dd', null);
$this->elementStart('ul', array('class' => 'nav')); $this->elementStart('ul', array('class' => 'nav'));
} }
@ -392,7 +392,7 @@ class FacebookAction extends Action
$newargs = $args ? array_merge($args, $pargs) : $pargs; $newargs = $args ? array_merge($args, $pargs) : $pargs;
$this->elementStart('li', array('class' => 'nav_prev')); $this->elementStart('li', array('class' => 'nav_prev'));
$this->element('a', array('href' => "$this->app_uri/$action?page=$newargs[page]", 'rel' => 'prev'), $this->element('a', array('href' => "$this->app_uri/$action?page=$newargs[page]", 'rel' => 'prev'),
_('After')); _m('After'));
$this->elementEnd('li'); $this->elementEnd('li');
} }
if ($have_after) { if ($have_after) {
@ -400,7 +400,7 @@ class FacebookAction extends Action
$newargs = $args ? array_merge($args, $pargs) : $pargs; $newargs = $args ? array_merge($args, $pargs) : $pargs;
$this->elementStart('li', array('class' => 'nav_next')); $this->elementStart('li', array('class' => 'nav_next'));
$this->element('a', array('href' => "$this->app_uri/$action?page=$newargs[page]", 'rel' => 'next'), $this->element('a', array('href' => "$this->app_uri/$action?page=$newargs[page]", 'rel' => 'next'),
_('Before')); _m('Before'));
$this->elementEnd('li'); $this->elementEnd('li');
} }
if ($have_before || $have_after) { if ($have_before || $have_after) {
@ -418,13 +418,13 @@ class FacebookAction extends Action
$content = $this->trimmed('status_textarea'); $content = $this->trimmed('status_textarea');
if (!$content) { if (!$content) {
$this->showPage(_('No notice content!')); $this->showPage(_m('No notice content!'));
return; return;
} else { } else {
$content_shortened = common_shorten_links($content); $content_shortened = common_shorten_links($content);
if (Notice::contentTooLong($content_shortened)) { if (Notice::contentTooLong($content_shortened)) {
$this->showPage(sprintf(_('That\'s too long. Max notice size is %d chars.'), $this->showPage(sprintf(_m('That\'s too long. Max notice size is %d chars.'),
Notice::maxContent())); Notice::maxContent()));
return; return;
} }
@ -520,7 +520,7 @@ class FacebookNoticeList extends NoticeList
function show() function show()
{ {
$this->out->elementStart('div', array('id' =>'notices_primary')); $this->out->elementStart('div', array('id' =>'notices_primary'));
$this->out->element('h2', null, _('Notices')); $this->out->element('h2', null, _m('Notices'));
$this->out->elementStart('ul', array('class' => 'notices')); $this->out->elementStart('ul', array('class' => 'notices'));
$cnt = 0; $cnt = 0;

View File

@ -108,7 +108,7 @@ class FacebookhomeAction extends FacebookAction
$user = User::staticGet('nickname', $nickname); $user = User::staticGet('nickname', $nickname);
if (!$user) { if (!$user) {
$this->showLoginForm(_("Server error - couldn't get user!")); $this->showLoginForm(_m("Server error - couldn't get user!"));
} }
$flink = DB_DataObject::factory('foreign_link'); $flink = DB_DataObject::factory('foreign_link');
@ -128,7 +128,7 @@ class FacebookhomeAction extends FacebookAction
return; return;
} else { } else {
$msg = _('Incorrect username or password.'); $msg = _m('Incorrect username or password.');
} }
} }
@ -155,9 +155,9 @@ class FacebookhomeAction extends FacebookAction
function title() function title()
{ {
if ($this->page > 1) { if ($this->page > 1) {
return sprintf(_("%s and friends, page %d"), $this->user->nickname, $this->page); return sprintf(_m("%s and friends, page %d"), $this->user->nickname, $this->page);
} else { } else {
return sprintf(_("%s and friends"), $this->user->nickname); return sprintf(_m("%s and friends"), $this->user->nickname);
} }
} }
@ -186,7 +186,7 @@ class FacebookhomeAction extends FacebookAction
$this->elementStart('div', array('class' => 'facebook_guide')); $this->elementStart('div', array('class' => 'facebook_guide'));
$instructions = sprintf(_('If you would like the %s app to automatically update ' . $instructions = sprintf(_m('If you would like the %s app to automatically update ' .
'your Facebook status with your latest notice, you need ' . 'your Facebook status with your latest notice, you need ' .
'to give it permission.'), $this->app_name); 'to give it permission.'), $this->app_name);
@ -210,13 +210,13 @@ class FacebookhomeAction extends FacebookAction
$this->elementStart('span', array('class' => 'facebook-button')); $this->elementStart('span', array('class' => 'facebook-button'));
$this->element('a', array('href' => $auth_url), $this->element('a', array('href' => $auth_url),
sprintf(_('Okay, do it!'), $this->app_name)); sprintf(_m('Okay, do it!'), $this->app_name));
$this->elementEnd('span'); $this->elementEnd('span');
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li', array('id' => 'fb-permissions-item')); $this->elementStart('li', array('id' => 'fb-permissions-item'));
$this->submit('skip', _('Skip')); $this->submit('skip', _m('Skip'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
@ -245,7 +245,7 @@ class FacebookhomeAction extends FacebookAction
if ($have_before || $have_after) { if ($have_before || $have_after) {
$this->elementStart('dl', 'pagination'); $this->elementStart('dl', 'pagination');
$this->element('dt', null, _('Pagination')); $this->element('dt', null, _m('Pagination'));
$this->elementStart('dd', null); $this->elementStart('dd', null);
$this->elementStart('ul', array('class' => 'nav')); $this->elementStart('ul', array('class' => 'nav'));
} }
@ -254,7 +254,7 @@ class FacebookhomeAction extends FacebookAction
$newargs = $args ? array_merge($args, $pargs) : $pargs; $newargs = $args ? array_merge($args, $pargs) : $pargs;
$this->elementStart('li', array('class' => 'nav_prev')); $this->elementStart('li', array('class' => 'nav_prev'));
$this->element('a', array('href' => "$action?page=$newargs[page]", 'rel' => 'prev'), $this->element('a', array('href' => "$action?page=$newargs[page]", 'rel' => 'prev'),
_('After')); _m('After'));
$this->elementEnd('li'); $this->elementEnd('li');
} }
if ($have_after) { if ($have_after) {
@ -262,7 +262,7 @@ class FacebookhomeAction extends FacebookAction
$newargs = $args ? array_merge($args, $pargs) : $pargs; $newargs = $args ? array_merge($args, $pargs) : $pargs;
$this->elementStart('li', array('class' => 'nav_next')); $this->elementStart('li', array('class' => 'nav_next'));
$this->element('a', array('href' => "$action?page=$newargs[page]", 'rel' => 'next'), $this->element('a', array('href' => "$action?page=$newargs[page]", 'rel' => 'next'),
_('Before')); _m('Before'));
$this->elementEnd('li'); $this->elementEnd('li');
} }
if ($have_before || $have_after) { if ($have_before || $have_after) {

View File

@ -69,9 +69,9 @@ class FacebookinviteAction extends FacebookAction
function showSuccessContent() function showSuccessContent()
{ {
$this->element('h2', null, sprintf(_('Thanks for inviting your friends to use %s'), $this->element('h2', null, sprintf(_m('Thanks for inviting your friends to use %s'),
common_config('site', 'name'))); common_config('site', 'name')));
$this->element('p', null, _('Invitations have been sent to the following users:')); $this->element('p', null, _m('Invitations have been sent to the following users:'));
$friend_ids = $_POST['ids']; // XXX: Hmm... is this the best way to access the list? $friend_ids = $_POST['ids']; // XXX: Hmm... is this the best way to access the list?
@ -91,7 +91,7 @@ class FacebookinviteAction extends FacebookAction
function showFormContent() function showFormContent()
{ {
$content = sprintf(_('You have been invited to %s'), common_config('site', 'name')) . $content = sprintf(_m('You have been invited to %s'), common_config('site', 'name')) .
htmlentities('<fb:req-choice url="' . $this->app_uri . '" label="Add"/>'); htmlentities('<fb:req-choice url="' . $this->app_uri . '" label="Add"/>');
$this->elementStart('fb:request-form', array('action' => 'invite.php', $this->elementStart('fb:request-form', array('action' => 'invite.php',
@ -100,7 +100,7 @@ class FacebookinviteAction extends FacebookAction
'type' => common_config('site', 'name'), 'type' => common_config('site', 'name'),
'content' => $content)); 'content' => $content));
$this->hidden('invite', 'true'); $this->hidden('invite', 'true');
$actiontext = sprintf(_('Invite your friends to use %s'), common_config('site', 'name')); $actiontext = sprintf(_m('Invite your friends to use %s'), common_config('site', 'name'));
$multi_params = array('showborder' => 'false'); $multi_params = array('showborder' => 'false');
$multi_params['actiontext'] = $actiontext; $multi_params['actiontext'] = $actiontext;
@ -122,7 +122,7 @@ class FacebookinviteAction extends FacebookAction
if ($exclude_ids) { if ($exclude_ids) {
$this->element('h2', null, sprintf(_('Friends already using %s:'), $this->element('h2', null, sprintf(_m('Friends already using %s:'),
common_config('site', 'name'))); common_config('site', 'name')));
$this->elementStart('ul', array('id' => 'facebook-friends')); $this->elementStart('ul', array('id' => 'facebook-friends'));
@ -140,7 +140,7 @@ class FacebookinviteAction extends FacebookAction
function title() function title()
{ {
return sprintf(_('Send invitations')); return sprintf(_m('Send invitations'));
} }
} }

View File

@ -88,7 +88,7 @@ class FacebookinviteAction extends FacebookAction
function title() function title()
{ {
return sprintf(_('Login')); return sprintf(_m('Login'));
} }
function redirectHome() function redirectHome()

View File

@ -55,7 +55,7 @@ class FacebookremoveAction extends FacebookAction
if (!$result) { if (!$result) {
common_log_db_error($flink, 'DELETE', __FILE__); common_log_db_error($flink, 'DELETE', __FILE__);
$this->serverError(_('Couldn\'t remove Facebook user.')); $this->serverError(_m('Couldn\'t remove Facebook user.'));
return; return;
} }

View File

@ -71,9 +71,9 @@ class FacebooksettingsAction extends FacebookAction
$trimmed); $trimmed);
if ($result === false) { if ($result === false) {
$this->showForm(_('There was a problem saving your sync preferences!')); $this->showForm(_m('There was a problem saving your sync preferences!'));
} else { } else {
$this->showForm(_('Sync preferences saved.'), true); $this->showForm(_m('Sync preferences saved.'), true);
} }
} }
@ -96,14 +96,14 @@ class FacebooksettingsAction extends FacebookAction
$this->elementStart('li'); $this->elementStart('li');
$this->checkbox('noticesync', _('Automatically update my Facebook status with my notices.'), $this->checkbox('noticesync', _m('Automatically update my Facebook status with my notices.'),
($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND) : true); ($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND) : true);
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->checkbox('replysync', _('Send "@" replies to Facebook.'), $this->checkbox('replysync', _m('Send "@" replies to Facebook.'),
($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true); ($this->flink) ? ($this->flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : true);
$this->elementEnd('li'); $this->elementEnd('li');
@ -112,15 +112,15 @@ class FacebooksettingsAction extends FacebookAction
$prefix = trim($this->facebook->api_client->data_getUserPreference(FACEBOOK_NOTICE_PREFIX)); $prefix = trim($this->facebook->api_client->data_getUserPreference(FACEBOOK_NOTICE_PREFIX));
$this->input('prefix', _('Prefix'), $this->input('prefix', _m('Prefix'),
($prefix) ? $prefix : null, ($prefix) ? $prefix : null,
_('A string to prefix notices with.')); _m('A string to prefix notices with.'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->submit('save', _('Save')); $this->submit('save', _m('Save'));
$this->elementEnd('li'); $this->elementEnd('li');
@ -130,7 +130,7 @@ class FacebooksettingsAction extends FacebookAction
} else { } else {
$instructions = sprintf(_('If you would like %s to automatically update ' . $instructions = sprintf(_m('If you would like %s to automatically update ' .
'your Facebook status with your latest notice, you need ' . 'your Facebook status with your latest notice, you need ' .
'to give it permission.'), $this->app_name); 'to give it permission.'), $this->app_name);
@ -143,7 +143,7 @@ class FacebooksettingsAction extends FacebookAction
$this->elementStart('fb:prompt-permission', array('perms' => 'publish_stream', $this->elementStart('fb:prompt-permission', array('perms' => 'publish_stream',
'next_fbjs' => 'document.setLocation(\'' . "$this->app_uri/settings.php" . '\')')); 'next_fbjs' => 'document.setLocation(\'' . "$this->app_uri/settings.php" . '\')'));
$this->element('span', array('class' => 'facebook-button'), $this->element('span', array('class' => 'facebook-button'),
sprintf(_('Allow %s to update my Facebook status'), common_config('site', 'name'))); sprintf(_m('Allow %s to update my Facebook status'), common_config('site', 'name')));
$this->elementEnd('fb:prompt-permission'); $this->elementEnd('fb:prompt-permission');
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
@ -153,7 +153,7 @@ class FacebooksettingsAction extends FacebookAction
function title() function title()
{ {
return _('Sync preferences'); return _m('Sync preferences');
} }
} }

View File

@ -277,10 +277,10 @@ function mail_facebook_app_removed($user)
$site_name = common_config('site', 'name'); $site_name = common_config('site', 'name');
$subject = sprintf( $subject = sprintf(
_('Your %1$s Facebook application access has been disabled.', _m('Your %1$s Facebook application access has been disabled.',
$site_name)); $site_name));
$body = sprintf(_("Hi, %1\$s. We're sorry to inform you that we are " . $body = sprintf(_m("Hi, %1\$s. We're sorry to inform you that we are " .
'unable to update your Facebook status from %2$s, and have disabled ' . 'unable to update your Facebook status from %2$s, and have disabled ' .
'the Facebook application for your account. This may be because ' . 'the Facebook application for your account. This may be because ' .
'you have removed the Facebook application\'s authorization, or ' . 'you have removed the Facebook application\'s authorization, or ' .

View File

@ -0,0 +1,394 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-07 20:38-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: facebookaction.php:171
msgid "Home"
msgstr ""
#: facebookaction.php:179
msgid "Invite"
msgstr ""
#: facebookaction.php:188
msgid "Settings"
msgstr ""
#: facebookaction.php:228
#, php-format
msgid ""
"To use the %s Facebook Application you need to login with your username and "
"password. Don't have a username yet? "
msgstr ""
#: facebookaction.php:230
msgid " a new account."
msgstr ""
#: facebookaction.php:236
msgid "Register"
msgstr ""
#: facebookaction.php:249 facebookaction.php:275 facebooklogin.php:91
msgid "Login"
msgstr ""
#: facebookaction.php:268
msgid "Nickname"
msgstr ""
#: facebookaction.php:271 FBConnectAuth.php:196
msgid "Password"
msgstr ""
#: facebookaction.php:281
msgid "Lost or forgotten password?"
msgstr ""
#: facebookaction.php:386 facebookhome.php:248
msgid "Pagination"
msgstr ""
#: facebookaction.php:395 facebookhome.php:257
msgid "After"
msgstr ""
#: facebookaction.php:403 facebookhome.php:265
msgid "Before"
msgstr ""
#: facebookaction.php:421
msgid "No notice content!"
msgstr ""
#: facebookaction.php:427
#, php-format
msgid "That's too long. Max notice size is %d chars."
msgstr ""
#: facebookaction.php:523
msgid "Notices"
msgstr ""
#: facebookutil.php:280
#, php-format
msgid "Your %1$s Facebook application access has been disabled."
msgstr ""
#: facebookutil.php:283
#, php-format
msgid ""
"Hi, %1$s. We're sorry to inform you that we are unable to update your "
"Facebook status from %2$s, and have disabled the Facebook application for "
"your account. This may be because you have removed the Facebook "
"application's authorization, or have deleted your Facebook account. You can "
"re-enable the Facebook application and automatic status updating by re-"
"installing the %2$s Facebook application.\n"
"\n"
"Regards,\n"
"\n"
"%2$s"
msgstr ""
#: FBConnectLogin.php:33
msgid "Already logged in."
msgstr ""
#: FBConnectLogin.php:41
msgid "Login with your Facebook Account"
msgstr ""
#: FBConnectLogin.php:55
msgid "Facebook Login"
msgstr ""
#: facebookhome.php:111
msgid "Server error - couldn't get user!"
msgstr ""
#: facebookhome.php:131
msgid "Incorrect username or password."
msgstr ""
#: facebookhome.php:158
#, php-format
msgid "%s and friends, page %d"
msgstr ""
#: facebookhome.php:160
#, php-format
msgid "%s and friends"
msgstr ""
#: facebookhome.php:189
#, php-format
msgid ""
"If you would like the %s app to automatically update your Facebook status "
"with your latest notice, you need to give it permission."
msgstr ""
#: facebookhome.php:213
msgid "Okay, do it!"
msgstr ""
#: facebookhome.php:219
msgid "Skip"
msgstr ""
#: facebooksettings.php:74
msgid "There was a problem saving your sync preferences!"
msgstr ""
#: facebooksettings.php:76
msgid "Sync preferences saved."
msgstr ""
#: facebooksettings.php:99
msgid "Automatically update my Facebook status with my notices."
msgstr ""
#: facebooksettings.php:106
msgid "Send \"@\" replies to Facebook."
msgstr ""
#: facebooksettings.php:115
msgid "Prefix"
msgstr ""
#: facebooksettings.php:117
msgid "A string to prefix notices with."
msgstr ""
#: facebooksettings.php:123
msgid "Save"
msgstr ""
#: facebooksettings.php:133
#, php-format
msgid ""
"If you would like %s to automatically update your Facebook status with your "
"latest notice, you need to give it permission."
msgstr ""
#: facebooksettings.php:146
#, php-format
msgid "Allow %s to update my Facebook status"
msgstr ""
#: facebooksettings.php:156
msgid "Sync preferences"
msgstr ""
#: facebookinvite.php:72
#, php-format
msgid "Thanks for inviting your friends to use %s"
msgstr ""
#: facebookinvite.php:74
msgid "Invitations have been sent to the following users:"
msgstr ""
#: facebookinvite.php:94
#, php-format
msgid "You have been invited to %s"
msgstr ""
#: facebookinvite.php:103
#, php-format
msgid "Invite your friends to use %s"
msgstr ""
#: facebookinvite.php:125
#, php-format
msgid "Friends already using %s:"
msgstr ""
#: facebookinvite.php:143
msgid "Send invitations"
msgstr ""
#: facebookremove.php:58
msgid "Couldn't remove Facebook user."
msgstr ""
#: FBConnectSettings.php:56 FacebookPlugin.php:430
msgid "Facebook Connect Settings"
msgstr ""
#: FBConnectSettings.php:67
msgid "Manage how your account connects to Facebook"
msgstr ""
#: FBConnectSettings.php:92
msgid "There is no Facebook user connected to this account."
msgstr ""
#: FBConnectSettings.php:100
msgid "Connected Facebook user"
msgstr ""
#: FBConnectSettings.php:119
msgid "Disconnect my account from Facebook"
msgstr ""
#: FBConnectSettings.php:124
msgid ""
"Disconnecting your Faceboook would make it impossible to log in! Please "
msgstr ""
#: FBConnectSettings.php:128
msgid "set a password"
msgstr ""
#: FBConnectSettings.php:130
msgid " first."
msgstr ""
#: FBConnectSettings.php:142
msgid "Disconnect"
msgstr ""
#: FBConnectSettings.php:164 FBConnectAuth.php:90
msgid "There was a problem with your session token. Try again, please."
msgstr ""
#: FBConnectSettings.php:178
msgid "Couldn't delete link to Facebook."
msgstr ""
#: FBConnectSettings.php:194
msgid "You have disconnected from Facebook."
msgstr ""
#: FBConnectSettings.php:197
msgid "Not sure what you're trying to do."
msgstr ""
#: FBConnectAuth.php:51
msgid "You must be logged into Facebook to use Facebook Connect."
msgstr ""
#: FBConnectAuth.php:77
msgid "There is already a local user linked with this Facebook."
msgstr ""
#: FBConnectAuth.php:95
msgid "You can't register if you don't agree to the license."
msgstr ""
#: FBConnectAuth.php:105
msgid "Something weird happened."
msgstr ""
#: FBConnectAuth.php:119
#, php-format
msgid ""
"This is the first time you've logged into %s so we must connect your "
"Facebook to a local account. You can either create a new account, or connect "
"with your existing account, if you have one."
msgstr ""
#: FBConnectAuth.php:125
msgid "Facebook Account Setup"
msgstr ""
#: FBConnectAuth.php:153
msgid "Connection options"
msgstr ""
#: FBConnectAuth.php:162
msgid "My text and files are available under "
msgstr ""
#: FBConnectAuth.php:165
msgid ""
" except this private data: password, email address, IM address, phone number."
msgstr ""
#: FBConnectAuth.php:173
msgid "Create new account"
msgstr ""
#: FBConnectAuth.php:175
msgid "Create a new user with this nickname."
msgstr ""
#: FBConnectAuth.php:178
msgid "New nickname"
msgstr ""
#: FBConnectAuth.php:180
msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
msgstr ""
#: FBConnectAuth.php:183
msgid "Create"
msgstr ""
#: FBConnectAuth.php:188
msgid "Connect existing account"
msgstr ""
#: FBConnectAuth.php:190
msgid ""
"If you already have an account, login with your username and password to "
"connect it to your Facebook."
msgstr ""
#: FBConnectAuth.php:193
msgid "Existing nickname"
msgstr ""
#: FBConnectAuth.php:199
msgid "Connect"
msgstr ""
#: FBConnectAuth.php:215 FBConnectAuth.php:224
msgid "Registration not allowed."
msgstr ""
#: FBConnectAuth.php:231
msgid "Not a valid invitation code."
msgstr ""
#: FBConnectAuth.php:241
msgid "Nickname must have only lowercase letters and numbers and no spaces."
msgstr ""
#: FBConnectAuth.php:246
msgid "Nickname not allowed."
msgstr ""
#: FBConnectAuth.php:251
msgid "Nickname already in use. Try another one."
msgstr ""
#: FBConnectAuth.php:269 FBConnectAuth.php:303 FBConnectAuth.php:323
msgid "Error connecting user to Facebook."
msgstr ""
#: FBConnectAuth.php:289
msgid "Invalid username or password."
msgstr ""
#: FacebookPlugin.php:409 FacebookPlugin.php:429
msgid "Facebook"
msgstr ""
#: FacebookPlugin.php:410
msgid "Login or register using Facebook"
msgstr ""

View File

@ -51,7 +51,6 @@ class FeedSubPlugin extends Plugin
* @param Net_URL_Mapper $m path-to-action mapper * @param Net_URL_Mapper $m path-to-action mapper
* @return boolean hook return * @return boolean hook return
*/ */
function onRouterInitialized($m) function onRouterInitialized($m)
{ {
$m->connect('feedsub/callback/:feed', $m->connect('feedsub/callback/:feed',
@ -74,8 +73,8 @@ class FeedSubPlugin extends Plugin
$action_name = $action->trimmed('action'); $action_name = $action->trimmed('action');
$action->menuItem(common_local_url('feedsubsettings'), $action->menuItem(common_local_url('feedsubsettings'),
dgettext('FeebSubPlugin', 'Feeds'), _m('Feeds'),
dgettext('FeedSubPlugin', 'Feed subscription options'), _m('Feed subscription options'),
$action_name === 'feedsubsettings'); $action_name === 'feedsubsettings');
return true; return true;

View File

@ -38,7 +38,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction
function title() function title()
{ {
return dgettext('FeedSubPlugin', 'Feed subscriptions'); return _m('Feed subscriptions');
} }
/** /**
@ -49,9 +49,8 @@ class FeedSubSettingsAction extends ConnectSettingsAction
function getInstructions() function getInstructions()
{ {
return dgettext('FeedSubPlugin', return _m('You can subscribe to feeds from other sites; ' .
'You can subscribe to feeds from other sites; ' . 'updates will appear in your personal timeline.');
'updates will appear in your personal timeline.');
} }
/** /**
@ -94,9 +93,9 @@ class FeedSubSettingsAction extends ConnectSettingsAction
$this->elementEnd('ul'); $this->elementEnd('ul');
if ($this->preview) { if ($this->preview) {
$this->submit('subscribe', dgettext('FeedSubPlugin', 'Subscribe')); $this->submit('subscribe', _m('Subscribe'));
} else { } else {
$this->submit('validate', dgettext('FeedSubPlugin', 'Continue')); $this->submit('validate', _m('Continue'));
} }
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
@ -149,8 +148,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction
$feedurl = trim($this->arg('feedurl')); $feedurl = trim($this->arg('feedurl'));
if ($feedurl == '') { if ($feedurl == '') {
$this->showForm(dgettext('FeedSubPlugin', $this->showForm(_m('Empty feed URL!'));
'Empty feed URL!'));
return; return;
} }
$this->feedurl = $feedurl; $this->feedurl = $feedurl;
@ -160,26 +158,26 @@ class FeedSubSettingsAction extends ConnectSettingsAction
$discover = new FeedDiscovery(); $discover = new FeedDiscovery();
$uri = $discover->discoverFromURL($feedurl); $uri = $discover->discoverFromURL($feedurl);
} catch (FeedSubBadURLException $e) { } catch (FeedSubBadURLException $e) {
$this->showForm(dgettext('FeedSubPlugin', 'Invalid URL or could not reach server.')); $this->showForm(_m('Invalid URL or could not reach server.'));
return false; return false;
} catch (FeedSubBadResponseException $e) { } catch (FeedSubBadResponseException $e) {
$this->showForm(dgettext('FeedSubPlugin', 'Cannot read feed; server returned error.')); $this->showForm(_m('Cannot read feed; server returned error.'));
return false; return false;
} catch (FeedSubEmptyException $e) { } catch (FeedSubEmptyException $e) {
$this->showForm(dgettext('FeedSubPlugin', 'Cannot read feed; server returned an empty page.')); $this->showForm(_m('Cannot read feed; server returned an empty page.'));
return false; return false;
} catch (FeedSubBadHTMLException $e) { } catch (FeedSubBadHTMLException $e) {
$this->showForm(dgettext('FeedSubPlugin', 'Bad HTML, could not find feed link.')); $this->showForm(_m('Bad HTML, could not find feed link.'));
return false; return false;
} catch (FeedSubNoFeedException $e) { } catch (FeedSubNoFeedException $e) {
$this->showForm(dgettext('FeedSubPlugin', 'Could not find a feed linked from this URL.')); $this->showForm(_m('Could not find a feed linked from this URL.'));
return false; return false;
} catch (FeedSubUnrecognizedTypeException $e) { } catch (FeedSubUnrecognizedTypeException $e) {
$this->showForm(dgettext('FeedSubPlugin', 'Not a recognized feed type.')); $this->showForm(_m('Not a recognized feed type.'));
return false; return false;
} catch (FeedSubException $e) { } catch (FeedSubException $e) {
// Any new ones we forgot about // Any new ones we forgot about
$this->showForm(dgettext('FeedSubPlugin', 'Bad feed URL.')); $this->showForm(_m('Bad feed URL.'));
return false; return false;
} }
@ -187,7 +185,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction
$this->feedinfo = $this->munger->feedInfo(); $this->feedinfo = $this->munger->feedInfo();
if ($this->feedinfo->huburi == '') { if ($this->feedinfo->huburi == '') {
$this->showForm(dgettext('FeedSubPlugin', 'Feed is not PuSH-enabled; cannot subscribe.')); $this->showForm(_m('Feed is not PuSH-enabled; cannot subscribe.'));
return false; return false;
} }
@ -207,7 +205,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction
$ok = $this->feedinfo->subscribe(); $ok = $this->feedinfo->subscribe();
common_log(LOG_INFO, __METHOD__ . ": sub was $ok"); common_log(LOG_INFO, __METHOD__ . ": sub was $ok");
if (!$ok) { if (!$ok) {
$this->showForm(dgettext('FeedSubPlugin', 'Feed subscription failed! Bad response from hub.')); $this->showForm(_m('Feed subscription failed! Bad response from hub.'));
return; return;
} }
} }
@ -217,11 +215,11 @@ class FeedSubSettingsAction extends ConnectSettingsAction
$profile = $this->feedinfo->getProfile(); $profile = $this->feedinfo->getProfile();
if ($user->isSubscribed($profile)) { if ($user->isSubscribed($profile)) {
$this->showForm(dgettext('FeedSubPlugin', 'Already subscribed!')); $this->showForm(_m('Already subscribed!'));
} elseif ($user->subscribeTo($profile)) { } elseif ($user->subscribeTo($profile)) {
$this->showForm(dgettext('FeedSubPlugin', 'Feed subscribed!')); $this->showForm(_m('Feed subscribed!'));
} else { } else {
$this->showForm(dgettext('FeedSubPlugin', 'Feed subscription failed!')); $this->showForm(_m('Feed subscription failed!'));
} }
} }
} }
@ -230,7 +228,7 @@ class FeedSubSettingsAction extends ConnectSettingsAction
{ {
if ($this->validateFeed()) { if ($this->validateFeed()) {
$this->preview = true; $this->preview = true;
$this->showForm(dgettext('FeedSubPlugin', 'Previewing feed:')); $this->showForm(_m('Previewing feed:'));
} }
} }

View File

@ -212,7 +212,7 @@ class FeedMunger
// try adding #hashtags from the categories/tags on a post. // try adding #hashtags from the categories/tags on a post.
// @todo Should we force a language here? // @todo Should we force a language here?
$format = dgettext("FeedSubPlugin", 'New post: "%1$s" %2$s'); $format = _m('New post: "%1$s" %2$s');
$title = $entry->title; $title = $entry->title;
$link = $this->getAltLink($entry); $link = $this->getAltLink($entry);
$out = sprintf($format, $title, $link); $out = sprintf($format, $title, $link);

View File

@ -0,0 +1,104 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-07 20:38-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: tests/gettext-speedtest.php:57 FeedSubPlugin.php:76
msgid "Feeds"
msgstr ""
#: FeedSubPlugin.php:77
msgid "Feed subscription options"
msgstr ""
#: feedmunger.php:215
#, php-format
msgid "New post: \"%1$s\" %2$s"
msgstr ""
#: actions/feedsubsettings.php:41
msgid "Feed subscriptions"
msgstr ""
#: actions/feedsubsettings.php:52
msgid ""
"You can subscribe to feeds from other sites; updates will appear in your "
"personal timeline."
msgstr ""
#: actions/feedsubsettings.php:96
msgid "Subscribe"
msgstr ""
#: actions/feedsubsettings.php:98
msgid "Continue"
msgstr ""
#: actions/feedsubsettings.php:151
msgid "Empty feed URL!"
msgstr ""
#: actions/feedsubsettings.php:161
msgid "Invalid URL or could not reach server."
msgstr ""
#: actions/feedsubsettings.php:164
msgid "Cannot read feed; server returned error."
msgstr ""
#: actions/feedsubsettings.php:167
msgid "Cannot read feed; server returned an empty page."
msgstr ""
#: actions/feedsubsettings.php:170
msgid "Bad HTML, could not find feed link."
msgstr ""
#: actions/feedsubsettings.php:173
msgid "Could not find a feed linked from this URL."
msgstr ""
#: actions/feedsubsettings.php:176
msgid "Not a recognized feed type."
msgstr ""
#: actions/feedsubsettings.php:180
msgid "Bad feed URL."
msgstr ""
#: actions/feedsubsettings.php:188
msgid "Feed is not PuSH-enabled; cannot subscribe."
msgstr ""
#: actions/feedsubsettings.php:208
msgid "Feed subscription failed! Bad response from hub."
msgstr ""
#: actions/feedsubsettings.php:218
msgid "Already subscribed!"
msgstr ""
#: actions/feedsubsettings.php:220
msgid "Feed subscribed!"
msgstr ""
#: actions/feedsubsettings.php:222
msgid "Feed subscription failed!"
msgstr ""
#: actions/feedsubsettings.php:231
msgid "Previewing feed:"
msgstr ""

View File

@ -0,0 +1,106 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-07 14:14-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: FeedSubPlugin.php:77
msgid "Feeds"
msgstr "Flux"
#: FeedSubPlugin.php:78
msgid "Feed subscription options"
msgstr "Préférences pour abonnement flux"
#: feedmunger.php:215
#, php-format
msgid "New post: \"%1$s\" %2$s"
msgstr "Nouveau: \"%1$s\" %2$s"
#: actions/feedsubsettings.php:41
msgid "Feed subscriptions"
msgstr "Abonnements aux fluxes"
#: actions/feedsubsettings.php:52
msgid ""
"You can subscribe to feeds from other sites; updates will appear in your "
"personal timeline."
msgstr ""
"Abonner aux fluxes RSS ou Atom des autres sites web; les temps se trouverair"
"en votre flux personnel."
#: actions/feedsubsettings.php:96
msgid "Subscribe"
msgstr "Abonner"
#: actions/feedsubsettings.php:98
msgid "Continue"
msgstr "Prochaine"
#: actions/feedsubsettings.php:151
msgid "Empty feed URL!"
msgstr ""
#: actions/feedsubsettings.php:161
msgid "Invalid URL or could not reach server."
msgstr ""
#: actions/feedsubsettings.php:164
msgid "Cannot read feed; server returned error."
msgstr ""
#: actions/feedsubsettings.php:167
msgid "Cannot read feed; server returned an empty page."
msgstr ""
#: actions/feedsubsettings.php:170
msgid "Bad HTML, could not find feed link."
msgstr ""
#: actions/feedsubsettings.php:173
msgid "Could not find a feed linked from this URL."
msgstr ""
#: actions/feedsubsettings.php:176
msgid "Not a recognized feed type."
msgstr ""
#: actions/feedsubsettings.php:180
msgid "Bad feed URL."
msgstr ""
#: actions/feedsubsettings.php:188
msgid "Feed is not PuSH-enabled; cannot subscribe."
msgstr ""
#: actions/feedsubsettings.php:208
msgid "Feed subscription failed! Bad response from hub."
msgstr ""
#: actions/feedsubsettings.php:218
msgid "Already subscribed!"
msgstr ""
#: actions/feedsubsettings.php:220
msgid "Feed subscribed!"
msgstr ""
#: actions/feedsubsettings.php:222
msgid "Feed subscription failed!"
msgstr ""
#: actions/feedsubsettings.php:231
msgid "Previewing feed:"
msgstr ""

View File

@ -0,0 +1,78 @@
<?php
if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
print "This script must be run from the command line\n";
exit();
}
define('INSTALLDIR', realpath(dirname(__FILE__) . '/../../..'));
define('STATUSNET', true);
define('LACONICA', true);
require_once INSTALLDIR . '/scripts/commandline.inc';
require_once INSTALLDIR . '/extlib/php-gettext/gettext.inc';
common_init_locale("en_US");
common_init_locale('fr');
putenv("LANG=fr");
putenv("LANGUAGE=fr");
setlocale('fr.utf8');
_setlocale('fr.utf8');
_bindtextdomain("statusnet", INSTALLDIR . '/locale');
_bindtextdomain("FeedSub", INSTALLDIR . '/plugins/FeedSub/locale');
$times = 10000;
$delta = array();
$start = microtime(true);
for($i = 0; $i < $times; $i++) {
$result = _("Send");
}
$delta["_"] = array((microtime(true) - $start) / $times, $result);
$start = microtime(true);
for($i = 0; $i < $times; $i++) {
$result = __("Send");
}
$delta["__"] = array((microtime(true) - $start) / $times, $result);
$start = microtime(true);
for($i = 0; $i < $times; $i++) {
$result = dgettext("FeedSub", "Feeds");
}
$delta["dgettext"] = array((microtime(true) - $start) / $times, $result);
$start = microtime(true);
for($i = 0; $i < $times; $i++) {
$result = _dgettext("FeedSub", "Feeds");
}
$delta["_dgettext"] = array((microtime(true) - $start) / $times, $result);
$start = microtime(true);
for($i = 0; $i < $times; $i++) {
$result = _m("Feeds");
}
$delta["_m"] = array((microtime(true) - $start) / $times, $result);
$start = microtime(true);
for($i = 0; $i < $times; $i++) {
$result = fake("Feeds");
}
$delta["fake"] = array((microtime(true) - $start) / $times, $result);
foreach ($delta as $func => $bits) {
list($time, $result) = $bits;
$ms = $time * 1000.0;
printf("%10s %2.4fms %s\n", $func, $ms, $result);
}
function fake($str) {
return $str;
}

View File

@ -0,0 +1,188 @@
<?php
/*
* 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/>.
*/
/**
* @package GravatarPlugin
* @maintainer Eric Helgeson <erichelgeson@gmail.com>
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
class GravatarPlugin extends Plugin
{
function onInitializePlugin() {
return true;
}
function onStartAvatarFormData($action) {
$user = common_current_user();
$hasGravatar = $this->hasGravatar($user->id);
if($hasGravatar) {
return false;
}
}
function onEndAvatarFormData(&$action) {
$user = common_current_user();
$hasGravatar = $this->hasGravatar($user->id);
if(!empty($user->email) && !$hasGravatar) { //and not gravatar already set
$action->elementStart('form', array('method' => 'post',
'id' => 'form_settings_gravatar_add',
'class' => 'form_settings',
'action' =>
common_local_url('avatarsettings')));
$action->elementStart('fieldset', array('id' => 'settings_gravatar_add'));
$action->element('legend', null, _m('Set Gravatar'));
$action->hidden('token', common_session_token());
$action->element('p', 'form_guide',
_m('If you want to use your Gravatar image, click "Add".'));
$action->element('input', array('type' => 'submit',
'id' => 'settings_gravatar_add_action-submit',
'name' => 'add',
'class' => 'submit',
'value' => _m('Add')));
$action->elementEnd('fieldset');
$action->elementEnd('form');
} elseif($hasGravatar) {
$action->elementStart('form', array('method' => 'post',
'id' => 'form_settings_gravatar_remove',
'class' => 'form_settings',
'action' =>
common_local_url('avatarsettings')));
$action->elementStart('fieldset', array('id' => 'settings_gravatar_remove'));
$action->element('legend', null, _m('Remove Gravatar'));
$action->hidden('token', common_session_token());
$action->element('p', 'form_guide',
_m('If you want to remove your Gravatar image, click "Remove".'));
$action->element('input', array('type' => 'submit',
'id' => 'settings_gravatar_remove_action-submit',
'name' => 'remove',
'class' => 'submit',
'value' => _m('Remove')));
$action->elementEnd('fieldset');
$action->elementEnd('form');
} else {
$action->element('p', 'form_guide',
_m('To use a Gravatar first enter in an email address.'));
}
}
function onStartAvatarSaveForm($action) {
if ($action->arg('add')) {
$result = $this->gravatar_save();
if($result['success']===true) {
common_broadcast_profile(common_current_user()->getProfile());
}
$action->showForm($result['message'], $result['success']);
return false;
} else if ($action->arg('remove')) {
$result = $this->gravatar_remove();
if($result['success']===true) {
common_broadcast_profile(common_current_user()->getProfile());
}
$action->showForm($result['message'], $result['success']);
return false;
} else {
return true;
}
}
function hasGravatar($id) {
$avatar = new Avatar();
$avatar->profile_id = $id;
if ($avatar->find()) {
while ($avatar->fetch()) {
if($avatar->filename == null) {
return true;
}
}
}
return false;
}
function gravatar_save()
{
$cur = common_current_user();
if(empty($cur->email)) {
return array('message' => _m('You do not have a email set in your profile.'),
'success' => false);
}
//Get rid of previous Avatar
$this->gravatar_remove();
foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
$gravatar = new Avatar();
$gravatar->profile_id = $cur->id;
$gravatar->width = $size;
$gravatar->height = $size;
$gravatar->original = false; //No file, so no original
$gravatar->mediatype = 'img';//XXX: Unsure what to put here
//$gravatar->filename = null;//No filename. Remote
$gravatar->url = $this->gravatar_url($cur->email, $size);
$gravatar->created = DB_DataObject_Cast::dateTime(); # current time
if (!$gravatar->insert()) {
return array('message' => _m('Failed to save Gravatar to the DB.'),
'success' => false);
}
}
return array('message' => _m('Gravatar added.'),
'success' => true);
}
function gravatar_remove()
{
$user = common_current_user();
$profile = $user->getProfile();
$avatar = $profile->getOriginalAvatar();
if($avatar) $avatar->delete();
$avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
if($avatar) $avatar->delete();
$avatar = $profile->getAvatar(AVATAR_STREAM_SIZE);
if($avatar) $avatar->delete();
$avatar = $profile->getAvatar(AVATAR_MINI_SIZE);
if($avatar) $avatar->delete();
return array('message' => _m('Gravatar removed.'),
'success' => true);
}
function gravatar_url($email, $size) {
$url = "http://www.gravatar.com/avatar.php?gravatar_id=".
md5(strtolower($email)).
"&default=".urlencode(Avatar::defaultImage($size)).
"&size=".$size;
return $url;
}
}

13
plugins/Gravatar/README Normal file
View File

@ -0,0 +1,13 @@
GravatarPlugin 0.1
About
This will allow users to use their Gravatar Avatar with your StatusNet install.
Configuration
add this to your config.php:
addPlugin('Gravatar', array());
ToDo:
Site default all on for gravatar by default
Migration Script
Localize

View File

@ -177,7 +177,7 @@ class MapstractionPlugin extends Plugin
$action->elementStart('div', array('id' => 'entity_map', $action->elementStart('div', array('id' => 'entity_map',
'class' => 'section')); 'class' => 'section'));
$action->element('h2', null, _('Map')); $action->element('h2', null, _m('Map'));
$action->element('div', array('id' => 'map_canvas', $action->element('div', array('id' => 'map_canvas',
'class' => 'gray smallmap', 'class' => 'gray smallmap',
@ -188,7 +188,7 @@ class MapstractionPlugin extends Plugin
array('nickname' => $action->trimmed('nickname'))); array('nickname' => $action->trimmed('nickname')));
$action->element('a', array('href' => $mapUrl), $action->element('a', array('href' => $mapUrl),
_("Full size")); _m("Full size"));
$action->elementEnd('div'); $action->elementEnd('div');
} }

View File

@ -68,10 +68,10 @@ class AllmapAction extends MapAction
} }
if ($this->page == 1) { if ($this->page == 1) {
return sprintf(_("%s friends map"), return sprintf(_m("%s friends map"),
$base); $base);
} else { } else {
return sprintf(_("%s friends map, page %d"), return sprintf(_m("%s friends map, page %d"),
$base, $base,
$this->page); $this->page);
} }

View File

@ -0,0 +1,48 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-07 20:38-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: allmap.php:71
#, php-format
msgid "%s friends map"
msgstr ""
#: allmap.php:74
#, php-format
msgid "%s friends map, page %d"
msgstr ""
#: map.php:72
msgid "No such user."
msgstr ""
#: map.php:79
msgid "User has no profile."
msgstr ""
#: usermap.php:71
#, php-format
msgid "%s map, page %d"
msgstr ""
#: MapstractionPlugin.php:180
msgid "Map"
msgstr ""
#: MapstractionPlugin.php:191
msgid "Full size"
msgstr ""

View File

@ -69,14 +69,14 @@ class MapAction extends OwnerDesignAction
$this->user = User::staticGet('nickname', $nickname); $this->user = User::staticGet('nickname', $nickname);
if (!$this->user) { if (!$this->user) {
$this->clientError(_('No such user.'), 404); $this->clientError(_m('No such user.'), 404);
return false; return false;
} }
$this->profile = $this->user->getProfile(); $this->profile = $this->user->getProfile();
if (!$this->profile) { if (!$this->profile) {
$this->serverError(_('User has no profile.')); $this->serverError(_m('User has no profile.'));
return false; return false;
} }

View File

@ -68,7 +68,7 @@ class UsermapAction extends MapAction
if ($this->page == 1) { if ($this->page == 1) {
return $base; return $base;
} else { } else {
return sprintf(_("%s map, page %d"), return sprintf(_m("%s map, page %d"),
$base, $base,
$this->page); $this->page);
} }

View File

@ -120,8 +120,8 @@ class OpenIDPlugin extends Plugin
$action_name = $action->trimmed('action'); $action_name = $action->trimmed('action');
$action->menuItem(common_local_url('openidlogin'), $action->menuItem(common_local_url('openidlogin'),
_('OpenID'), _m('OpenID'),
_('Login or register with OpenID'), _m('Login or register with OpenID'),
$action_name === 'openidlogin'); $action_name === 'openidlogin');
return true; return true;
@ -132,8 +132,8 @@ class OpenIDPlugin extends Plugin
$action_name = $action->trimmed('action'); $action_name = $action->trimmed('action');
$action->menuItem(common_local_url('openidsettings'), $action->menuItem(common_local_url('openidsettings'),
_('OpenID'), _m('OpenID'),
_('Add or remove OpenIDs'), _m('Add or remove OpenIDs'),
$action_name === 'openidsettings'); $action_name === 'openidsettings');
return true; return true;

View File

@ -64,7 +64,7 @@ class FinishaddopenidAction extends Action
{ {
parent::handle($args); parent::handle($args);
if (!common_logged_in()) { if (!common_logged_in()) {
$this->clientError(_('Not logged in.')); $this->clientError(_m('Not logged in.'));
} else { } else {
$this->tryLogin(); $this->tryLogin();
} }
@ -85,11 +85,11 @@ class FinishaddopenidAction extends Action
$response = $consumer->complete(common_local_url('finishaddopenid')); $response = $consumer->complete(common_local_url('finishaddopenid'));
if ($response->status == Auth_OpenID_CANCEL) { if ($response->status == Auth_OpenID_CANCEL) {
$this->message(_('OpenID authentication cancelled.')); $this->message(_m('OpenID authentication cancelled.'));
return; return;
} else if ($response->status == Auth_OpenID_FAILURE) { } else if ($response->status == Auth_OpenID_FAILURE) {
// Authentication failed; display the error message. // Authentication failed; display the error message.
$this->message(sprintf(_('OpenID authentication failed: %s'), $this->message(sprintf(_m('OpenID authentication failed: %s'),
$response->message)); $response->message));
} else if ($response->status == Auth_OpenID_SUCCESS) { } else if ($response->status == Auth_OpenID_SUCCESS) {
@ -109,9 +109,9 @@ class FinishaddopenidAction extends Action
if ($other) { if ($other) {
if ($other->id == $cur->id) { if ($other->id == $cur->id) {
$this->message(_('You already have this OpenID!')); $this->message(_m('You already have this OpenID!'));
} else { } else {
$this->message(_('Someone else already has this OpenID.')); $this->message(_m('Someone else already has this OpenID.'));
} }
return; return;
} }
@ -123,12 +123,12 @@ class FinishaddopenidAction extends Action
$result = oid_link_user($cur->id, $canonical, $display); $result = oid_link_user($cur->id, $canonical, $display);
if (!$result) { if (!$result) {
$this->message(_('Error connecting user.')); $this->message(_m('Error connecting user.'));
return; return;
} }
if ($sreg) { if ($sreg) {
if (!oid_update_user($cur, $sreg)) { if (!oid_update_user($cur, $sreg)) {
$this->message(_('Error updating profile')); $this->message(_m('Error updating profile'));
return; return;
} }
} }
@ -167,7 +167,7 @@ class FinishaddopenidAction extends Action
function title() function title()
{ {
return _('OpenID Login'); return _m('OpenID Login');
} }
/** /**

View File

@ -31,16 +31,16 @@ class FinishopenidloginAction extends Action
{ {
parent::handle($args); parent::handle($args);
if (common_is_real_login()) { if (common_is_real_login()) {
$this->clientError(_('Already logged in.')); $this->clientError(_m('Already logged in.'));
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') { } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$token = $this->trimmed('token'); $token = $this->trimmed('token');
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
$this->showForm(_('There was a problem with your session token. Try again, please.')); $this->showForm(_m('There was a problem with your session token. Try again, please.'));
return; return;
} }
if ($this->arg('create')) { if ($this->arg('create')) {
if (!$this->boolean('license')) { if (!$this->boolean('license')) {
$this->showForm(_('You can\'t register if you don\'t agree to the license.'), $this->showForm(_m('You can\'t register if you don\'t agree to the license.'),
$this->trimmed('newname')); $this->trimmed('newname'));
return; return;
} }
@ -49,7 +49,7 @@ class FinishopenidloginAction extends Action
$this->connectUser(); $this->connectUser();
} else { } else {
common_debug(print_r($this->args, true), __FILE__); common_debug(print_r($this->args, true), __FILE__);
$this->showForm(_('Something weird happened.'), $this->showForm(_m('Something weird happened.'),
$this->trimmed('newname')); $this->trimmed('newname'));
} }
} else { } else {
@ -63,13 +63,13 @@ class FinishopenidloginAction extends Action
$this->element('div', array('class' => 'error'), $this->error); $this->element('div', array('class' => 'error'), $this->error);
} else { } else {
$this->element('div', 'instructions', $this->element('div', 'instructions',
sprintf(_('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), common_config('site', 'name'))); sprintf(_m('This is the first time you\'ve logged into %s so we must connect your OpenID to a local account. You can either create a new account, or connect with your existing account, if you have one.'), common_config('site', 'name')));
} }
} }
function title() function title()
{ {
return _('OpenID Account Setup'); return _m('OpenID Account Setup');
} }
function showForm($error=null, $username=null) function showForm($error=null, $username=null)
@ -94,14 +94,14 @@ class FinishopenidloginAction extends Action
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
$this->elementStart('fieldset', array('id' => 'form_openid_createaccount')); $this->elementStart('fieldset', array('id' => 'form_openid_createaccount'));
$this->element('legend', null, $this->element('legend', null,
_('Create new account')); _m('Create new account'));
$this->element('p', null, $this->element('p', null,
_('Create a new user with this nickname.')); _m('Create a new user with this nickname.'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
$this->input('newname', _('New nickname'), $this->input('newname', _m('New nickname'),
($this->username) ? $this->username : '', ($this->username) ? $this->username : '',
_('1-64 lowercase letters or numbers, no punctuation or spaces')); _m('1-64 lowercase letters or numbers, no punctuation or spaces'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->element('input', array('type' => 'checkbox', $this->element('input', array('type' => 'checkbox',
@ -111,30 +111,30 @@ class FinishopenidloginAction extends Action
'value' => 'true')); 'value' => 'true'));
$this->elementStart('label', array('for' => 'license', $this->elementStart('label', array('for' => 'license',
'class' => 'checkbox')); 'class' => 'checkbox'));
$this->text(_('My text and files are available under ')); $this->text(_m('My text and files are available under '));
$this->element('a', array('href' => common_config('license', 'url')), $this->element('a', array('href' => common_config('license', 'url')),
common_config('license', 'title')); common_config('license', 'title'));
$this->text(_(' except this private data: password, email address, IM address, phone number.')); $this->text(_m(' except this private data: password, email address, IM address, phone number.'));
$this->elementEnd('label'); $this->elementEnd('label');
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->submit('create', _('Create')); $this->submit('create', _m('Create'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementStart('fieldset', array('id' => 'form_openid_createaccount')); $this->elementStart('fieldset', array('id' => 'form_openid_createaccount'));
$this->element('legend', null, $this->element('legend', null,
_('Connect existing account')); _m('Connect existing account'));
$this->element('p', null, $this->element('p', null,
_('If you already have an account, login with your username and password to connect it to your OpenID.')); _m('If you already have an account, login with your username and password to connect it to your OpenID.'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
$this->input('nickname', _('Existing nickname')); $this->input('nickname', _m('Existing nickname'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->password('password', _('Password')); $this->password('password', _m('Password'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->submit('connect', _('Connect')); $this->submit('connect', _m('Connect'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }
@ -146,11 +146,11 @@ class FinishopenidloginAction extends Action
$response = $consumer->complete(common_local_url('finishopenidlogin')); $response = $consumer->complete(common_local_url('finishopenidlogin'));
if ($response->status == Auth_OpenID_CANCEL) { if ($response->status == Auth_OpenID_CANCEL) {
$this->message(_('OpenID authentication cancelled.')); $this->message(_m('OpenID authentication cancelled.'));
return; return;
} else if ($response->status == Auth_OpenID_FAILURE) { } else if ($response->status == Auth_OpenID_FAILURE) {
// Authentication failed; display the error message. // Authentication failed; display the error message.
$this->message(sprintf(_('OpenID authentication failed: %s'), $response->message)); $this->message(sprintf(_m('OpenID authentication failed: %s'), $response->message));
} else if ($response->status == Auth_OpenID_SUCCESS) { } else if ($response->status == Auth_OpenID_SUCCESS) {
// This means the authentication succeeded; extract the // This means the authentication succeeded; extract the
// identity URL and Simple Registration data (if it was // identity URL and Simple Registration data (if it was
@ -212,7 +212,7 @@ class FinishopenidloginAction extends Action
# FIXME: save invite code before redirect, and check here # FIXME: save invite code before redirect, and check here
if (common_config('site', 'closed')) { if (common_config('site', 'closed')) {
$this->clientError(_('Registration not allowed.')); $this->clientError(_m('Registration not allowed.'));
return; return;
} }
@ -221,14 +221,14 @@ class FinishopenidloginAction extends Action
if (common_config('site', 'inviteonly')) { if (common_config('site', 'inviteonly')) {
$code = $_SESSION['invitecode']; $code = $_SESSION['invitecode'];
if (empty($code)) { if (empty($code)) {
$this->clientError(_('Registration not allowed.')); $this->clientError(_m('Registration not allowed.'));
return; return;
} }
$invite = Invitation::staticGet($code); $invite = Invitation::staticGet($code);
if (empty($invite)) { if (empty($invite)) {
$this->clientError(_('Not a valid invitation code.')); $this->clientError(_m('Not a valid invitation code.'));
return; return;
} }
} }
@ -238,24 +238,24 @@ class FinishopenidloginAction extends Action
if (!Validate::string($nickname, array('min_length' => 1, if (!Validate::string($nickname, array('min_length' => 1,
'max_length' => 64, 'max_length' => 64,
'format' => NICKNAME_FMT))) { 'format' => NICKNAME_FMT))) {
$this->showForm(_('Nickname must have only lowercase letters and numbers and no spaces.')); $this->showForm(_m('Nickname must have only lowercase letters and numbers and no spaces.'));
return; return;
} }
if (!User::allowed_nickname($nickname)) { if (!User::allowed_nickname($nickname)) {
$this->showForm(_('Nickname not allowed.')); $this->showForm(_m('Nickname not allowed.'));
return; return;
} }
if (User::staticGet('nickname', $nickname)) { if (User::staticGet('nickname', $nickname)) {
$this->showForm(_('Nickname already in use. Try another one.')); $this->showForm(_m('Nickname already in use. Try another one.'));
return; return;
} }
list($display, $canonical, $sreg) = $this->getSavedValues(); list($display, $canonical, $sreg) = $this->getSavedValues();
if (!$display || !$canonical) { if (!$display || !$canonical) {
$this->serverError(_('Stored OpenID not found.')); $this->serverError(_m('Stored OpenID not found.'));
return; return;
} }
@ -264,7 +264,7 @@ class FinishopenidloginAction extends Action
$other = oid_get_user($canonical); $other = oid_get_user($canonical);
if ($other) { if ($other) {
$this->serverError(_('Creating new account for OpenID that already has a user.')); $this->serverError(_m('Creating new account for OpenID that already has a user.'));
return; return;
} }
@ -324,7 +324,7 @@ class FinishopenidloginAction extends Action
$password = $this->trimmed('password'); $password = $this->trimmed('password');
if (!common_check_user($nickname, $password)) { if (!common_check_user($nickname, $password)) {
$this->showForm(_('Invalid username or password.')); $this->showForm(_m('Invalid username or password.'));
return; return;
} }
@ -335,14 +335,14 @@ class FinishopenidloginAction extends Action
list($display, $canonical, $sreg) = $this->getSavedValues(); list($display, $canonical, $sreg) = $this->getSavedValues();
if (!$display || !$canonical) { if (!$display || !$canonical) {
$this->serverError(_('Stored OpenID not found.')); $this->serverError(_m('Stored OpenID not found.'));
return; return;
} }
$result = oid_link_user($user->id, $canonical, $display); $result = oid_link_user($user->id, $canonical, $display);
if (!$result) { if (!$result) {
$this->serverError(_('Error connecting user to OpenID.')); $this->serverError(_m('Error connecting user to OpenID.'));
return; return;
} }

View File

@ -0,0 +1,344 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-07 20:38-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: openidlogin.php:30 finishopenidlogin.php:34
msgid "Already logged in."
msgstr ""
#: openidlogin.php:37 openidsettings.php:194 finishopenidlogin.php:38
msgid "There was a problem with your session token. Try again, please."
msgstr ""
#: openidlogin.php:66
#, php-format
msgid ""
"For security reasons, please re-login with your [OpenID](%%doc.openid%%) "
"before changing your settings."
msgstr ""
#: openidlogin.php:70
#, php-format
msgid "Login with an [OpenID](%%doc.openid%%) account."
msgstr ""
#: openidlogin.php:95 finishaddopenid.php:170
msgid "OpenID Login"
msgstr ""
#: openidlogin.php:112
msgid "OpenID login"
msgstr ""
#: openidlogin.php:117 openidsettings.php:107
msgid "OpenID URL"
msgstr ""
#: openidlogin.php:119
msgid "Your OpenID URL"
msgstr ""
#: openidlogin.php:122
msgid "Remember me"
msgstr ""
#: openidlogin.php:123
msgid "Automatically login in the future; not for shared computers!"
msgstr ""
#: openidlogin.php:127
msgid "Login"
msgstr ""
#: openidserver.php:106
#, php-format
msgid "You are not authorized to use the identity %s"
msgstr ""
#: openidserver.php:126
msgid "Just an OpenID provider. Nothing to see here, move along..."
msgstr ""
#: OpenIDPlugin.php:123 OpenIDPlugin.php:135
msgid "OpenID"
msgstr ""
#: OpenIDPlugin.php:124
msgid "Login or register with OpenID"
msgstr ""
#: OpenIDPlugin.php:136
msgid "Add or remove OpenIDs"
msgstr ""
#: openid.php:141
msgid "Cannot instantiate OpenID consumer object."
msgstr ""
#: openid.php:151
msgid "Not a valid OpenID."
msgstr ""
#: openid.php:153
#, php-format
msgid "OpenID failure: %s"
msgstr ""
#: openid.php:180
#, php-format
msgid "Could not redirect to server: %s"
msgstr ""
#: openid.php:198
#, php-format
msgid "Could not create OpenID form: %s"
msgstr ""
#: openid.php:214
msgid ""
"This form should automatically submit itself. If not, click the submit "
"button to go to your OpenID provider."
msgstr ""
#: openid.php:246
msgid "Error saving the profile."
msgstr ""
#: openid.php:257
msgid "Error saving the user."
msgstr ""
#: openid.php:277
msgid "OpenID Auto-Submit"
msgstr ""
#: openidtrust.php:51
msgid "OpenID Identity Verification"
msgstr ""
#: openidtrust.php:69
msgid ""
"This page should only be reached during OpenID processing, not directly."
msgstr ""
#: openidtrust.php:118
#, php-format
msgid ""
"%s has asked to verify your identity. Click Continue to verify your "
"identity and login without creating a new password."
msgstr ""
#: openidtrust.php:136
msgid "Continue"
msgstr ""
#: openidtrust.php:137
msgid "Cancel"
msgstr ""
#: finishaddopenid.php:67
msgid "Not logged in."
msgstr ""
#: finishaddopenid.php:88 finishopenidlogin.php:149
msgid "OpenID authentication cancelled."
msgstr ""
#: finishaddopenid.php:92 finishopenidlogin.php:153
#, php-format
msgid "OpenID authentication failed: %s"
msgstr ""
#: finishaddopenid.php:112
msgid "You already have this OpenID!"
msgstr ""
#: finishaddopenid.php:114
msgid "Someone else already has this OpenID."
msgstr ""
#: finishaddopenid.php:126
msgid "Error connecting user."
msgstr ""
#: finishaddopenid.php:131
msgid "Error updating profile"
msgstr ""
#: openidsettings.php:59
msgid "OpenID settings"
msgstr ""
#: openidsettings.php:70
#, php-format
msgid ""
"[OpenID](%%doc.openid%%) lets you log into many sites with the same user "
"account. Manage your associated OpenIDs from here."
msgstr ""
#: openidsettings.php:99
msgid "Add OpenID"
msgstr ""
#: openidsettings.php:102
msgid ""
"If you want to add an OpenID to your account, enter it in the box below and "
"click \"Add\"."
msgstr ""
#: openidsettings.php:117
msgid "Add"
msgstr ""
#: openidsettings.php:129
msgid "Remove OpenID"
msgstr ""
#: openidsettings.php:134
msgid ""
"Removing your only OpenID would make it impossible to log in! If you need to "
"remove it, add another OpenID first."
msgstr ""
#: openidsettings.php:149
msgid ""
"You can remove an OpenID from your account by clicking the button marked "
"\"Remove\"."
msgstr ""
#: openidsettings.php:172
msgid "Remove"
msgstr ""
#: openidsettings.php:208 finishopenidlogin.php:52
msgid "Something weird happened."
msgstr ""
#: openidsettings.php:228
msgid "No such OpenID."
msgstr ""
#: openidsettings.php:233
msgid "That OpenID does not belong to you."
msgstr ""
#: openidsettings.php:237
msgid "OpenID removed."
msgstr ""
#: finishopenidlogin.php:43
msgid "You can't register if you don't agree to the license."
msgstr ""
#: finishopenidlogin.php:66
#, php-format
msgid ""
"This is the first time you've logged into %s so we must connect your OpenID "
"to a local account. You can either create a new account, or connect with "
"your existing account, if you have one."
msgstr ""
#: finishopenidlogin.php:72
msgid "OpenID Account Setup"
msgstr ""
#: finishopenidlogin.php:97
msgid "Create new account"
msgstr ""
#: finishopenidlogin.php:99
msgid "Create a new user with this nickname."
msgstr ""
#: finishopenidlogin.php:102
msgid "New nickname"
msgstr ""
#: finishopenidlogin.php:104
msgid "1-64 lowercase letters or numbers, no punctuation or spaces"
msgstr ""
#: finishopenidlogin.php:114
msgid "My text and files are available under "
msgstr ""
#: finishopenidlogin.php:117
msgid ""
" except this private data: password, email address, IM address, phone number."
msgstr ""
#: finishopenidlogin.php:121
msgid "Create"
msgstr ""
#: finishopenidlogin.php:126
msgid "Connect existing account"
msgstr ""
#: finishopenidlogin.php:128
msgid ""
"If you already have an account, login with your username and password to "
"connect it to your OpenID."
msgstr ""
#: finishopenidlogin.php:131
msgid "Existing nickname"
msgstr ""
#: finishopenidlogin.php:134
msgid "Password"
msgstr ""
#: finishopenidlogin.php:137
msgid "Connect"
msgstr ""
#: finishopenidlogin.php:215 finishopenidlogin.php:224
msgid "Registration not allowed."
msgstr ""
#: finishopenidlogin.php:231
msgid "Not a valid invitation code."
msgstr ""
#: finishopenidlogin.php:241
msgid "Nickname must have only lowercase letters and numbers and no spaces."
msgstr ""
#: finishopenidlogin.php:246
msgid "Nickname not allowed."
msgstr ""
#: finishopenidlogin.php:251
msgid "Nickname already in use. Try another one."
msgstr ""
#: finishopenidlogin.php:258 finishopenidlogin.php:338
msgid "Stored OpenID not found."
msgstr ""
#: finishopenidlogin.php:267
msgid "Creating new account for OpenID that already has a user."
msgstr ""
#: finishopenidlogin.php:327
msgid "Invalid username or password."
msgstr ""
#: finishopenidlogin.php:345
msgid "Error connecting user to OpenID."
msgstr ""

View File

@ -138,7 +138,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false)
$consumer = oid_consumer(); $consumer = oid_consumer();
if (!$consumer) { if (!$consumer) {
common_server_error(_('Cannot instantiate OpenID consumer object.')); common_server_error(_m('Cannot instantiate OpenID consumer object.'));
return false; return false;
} }
@ -148,9 +148,9 @@ function oid_authenticate($openid_url, $returnto, $immediate=false)
// Handle failure status return values. // Handle failure status return values.
if (!$auth_request) { if (!$auth_request) {
return _('Not a valid OpenID.'); return _m('Not a valid OpenID.');
} else if (Auth_OpenID::isFailure($auth_request)) { } else if (Auth_OpenID::isFailure($auth_request)) {
return sprintf(_('OpenID failure: %s'), $auth_request->message); return sprintf(_m('OpenID failure: %s'), $auth_request->message);
} }
$sreg_request = Auth_OpenID_SRegRequest::build(// Required $sreg_request = Auth_OpenID_SRegRequest::build(// Required
@ -177,7 +177,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false)
$immediate); $immediate);
if (!$redirect_url) { if (!$redirect_url) {
} else if (Auth_OpenID::isFailure($redirect_url)) { } else if (Auth_OpenID::isFailure($redirect_url)) {
return sprintf(_('Could not redirect to server: %s'), $redirect_url->message); return sprintf(_m('Could not redirect to server: %s'), $redirect_url->message);
} else { } else {
common_redirect($redirect_url, 303); common_redirect($redirect_url, 303);
} }
@ -195,7 +195,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false)
// Display an error if the form markup couldn't be generated; // Display an error if the form markup couldn't be generated;
// otherwise, render the HTML. // otherwise, render the HTML.
if (Auth_OpenID::isFailure($form_html)) { if (Auth_OpenID::isFailure($form_html)) {
common_server_error(sprintf(_('Could not create OpenID form: %s'), $form_html->message)); common_server_error(sprintf(_m('Could not create OpenID form: %s'), $form_html->message));
} else { } else {
$action = new AutosubmitAction(); // see below $action = new AutosubmitAction(); // see below
$action->form_html = $form_html; $action->form_html = $form_html;
@ -211,7 +211,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false)
function _oid_print_instructions() function _oid_print_instructions()
{ {
common_element('div', 'instructions', common_element('div', 'instructions',
_('This form should automatically submit itself. '. _m('This form should automatically submit itself. '.
'If not, click the submit button to go to your '. 'If not, click the submit button to go to your '.
'OpenID provider.')); 'OpenID provider.'));
} }
@ -243,7 +243,7 @@ function oid_update_user(&$user, &$sreg)
# XXX save timezone if it's passed # XXX save timezone if it's passed
if (!$profile->update($orig_profile)) { if (!$profile->update($orig_profile)) {
common_server_error(_('Error saving the profile.')); common_server_error(_m('Error saving the profile.'));
return false; return false;
} }
@ -254,7 +254,7 @@ function oid_update_user(&$user, &$sreg)
} }
if (!$user->update($orig_user)) { if (!$user->update($orig_user)) {
common_server_error(_('Error saving the user.')); common_server_error(_m('Error saving the user.'));
return false; return false;
} }
@ -274,7 +274,7 @@ class AutosubmitAction extends Action
function title() function title()
{ {
return _('OpenID Auto-Submit'); return _m('OpenID Auto-Submit');
} }
function showContent() function showContent()

View File

@ -27,14 +27,14 @@ class OpenidloginAction extends Action
{ {
parent::handle($args); parent::handle($args);
if (common_is_real_login()) { if (common_is_real_login()) {
$this->clientError(_('Already logged in.')); $this->clientError(_m('Already logged in.'));
} else if ($_SERVER['REQUEST_METHOD'] == 'POST') { } else if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$openid_url = $this->trimmed('openid_url'); $openid_url = $this->trimmed('openid_url');
# CSRF protection # CSRF protection
$token = $this->trimmed('token'); $token = $this->trimmed('token');
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
$this->showForm(_('There was a problem with your session token. Try again, please.'), $openid_url); $this->showForm(_m('There was a problem with your session token. Try again, please.'), $openid_url);
return; return;
} }
@ -63,11 +63,11 @@ class OpenidloginAction extends Action
common_get_returnto()) { common_get_returnto()) {
// rememberme logins have to reauthenticate before // rememberme logins have to reauthenticate before
// changing any profile settings (cookie-stealing protection) // changing any profile settings (cookie-stealing protection)
return _('For security reasons, please re-login with your ' . return _m('For security reasons, please re-login with your ' .
'[OpenID](%%doc.openid%%) ' . '[OpenID](%%doc.openid%%) ' .
'before changing your settings.'); 'before changing your settings.');
} else { } else {
return _('Login with an [OpenID](%%doc.openid%%) account.'); return _m('Login with an [OpenID](%%doc.openid%%) account.');
} }
} }
@ -92,7 +92,7 @@ class OpenidloginAction extends Action
function title() function title()
{ {
return _('OpenID Login'); return _m('OpenID Login');
} }
function showForm($error=null, $openid_url) function showForm($error=null, $openid_url)
@ -109,22 +109,22 @@ class OpenidloginAction extends Action
'class' => 'form_settings', 'class' => 'form_settings',
'action' => $formaction)); 'action' => $formaction));
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->element('legend', null, _('OpenID login')); $this->element('legend', null, _m('OpenID login'));
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
$this->input('openid_url', _('OpenID URL'), $this->input('openid_url', _m('OpenID URL'),
$this->openid_url, $this->openid_url,
_('Your OpenID URL')); _m('Your OpenID URL'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li', array('id' => 'settings_rememberme')); $this->elementStart('li', array('id' => 'settings_rememberme'));
$this->checkbox('rememberme', _('Remember me'), false, $this->checkbox('rememberme', _m('Remember me'), false,
_('Automatically login in the future; ' . _m('Automatically login in the future; ' .
'not for shared computers!')); 'not for shared computers!'));
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementEnd('ul'); $this->elementEnd('ul');
$this->submit('submit', _('Login')); $this->submit('submit', _m('Login'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
} }

View File

@ -103,7 +103,7 @@ class OpenidserverAction extends Action
$response = $this->generateDenyResponse($request); $response = $this->generateDenyResponse($request);
} else { } else {
//invalid //invalid
$this->clientError(sprintf(_('You are not authorized to use the identity %s'),$request->identity),$code=403); $this->clientError(sprintf(_m('You are not authorized to use the identity %s'),$request->identity),$code=403);
} }
} else { } else {
$response = $this->oserver->handleRequest($request); $response = $this->oserver->handleRequest($request);
@ -123,7 +123,7 @@ class OpenidserverAction extends Action
} }
$this->raw($response->body); $this->raw($response->body);
}else{ }else{
$this->clientError(_('Just an OpenID provider. Nothing to see here, move along...'),$code=500); $this->clientError(_m('Just an OpenID provider. Nothing to see here, move along...'),$code=500);
} }
} }

View File

@ -56,7 +56,7 @@ class OpenidsettingsAction extends AccountSettingsAction
function title() function title()
{ {
return _('OpenID settings'); return _m('OpenID settings');
} }
/** /**
@ -67,7 +67,7 @@ class OpenidsettingsAction extends AccountSettingsAction
function getInstructions() function getInstructions()
{ {
return _('[OpenID](%%doc.openid%%) lets you log into many sites' . return _m('[OpenID](%%doc.openid%%) lets you log into many sites' .
' with the same user account.'. ' with the same user account.'.
' Manage your associated OpenIDs from here.'); ' Manage your associated OpenIDs from here.');
} }
@ -96,15 +96,15 @@ class OpenidsettingsAction extends AccountSettingsAction
'action' => 'action' =>
common_local_url('openidsettings'))); common_local_url('openidsettings')));
$this->elementStart('fieldset', array('id' => 'settings_openid_add')); $this->elementStart('fieldset', array('id' => 'settings_openid_add'));
$this->element('legend', null, _('Add OpenID')); $this->element('legend', null, _m('Add OpenID'));
$this->hidden('token', common_session_token()); $this->hidden('token', common_session_token());
$this->element('p', 'form_guide', $this->element('p', 'form_guide',
_('If you want to add an OpenID to your account, ' . _m('If you want to add an OpenID to your account, ' .
'enter it in the box below and click "Add".')); 'enter it in the box below and click "Add".'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
$this->element('label', array('for' => 'openid_url'), $this->element('label', array('for' => 'openid_url'),
_('OpenID URL')); _m('OpenID URL'));
$this->element('input', array('name' => 'openid_url', $this->element('input', array('name' => 'openid_url',
'type' => 'text', 'type' => 'text',
'id' => 'openid_url')); 'id' => 'openid_url'));
@ -114,7 +114,7 @@ class OpenidsettingsAction extends AccountSettingsAction
'id' => 'settings_openid_add_action-submit', 'id' => 'settings_openid_add_action-submit',
'name' => 'add', 'name' => 'add',
'class' => 'submit', 'class' => 'submit',
'value' => _('Add'))); 'value' => _m('Add')));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
@ -126,12 +126,12 @@ class OpenidsettingsAction extends AccountSettingsAction
if ($cnt > 0) { if ($cnt > 0) {
$this->element('h2', null, _('Remove OpenID')); $this->element('h2', null, _m('Remove OpenID'));
if ($cnt == 1 && !$user->password) { if ($cnt == 1 && !$user->password) {
$this->element('p', 'form_guide', $this->element('p', 'form_guide',
_('Removing your only OpenID '. _m('Removing your only OpenID '.
'would make it impossible to log in! ' . 'would make it impossible to log in! ' .
'If you need to remove it, '. 'If you need to remove it, '.
'add another OpenID first.')); 'add another OpenID first.'));
@ -146,7 +146,7 @@ class OpenidsettingsAction extends AccountSettingsAction
} else { } else {
$this->element('p', 'form_guide', $this->element('p', 'form_guide',
_('You can remove an OpenID from your account '. _m('You can remove an OpenID from your account '.
'by clicking the button marked "Remove".')); 'by clicking the button marked "Remove".'));
$idx = 0; $idx = 0;
@ -169,7 +169,7 @@ class OpenidsettingsAction extends AccountSettingsAction
'id' => 'remove'.$idx, 'id' => 'remove'.$idx,
'name' => 'remove', 'name' => 'remove',
'class' => 'submit remove', 'class' => 'submit remove',
'value' => _('Remove'))); 'value' => _m('Remove')));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');
$idx++; $idx++;
@ -191,7 +191,7 @@ class OpenidsettingsAction extends AccountSettingsAction
// CSRF protection // CSRF protection
$token = $this->trimmed('token'); $token = $this->trimmed('token');
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
$this->showForm(_('There was a problem with your session token. '. $this->showForm(_m('There was a problem with your session token. '.
'Try again, please.')); 'Try again, please.'));
return; return;
} }
@ -205,7 +205,7 @@ class OpenidsettingsAction extends AccountSettingsAction
} else if ($this->arg('remove')) { } else if ($this->arg('remove')) {
$this->removeOpenid(); $this->removeOpenid();
} else { } else {
$this->showForm(_('Something weird happened.')); $this->showForm(_m('Something weird happened.'));
} }
} }
@ -225,16 +225,16 @@ class OpenidsettingsAction extends AccountSettingsAction
$oid = User_openid::staticGet('canonical', $openid_url); $oid = User_openid::staticGet('canonical', $openid_url);
if (!$oid) { if (!$oid) {
$this->showForm(_('No such OpenID.')); $this->showForm(_m('No such OpenID.'));
return; return;
} }
$cur = common_current_user(); $cur = common_current_user();
if (!$cur || $oid->user_id != $cur->id) { if (!$cur || $oid->user_id != $cur->id) {
$this->showForm(_('That OpenID does not belong to you.')); $this->showForm(_m('That OpenID does not belong to you.'));
return; return;
} }
$oid->delete(); $oid->delete();
$this->showForm(_('OpenID removed.'), true); $this->showForm(_m('OpenID removed.'), true);
return; return;
} }
} }

View File

@ -48,7 +48,7 @@ class OpenidtrustAction extends Action
function title() function title()
{ {
return _('OpenID Identity Verification'); return _m('OpenID Identity Verification');
} }
function prepare($args) function prepare($args)
@ -66,7 +66,7 @@ class OpenidtrustAction extends Action
$this->allowUrl = $_SESSION['openid_allow_url']; $this->allowUrl = $_SESSION['openid_allow_url'];
$this->denyUrl = $_SESSION['openid_deny_url']; $this->denyUrl = $_SESSION['openid_deny_url'];
if(empty($this->trust_root) || empty($this->allowUrl) || empty($this->denyUrl)){ if(empty($this->trust_root) || empty($this->allowUrl) || empty($this->denyUrl)){
$this->clientError(_('This page should only be reached during OpenID processing, not directly.')); $this->clientError(_m('This page should only be reached during OpenID processing, not directly.'));
return; return;
} }
return true; return true;
@ -115,7 +115,7 @@ class OpenidtrustAction extends Action
function showPageNotice() function showPageNotice()
{ {
$this->element('p',null,sprintf(_('%s has asked to verify your identity. Click Continue to verify your identity and login without creating a new password.'),$this->trust_root)); $this->element('p',null,sprintf(_m('%s has asked to verify your identity. Click Continue to verify your identity and login without creating a new password.'),$this->trust_root));
} }
/** /**
@ -133,8 +133,8 @@ class OpenidtrustAction extends Action
'class' => 'form_settings', 'class' => 'form_settings',
'action' => common_local_url('openidtrust'))); 'action' => common_local_url('openidtrust')));
$this->elementStart('fieldset'); $this->elementStart('fieldset');
$this->submit('allow', _('Continue')); $this->submit('allow', _m('Continue'));
$this->submit('deny', _('Cancel')); $this->submit('deny', _m('Cancel'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementEnd('form'); $this->elementEnd('form');

11
plugins/Realtime/README Normal file
View File

@ -0,0 +1,11 @@
== TODO ==
* i18n
* Change in context URL to conversation (try not to construct the URL in JS)
* Update mark behaviour (on notice send)
* Pause, Send a notice ~ should not update counter
* Pause ~ retain up to 50-100 most recent notices
* Add geo data
* Make it work for Conversation page (perhaps a little tricky)
* IE is updating the counter in document title all the time (Not sure if this is still an issue)
* Reconsider the timestamp approach

View File

@ -0,0 +1,59 @@
<?php
/*
* 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/>.
*/
/**
* @package SamplePlugin
* @maintainer Your Name <you@example.com>
*/
if (!defined('STATUSNET') && !defined('LACONICA')) {
// This check helps protect against security problems;
// your code file can't be executed directly from the web.
exit(1);
}
class SamplePlugin extends Plugin
{
function onInitializePlugin()
{
// Event handlers normally return true to indicate that all is well.
//
// Returning false will cancel further processing of any other
// plugins or core code hooking the same event.
return true;
}
/**
* Hook for RouterInitialized event.
*
* @param Net_URL_Mapper $m path-to-action mapper
* @return boolean hook return
*/
function onRouterInitialized($m)
{
$m->connect(':nickname/samples',
array('action' => 'showsamples'),
array('feed' => '[A-Za-z0-9_-]+'));
$m->connect('settings/sample',
array('action' => 'samplesettings'));
return true;
}
}

View File

@ -86,8 +86,8 @@ class TwitterBridgePlugin extends Plugin
$action_name = $action->trimmed('action'); $action_name = $action->trimmed('action');
$action->menuItem(common_local_url('twittersettings'), $action->menuItem(common_local_url('twittersettings'),
_('Twitter'), _m('Twitter'),
_('Twitter integration options'), _m('Twitter integration options'),
$action_name === 'twittersettings'); $action_name === 'twittersettings');
return true; return true;

View File

@ -0,0 +1,128 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2009-12-07 20:38-0800\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=CHARSET\n"
"Content-Transfer-Encoding: 8bit\n"
#: twitterauthorization.php:81
msgid "Not logged in."
msgstr ""
#: twitterauthorization.php:131 twitterauthorization.php:150
#: twitterauthorization.php:170 twitterauthorization.php:217
msgid "Couldn't link your Twitter account."
msgstr ""
#: TwitterBridgePlugin.php:89
msgid "Twitter"
msgstr ""
#: TwitterBridgePlugin.php:90
msgid "Twitter integration options"
msgstr ""
#: twittersettings.php:59
msgid "Twitter settings"
msgstr ""
#: twittersettings.php:70
msgid ""
"Connect your Twitter account to share your updates with your Twitter friends "
"and vice-versa."
msgstr ""
#: twittersettings.php:118
msgid "Twitter account"
msgstr ""
#: twittersettings.php:123
msgid "Connected Twitter account"
msgstr ""
#: twittersettings.php:125
msgid "Remove"
msgstr ""
#: twittersettings.php:131
msgid "Preferences"
msgstr ""
#: twittersettings.php:135
msgid "Automatically send my notices to Twitter."
msgstr ""
#: twittersettings.php:142
msgid "Send local \"@\" replies to Twitter."
msgstr ""
#: twittersettings.php:149
msgid "Subscribe to my Twitter friends here."
msgstr ""
#: twittersettings.php:158
msgid "Import my Friends Timeline."
msgstr ""
#: twittersettings.php:174
msgid "Save"
msgstr ""
#: twittersettings.php:176
msgid "Add"
msgstr ""
#: twittersettings.php:201
msgid "There was a problem with your session token. Try again, please."
msgstr ""
#: twittersettings.php:211
msgid "Unexpected form submission."
msgstr ""
#: twittersettings.php:230
msgid "Couldn't remove Twitter user."
msgstr ""
#: twittersettings.php:234
msgid "Twitter account removed."
msgstr ""
#: twittersettings.php:255 twittersettings.php:265
msgid "Couldn't save Twitter preferences."
msgstr ""
#: twittersettings.php:269
msgid "Twitter preferences saved."
msgstr ""
#: twitter.php:333
msgid "Your Twitter bridge has been disabled."
msgstr ""
#: twitter.php:337
#, php-format
msgid ""
"Hi, %1$s. We're sorry to inform you that your link to Twitter has been "
"disabled. We no longer seem to have permission to update your Twitter "
"status. (Did you revoke %3$s's access?)\n"
"\n"
"You can re-enable your Twitter bridge by visiting your Twitter settings "
"page:\n"
"\n"
"\t%2$s\n"
"\n"
"Regards,\n"
"%3$s\n"
msgstr ""

View File

@ -330,11 +330,11 @@ function mail_twitter_bridge_removed($user)
$profile = $user->getProfile(); $profile = $user->getProfile();
$subject = sprintf(_('Your Twitter bridge has been disabled.')); $subject = sprintf(_m('Your Twitter bridge has been disabled.'));
$site_name = common_config('site', 'name'); $site_name = common_config('site', 'name');
$body = sprintf(_('Hi, %1$s. We\'re sorry to inform you that your ' . $body = sprintf(_m('Hi, %1$s. We\'re sorry to inform you that your ' .
'link to Twitter has been disabled. We no longer seem to have ' . 'link to Twitter has been disabled. We no longer seem to have ' .
'permission to update your Twitter status. (Did you revoke ' . 'permission to update your Twitter status. (Did you revoke ' .
'%3$s\'s access?)' . "\n\n" . '%3$s\'s access?)' . "\n\n" .

View File

@ -78,7 +78,7 @@ class TwitterauthorizationAction extends Action
parent::handle($args); parent::handle($args);
if (!common_logged_in()) { if (!common_logged_in()) {
$this->clientError(_('Not logged in.'), 403); $this->clientError(_m('Not logged in.'), 403);
} }
$user = common_current_user(); $user = common_current_user();
@ -128,7 +128,7 @@ class TwitterauthorizationAction extends Action
} catch (OAuthClientException $e) { } catch (OAuthClientException $e) {
$msg = sprintf('OAuth client cURL error - code: %1s, msg: %2s', $msg = sprintf('OAuth client cURL error - code: %1s, msg: %2s',
$e->getCode(), $e->getMessage()); $e->getCode(), $e->getMessage());
$this->serverError(_('Couldn\'t link your Twitter account.')); $this->serverError(_m('Couldn\'t link your Twitter account.'));
} }
common_redirect($auth_link); common_redirect($auth_link);
@ -147,7 +147,7 @@ class TwitterauthorizationAction extends Action
// token we sent them // token we sent them
if ($_SESSION['twitter_request_token'] != $this->oauth_token) { if ($_SESSION['twitter_request_token'] != $this->oauth_token) {
$this->serverError(_('Couldn\'t link your Twitter account.')); $this->serverError(_m('Couldn\'t link your Twitter account.'));
} }
try { try {
@ -167,7 +167,7 @@ class TwitterauthorizationAction extends Action
} catch (OAuthClientException $e) { } catch (OAuthClientException $e) {
$msg = sprintf('OAuth client cURL error - code: %1$s, msg: %2$s', $msg = sprintf('OAuth client cURL error - code: %1$s, msg: %2$s',
$e->getCode(), $e->getMessage()); $e->getCode(), $e->getMessage());
$this->serverError(_('Couldn\'t link your Twitter account.')); $this->serverError(_m('Couldn\'t link your Twitter account.'));
} }
// Save the access token and Twitter user info // Save the access token and Twitter user info
@ -214,7 +214,7 @@ class TwitterauthorizationAction extends Action
if (empty($flink_id)) { if (empty($flink_id)) {
common_log_db_error($flink, 'INSERT', __FILE__); common_log_db_error($flink, 'INSERT', __FILE__);
$this->serverError(_('Couldn\'t link your Twitter account.')); $this->serverError(_m('Couldn\'t link your Twitter account.'));
} }
save_twitter_user($twitter_user->id, $twitter_user->screen_name); save_twitter_user($twitter_user->id, $twitter_user->screen_name);

View File

@ -56,7 +56,7 @@ class TwittersettingsAction extends ConnectSettingsAction
function title() function title()
{ {
return _('Twitter settings'); return _m('Twitter settings');
} }
/** /**
@ -67,8 +67,8 @@ class TwittersettingsAction extends ConnectSettingsAction
function getInstructions() function getInstructions()
{ {
return _('Connect your Twitter account to share your updates ' . return _m('Connect your Twitter account to share your updates ' .
'with your Twitter friends and vice-versa.'); 'with your Twitter friends and vice-versa.');
} }
/** /**
@ -115,38 +115,38 @@ class TwittersettingsAction extends ConnectSettingsAction
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
} else { } else {
$this->element('legend', null, _('Twitter account')); $this->element('legend', null, _m('Twitter account'));
$this->elementStart('p', array('id' => 'form_confirmed')); $this->elementStart('p', array('id' => 'form_confirmed'));
$this->element('a', array('href' => $fuser->uri), $fuser->nickname); $this->element('a', array('href' => $fuser->uri), $fuser->nickname);
$this->elementEnd('p'); $this->elementEnd('p');
$this->element('p', 'form_note', $this->element('p', 'form_note',
_('Connected Twitter account')); _m('Connected Twitter account'));
$this->submit('remove', _('Remove')); $this->submit('remove', _m('Remove'));
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
$this->elementStart('fieldset', array('id' => 'settings_twitter_preferences')); $this->elementStart('fieldset', array('id' => 'settings_twitter_preferences'));
$this->element('legend', null, _('Preferences')); $this->element('legend', null, _m('Preferences'));
$this->elementStart('ul', 'form_data'); $this->elementStart('ul', 'form_data');
$this->elementStart('li'); $this->elementStart('li');
$this->checkbox('noticesend', $this->checkbox('noticesend',
_('Automatically send my notices to Twitter.'), _m('Automatically send my notices to Twitter.'),
($flink) ? ($flink) ?
($flink->noticesync & FOREIGN_NOTICE_SEND) : ($flink->noticesync & FOREIGN_NOTICE_SEND) :
true); true);
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->checkbox('replysync', $this->checkbox('replysync',
_('Send local "@" replies to Twitter.'), _m('Send local "@" replies to Twitter.'),
($flink) ? ($flink) ?
($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) : ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY) :
true); true);
$this->elementEnd('li'); $this->elementEnd('li');
$this->elementStart('li'); $this->elementStart('li');
$this->checkbox('friendsync', $this->checkbox('friendsync',
_('Subscribe to my Twitter friends here.'), _m('Subscribe to my Twitter friends here.'),
($flink) ? ($flink) ?
($flink->friendsync & FOREIGN_FRIEND_RECV) : ($flink->friendsync & FOREIGN_FRIEND_RECV) :
false); false);
@ -155,7 +155,7 @@ class TwittersettingsAction extends ConnectSettingsAction
if (common_config('twitterimport','enabled')) { if (common_config('twitterimport','enabled')) {
$this->elementStart('li'); $this->elementStart('li');
$this->checkbox('noticerecv', $this->checkbox('noticerecv',
_('Import my Friends Timeline.'), _m('Import my Friends Timeline.'),
($flink) ? ($flink) ?
($flink->noticesync & FOREIGN_NOTICE_RECV) : ($flink->noticesync & FOREIGN_NOTICE_RECV) :
false); false);
@ -171,9 +171,9 @@ class TwittersettingsAction extends ConnectSettingsAction
$this->elementEnd('ul'); $this->elementEnd('ul');
if ($flink) { if ($flink) {
$this->submit('save', _('Save')); $this->submit('save', _m('Save'));
} else { } else {
$this->submit('add', _('Add')); $this->submit('add', _m('Add'));
} }
$this->elementEnd('fieldset'); $this->elementEnd('fieldset');
@ -198,8 +198,8 @@ class TwittersettingsAction extends ConnectSettingsAction
// CSRF protection // CSRF protection
$token = $this->trimmed('token'); $token = $this->trimmed('token');
if (!$token || $token != common_session_token()) { if (!$token || $token != common_session_token()) {
$this->showForm(_('There was a problem with your session token. '. $this->showForm(_m('There was a problem with your session token. '.
'Try again, please.')); 'Try again, please.'));
return; return;
} }
@ -208,7 +208,7 @@ class TwittersettingsAction extends ConnectSettingsAction
} else if ($this->arg('remove')) { } else if ($this->arg('remove')) {
$this->removeTwitterAccount(); $this->removeTwitterAccount();
} else { } else {
$this->showForm(_('Unexpected form submission.')); $this->showForm(_m('Unexpected form submission.'));
} }
} }
@ -227,11 +227,11 @@ class TwittersettingsAction extends ConnectSettingsAction
if (empty($result)) { if (empty($result)) {
common_log_db_error($flink, 'DELETE', __FILE__); common_log_db_error($flink, 'DELETE', __FILE__);
$this->serverError(_('Couldn\'t remove Twitter user.')); $this->serverError(_m('Couldn\'t remove Twitter user.'));
return; return;
} }
$this->showForm(_('Twitter account removed.'), true); $this->showForm(_m('Twitter account removed.'), true);
} }
/** /**
@ -252,7 +252,7 @@ class TwittersettingsAction extends ConnectSettingsAction
if (empty($flink)) { if (empty($flink)) {
common_log_db_error($flink, 'SELECT', __FILE__); common_log_db_error($flink, 'SELECT', __FILE__);
$this->showForm(_('Couldn\'t save Twitter preferences.')); $this->showForm(_m('Couldn\'t save Twitter preferences.'));
return; return;
} }
@ -262,11 +262,11 @@ class TwittersettingsAction extends ConnectSettingsAction
if ($result === false) { if ($result === false) {
common_log_db_error($flink, 'UPDATE', __FILE__); common_log_db_error($flink, 'UPDATE', __FILE__);
$this->showForm(_('Couldn\'t save Twitter preferences.')); $this->showForm(_m('Couldn\'t save Twitter preferences.'));
return; return;
} }
$this->showForm(_('Twitter preferences saved.'), true); $this->showForm(_m('Twitter preferences saved.'), true);
} }
} }

211
scripts/update_po_templates.php Executable file
View File

@ -0,0 +1,211 @@
#!/usr/bin/env php
<?php
/*
* StatusNet - the distributed open-source microblogging tool
* Copyright (C) 2008, 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/>.
*/
// Abort if called from a web server
if (isset($_SERVER) && array_key_exists('REQUEST_METHOD', $_SERVER)) {
print "This script must be run from the command line\n";
exit();
}
define('INSTALLDIR', realpath(dirname(__FILE__) . '/..'));
function update_core($dir, $domain)
{
$old = getcwd();
chdir($dir);
passthru(<<<END
xgettext \
--from-code=UTF-8 \
--default-domain=$domain \
--output=locale/$domain.po \
--language=PHP \
--keyword="_m:1" \
--keyword="pgettext:1c,2" \
--keyword="npgettext:1c,2,3" \
actions/*.php \
classes/*.php \
lib/*.php \
scripts/*.php
END
);
chdir($old);
}
function do_update_plugin($dir, $domain)
{
$old = getcwd();
chdir($dir);
if (!file_exists('locale')) {
mkdir('locale');
}
$files = get_plugin_sources(".");
$cmd = <<<END
xgettext \
--from-code=UTF-8 \
--default-domain=$domain \
--output=locale/$domain.po \
--language=PHP \
--keyword='' \
--keyword="_m:1" \
END;
foreach ($files as $file) {
$cmd .= ' ' . escapeshellarg($file);
}
passthru($cmd);
chdir($old);
}
function do_translatewiki_plugin($basedir, $plugin)
{
$yamldir = "$basedir/locale/TranslateWiki";
if (!file_exists($yamldir)) {
mkdir($yamldir);
}
$outfile = "$yamldir/StatusNet-{$plugin}.yml";
$data = <<<END
---
BASIC:
id: out-statusnet-{$plugin}
label: StatusNet - {$plugin}
description: "{{int:bw-desc-statusnet-plugin-{$plugin}}}"
namespace: NS_STATUSNET
display: out/statusnet/{$plugin}
class: GettextMessageGroup
FILES:
class: GettextFFS
sourcePattern: %GROUPROOT%/plugins/{$plugin}/locale/%CODE%/LC_MESSAGES/{$plugin}.po
targetPattern: {$plugin}.po
codeMap:
en-gb: en_GB
no: nb
pt-br: pt_BR
zh-hans: zh_CN
zh-hant: zh_TW
MANGLER
class: StringMatcher
prefix: {$plugin}-
patterns:
- "*"
END;
file_put_contents($outfile, $data);
}
function get_plugins($dir)
{
$plugins = array();
$dirs = new DirectoryIterator("$dir/plugins");
foreach ($dirs as $item) {
if ($item->isDir() && !$item->isDot()) {
$name = $item->getBasename();
if (file_exists("$dir/plugins/$name/{$name}Plugin.php")) {
$plugins[] = $name;
}
}
}
return $plugins;
}
function get_plugin_sources($dir)
{
$files = array();
$dirs = new RecursiveDirectoryIterator($dir);
$iter = new RecursiveIteratorIterator($dirs);
foreach ($iter as $pathname => $item) {
if ($item->isFile() && preg_match('/\.php$/', $item->getBaseName())) {
$files[] = $pathname;
}
}
return $files;
}
function plugin_using_gettext($dir)
{
$files = get_plugin_sources($dir);
foreach ($files as $pathname) {
// Check if the file is using our _m gettext wrapper
$code = file_get_contents($pathname);
if (preg_match('/\b_m\(/', $code)) {
return true;
}
}
return false;
}
function update_plugin($basedir, $name)
{
$dir = "$basedir/plugins/$name";
if (plugin_using_gettext($dir)) {
do_update_plugin($dir, $name);
do_translatewiki_plugin($basedir, $name);
return true;
} else {
return false;
}
}
$args = $_SERVER['argv'];
array_shift($args);
$all = false;
$core = false;
$allplugins = false;
$plugins = array();
if (count($args) == 0) {
$all = true;
}
foreach ($args as $arg) {
if ($arg == '--all') {
$all = true;
} elseif ($arg == "--core") {
$core = true;
} elseif ($arg == "--plugins") {
$allplugins = true;
} elseif (substr($arg, 0, 9) == "--plugin=") {
$plugins[] = substr($arg, 9);
}
}
if ($all || $core) {
echo "core...";
update_core(INSTALLDIR, 'statusnet');
echo " ok\n";
}
if ($all || $allplugins) {
$plugins = get_plugins(INSTALLDIR);
}
if ($plugins) {
foreach ($plugins as $plugin) {
echo "$plugin...";
if (update_plugin(INSTALLDIR, $plugin)) {
echo " ok\n";
} else {
echo " not localized\n";
}
}
}

View File

@ -1,13 +0,0 @@
cd `dirname $0`
cd ..
xgettext \
--from-code=UTF-8 \
--default-domain=statusnet \
--output=locale/statusnet.po \
--language=PHP \
--keyword="pgettext:1c,2" \
--keyword="npgettext:1c,2,3" \
actions/*.php \
classes/*.php \
lib/*.php \
scripts/*.php

View File

@ -112,7 +112,6 @@ border-style:solid;
line-height:0; line-height:0;
} }
.form_settings input.remove { .form_settings input.remove {
margin-left:11px; margin-left:11px;
} }
@ -246,7 +245,6 @@ margin-left:11px;
width:auto; width:auto;
} }
address { address {
float:left; float:left;
margin-bottom:18px; margin-bottom:18px;
@ -672,8 +670,7 @@ display:block;
text-align:left; text-align:left;
width:100%; width:100%;
} }
.entity_actions a, .entity_actions a {
.entity_remote_subscribe {
text-decoration:none; text-decoration:none;
font-weight:bold; font-weight:bold;
display:block; display:block;
@ -688,7 +685,8 @@ border-radius:4px;
.entity_actions a, .entity_actions a,
.entity_actions input, .entity_actions input,
.entity_actions p { .entity_actions p {
border:0; border-width:2px;
border-style:solid;
padding-left:23px; padding-left:23px;
} }
@ -697,19 +695,10 @@ padding-left:23px;
padding:2px 4px 1px 26px; padding:2px 4px 1px 26px;
} }
.entity_remote_subscribe {
padding:4px;
border-width:2px;
border-style:solid;
border-radius:4px;
-moz-border-radius:4px;
-webkit-border-radius:4px;
}
.entity_actions .accept { .entity_actions .accept {
margin-bottom:18px; margin-bottom:18px;
} }
.entity_send-a-message button { .entity_send-a-message button {
position:absolute; position:absolute;
top:3px; top:3px;

View File

@ -30,8 +30,7 @@ border-radius:4px;
input, textarea, select, option { input, textarea, select, option {
font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
} }
input, textarea, select, input, textarea, select {
.entity_remote_subscribe {
border-color:#AAAAAA; border-color:#AAAAAA;
} }
@ -56,15 +55,12 @@ background:none;
} }
.form_notice.warning #notice_text-count, .form_notice.warning #notice_text-count,
.form_settings .form_note, .form_settings .form_note {
.entity_remote_subscribe,
.entity_actions .form_notice input.submit {
background-color:#9BB43E; background-color:#9BB43E;
} }
input.submit, input.submit,
.form_notice.warning #notice_text-count, .form_notice.warning #notice_text-count,
.form_settings .form_note, .form_settings .form_note,
.entity_remote_subscribe,
.entity_actions a, .entity_actions a,
.entity_actions input, .entity_actions input,
.entity_moderation p, .entity_moderation p,
@ -82,16 +78,18 @@ background-color:transparent;
input:focus, textarea:focus, select:focus, input:focus, textarea:focus, select:focus,
.form_notice.warning #notice_data-text, .form_notice.warning #notice_data-text,
.form_notice.warning #notice_text-count, .form_notice.warning #notice_text-count,
.form_settings .form_note, .form_settings .form_note {
.entity_remote_subscribe {
border-color:#9BB43E; border-color:#9BB43E;
} }
input.submit, input.submit {
.entity_remote_subscribe,
.entity_actions .form_notice input.submit {
color:#FFFFFF; color:#FFFFFF;
} }
input.submit { .entity_actions input.submit {
border-color:transparent;
text-shadow:none;
}
input.submit,
.form_notice input.submit {
background:#AAAAAA url(../../base/images/illustrations/illu_pattern-01.png) 0 0 repeat-x; background:#AAAAAA url(../../base/images/illustrations/illu_pattern-01.png) 0 0 repeat-x;
text-shadow:0 1px 0 #FFFFFF; text-shadow:0 1px 0 #FFFFFF;
color:#000000; color:#000000;
@ -109,9 +107,6 @@ box-shadow:3px 3px 3px rgba(194, 194, 194, 0.1);
-webkit-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.1); -webkit-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.1);
text-shadow:none; text-shadow:none;
} }
.entity_actions input.submit {
text-shadow:none;
}
a, a,
.form_settings input.form_action-primary, .form_settings input.form_action-primary,

View File

@ -30,8 +30,7 @@ border-radius:4px;
input, textarea, select, option { input, textarea, select, option {
font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif;
} }
input, textarea, select, input, textarea, select {
.entity_remote_subscribe {
border-color:#AAAAAA; border-color:#AAAAAA;
} }
@ -56,15 +55,12 @@ background:none;
} }
.form_notice.warning #notice_text-count, .form_notice.warning #notice_text-count,
.form_settings .form_note, .form_settings .form_note {
.entity_remote_subscribe,
.entity_actions .form_notice input.submit {
background-color:#9BB43E; background-color:#9BB43E;
} }
input.submit, input.submit,
.form_notice.warning #notice_text-count, .form_notice.warning #notice_text-count,
.form_settings .form_note, .form_settings .form_note,
.entity_remote_subscribe,
.entity_actions a, .entity_actions a,
.entity_actions input, .entity_actions input,
.entity_moderation p, .entity_moderation p,
@ -82,16 +78,18 @@ background-color:transparent;
input:focus, textarea:focus, select:focus, input:focus, textarea:focus, select:focus,
.form_notice.warning #notice_data-text, .form_notice.warning #notice_data-text,
.form_notice.warning #notice_text-count, .form_notice.warning #notice_text-count,
.form_settings .form_note, .form_settings .form_note {
.entity_remote_subscribe {
border-color:#9BB43E; border-color:#9BB43E;
} }
input.submit, input.submit {
.entity_remote_subscribe,
.entity_actions .form_notice input.submit {
color:#FFFFFF; color:#FFFFFF;
} }
input.submit { .entity_actions input.submit {
border-color:transparent;
text-shadow:none;
}
input.submit,
.form_notice input.submit {
background:#AAAAAA url(../../base/images/illustrations/illu_pattern-01.png) 0 0 repeat-x; background:#AAAAAA url(../../base/images/illustrations/illu_pattern-01.png) 0 0 repeat-x;
text-shadow:0 1px 0 #FFFFFF; text-shadow:0 1px 0 #FFFFFF;
color:#000000; color:#000000;
@ -109,9 +107,6 @@ box-shadow:3px 3px 3px rgba(194, 194, 194, 0.1);
-webkit-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.1); -webkit-box-shadow:3px 3px 3px rgba(194, 194, 194, 0.1);
text-shadow:none; text-shadow:none;
} }
.entity_actions input.submit {
text-shadow:none;
}
a, a,
.form_settings input.form_action-primary, .form_settings input.form_action-primary,