summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorEvan Prodromou <evan@status.net>2009-12-11 09:55:47 -0500
committerEvan Prodromou <evan@status.net>2009-12-11 09:55:47 -0500
commite9b733e7f036bc03353ae6dd7b096ea179698a4d (patch)
tree1f93b0344e3d5b7c1e50f9ee272c8dc8d8ecf8c6 /lib
parent78fc9483d4d1fde4561905edf6594b86c4dc374e (diff)
parent85473ecf94e92cd0e6503e4d27ea26452076aafd (diff)
Merge branch '0.9.x' into testing
Diffstat (limited to 'lib')
-rw-r--r--lib/command.php3
-rw-r--r--lib/language.php125
-rw-r--r--lib/messageform.php2
-rw-r--r--lib/noticeform.php2
-rw-r--r--lib/plugin.php19
5 files changed, 140 insertions, 11 deletions
diff --git a/lib/command.php b/lib/command.php
index e2a665511..450db9da3 100644
--- a/lib/command.php
+++ b/lib/command.php
@@ -584,7 +584,8 @@ class LoginCommand extends Command
function execute($channel)
{
$disabled = common_config('logincommand','disabled');
- if(isset($disabled)) {
+ $disabled = isset($disabled) && $disabled;
+ if($disabled) {
$channel->error($this->user, _('Login command is disabled'));
return;
}
diff --git a/lib/language.php b/lib/language.php
index 4fc45bafe..916cee7ed 100644
--- a/lib/language.php
+++ b/lib/language.php
@@ -36,6 +36,33 @@ if (!function_exists('gettext')) {
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')) {
/**
* Context-aware gettext wrapper; use when messages in different contexts
@@ -51,8 +78,30 @@ if (!function_exists('pgettext')) {
*/
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;
- $out = dcgettext(textdomain(NULL), $msgid, LC_MESSAGES);
+ $out = dcngettext($domain, $msgid, $plural, $n, LC_MESSAGES);
if ($out == $msgid) {
return $msg;
} else {
@@ -78,14 +127,78 @@ if (!function_exists('npgettext')) {
*/
function npgettext($context, $msg, $plural, $n)
{
- $msgid = $context . "\004" . $msg;
- $out = dcngettext(textdomain(NULL), $msgid, $plural, $n, LC_MESSAGES);
- if ($out == $msgid) {
- return $msg;
+ return dnpgettext(textdomain(NULL), $msgid, $plural, $n, LC_MESSAGES);
+ }
+}
+
+/**
+ * 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 {
- return $out;
+ return null;
}
}
+ return $cached[$path];
}
diff --git a/lib/messageform.php b/lib/messageform.php
index 4df193c6d..0c568e1bd 100644
--- a/lib/messageform.php
+++ b/lib/messageform.php
@@ -154,8 +154,6 @@ class MessageForm extends Form
$contentLimit = Message::maxContent();
- $this->out->inlineScript('maxLength = ' . $contentLimit . ';');
-
if ($contentLimit > 0) {
$this->out->elementStart('dl', 'form_note');
$this->out->element('dt', null, _('Available characters'));
diff --git a/lib/noticeform.php b/lib/noticeform.php
index 0dd3f2d77..593a1e932 100644
--- a/lib/noticeform.php
+++ b/lib/noticeform.php
@@ -178,8 +178,6 @@ class NoticeForm extends Form
$contentLimit = Notice::maxContent();
- $this->out->inlineScript('maxLength = ' . $contentLimit . ';');
-
if ($contentLimit > 0) {
$this->out->elementStart('dl', 'form_note');
$this->out->element('dt', null, _('Available characters'));
diff --git a/lib/plugin.php b/lib/plugin.php
index 2c77c3e12..de7313e59 100644
--- a/lib/plugin.php
+++ b/lib/plugin.php
@@ -65,6 +65,8 @@ class Plugin
Event::addHandler(mb_substr($method, 2), array($this, $method));
}
}
+
+ $this->setupGettext();
}
function initialize()
@@ -77,6 +79,22 @@ class Plugin
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)
{
common_log($level, get_class($this) . ': '.$msg);
@@ -87,3 +105,4 @@ class Plugin
$this->log(LOG_DEBUG, $msg);
}
}
+