My favorites | Sign in
yii
Project Home Downloads Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
/**
* YiiBase class file.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @link http://www.yiiframework.com/
* @copyright Copyright &copy; 2008-2011 Yii Software LLC
* @license http://www.yiiframework.com/license/
*/


/**
* CChoiceFormat is a helper that chooses an appropriate message based on the specified number value.
* The candidate messages are given as a string in the following format:
* <pre>
* 'expr1#message1|expr2#message2|expr3#message3'
* </pre>
* where each expression should be a valid PHP expression with 'n' as the only variable.
* For example, 'n==1' and 'n%10==2 && n>10' are both valid expressions.
* The variable 'n' will take the given number value, and if an expression evaluates true,
* the corresponding message will be returned.
*
* For example, given the candidate messages 'n==1#one|n==2#two|n>2#others' and
* the number value 2, the resulting message will be 'two'.
*
* For expressions like 'n==1', we can also use a shortcut '1'. So the above example
* candidate messages can be simplified as '1#one|2#two|n>2#others'.
*
* In case the given number doesn't select any message, the last candidate message
* will be returned.
*
* @author Qiang Xue <qiang.xue@gmail.com>
* @version $Id$
* @package system.i18n
*/
class CChoiceFormat
{
/**
* Formats a message according to the specified number value.
* @param string $messages the candidate messages in the format of 'expr1#message1|expr2#message2|expr3#message3'.
* See {@link CChoiceFormat} for more details.
* @param mixed $number the number value
* @return string the selected message
*/
public static function format($messages, $number)
{
$n=preg_match_all('/\s*([^#]*)\s*#([^\|]*)\|/',$messages.'|',$matches);
if($n===0)
return $messages;
for($i=0;$i<$n;++$i)
{
$expression=$matches[1][$i];
$message=$matches[2][$i];
if($expression===(string)(int)$expression)
{
if($expression==$number)
return $message;
}
else if(self::evaluate(str_replace('n','$n',$expression),$number))
return $message;
}
return $message; // return the last choice
}

/**
* Evaluates a PHP expression with the given number value.
* @param string $expression the PHP expression
* @param mixed $n the number value
* @return boolean the expression result
*/
protected static function evaluate($expression,$n)
{
return @eval("return $expression;");
}
}

Change log

r3527 by qiang.xue on Dec 31, 2011   Diff
1.1.9 release.
Go to: 
Sign in to write a code review

Older revisions

r3515 by mdomba on Dec 28, 2011   Diff
removed 1.0.x reference from
documentation
r2899 by alexander.makarow on Jan 20, 2011   Diff
CChoiceFormat optimization
r2856 by alexander.makarow on Jan 14, 2011   Diff
[No log message]
All revisions of this file

File info

Size: 2414 bytes, 75 lines

File properties

svn:keywords
Id
Powered by Google Project Hosting