Merge branch 'master' of git@gitorious.org:statusnet/mainline

This commit is contained in:
Evan Prodromou 2010-04-07 10:44:00 -04:00
commit 9ea0b06452
17 changed files with 6216 additions and 21 deletions

View File

@ -1,9 +1,56 @@
Localizations for StatusNet are being maintained through TranslateWiki:
http://translatewiki.net/wiki/Translating:StatusNet
Note if you are working with a direct git checkout, you will need to build
the binary .mo files from the .po source files for translations to work
in the web app.
Ongoing translation work should be done there to ensure updates are
integrated into future versions of StatusNet.
If gettext and GNU make are installed, you can simply run 'make' in this
directory to build them.
== Building runtime translations ==
If you are working with a direct git checkout or have customized any
message files, you will need to build binary .mo files from the .po
source files for translations to work in the web app.
If gettext and GNU make are installed, you can simply run 'make' in the
main StatusNet directory, and all core and plugin localizations will be
recompiled.
== Customization ==
User interface texts in any language can be customized by editing the
texts in the .po source files, then rebuilding the binary .mo files
used at runtime.
The default/US English texts can be overridden by adding "translations"
to en/LC_MESSAGES/statusnet.po.
Note that texts you change in one language will not affect other
languages, which are selected based on visitors' browser preferences.
If you customizations include important information or links,
you may wish to disable languages that you haven't customized so that
visitors always get your text.
To disable all non-English languages add this to your config.php (you
will need to edit both the en and en_GB files):
$config['site']['languages'] = array(
'en-us' => array('q' => 1, 'lang' => 'en', 'name' => 'English (US)', 'direction' => 'ltr'),
'en-gb' => array('q' => 1, 'lang' => 'en_GB', 'name' => 'English (British)', 'direction' => 'ltr'),
'en' => array('q' => 1, 'lang' => 'en', 'name' => 'English (US)', 'direction' => 'ltr'),
);
To disable everything including British English variant:
$config['site']['languages'] = array(
'en' => array('q' => 1, 'lang' => 'en', 'name' => 'English', 'direction' => 'ltr'),
);
== Plugins ==
This locale directory contains translations for the core StatusNet
software only. Plugins may have their own locale subdirectories and
their own .po and .mo files as well, so if customizing you may need
to poke at those as well.

6062
locale/statusnet.pot Normal file

File diff suppressed because it is too large Load Diff

View File

