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:
|
Localizations for StatusNet are being maintained through TranslateWiki:
|
||||||
http://translatewiki.net/wiki/Translating:StatusNet
|
http://translatewiki.net/wiki/Translating:StatusNet
|
||||||
|
|
||||||
Note if you are working with a direct git checkout, you will need to build
|
Ongoing translation work should be done there to ensure updates are
|
||||||
the binary .mo files from the .po source files for translations to work
|
integrated into future versions of StatusNet.
|
||||||
in the web app.
|
|
||||||
|
|
||||||
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 $username = null;
|
||||||
public $token = null;
|
public $token = null;
|
||||||
public $expiry = 7776000; // 90-day expiry
|
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
|
public $cachePrefix = null; // Optional shared memcache prefix override
|
||||||
// to share lookups between local instances.
|
// to share lookups between local instances.
|
||||||
|
|
||||||
|
protected $lastTimeout = null; // timestamp of last web service timeout
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* convert a name into a Location object
|
* convert a name into a Location object
|
||||||
*
|
*
|
||||||
@ -437,9 +441,21 @@ class GeonamesPlugin extends Plugin
|
|||||||
|
|
||||||
function getGeonames($method, $params)
|
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()) {
|
if (!$result->isOk()) {
|
||||||
throw new Exception("HTTP error code " . $result->code);
|
throw new Exception("HTTP error code " . $result->code);
|
||||||
|
@ -65,6 +65,26 @@ class MeteorPlugin extends RealtimePlugin
|
|||||||
parent::__construct();
|
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()
|
function _getScripts()
|
||||||
{
|
{
|
||||||
$scripts = parent::_getScripts();
|
$scripts = parent::_getScripts();
|
||||||
|
@ -73,9 +73,11 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
$this->serveMobile = true;
|
$this->serveMobile = true;
|
||||||
} else {
|
} else {
|
||||||
// If they like the WAP 2.0 mimetype, serve them MP
|
// If they like the WAP 2.0 mimetype, serve them MP
|
||||||
if (strstr('application/vnd.wap.xhtml+xml', $type) !== false) {
|
// @fixme $type is undefined, making this if case useless and spewing errors.
|
||||||
$this->serveMobile = true;
|
// What's the intent?
|
||||||
} else {
|
//if (strstr('application/vnd.wap.xhtml+xml', $type) !== false) {
|
||||||
|
// $this->serveMobile = true;
|
||||||
|
//} else {
|
||||||
// If they are a mobile device that supports WAP 2.0,
|
// If they are a mobile device that supports WAP 2.0,
|
||||||
// serve them MP
|
// serve them MP
|
||||||
|
|
||||||
@ -139,8 +141,19 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
'windows ce'
|
'windows ce'
|
||||||
);
|
);
|
||||||
|
|
||||||
|
$blacklist = array(
|
||||||
|
'ipad', // Larger screen handles the full theme fairly well.
|
||||||
|
);
|
||||||
|
|
||||||
$httpuseragent = strtolower($_SERVER['HTTP_USER_AGENT']);
|
$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) {
|
foreach ($this->mobiledevices as $md) {
|
||||||
if (strstr($httpuseragent, $md) !== false) {
|
if (strstr($httpuseragent, $md) !== false) {
|
||||||
$this->setMobileFeatures($httpuseragent);
|
$this->setMobileFeatures($httpuseragent);
|
||||||
@ -149,7 +162,7 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
//}
|
||||||
|
|
||||||
// If they are okay with MP, and the site has a mobile server,
|
// If they are okay with MP, and the site has a mobile server,
|
||||||
// redirect there
|
// redirect there
|
||||||
@ -167,7 +180,9 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
return true;
|
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']) ?
|
$httpaccept = isset($_SERVER['HTTP_ACCEPT']) ?
|
||||||
$_SERVER['HTTP_ACCEPT'] : null;
|
$_SERVER['HTTP_ACCEPT'] : null;
|
||||||
|
|
||||||
@ -180,7 +195,7 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
throw new ClientException(_('This page is not available in a '.
|
throw new ClientException(_('This page is not available in a '.
|
||||||
'media type you accept'), 406);
|
'media type you accept'), 406);
|
||||||
}
|
}
|
||||||
}
|
//}
|
||||||
|
|
||||||
header('Content-Type: '.$type);
|
header('Content-Type: '.$type);
|
||||||
|
|
||||||
@ -221,9 +236,12 @@ class MobileProfilePlugin extends WAP20Plugin
|
|||||||
|
|
||||||
function onStartShowHeadElements($action)
|
function onStartShowHeadElements($action)
|
||||||
{
|
{
|
||||||
if (!$action->serveMobile) {
|
// @fixme nothing appears to set a serveMobile on any action,
|
||||||
return true;
|
// so this is useless and spews errors. Is this supposed to be
|
||||||
}
|
// checking $this?
|
||||||
|
//if (!$action->serveMobile) {
|
||||||
|
// return true;
|
||||||
|
//}
|
||||||
|
|
||||||
$action->showTitle();
|
$action->showTitle();
|
||||||
$action->showShortcutIcon();
|
$action->showShortcutIcon();
|
||||||
|
@ -726,7 +726,8 @@ class Ostatus_profile extends Memcached_DataObject
|
|||||||
*
|
*
|
||||||
* @param string $profile_url
|
* @param string $profile_url
|
||||||
* @return Ostatus_profile
|
* @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())
|
public static function ensureProfileURL($profile_url, $hints=array())
|
||||||
@ -813,7 +814,7 @@ class Ostatus_profile extends Memcached_DataObject
|
|||||||
* remote profiles.
|
* remote profiles.
|
||||||
*
|
*
|
||||||
* @return mixed Ostatus_profile or null
|
* @return mixed Ostatus_profile or null
|
||||||
* @throws Exception for local profiles
|
* @throws OStatusShadowException for local profiles
|
||||||
*/
|
*/
|
||||||
static function getFromProfileURL($profile_url)
|
static function getFromProfileURL($profile_url)
|
||||||
{
|
{
|
||||||
@ -836,7 +837,7 @@ class Ostatus_profile extends Memcached_DataObject
|
|||||||
$user = User::staticGet('id', $profile->id);
|
$user = User::staticGet('id', $profile->id);
|
||||||
|
|
||||||
if (!empty($user)) {
|
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
|
// Continue discovery; it's a remote profile
|
||||||
@ -1538,6 +1539,7 @@ class Ostatus_profile extends Memcached_DataObject
|
|||||||
* @param string $addr webfinger address
|
* @param string $addr webfinger address
|
||||||
* @return Ostatus_profile
|
* @return Ostatus_profile
|
||||||
* @throws Exception on error conditions
|
* @throws Exception on error conditions
|
||||||
|
* @throws OStatusShadowException if this reference would obscure a local user/group
|
||||||
*/
|
*/
|
||||||
public static function ensureWebfinger($addr)
|
public static function ensureWebfinger($addr)
|
||||||
{
|
{
|
||||||
@ -1616,9 +1618,18 @@ class Ostatus_profile extends Memcached_DataObject
|
|||||||
$oprofile = self::ensureProfileURL($hints['profileurl'], $hints);
|
$oprofile = self::ensureProfileURL($hints['profileurl'], $hints);
|
||||||
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
|
self::cacheSet(sprintf('ostatus_profile:webfinger:%s', $addr), $oprofile->uri);
|
||||||
return $oprofile;
|
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) {
|
} catch (Exception $e) {
|
||||||
common_log(LOG_WARNING, "Failed creating profile from profile URL '$profileUrl': " . $e->getMessage());
|
common_log(LOG_WARNING, "Failed creating profile from profile URL '$profileUrl': " . $e->getMessage());
|
||||||
// keep looking
|
// 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;
|
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 \
|
xgettext \
|
||||||
--from-code=UTF-8 \
|
--from-code=UTF-8 \
|
||||||
--default-domain=$domain \
|
--default-domain=$domain \
|
||||||
--output=locale/$domain.po \
|
--output=locale/$domain.pot \
|
||||||
--language=PHP \
|
--language=PHP \
|
||||||
--add-comments=TRANS \
|
--add-comments=TRANS \
|
||||||
--keyword="_m:1,1t" \
|
--keyword="_m:1,1t" \
|
||||||
@ -64,7 +64,7 @@ function do_update_plugin($dir, $domain)
|
|||||||
xgettext \
|
xgettext \
|
||||||
--from-code=UTF-8 \
|
--from-code=UTF-8 \
|
||||||
--default-domain=$domain \
|
--default-domain=$domain \
|
||||||
--output=locale/$domain.po \
|
--output=locale/$domain.pot \
|
||||||
--language=PHP \
|
--language=PHP \
|
||||||
--add-comments=TRANS \
|
--add-comments=TRANS \
|
||||||
--keyword='' \
|
--keyword='' \
|
||||||
|
Loading…
Reference in New Issue
Block a user