forked from GNUsocial/gnu-social
Merge branch 'master' of git@gitorious.org:statusnet/mainline
This commit is contained in:
commit
9ea0b06452
@ -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
6062
locale/statusnet.pot
Normal file
File diff suppressed because it is too large
Load Diff
@ -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);
|
||||
|
@ -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();
|
||||
|
@ -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();
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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='' \
|
||||
|
Loading…
Reference in New Issue
Block a user