@ -55,9 +55,13 @@ class GeonamesPlugin extends Plugin
public $username = null;
public $token = null;
public $expiry = 7776000; // 90-day expiry
public $timeout = 2; // Web service timeout in seconds.
public $timeoutWindow = 60; // Further lookups in this process will be disabled for N seconds after a timeout.
public $cachePrefix = null; // Optional shared memcache prefix override
// to share lookups between local instances.
protected $lastTimeout = null; // timestamp of last web service timeout
/**
* convert a name into a Location object
*
@ -437,9 +441,21 @@ class GeonamesPlugin extends Plugin
function getGeonames($method, $params)
{
$client = HTTPClient::start();
if ($this->lastTimeout && (time() - $this->lastTimeout < $this->timeoutWindow)) {
throw new Exception("skipping due to recent web service timeout");
}
$result = $client->get($this->wsUrl($method, $params));
$client = HTTPClient::start();
$client->setConfig('connect_timeout', $this->timeout);
$client->setConfig('timeout', $this->timeout);
try {
$result = $client->get($this->wsUrl($method, $params));
} catch (Exception $e) {
common_log(LOG_ERR, __METHOD__ . ": " . $e->getMessage());
$this->lastTimeout = time();
throw $e;
}
if (!$result->isOk()) {
throw new Exception("HTTP error code " . $result->code);

View File

@ -65,6 +65,26 @@ class MeteorPlugin extends RealtimePlugin
parent::__construct();
}
/**
* Pull settings from config file/database if set.
*/
function initialize()
{
$settings = array('webserver',
'webport',
'controlport',
'controlserver',
'channelbase');
foreach ($settings as $name) {
$val = common_config('meteor', $name);
if ($val !== false) {
$this->$name = $val;
}
}
return parent::initialize();
}
function _getScripts()
{
$scripts = parent::_getScripts();

View File

@ -73,9 +73,11 @@ class MobileProfilePlugin extends WAP20Plugin
$this->serveMobile = true;
} else {
// If they like the WAP 2.0 mimetype, serve them MP
if (strstr('application/vnd.wap.xhtml+xml', $type) !== false) {
$this->serveMobile = true;
} else {
// @fixme $type is undefined, making this if case useless and spewing errors.
// What's the intent?
//if (strstr('application/vnd.wap.xhtml+xml', $type) !== false) {
// $this->serveMobile = true;
//} else {
// If they are a mobile device that supports WAP 2.0,
// serve them MP
@ -139,8 +141,19 @@ class MobileProfilePlugin extends WAP20Plugin
'windows ce'
);
$blacklist = array(
'ipad', // Larger screen handles the full theme fairly well.
);
$httpuseragent = strtolower($_SERVER['HTTP_USER_AGENT']);
foreach ($blacklist as $md) {
if (strstr($httpuseragent, $md) !== false) {
$this->serveMobile = false;
return true;
}
}
foreach ($this->mobiledevices as $md) {
if (strstr($httpuseragent, $md) !== false) {
$this->setMobileFeatures($httpuseragent);
@ -149,7 +162,7 @@ class MobileProfilePlugin extends WAP20Plugin
break;
}
}
}
//}
// If they are okay with MP, and the site has a mobile server,
// redirect there
@ -167,7 +180,9 @@ class MobileProfilePlugin extends WAP20Plugin
return true;
}
if (!$type) {
// @fixme $type is undefined, making this if case useless and spewing errors.
// What's the intent?
//if (!$type) {
$httpaccept = isset($_SERVER['HTTP_ACCEPT']) ?
$_SERVER['HTTP_ACCEPT'] : null;
@ -180,7 +195,7 @@ class MobileProfilePlugin extends WAP20Plugin
throw new ClientException(_('This page is not available in a '.
'media type you accept'), 406);
}
}
//}
header('Content-Type: '.$type);
@ -221,9 +236,12 @@ class MobileProfilePlugin extends WAP20Plugin
function onStartShowHeadElements($action)
{
if (!$action->serveMobile) {
return true;
}
// @fixme nothing appears to set a serveMobile on any action,
// so this is useless and spews errors. Is this supposed to be
// checking $this?
//if (!$action->serveMobile) {
// return true;
//}
$action->showTitle();
$action->showShortcutIcon();

View File

@ -726,7 +726,8 @@ class Ostatus_profile extends Memcached_DataObject
*
* @param string $profile_url
* @return Ostatus_profile
* @throws Exception
* @throws Exception on various error conditions
* @throws OStatusShadowException if this reference would obscure a local user/group
*/
public static function ensureProfileURL($profile_url, $hints=array())
@ -813,7 +814,7 @@ class Ostatus_profile extends Memcached_DataObject
* remote profiles.
*
* @return mixed Ostatus_profile or null
* @throws Exception for local profiles
* @throws OStatusShadowException for local profiles
*/
static function getFromProfileURL($profile_url)
{
@ -836,7 +837,7 @@ class Ostatus_profile extends Memcached_DataObject
$user = User::staticGet('id', $profile->id);
if (!empty($user)) {
throw new Exception("'$profile_url' is the profile for local user '{$user->nickname}'.");
throw new OStatusShadowException($profile, "'$profile_url' is the profile for local user '{$user->nickname}'.");
}
// Continue discovery; it's a remote profile
@ -1538,6 +1539,7 @@ class Ostatus_profile extends Memcached_DataObject
* @param string $addr webfinger address
* @return Ostatus_profile
* @throws Exception on error conditions
* @throws OStatusShadowException if this reference would obscure a local user/group
*/
public static function ensureWebfinger($addr)
{
@ -1616,9 +1618,18 @@ class Ostatus_profile extends Memcached_DataObject
$oprofile = self::ensureProfileURL($hints['profileurl'], $hints);
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
return $oprofile;
} catch (OStatusShadowException $e) {
// We've ended up with a remote reference to a local user or group.
// @fixme ideally we should be able to say who it was so we can
// go back and refer to it the regular way
throw $e;
} catch (Exception $e) {
common_log(LOG_WARNING, "Failed creating profile from profile URL '$profileUrl': " . $e->getMessage());
// keep looking
//
// @fixme this means an error discovering from profile page
// may give us a corrupt entry using the webfinger URI, which
// will obscure the correct page-keyed profile later on.
}
}
@ -1720,3 +1731,24 @@ class Ostatus_profile extends Memcached_DataObject
return $file;
}
}
/**
* Exception indicating we've got a remote reference to a local user,
* not a remote user!
*
* If we can ue a local profile after all, it's available as $e->profile.
*/
class OStatusShadowException extends Exception
{
public $profile;
/**
* @param Profile $profile
* @param string $message
*/
function __construct($profile, $message) {
$this->profile = $profile;
parent::__construct($message);
}
}

View File

@ -34,7 +34,7 @@ function update_core($dir, $domain)
xgettext \
--from-code=UTF-8 \
--default-domain=$domain \
--output=locale/$domain.po \
--output=locale/$domain.pot \
--language=PHP \
--add-comments=TRANS \
--keyword="_m:1,1t" \
@ -64,7 +64,7 @@ function do_update_plugin($dir, $domain)
xgettext \
--from-code=UTF-8 \
--default-domain=$domain \
--output=locale/$domain.po \
--output=locale/$domain.pot \
--language=PHP \
--add-comments=TRANS \
--keyword='' \