Implementing support to multiline string in __*() calls.

This commit is contained in:
Renan Gonçalves 2011-04-25 19:22:14 +02:00
parent 43a95a79fc
commit cd3529c986
3 changed files with 50 additions and 19 deletions

View file

@ -316,24 +316,13 @@ class ExtractTask extends Shell {
} }
$mapCount = count($map); $mapCount = count($map);
$strings = array(); $strings = $this->__getStrings($position, $mapCount);
while (count($strings) < $mapCount && ($this->__tokens[$position] == ',' || $this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING)) {
if ($this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING) {
$strings[] = $this->__tokens[$position][1];
}
$position++;
}
if ($mapCount == count($strings)) { if ($mapCount == count($strings)) {
extract(array_combine($map, $strings)); extract(array_combine($map, $strings));
if (!isset($domain)) { $domain = isset($domain) ? $domain : 'default';
$domain = '\'default\''; $string = isset($plural) ? $singular . "\0" . $plural : $singular;
} $this->__strings[$domain][$string][$this->__file][] = $line;
$string = $this->__formatString($singular);
if (isset($plural)) {
$string .= "\0" . $this->__formatString($plural);
}
$this->__strings[$this->__formatString($domain)][$string][$this->__file][] = $line;
} else { } else {
$this->__markerError($this->__file, $line, $functionName, $count); $this->__markerError($this->__file, $line, $functionName, $count);
} }
@ -455,6 +444,34 @@ class ExtractTask extends Shell {
return $output; return $output;
} }
/**
* Get the strings from the position forward
*
* @param int $position Actual position on tokens array
* @param int $target Number of strings to extract
* @return array Strings extracted
* @access private
*/
function __getStrings(&$position, $target) {
$strings = array();
while (count($strings) < $target && ($this->__tokens[$position] == ',' || $this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING)) {
if ($this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING && $this->__tokens[$position+1] == '.') {
$string = '';
while ($this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING || $this->__tokens[$position] == '.') {
if ($this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING) {
$string .= $this->__formatString($this->__tokens[$position][1]);
}
$position++;
}
$strings[] = $string;
} else if ($this->__tokens[$position][0] == T_CONSTANT_ENCAPSED_STRING) {
$strings[] = $this->__formatString($this->__tokens[$position][1]);
}
$position++;
}
return $strings;
}
/** /**
* Format a string to be added as a translateable string * Format a string to be added as a translateable string
* *

View file

@ -118,7 +118,6 @@ class ExtractTaskTest extends CakeTestCase {
$pattern = '/To change its layout, create: APP\/views\/layouts\/default\.ctp\./s'; $pattern = '/To change its layout, create: APP\/views\/layouts\/default\.ctp\./s';
$this->assertPattern($pattern, $result); $this->assertPattern($pattern, $result);
// extract.ctp // extract.ctp
$pattern = '/\#: (\\\\|\/)extract\.ctp:6\n'; $pattern = '/\#: (\\\\|\/)extract\.ctp:6\n';
$pattern .= 'msgid "You have %d new message."\nmsgid_plural "You have %d new messages."/'; $pattern .= 'msgid "You have %d new message."\nmsgid_plural "You have %d new messages."/';
@ -131,9 +130,15 @@ class ExtractTaskTest extends CakeTestCase {
$pattern = '/\#: (\\\\|\/)extract\.ctp:14\n'; $pattern = '/\#: (\\\\|\/)extract\.ctp:14\n';
$pattern .= '\#: (\\\\|\/)home\.ctp:99\n'; $pattern .= '\#: (\\\\|\/)home\.ctp:99\n';
$pattern .= 'msgid "Editing this Page"\nmsgstr ""/'; $pattern .= 'msgid "Editing this Page"\nmsgstr ""/';
$this->assertPattern($pattern, $result); $this->assertPattern($pattern, $result);
$pattern = '/\#: (\\\\|\/)extract\.ctp:17\nmsgid "';
$pattern .= 'Hot features!';
$pattern .= '\\\n - No Configuration: Set-up the database and let the magic begin';
$pattern .= '\\\n - Extremely Simple: Just look at the name...It\'s Cake';
$pattern .= '\\\n - Active, Friendly Community: Join us #cakephp on IRC. We\'d love to help you get started';
$pattern .= '"\nmsgstr ""/';
$this->assertPattern($pattern, $result);
// extract.ctp - reading the domain.pot // extract.ctp - reading the domain.pot
$result = file_get_contents($this->path . DS . 'domain.pot'); $result = file_get_contents($this->path . DS . 'domain.pot');

View file

@ -12,3 +12,12 @@ echo __dn('domain', 'You deleted %d message (domain).', 'You deleted %d messages
// Duplicated Message // Duplicated Message
echo __('Editing this Page'); echo __('Editing this Page');
// Multiline
__('Hot features!'
. "\n - No Configuration:"
. ' Set-up the database and let the magic begin'
. "\n - Extremely Simple:"
. ' Just look at the name...It\'s Cake'
. "\n - Active, Friendly Community:"
. ' Join us #cakephp on IRC. We\'d love to help you get started');