Skip to content

Commit

Permalink
Implement plural and context based translation functionality
Browse files Browse the repository at this point in the history
refs #6982
  • Loading branch information
Alexander Fuhr committed Sep 16, 2014
1 parent e2b5e05 commit b38ef9c
Show file tree
Hide file tree
Showing 6 changed files with 148 additions and 37 deletions.
14 changes: 10 additions & 4 deletions library/Icinga/Application/Modules/Module.php
Expand Up @@ -918,15 +918,21 @@ protected function addRoute($name, Zend_Controller_Router_Route_Abstract $route)
* Translate a string with the global mt()
*
* @param $string
* @param null $context
*
* @return mixed|string
*/
protected function translate($string)
protected function translate($string, $context = null)
{
return mt($this->name, $string);
return mt($this->name, $string, $context);
}

protected function translatePlural($string, $string2, $n)
/**
* (non-PHPDoc)
* @see Translator::translatePlural() For the function documentation.
*/
protected function translatePlural($textSingular, $textPlural, $number, $context = null)
{
return mtp($this->name, $string, $string2, $n);
return mtp($this->name, $textSingular, $textPlural, $number, $context);
}
}
64 changes: 50 additions & 14 deletions library/Icinga/Application/functions.php
Expand Up @@ -5,49 +5,85 @@
use Icinga\Util\Translator;

