Subversion-Projekte lars-tiefland.laravel_shop

Revision

Zur aktuellen Revision | Details | Letzte Änderung | Log anzeigen | RSS feed

Revision Autor Zeilennr. Zeile
148 lars 1
<?php
2
 
3
namespace Illuminate\Translation;
4
 
5
class MessageSelector
6
{
7
    /**
8
     * Select a proper translation string based on the given number.
9
     *
10
     * @param  string  $line
11
     * @param  int  $number
12
     * @param  string  $locale
13
     * @return mixed
14
     */
15
    public function choose($line, $number, $locale)
16
    {
17
        $segments = explode('|', $line);
18
 
19
        if (($value = $this->extract($segments, $number)) !== null) {
20
            return trim($value);
21
        }
22
 
23
        $segments = $this->stripConditions($segments);
24
 
25
        $pluralIndex = $this->getPluralIndex($locale, $number);
26
 
27
        if (count($segments) === 1 || ! isset($segments[$pluralIndex])) {
28
            return $segments[0];
29
        }
30
 
31
        return $segments[$pluralIndex];
32
    }
33
 
34
    /**
35
     * Extract a translation string using inline conditions.
36
     *
37
     * @param  array  $segments
38
     * @param  int  $number
39
     * @return mixed
40
     */
41
    private function extract($segments, $number)
42
    {
43
        foreach ($segments as $part) {
44
            if (! is_null($line = $this->extractFromString($part, $number))) {
45
                return $line;
46
            }
47
        }
48
    }
49
 
50
    /**
51
     * Get the translation string if the condition matches.
52
     *
53
     * @param  string  $part
54
     * @param  int  $number
55
     * @return mixed
56
     */
57
    private function extractFromString($part, $number)
58
    {
59
        preg_match('/^[\{\[]([^\[\]\{\}]*)[\}\]](.*)/s', $part, $matches);
60
 
61
        if (count($matches) !== 3) {
62
            return null;
63
        }
64
 
65
        $condition = $matches[1];
66
 
67
        $value = $matches[2];
68
 
69
        if (str_contains($condition, ',')) {
70
            [$from, $to] = explode(',', $condition, 2);
71
 
72
            if ($to === '*' && $number >= $from) {
73
                return $value;
74
            } elseif ($from === '*' && $number <= $to) {
75
                return $value;
76
            } elseif ($number >= $from && $number <= $to) {
77
                return $value;
78
            }
79
        }
80
 
81
        return $condition == $number ? $value : null;
82
    }
83
 
84
    /**
85
     * Strip the inline conditions from each segment, just leaving the text.
86
     *
87
     * @param  array  $segments
88
     * @return array
89
     */
90
    private function stripConditions($segments)
91
    {
92
        return collect($segments)->map(function ($part) {
93
            return preg_replace('/^[\{\[]([^\[\]\{\}]*)[\}\]]/', '', $part);
94
        })->all();
95
    }
96
 
97
    /**
98
     * Get the index to use for pluralization.
99
     *
100
     * The plural rules are derived from code of the Zend Framework (2010-09-25), which
101
     * is subject to the new BSD license (https://framework.zend.com/license)
102
     * Copyright (c) 2005-2010 - Zend Technologies USA Inc. (http://www.zend.com)
103
     *
104
     * @param  string  $locale
105
     * @param  int  $number
106
     * @return int
107
     */
108
    public function getPluralIndex($locale, $number)
109
    {
110
        switch ($locale) {
111
            case 'az':
112
            case 'az_AZ':
113
            case 'bo':
114
            case 'bo_CN':
115
            case 'bo_IN':
116
            case 'dz':
117
            case 'dz_BT':
118
            case 'id':
119
            case 'id_ID':
120
            case 'ja':
121
            case 'ja_JP':
122
            case 'jv':
123
            case 'ka':
124
            case 'ka_GE':
125
            case 'km':
126
            case 'km_KH':
127
            case 'kn':
128
            case 'kn_IN':
129
            case 'ko':
130
            case 'ko_KR':
131
            case 'ms':
132
            case 'ms_MY':
133
            case 'th':
134
            case 'th_TH':
135
            case 'tr':
136
            case 'tr_CY':
137
            case 'tr_TR':
138
            case 'vi':
139
            case 'vi_VN':
140
            case 'zh':
141
            case 'zh_CN':
142
            case 'zh_HK':
143
            case 'zh_SG':
144
            case 'zh_TW':
145
                return 0;
146
            case 'af':
147
            case 'af_ZA':
148
            case 'bn':
149
            case 'bn_BD':
150
            case 'bn_IN':
151
            case 'bg':
152
            case 'bg_BG':
153
            case 'ca':
154
            case 'ca_AD':
155
            case 'ca_ES':
156
            case 'ca_FR':
157
            case 'ca_IT':
158
            case 'da':
159
            case 'da_DK':
160
            case 'de':
161
            case 'de_AT':
162
            case 'de_BE':
163
            case 'de_CH':
164
            case 'de_DE':
165
            case 'de_LI':
166
            case 'de_LU':
167
            case 'el':
168
            case 'el_CY':
169
            case 'el_GR':
170
            case 'en':
171
            case 'en_AG':
172
            case 'en_AU':
173
            case 'en_BW':
174
            case 'en_CA':
175
            case 'en_DK':
176
            case 'en_GB':
177
            case 'en_HK':
178
            case 'en_IE':
179
            case 'en_IN':
180
            case 'en_NG':
181
            case 'en_NZ':
182
            case 'en_PH':
183
            case 'en_SG':
184
            case 'en_US':
185
            case 'en_ZA':
186
            case 'en_ZM':
187
            case 'en_ZW':
188
            case 'eo':
189
            case 'eo_US':
190
            case 'es':
191
            case 'es_AR':
192
            case 'es_BO':
193
            case 'es_CL':
194
            case 'es_CO':
195
            case 'es_CR':
196
            case 'es_CU':
197
            case 'es_DO':
198
            case 'es_EC':
199
            case 'es_ES':
200
            case 'es_GT':
201
            case 'es_HN':
202
            case 'es_MX':
203
            case 'es_NI':
204
            case 'es_PA':
205
            case 'es_PE':
206
            case 'es_PR':
207
            case 'es_PY':
208
            case 'es_SV':
209
            case 'es_US':
210
            case 'es_UY':
211
            case 'es_VE':
212
            case 'et':
213
            case 'et_EE':
214
            case 'eu':
215
            case 'eu_ES':
216
            case 'eu_FR':
217
            case 'fa':
218
            case 'fa_IR':
219
            case 'fi':
220
            case 'fi_FI':
221
            case 'fo':
222
            case 'fo_FO':
223
            case 'fur':
224
            case 'fur_IT':
225
            case 'fy':
226
            case 'fy_DE':
227
            case 'fy_NL':
228
            case 'gl':
229
            case 'gl_ES':
230
            case 'gu':
231
            case 'gu_IN':
232
            case 'ha':
233
            case 'ha_NG':
234
            case 'he':
235
            case 'he_IL':
236
            case 'hu':
237
            case 'hu_HU':
238
            case 'is':
239
            case 'is_IS':
240
            case 'it':
241
            case 'it_CH':
242
            case 'it_IT':
243
            case 'ku':
244
            case 'ku_TR':
245
            case 'lb':
246
            case 'lb_LU':
247
            case 'ml':
248
            case 'ml_IN':
249
            case 'mn':
250
            case 'mn_MN':
251
            case 'mr':
252
            case 'mr_IN':
253
            case 'nah':
254
            case 'nb':
255
            case 'nb_NO':
256
            case 'ne':
257
            case 'ne_NP':
258
            case 'nl':
259
            case 'nl_AW':
260
            case 'nl_BE':
261
            case 'nl_NL':
262
            case 'nn':
263
            case 'nn_NO':
264
            case 'no':
265
            case 'om':
266
            case 'om_ET':
267
            case 'om_KE':
268
            case 'or':
269
            case 'or_IN':
270
            case 'pa':
271
            case 'pa_IN':
272
            case 'pa_PK':
273
            case 'pap':
274
            case 'pap_AN':
275
            case 'pap_AW':
276
            case 'pap_CW':
277
            case 'ps':
278
            case 'ps_AF':
279
            case 'pt':
280
            case 'pt_BR':
281
            case 'pt_PT':
282
            case 'so':
283
            case 'so_DJ':
284
            case 'so_ET':
285
            case 'so_KE':
286
            case 'so_SO':
287
            case 'sq':
288
            case 'sq_AL':
289
            case 'sq_MK':
290
            case 'sv':
291
            case 'sv_FI':
292
            case 'sv_SE':
293
            case 'sw':
294
            case 'sw_KE':
295
            case 'sw_TZ':
296
            case 'ta':
297
            case 'ta_IN':
298
            case 'ta_LK':
299
            case 'te':
300
            case 'te_IN':
301
            case 'tk':
302
            case 'tk_TM':
303
            case 'ur':
304
            case 'ur_IN':
305
            case 'ur_PK':
306
            case 'zu':
307
            case 'zu_ZA':
308
                return ($number == 1) ? 0 : 1;
309
            case 'am':
310
            case 'am_ET':
311
            case 'bh':
312
            case 'fil':
313
            case 'fil_PH':
314
            case 'fr':
315
            case 'fr_BE':
316
            case 'fr_CA':
317
            case 'fr_CH':
318
            case 'fr_FR':
319
            case 'fr_LU':
320
            case 'gun':
321
            case 'hi':
322
            case 'hi_IN':
323
            case 'hy':
324
            case 'hy_AM':
325
            case 'ln':
326
            case 'ln_CD':
327
            case 'mg':
328
            case 'mg_MG':
329
            case 'nso':
330
            case 'nso_ZA':
331
            case 'ti':
332
            case 'ti_ER':
333
            case 'ti_ET':
334
            case 'wa':
335
            case 'wa_BE':
336
            case 'xbr':
337
                return (($number == 0) || ($number == 1)) ? 0 : 1;
338
            case 'be':
339
            case 'be_BY':
340
            case 'bs':
341
            case 'bs_BA':
342
            case 'hr':
343
            case 'hr_HR':
344
            case 'ru':
345
            case 'ru_RU':
346
            case 'ru_UA':
347
            case 'sr':
348
            case 'sr_ME':
349
            case 'sr_RS':
350
            case 'uk':
351
            case 'uk_UA':
352
                return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
353
            case 'cs':
354
            case 'cs_CZ':
355
            case 'sk':
356
            case 'sk_SK':
357
                return ($number == 1) ? 0 : ((($number >= 2) && ($number <= 4)) ? 1 : 2);
358
            case 'ga':
359
            case 'ga_IE':
360
                return ($number == 1) ? 0 : (($number == 2) ? 1 : 2);
361
            case 'lt':
362
            case 'lt_LT':
363
                return (($number % 10 == 1) && ($number % 100 != 11)) ? 0 : ((($number % 10 >= 2) && (($number % 100 < 10) || ($number % 100 >= 20))) ? 1 : 2);
364
            case 'sl':
365
            case 'sl_SI':
366
                return ($number % 100 == 1) ? 0 : (($number % 100 == 2) ? 1 : ((($number % 100 == 3) || ($number % 100 == 4)) ? 2 : 3));
367
            case 'mk':
368
            case 'mk_MK':
369
                return ($number % 10 == 1) ? 0 : 1;
370
            case 'mt':
371
            case 'mt_MT':
372
                return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 1) && ($number % 100 < 11))) ? 1 : ((($number % 100 > 10) && ($number % 100 < 20)) ? 2 : 3));
