1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
namespace Efabrica\Translatte; |
6
|
|
|
|
7
|
|
|
class PluralForm |
8
|
|
|
{ |
9
|
9 |
|
public static function get(int $number, string $lang): int |
10
|
|
|
{ |
11
|
9 |
|
if ($lang === 'pt_BR') { |
12
|
|
|
// temporary set a locale for brazilian |
13
|
|
|
$lang = 'xbr'; |
14
|
|
|
} |
15
|
|
|
|
16
|
9 |
|
if (strlen($lang) > 3) { |
17
|
9 |
|
$lang = substr($lang, 0, -strlen((string) strrchr($lang, '_'))); |
18
|
|
|
} |
19
|
|
|
|
20
|
9 |
|
if (in_array($lang, ['az', 'bo', 'dz', 'id', 'ja', 'jv', 'ka', 'km', 'kn', 'ko', 'ms', 'th', 'tr', 'vi', 'zh'])) { |
21
|
|
|
return 0; |
22
|
|
|
} |
23
|
|
|
|
24
|
9 |
|
if (in_array($lang, ['af', 'bn', 'bg', 'ca', 'da', 'de', 'el', 'en', 'eo', 'es', 'et', 'eu', 'fa', 'fi', 'fo', 'fur', 'fy', 'gl', 'gu', 'ha', 'he', 'hu', 'is', 'it', 'ku', 'lb', 'ml', 'mn', 'mr', 'nah', 'nb', 'ne', 'nl', 'nn', 'no', 'oc', 'om', 'or', 'pa', 'pap', 'ps', 'pt', 'so', 'sq', 'sv', 'sw', 'ta', 'te', 'tk', 'ur', 'zu'])) { |
25
|
9 |
|
return ($number === 1) ? 0 : 1; |
26
|
|
|
} |
27
|
|
|
|
28
|
9 |
|
if (in_array($lang, ['am', 'bh', 'fil', 'fr', 'gun', 'hi', 'hy', 'ln', 'mg', 'nso', 'xbr', 'ti', 'wa'])) { |
29
|
|
|
return (($number === 0) || ($number === 1)) ? 0 : 1; |
30
|
|
|
} |
31
|
|
|
|
32
|
9 |
|
if (in_array($lang, ['be', 'bs', 'hr', 'ru', 'sh', 'sr', 'uk'])) { |
33
|
|
|
return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); |
34
|
|
|
} |
35
|
|
|
|
36
|
9 |
|
if (in_array($lang, ['cs', 'sk'])) { |
37
|
9 |
|
return (1 == $number) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2); |
38
|
|
|
} |
39
|
|
|
|
40
|
|
|
if (in_array($lang, ['ga'])) { |
41
|
|
|
return (1 == $number) ? 0 : ((2 == $number) ? 1 : 2); |
42
|
|
|
} |
43
|
|
|
|
44
|
|
|
if (in_array($lang, ['lt'])) { |
45
|
|
|
return ((1 == $number % 10) && (11 != $number % 100)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2); |
46
|
|
|
} |
47
|
|
|
|
48
|
|
|
if (in_array($lang, ['sl'])) { |
49
|
|
|
return (1 == $number % 100) ? 0 : ((2 == $number % 100) ? 1 : (((3 == $number % 100) || (4 == $number % 100)) ? 2 : 3)); |
50
|
|
|
} |
51
|
|
|
|
52
|
|
|
if (in_array($lang, ['mk'])) { |
53
|
|
|
return (1 == $number % 10) ? 0 : 1; |
54
|
|
|
} |
55
|
|
|
|
56
|
|
|
if (in_array($lang, ['mt'])) { |
57
|
|
|
return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3)); |
58
|
|
|
} |
59
|
|
|
|
60
|
|
|
if (in_array($lang, ['lv'])) { |
61
|
|
|
return (0 == $number) ? 0 : (((1 == $number % 10) && (11 != $number % 100)) ? 1 : 2); |
62
|
|
|
} |
63
|
|
|
|
64
|
|
|
if (in_array($lang, ['pl'])) { |
65
|
|
|
return (1 == $number) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2); |
66
|
|
|
} |
67
|
|
|
|
68
|
|
|
if (in_array($lang, ['cy'])) { |
69
|
|
|
return (1 == $number) ? 0 : ((2 == $number) ? 1 : (((8 == $number) || (11 == $number)) ? 2 : 3)); |
70
|
|
|
} |
71
|
|
|
|
72
|
|
|
if (in_array($lang, ['ro'])) { |
73
|
|
|
return (1 == $number) ? 0 : (((0 == $number) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2); |
74
|
|
|
} |
75
|
|
|
|
76
|
|
|
if (in_array($lang, ['ar'])) { |
77
|
|
|
return (0 == $number) ? 0 : ((1 == $number) ? 1 : ((2 == $number) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5)))); |
78
|
|
|
} |
79
|
|
|
|
80
|
|
|
return 0; |
81
|
|
|
} |
82
|
|
|
} |
83
|
|
|
|