if (extension_loaded('gettext')) {
function t($messageId)

/**
* (non-PHPDoc)
* @see Translator::translate() For the function documentation.
*/
function t($messageId, $context = null)
{
return Translator::translate($messageId, Translator::DEFAULT_DOMAIN);
return Translator::translate($messageId, Translator::DEFAULT_DOMAIN, $context);
}

function mt($domain, $messageId)
/**
* (non-PHPDoc)
* @see Translator::translate() For the function documentation.
*/
function mt($domain, $messageId, $context = null)
{
return Translator::translate($messageId, $domain);
return Translator::translate($messageId, $domain, $context);
}

function tp($messageId, $messageId2, $number)
/**
* (non-PHPDoc)
* @see Translator::translatePlural() For the function documentation.
*/
function tp($messageId, $messageId2, $number, $context = null)
{
return Translator::translatePlural($messageId, $messageId2, $number, Translator::DEFAULT_DOMAIN);
return Translator::translatePlural($messageId, $messageId2, $number, Translator::DEFAULT_DOMAIN, $context);
}

function mtp($domain, $messageId, $messageId2, $number)
/**
* (non-PHPDoc)
* @see Translator::translatePlural() For the function documentation.
*/
function mtp($domain, $messageId, $messageId2, $number, $context = null)
{
return Translator::translatePlural($messageId, $messageId2, $number, $domain);
return Translator::translatePlural($messageId, $messageId2, $number, $domain, $context);
}

} else {
function t($messageId)

/**
* (non-PHPDoc)
* @see Translator::translate() For the function documentation.
*/
function t($messageId, $context = null)
{
return $messageId;
}

function mt($domain, $messageId)
/**
* (non-PHPDoc)
* @see Translator::translate() For the function documentation.
*/
function mt($domain, $messageId, $context = null)
{
return $messageId;
}

function tp($messageId, $messageId2, $number)
/**
* (non-PHPDoc)
* @see Translator::translatePlural() For the function documentation.
*/
function tp($messageId, $messageId2, $number, $context = null)
{
if ($number === 0 || $number > 1 || $number < 0) {
if ((int) $number !== 1) {
return $messageId2;
}
return $messageId;
}

function mt($domain, $messageId, $messageId2, $number)
/**
* (non-PHPDoc)
* @see Translator::translatePlural() For the function documentation.
*/
function mtp($domain, $messageId, $messageId2, $number, $context = null)
{
if ($number === 0 || $number > 1 || $number < 0) {
if ((int) $number !== 1) {
return $messageId2;
}
return $messageId;
}

}
70 changes: 65 additions & 5 deletions library/Icinga/Util/Translator.php
Expand Up @@ -34,13 +34,18 @@ class Translator
*
* Falls back to the default domain in case the string cannot be translated using the given domain
*
* @param string $text The string to translate
* @param string $domain The primary domain to use
* @param string $text The string to translate
* @param string $domain The primary domain to use
* @param string|null $context Optional parameter for context based translation
*
* @return string The translated string
* @return string The translated string
*/
public static function translate($text, $domain)
public static function translate($text, $domain, $context = null)
{
if ($context !== null) {
return self::pgettext($text, $domain, $context);
}

$res = dgettext($domain, $text);
if ($res === $text && $domain !== self::DEFAULT_DOMAIN) {
return dgettext(self::DEFAULT_DOMAIN, $text);
Expand All @@ -55,15 +60,70 @@ public static function translate($text, $domain)
* @param string $textPlural The string in plural form to translate
* @param integer $number The number to get the plural or singular string
* @param string $domain The primary domain to use
* @param string|null $context Optional parameter for context based translation
*
* @return string The translated string
*/
public static function translatePlural($textSingular, $textPlural, $number, $domain)
public static function translatePlural($textSingular, $textPlural, $number, $domain, $context = null)
{
if ($context !== null) {
return self::pngettext($textSingular, $textPlural, $number, $domain, $context);
}

$res = dngettext($domain, $textSingular, $textPlural, $number);
return $res;
}

/**
* Emulated pgettext()
*
* @link http://php.net/manual/de/book.gettext.php#89975
*
* @param $text
* @param $domain
* @param $context
*
* @return string
*/
public static function pgettext($text, $domain, $context)
{
$contextString = "{$context}\004{$text}";

$translation = dcgettext($domain, $contextString, LC_MESSAGES);

if ($translation == $contextString) {
return $text;
} else {
return $translation;
}
}

/**
* Emulated pngettext()
*
* @link http://php.net/manual/de/book.gettext.php#89975
*
* @param $textSingular
* @param $textPlural
* @param $number
* @param $domain
* @param $context
*
* @return string
*/
public static function pngettext($textSingular, $textPlural, $number, $domain, $context)
{
$contextString = "{$context}\004{$textSingular}";

$translation = dcngettext($domain, $contextString, $textPlural, $number, LC_MESSAGES);

if ($translation == $contextString || $translation == $textPlural) {
return ($number == 1 ? $textSingular : $textPlural);
} else {
return $translation;
}
}

/**
* Register a new gettext domain
*
Expand Down
22 changes: 12 additions & 10 deletions library/Icinga/Web/Controller/ActionController.php
Expand Up @@ -216,27 +216,29 @@ public function getTabs()
*
* Autoselects the module domain, if any, and falls back to the global one if no translation could be found.
*
* @param string $text The string to translate
* @param string $text The string to translate
* @param string|null $context Optional parameter for context based translation
*
* @return string The translated string
* @return string The translated string
*/
public function translate($text)
public function translate($text, $context = null)
{
return Translator::translate($text, $this->view->translationDomain);
return Translator::translate($text, $this->view->translationDomain, $context);
}

/**
* Translate a plural string
*
* @param string $textSingular The string in singular form to translate
* @param string $textPlural The string in plural form to translate
* @param string $number The number to get the plural or singular string
* @param string $textSingular The string in singular form to translate
* @param string $textPlural The string in plural form to translate
* @param string $number The number to get the plural or singular string
* @param string|null $context Optional parameter for context based translation
*
* @return string The translated string
* @return string The translated string
*/
public function translatePlural($textSingular, $textPlural, $number)
public function translatePlural($textSingular, $textPlural, $number, $context = null)
{
return Translator::translatePlural($textSingular, $textPlural, $number, $this->view->translationDomain);
return Translator::translatePlural($textSingular, $textPlural, $number, $this->view->translationDomain, $context);
}

protected function ignoreXhrBody()
Expand Down
8 changes: 4 additions & 4 deletions library/Icinga/Web/View.php
Expand Up @@ -127,19 +127,19 @@ public function callHelperFunction($name, $args)
);
}

public function translate($text)
public function translate($text, $context = null)
{
return Translator::translate($text, $this->translationDomain);
return Translator::translate($text, $this->translationDomain, $context);
}

/**
* Translate a plural string
*
* @see Translator::translatePlural()
*/
public function translatePlural($textSingular, $textPlural, $number)
public function translatePlural($textSingular, $textPlural, $number, $context = null)
{
return Translator::translatePlural($textSingular, $textPlural, $number, $this->translationDomain);
return Translator::translatePlural($textSingular, $textPlural, $number, $this->translationDomain, $context);
}

/**
Expand Down
Expand Up @@ -237,9 +237,16 @@ private function createTemplateFile()
'/usr/bin/xgettext',
'--language=PHP',
'--keyword=translate',
'--keyword=translate:1,2c',
'--keyword=translatePlural:1,2',
'--keyword=translatePlural:1,2,4c',
'--keyword=mt:2',
'--keyword=mtp:2,3',
'--keyword=mtp:2,3,5c',
'--keyword=t',
'--keyword=t:1,2c',
'--keyword=tp:1,2',
'--keyword=tp:1,2,4c',
'--sort-output',
'--force-po',
'--omit-header',
Expand Down

0 comments on commit b38ef9c

Please sign in to comment.