vendor/symfony/src/Symfony/Component/Translation/MessageSelector.php
author ymh <ymh.work@gmail.com>
Sat, 24 Sep 2011 15:40:41 +0200
changeset 0 7f95f8617b0b
permissions -rwxr-xr-x
first commit
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     1
<?php
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     2
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     3
/*
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     4
 * This file is part of the Symfony package.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     5
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     6
 * (c) Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     7
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     8
 * For the full copyright and license information, please view the LICENSE
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
     9
 * file that was distributed with this source code.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    10
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    11
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    12
namespace Symfony\Component\Translation;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    13
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    14
/**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    15
 * MessageSelector.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    16
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    17
 * @author Fabien Potencier <fabien@symfony.com>
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    18
 *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    19
 * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    20
 */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    21
class MessageSelector
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    22
{
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    23
    /**
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    24
     * Given a message with different plural translations separated by a
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    25
     * pipe (|), this method returns the correct portion of the message based
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    26
     * on the given number, locale and the pluralization rules in the message
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    27
     * itself.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    28
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    29
     * The message supports two different types of pluralization rules:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    30
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    31
     * interval: {0} There is no apples|{1} There is one apple|]1,Inf] There is %count% apples
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    32
     * indexed:  There is one apple|There is %count% apples
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    33
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    34
     * The indexed solution can also contain labels (e.g. one: There is one apple).
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    35
     * This is purely for making the translations more clear - it does not
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    36
     * affect the functionality.
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    37
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    38
     * The two methods can also be mixed:
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    39
     *     {0} There is no apples|one: There is one apple|more: There is %count% apples
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    40
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    41
     * @throws InvalidArgumentException
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    42
     * @param  string $message The message being translated
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    43
     * @param  integer $number The number of items represented for the message
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    44
     * @param  string $locale The locale to use for choosing
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    45
     * @return string
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    46
     *
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    47
     * @api
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    48
     */
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    49
    public function choose($message, $number, $locale)
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    50
    {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    51
        $parts = explode('|', $message);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    52
        $explicitRules = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    53
        $standardRules = array();
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    54
        foreach ($parts as $part) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    55
            $part = trim($part);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    56
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    57
            if (preg_match('/^(?<interval>'.Interval::getIntervalRegexp().')\s+(?<message>.+?)$/x', $part, $matches)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    58
                $explicitRules[$matches['interval']] = $matches['message'];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    59
            } elseif (preg_match('/^\w+\: +(.+)$/', $part, $matches)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    60
                $standardRules[] = $matches[1];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    61
            } else {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    62
                $standardRules[] = $part;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    63
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    64
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    65
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    66
        // try to match an explicit rule, then fallback to the standard ones
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    67
        foreach ($explicitRules as $interval => $m) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    68
            if (Interval::test($number, $interval)) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    69
                return $m;
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    70
            }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    71
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    72
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    73
        $position = PluralizationRules::get($number, $locale);
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    74
        if (!isset($standardRules[$position])) {
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    75
            throw new \InvalidArgumentException('Unable to choose a translation.');
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    76
        }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    77
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    78
        return $standardRules[$position];
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    79
    }
7f95f8617b0b first commit
ymh <ymh.work@gmail.com>
parents:
diff changeset
    80
}