framework/i18n/MessageFormatter.php
private function parseToken($token, $args, $locale)
    {
        // parsing pattern based on ICU grammar:
        // http://icu-project.org/apiref/icu4c/classMessageFormat.html#details
        $charset = Yii::$app ? Yii::$app->charset : 'UTF-8';
        $param = trim($token[0]);
        if (isset($args[$param])) {
            $arg = $args[$param];
        } else {
            return '{' . implode(',', $token) . '}';
        }
        $type = isset($token[1]) ? trim($token[1]) : 'none';
        switch ($type) {
            case 'date':
            case 'time':
            case 'spellout':
            case 'ordinal':
            case 'duration':
            case 'choice':
            case 'selectordinal':
                throw new NotSupportedException("Message format '$type' is not supported. You have to install PHP intl extension to use this feature.");
            case 'number':
                $format = isset($token[2]) ? trim($token[2]) : null;
                if (is_numeric($arg) && ($format === null || $format === 'integer')) {
                    $number = number_format($arg);
                    if ($format === null && ($pos = strpos($arg, '.')) !== false) {
                        // add decimals with unknown length
                        $number .= '.' . substr($arg, $pos + 1);
                    }

                    return $number;
                }
                throw new NotSupportedException("Message format 'number' is only supported for integer values. You have to install PHP intl extension to use this feature.");
            case 'none':
                return $arg;
            case 'select':
                /* http://icu-project.org/apiref/icu4c/classicu_1_1SelectFormat.html
                selectStyle = (selector '{' message '}')+
                */
                if (!isset($token[2])) {
                    return false;
                }
                $select = self::tokenizePattern($token[2]);
                $c = count($select);
                $message = false;
                for ($i = 0; $i + 1 < $c; $i++) {
                    if (is_array($select[$i]) || !is_array($select[$i + 1])) {
                        return false;
                    }
                    $selector = trim($select[$i++]);
                    if ($message === false && $selector === 'other' || $selector == $arg) {
                        $message = implode(',', $select[$i]);
                    }
                }
                if ($message !== false) {
                    return $this->fallbackFormat($message, $args, $locale);
                }
                break;
            case 'plural':
                /* http://icu-project.org/apiref/icu4c/classicu_1_1PluralFormat.html
                pluralStyle = [offsetValue] (selector '{' message '}')+
                offsetValue = "offset:" number
                selector = explicitValue | keyword
                explicitValue = '=' number  // adjacent, no white space in between
                keyword = [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+
                message: see MessageFormat
                */
                if (!isset($token[2])) {
                    return false;
                }
                $plural = self::tokenizePattern($token[2]);
                $c = count($plural);
                $message = false;
                $offset = 0;
                for ($i = 0; $i + 1 < $c; $i++) {
                    if (is_array($plural[$i]) || !is_array($plural[$i + 1])) {
                        return false;
                    }
                    $selector = trim($plural[$i++]);

                    if ($i == 1 && strncmp($selector, 'offset:', 7) === 0) {
                        $offset = (int) trim(mb_substr($selector, 7, ($pos = mb_strpos(str_replace(["\n", "\r", "\t"], ' ', $selector), ' ', 7, $charset)) - 7, $charset));
                        $selector = trim(mb_substr($selector, $pos + 1, mb_strlen($selector, $charset), $charset));
                    }
                    if ($message === false && $selector === 'other' ||
                        $selector[0] === '=' && (int) mb_substr($selector, 1, mb_strlen($selector, $charset), $charset) === $arg ||
                        $selector === 'one' && $arg - $offset == 1
                    ) {
                        $message = implode(',', str_replace('#', $arg - $offset, $plural[$i]));
                    }
                }
                if ($message !== false) {
                    return $this->fallbackFormat($message, $args, $locale);
                }
                break;
        }

        return false;
    }
