summaryrefslogtreecommitdiff
path: root/framework/i18n/CChoiceFormat.php
diff options
context:
space:
mode:
Diffstat (limited to 'framework/i18n/CChoiceFormat.php')
-rw-r--r--framework/i18n/CChoiceFormat.php75
1 files changed, 75 insertions, 0 deletions
diff --git a/framework/i18n/CChoiceFormat.php b/framework/i18n/CChoiceFormat.php
new file mode 100644
index 0000000..d9cd2e1
--- /dev/null
+++ b/framework/i18n/CChoiceFormat.php
@@ -0,0 +1,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: CChoiceFormat.php 3515 2011-12-28 12:29:24Z mdomba $
+ * @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;");
+ }
+} \ No newline at end of file