373
            case 'lv':
374
            case 'lv_LV':
375
                return ($number == 0) ? 0 : ((($number % 10 == 1) && ($number % 100 != 11)) ? 1 : 2);
376
            case 'pl':
377
            case 'pl_PL':
378
                return ($number == 1) ? 0 : ((($number % 10 >= 2) && ($number % 10 <= 4) && (($number % 100 < 12) || ($number % 100 > 14))) ? 1 : 2);
379
            case 'cy':
380
            case 'cy_GB':
381
                return ($number == 1) ? 0 : (($number == 2) ? 1 : ((($number == 8) || ($number == 11)) ? 2 : 3));
382
            case 'ro':
383
            case 'ro_RO':
384
                return ($number == 1) ? 0 : ((($number == 0) || (($number % 100 > 0) && ($number % 100 < 20))) ? 1 : 2);
385
            case 'ar':
386
            case 'ar_AE':
387
            case 'ar_BH':
388
            case 'ar_DZ':
389
            case 'ar_EG':
390
            case 'ar_IN':
391
            case 'ar_IQ':
392
            case 'ar_JO':
393
            case 'ar_KW':
394
            case 'ar_LB':
395
            case 'ar_LY':
396
            case 'ar_MA':
397
            case 'ar_OM':
398
            case 'ar_QA':
399
            case 'ar_SA':
400
            case 'ar_SD':
401
            case 'ar_SS':
402
            case 'ar_SY':
403
            case 'ar_TN':
404
            case 'ar_YE':
405
                return ($number == 0) ? 0 : (($number == 1) ? 1 : (($number == 2) ? 2 : ((($number % 100 >= 3) && ($number % 100 <= 10)) ? 3 : ((($number % 100 >= 11) && ($number % 100 <= 99)) ? 4 : 5))));
406
            default:
407
                return 0;
408
        }
409
    }
410
}