private function parseToken($token, $args, $locale)
    {
        // parsing pattern based on ICU grammar:
        // http://icu-project.org/apiref/icu4c/classMessageFormat.html#details
        $charset = Yii::$app ? Yii::$app->charset : 'UTF-8';
        $param = trim($token[0]);
        if (isset($args[$param])) {
            $arg = $args[$param];
        } else {
            return '{' . implode(',', $token) . '}';
        }
        $type = isset($token[1]) ? trim($token[1]) : 'none';
        switch ($type) {
            case 'date':
            case 'time':
            case 'spellout':
            case 'ordinal':
            case 'duration':
            case 'choice':
            case 'selectordinal':
                throw new NotSupportedException("Message format '$type' is not supported. You have to install PHP intl extension to use this feature.");
            case 'number':
                $format = isset($token[2]) ? trim($token[2]) : null;
                if (is_numeric($arg) && ($format === null || $format === 'integer')) {
                    $number = number_format($arg);
                    if ($format === null && ($pos = strpos($arg, '.')) !== false) {
                        // add decimals with unknown length
                        $number .= '.' . substr($arg, $pos + 1);
                    }

                    return $number;
                }
                throw new NotSupportedException("Message format 'number' is only supported for integer values. You have to install PHP intl extension to use this feature.");
            case 'none':
                return $arg;
            case 'select':
                /* http://icu-project.org/apiref/icu4c/classicu_1_1SelectFormat.html
                selectStyle = (selector '{' message '}')+
                */
                if (!isset($token[2])) {
                    return false;
                }
                $select = self::tokenizePattern($token[2]);
                $c = count($select);
                $message = false;
                for ($i = 0; $i + 1 < $c; $i++) {
                    if (is_array($select[$i]) || !is_array($select[$i + 1])) {
                        return false;
                    }
                    $selector = trim($select[$i++]);
                    if ($message === false && $selector === 'other' || $selector == $arg) {
                        $message = implode(',', $select[$i]);
                    }
                }
                if ($message !== false) {
                    return $this->fallbackFormat($message, $args, $locale);
                }
                break;
            case 'plural':
                /* http://icu-project.org/apiref/icu4c/classicu_1_1PluralFormat.html
                pluralStyle = [offsetValue] (selector '{' message '}')+
                offsetValue = "offset:" number
                selector = explicitValue | keyword
                explicitValue = '=' number  // adjacent, no white space in between
                keyword = [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+
                message: see MessageFormat
                */
                if (!isset($token[2])) {
                    return false;
                }
                $plural = self::tokenizePattern($token[2]);
                $c = count($plural);
                $message = false;
                $offset = 0;
                for ($i = 0; $i + 1 < $c; $i++) {
                    if (is_array($plural[$i]) || !is_array($plural[$i + 1])) {
                        return false;
                    }
                    $selector = trim($plural[$i++]);

                    if ($i == 1 && strncmp($selector, 'offset:', 7) === 0) {
                        $offset = (int) trim(mb_substr($selector, 7, ($pos = mb_strpos(str_replace(["\n", "\r", "\t"], ' ', $selector), ' ', 7, $charset)) - 7, $charset));
                        $selector = trim(mb_substr($selector, $pos + 1, mb_strlen($selector, $charset), $charset));
                    }
                    if ($message === false && $selector === 'other' ||
                        $selector[0] === '=' && (int) mb_substr($selector, 1, mb_strlen($selector, $charset), $charset) === $arg ||
                        $selector === 'one' && $arg - $offset == 1
                    ) {
                        $message = implode(',', str_replace('#', $arg - $offset, $plural[$i]));
                    }
                }
                if ($message !== false) {
                    return $this->fallbackFormat($message, $args, $locale);
                }
                break;
        }

        return false;
    }
