1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
namespace Polyglot\Pluralization; |
6
|
|
|
|
7
|
|
|
use Polyglot\Pluralization\Rules\Arabic; |
8
|
|
|
use Polyglot\Pluralization\Rules\BosnianSerbian; |
9
|
|
|
use Polyglot\Pluralization\Rules\Chinese; |
10
|
|
|
use Polyglot\Pluralization\Rules\Croatian; |
11
|
|
|
use Polyglot\Pluralization\Rules\Czech; |
12
|
|
|
use Polyglot\Pluralization\Rules\French; |
13
|
|
|
use Polyglot\Pluralization\Rules\German; |
14
|
|
|
use Polyglot\Pluralization\Rules\Icelandic; |
15
|
|
|
use Polyglot\Pluralization\Rules\Lithuanian; |
16
|
|
|
use Polyglot\Pluralization\Rules\Polish; |
17
|
|
|
use Polyglot\Pluralization\Rules\RuleInterface; |
18
|
|
|
use Polyglot\Pluralization\Rules\Russian; |
19
|
|
|
use Polyglot\Pluralization\Rules\Slovenian; |
20
|
|
|
use RuntimeException; |
21
|
|
|
|
22
|
|
|
/** |
23
|
|
|
* Rule factory which crafts a pluralization rule depending on the provided locale. |
24
|
|
|
* |
25
|
|
|
* @package Polyglot/Pluralization |
26
|
|
|
* @author Mihai MATEI <[email protected]> |
27
|
|
|
*/ |
28
|
|
|
class RuleFactory |
29
|
|
|
{ |
30
|
|
|
/** |
31
|
|
|
* @var array |
32
|
|
|
*/ |
33
|
|
|
private static $localesRulesMapping = [ |
34
|
|
|
'ar' => Arabic::class, |
35
|
|
|
'bs-Latn-BA' => BosnianSerbian::class, |
36
|
|
|
'bs-Cyrl-BA' => BosnianSerbian::class, |
37
|
|
|
'srl-RS' => BosnianSerbian::class, |
38
|
|
|
'sr-RS' => BosnianSerbian::class, |
39
|
|
|
'id' => Chinese::class, |
40
|
|
|
'id-ID' => Chinese::class, |
41
|
|
|
'ja' => Chinese::class, |
42
|
|
|
'ko' => Chinese::class, |
43
|
|
|
'ko-KR' => Chinese::class, |
44
|
|
|
'lo' => Chinese::class, |
45
|
|
|
'ms' => Chinese::class, |
46
|
|
|
'th' => Chinese::class, |
47
|
|
|
'th-TH' => Chinese::class, |
48
|
|
|
'zh' => Chinese::class, |
49
|
|
|
'hr' => Croatian::class, |
50
|
|
|
'hr-HR' => Croatian::class, |
51
|
|
|
'fr' => French::class, |
52
|
|
|
'tl' => French::class, |
53
|
|
|
'pt-br' => French::class, |
54
|
|
|
'ru' => Russian::class, |
55
|
|
|
'ru-RU' => Russian::class, |
56
|
|
|
'lt' => Lithuanian::class, |
57
|
|
|
'cs' => Czech::class, |
58
|
|
|
'cs-CZ' => Czech::class, |
59
|
|
|
'sk' => Czech::class, |
60
|
|
|
'pl' => Polish::class, |
61
|
|
|
'is' => Icelandic::class, |
62
|
|
|
'sl-SL' => Slovenian::class, |
63
|
|
|
]; |
64
|
|
|
|
65
|
|
|
/** |
66
|
|
|
* Make a new pluralization rule. |
67
|
|
|
* |
68
|
|
|
* @param string $locale |
69
|
|
|
* @param array $customPluralRules |
70
|
|
|
* |
71
|
|
|
* @return RuleInterface |
72
|
|
|
*/ |
73
|
|
|
public static function make(string $locale, array $customPluralRules = []): RuleInterface |
74
|
|
|
{ |
75
|
|
|
if (isset($customPluralRules[$locale])) { |
76
|
|
|
if (!is_object($customPluralRules[$locale]) || !$customPluralRules[$locale] instanceof RuleInterface) { |
77
|
|
|
throw new RuntimeException('All custom plural rules must be classes ' |
78
|
|
|
. 'which implement the interface Polyglot\Pluralization\Rules\RuleInterface'); |
79
|
|
|
} |
80
|
|
|
|
81
|
|
|
return $customPluralRules[$locale]; |
82
|
|
|
} |
83
|
|
|
|
84
|
|
|
$rule = self::$localesRulesMapping[$locale] ?? German::class; |
85
|
|
|
|
86
|
|
|
return new $rule(); |
87
|
|
|
} |
88
|
|
|
} |