private function parseToken ( $ token , $ args , $ locale ) { // parsing pattern based on ICU grammar: // http://icu-project.org/apiref/icu4c/classMessageFormat.html#details $ charset = Yii :: $ app ? Yii :: $ app -> charset : 'UTF-8' ; $ param = trim ( $ token [ 0 ] ) ; if ( isset ( $ args [ $ param ] ) ) { $ arg = $ args [ $ param ] ; } else { return '{' . implode ( ',' , $ token ) . '}' ; } $ type = isset ( $ token [ 1 ] ) ? trim ( $ token [ 1 ] ) : 'none' ; switch ( $ type ) { case 'date' : case 'time' : case 'spellout' : case 'ordinal' : case 'duration' : case 'choice' : case 'selectordinal' : throw new NotSupportedException ( "Message format '$type' is not supported. You have to install PHP intl extension to use this feature." ) ; case 'number' : $ format = isset ( $ token [ 2 ] ) ? trim ( $ token [ 2 ] ) : null ; if ( is_numeric ( $ arg ) && ( $ format === null || $ format === 'integer' ) ) { $ number = number_format ( $ arg ) ; if ( $ format === null && ( $ pos = strpos ( $ arg , '.' ) ) !== false ) { // add decimals with unknown length $ number .= '.' . substr ( $ arg , $ pos + 1 ) ; } return $ number ; } throw new NotSupportedException ( "Message format 'number' is only supported for integer values. You have to install PHP intl extension to use this feature." ) ; case 'none' : return $ arg ; case 'select' : /* http://icu-project.org/apiref/icu4c/classicu_1_1SelectFormat.html
                selectStyle = (selector '{' message '}')+
                */ if ( ! isset ( $ token [ 2 ] ) ) { return false ; } $ select = self :: tokenizePattern ( $ token [ 2 ] ) ; $ c = count ( $ select ) ; $ message = false ; for ( $ i = 0 ; $ i + 1 < $ c ; $ i ++ ) { if ( is_array ( $ select [ $ i ] ) || ! is_array ( $ select [ $ i + 1 ] ) ) { return false ; } $ selector = trim ( $ select [ $ i ++ ] ) ; if ( $ message === false && $ selector === 'other' || $ selector == $ arg ) { $ message = implode ( ',' , $ select [ $ i ] ) ; } } if ( $ message !== false ) { return $ this -> fallbackFormat ( $ message , $ args , $ locale ) ; } break ; case 'plural' : /* http://icu-project.org/apiref/icu4c/classicu_1_1PluralFormat.html
                pluralStyle = [offsetValue] (selector '{' message '}')+
                offsetValue = "offset:" number
                selector = explicitValue | keyword
                explicitValue = '=' number  // adjacent, no white space in between
                keyword = [^[[:Pattern_Syntax:][:Pattern_White_Space:]]]+
                message: see MessageFormat
                */ if ( ! isset ( $ token [ 2 ] ) ) { return false ; } $ plural = self :: tokenizePattern ( $ token [ 2 ] ) ; $ c = count ( $ plural ) ; $ message = false ; $ offset = 0 ; for ( $ i = 0 ; $ i + 1 < $ c ; $ i ++ ) { if ( is_array ( $ plural [ $ i ] ) || ! is_array ( $ plural [ $ i + 1 ] ) ) { return false ; } $ selector = trim ( $ plural [ $ i ++ ] ) ; if ( $ i == 1 && strncmp ( $ selector , 'offset:' , 7 ) === 0 ) { $ offset = ( int ) trim ( mb_substr ( $ selector , 7 , ( $ pos = mb_strpos ( str_replace ( [ "\n" , "\r" , "\t" ] , ' ' , $ selector ) , ' ' , 7 , $ charset ) ) - 7 , $ charset ) ) ; $ selector = trim ( mb_substr ( $ selector , $ pos + 1 , mb_strlen ( $ selector , $ charset ) , $ charset ) ) ; } if ( $ message === false && $ selector === 'other' || $ selector [ 0 ] === '=' && ( int ) mb_substr ( $ selector , 1 , mb_strlen ( $ selector , $ charset ) , $ charset ) === $ arg || $ selector === 'one' && $ arg - $ offset == 1 ) { $ message = implode ( ',' , str_replace ( '#' , $ arg - $ offset , $ plural [ $ i ] ) ) ; } } if ( $ message !== false ) { return $ this -> fallbackFormat ( $ message , $ args , $ locale ) ; } break ; } return false ; }
Parses a token.
@param array $token the token to parse
@param array $args arguments to replace
@param string $locale the locale
@return bool|string parsed token or false on failure
@throws \yii\base\NotSupportedException when unsupported formatting is used.
Parses a token .