PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.35.1
MailPoet – Newsletters, Email Marketing, and Automation v5.35.1
5.36.1 5.36.0 5.35.1 5.35.0 5.34.3 5.34.2 5.34.1 5.34.0 5.33.1 5.33.0 5.32.0 5.31.0 5.30.0 5.29.0 5.28.1 5.28.0 5.27.0 5.26.0 5.26.1 5.25.0 5.24.0 4.43.0 4.43.1 4.44.0 4.44.1 4.45.0 4.46.0 4.47.0 4.48.0 4.48.1 4.48.2 4.49.0 4.49.1 4.5.0 4.5.1 4.5.2 4.50.0 4.50.1 4.51.0 4.51.1 4.51.2 4.52.0 4.53.0 4.54.0 4.55.0 4.56.0 4.57.0 4.58.0 4.58.1 4.58.2 4.6.0 4.6.1 4.6.2 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 5.0.0 5.0.1 5.0.2 5.1.0 5.1.1 5.10.0 5.10.1 5.11.0 5.12.0 5.12.1 5.12.10 5.12.11 5.12.12 5.12.13 5.12.2 5.12.3 5.12.4 5.12.5 5.12.6 5.12.7 5.12.8 5.12.9 5.13.0 5.13.1 5.13.2 5.14.0 5.14.1 5.14.2 5.14.3 5.15.0 5.15.1 5.16.0 5.16.1 5.16.2 5.16.3 5.16.4 5.17.0 5.17.1 5.17.2 5.17.3 5.17.4 5.17.5 5.17.6 5.18.0 5.19.0 5.2.0 5.2.1 5.2.2 5.2.3 5.20.0 5.21.0 5.21.1 5.21.2 5.21.3 5.22.0 5.22.1 5.22.2 5.22.3 5.22.4 5.23.0 5.23.1 5.23.2 5.3.0 5.3.1 5.3.2 5.3.3 5.3.4 5.3.5 5.3.6 5.3.7 5.4.0 5.4.1 5.4.2 5.5.0 5.5.1 5.5.2 5.6.0 5.6.1 5.6.2 5.6.3 5.6.4 5.7.0 5.7.1 5.8.0 5.8.1 5.9.0 3.0.0-beta.15 3.7.1 3.0.0-beta.16 3.7.2 3.0.0-beta.17 3.7.3 3.0.0-beta.18 3.7.4 3.0.0-beta.19 3.7.5 3.0.0-beta.2 3.7.6 3.0.0-beta.20 3.7.8 3.0.0-beta.21 3.70.0 3.0.0-beta.22 3.71.0 3.0.0-beta.23 3.71.1 3.0.0-beta.23.1 3.71.2 3.0.0-beta.23.2 3.71.3 3.0.0-beta.24 3.72.0 3.0.0-beta.25 3.73.0 3.0.0-beta.26 3.73.1 3.0.0-beta.27 3.73.2 3.0.0-beta.28 3.74.0 3.0.0-beta.29 3.74.1 3.0.0-beta.3 3.74.2 3.0.0-beta.30 3.74.3 3.0.0-beta.31 3.75.0 3.0.0-beta.32 3.75.1 3.0.0-beta.33 3.76.0 3.0.0-beta.33.1 3.77.0 3.0.0-beta.34.0.0 3.77.1 3.0.0-beta.36.0.0 3.78.0 3.0.0-beta.36.0.1 3.79.0 3.0.0-beta.36.2.0 3.8 3.0.0-beta.36.3.0 3.8.1 3.0.0-beta.36.3.1 3.8.2 3.0.0-beta.37.0.0 3.8.3 3.0.0-beta.4 3.8.4 3.0.0-beta.5 3.8.5 3.0.0-beta.6 3.8.6 3.0.0-beta.7 3.80.0 3.0.0-beta.7.1 3.81.0 3.0.0-beta.8 3.82.0 3.0.0-beta.9 3.83.0 3.0.0-rc.1.0.0 3.84.0 3.0.0-rc.1.0.1 3.84.1 3.0.0-rc.1.0.2 3.85.0 3.0.0-rc.1.0.3 3.85.1 3.0.0-rc.1.0.4 3.86.0 3.0.0-rc.2.0.0 3.87.0 3.0.0-rc.2.0.1 3.87.1 3.0.0-rc.2.0.2 3.87.2 3.0.0-rc.2.0.3 3.88.0 3.0.1 3.88.1 3.0.2 3.88.2 3.0.3 3.89.0 3.0.4 3.89.1 3.0.5 3.89.2 3.0.6 3.89.3 3.0.7 3.89.4 3.0.8 3.9.0 3.0.9 3.9.1 3.1.0 3.90.0 3.10 3.90.1 3.10.1 3.90.2 3.100.0 3.91.0 3.100.1 3.91.1 3.100.2 3.92.0 3.101.0 3.92.1 3.101.1 3.93.0 3.102.0 3.93.1 3.102.1 3.94.0 3.103.0 3.95.0 3.103.1 3.95.1 3.11.0 3.96.0 3.11.1 3.96.1 3.11.2 3.97.0 3.11.3 3.98.0 3.11.4 3.98.1 3.11.5 3.99.0 3.12.0 3.99.1 3.12.1 4.0.0 3.13.0 4.0.1 3.14.0 4.1.0 3.14.1 4.1.1 3.15.0 4.10.0 3.16.0 4.11.0 3.16.1 4.11.1 3.16.2 4.12.0 3.16.3 4.12.1 3.17.0 4.12.2 3.17.1 4.13.0 3.17.2 4.14.0 3.18.0 4.15.0 3.18.1 4.16.0 3.18.2 4.17.0 3.19.0 4.17.1 3.19.1 4.18.0 3.19.2 4.18.1 3.19.3 4.19.0 3.2.0 4.2.0 3.2.1 4.20.0 3.2.2 4.20.1 3.2.3 4.20.2 3.2.4 4.21.0 3.2.5 4.22.0 3.20.0 4.22.1 3.21.0 4.22.2 3.21.1 4.23.0 3.22.0 4.24.0 3.23.0 4.25.0 3.23.1 4.26.0 3.23.2 4.26.1 3.24.0 4.27.0 3.25.0 4.28.0 3.25.1 4.29.0 3.26.0 4.3.0 3.26.1 4.3.1 3.27.0 4.30.0 3.28.0 4.31.0 3.29.0 4.31.1 3.3.0 4.32.0 3.3.1 4.33.0 3.3.2 4.34.0 3.3.3 4.35.0 3.3.4 4.35.1 3.3.5 4.36.0 3.3.6 4.37.0 3.30.0 4.38.0 3.31.0 4.39.0 3.31.1 4.4.0 3.32.0 4.40.0 3.32.1 4.41.0 3.32.2 4.41.1 3.33.0 4.41.2 3.34.0 4.41.3 3.34.1 4.42.0 3.34.2 4.42.1 3.34.3 3.34.4 3.35.0 3.35.1 3.35.3 3.35.4 3.36.0 3.37.0 3.37.1 3.37.2 3.37.3 3.38.0 3.38.1 3.39.0 3.39.1 3.39.2 3.4.0 3.4.1 3.4.2 3.4.3 3.4.4 3.40.0 3.40.1 3.41.0 3.41.1 3.41.2 3.42.0 3.42.1 3.42.2 3.42.3 3.43.0 3.43.1 3.44.0 3.45.0 3.45.1 3.46.0 3.46.1 3.46.10 3.46.11 3.46.12 3.46.13 3.46.14 3.46.2 3.46.3 3.46.4 3.46.5 3.46.6 3.46.7 3.46.8 3.46.9 3.47.0 3.47.1 3.47.10 3.47.11 3.47.2 3.47.3 3.47.5 3.47.6 3.47.7 3.47.9 3.48.0 3.48.1 3.49.0 3.49.1 3.5.0 3.5.1 3.50.0 3.51.0 3.51.1 3.51.2 3.52.0 3.53.0 3.54.0 3.54.1 3.54.2 3.54.3 3.55.0 3.55.1 3.56.0 3.56.1 3.56.2 3.57.0 3.57.1 3.58.0 3.59.0 3.59.1 3.59.2 3.6.0 3.6.1 3.6.2 3.6.3 3.6.4 3.6.5 3.6.6 3.6.7 3.60.0 3.60.1 3.60.10 3.60.11 3.60.12 3.60.2 3.60.3 3.60.4 3.60.6 3.60.7 3.60.8 3.60.9 3.61.0 3.62.0 3.62.1 3.63.0 3.64.0 3.64.1 3.64.2 3.64.3 3.65.0 trunk 3.65.1 3.0.0 3.66.0 3.0.0-beta.1 3.67.0 3.0.0-beta.10 3.67.1 3.0.0-beta.11 3.68.0 3.0.0-beta.12 3.69.0 3.0.0-beta.13 3.69.1 3.0.0-beta.14 3.7.0
mailpoet / vendor-prefixed / nesbot / carbon / src / Carbon / Traits / Localization.php
mailpoet / vendor-prefixed / nesbot / carbon / src / Carbon / Traits Last commit date
Boundaries.php 4 years ago Cast.php 4 years ago Comparison.php 2 years ago Converter.php 2 years ago Creator.php 2 years ago Date.php 9 months ago DeprecatedProperties.php 4 years ago Difference.php 2 years ago IntervalRounding.php 2 years ago IntervalStep.php 4 years ago Localization.php 9 months ago Macro.php 4 years ago MagicParameter.php 2 years ago Mixin.php 2 years ago Modifiers.php 4 years ago Mutability.php 4 years ago ObjectInitialisation.php 4 years ago Options.php 2 years ago Rounding.php 2 years ago Serialization.php 2 years ago Test.php 9 months ago Timestamp.php 1 year ago ToStringFormat.php 3 years ago Units.php 2 years ago Week.php 4 years ago index.php 3 years ago
Localization.php
373 lines
1 <?php
2 namespace MailPoetVendor\Carbon\Traits;
3 if (!defined('ABSPATH')) exit;
4 use MailPoetVendor\Carbon\CarbonInterface;
5 use MailPoetVendor\Carbon\Exceptions\InvalidTypeException;
6 use MailPoetVendor\Carbon\Exceptions\NotLocaleAwareException;
7 use MailPoetVendor\Carbon\Language;
8 use MailPoetVendor\Carbon\Translator;
9 use MailPoetVendor\Carbon\TranslatorStrongTypeInterface;
10 use Closure;
11 use MailPoetVendor\Symfony\Component\Translation\TranslatorBagInterface;
12 use MailPoetVendor\Symfony\Component\Translation\TranslatorInterface;
13 use MailPoetVendor\Symfony\Contracts\Translation\LocaleAwareInterface;
14 use MailPoetVendor\Symfony\Contracts\Translation\TranslatorInterface as ContractsTranslatorInterface;
15 // @codeCoverageIgnoreStart
16 if (\interface_exists('MailPoetVendor\\Symfony\\Contracts\\Translation\\TranslatorInterface') && !\interface_exists('MailPoetVendor\\Symfony\\Component\\Translation\\TranslatorInterface')) {
17 \class_alias('MailPoetVendor\\Symfony\\Contracts\\Translation\\TranslatorInterface', 'MailPoetVendor\\Symfony\\Component\\Translation\\TranslatorInterface');
18 }
19 // @codeCoverageIgnoreEnd
20 trait Localization
21 {
22 protected static $translator;
23 protected $localTranslator;
24 protected static $humanDiffOptions = CarbonInterface::NO_ZERO_DIFF;
25 public static function setHumanDiffOptions($humanDiffOptions)
26 {
27 static::$humanDiffOptions = $humanDiffOptions;
28 }
29 public static function enableHumanDiffOption($humanDiffOption)
30 {
31 static::$humanDiffOptions = static::getHumanDiffOptions() | $humanDiffOption;
32 }
33 public static function disableHumanDiffOption($humanDiffOption)
34 {
35 static::$humanDiffOptions = static::getHumanDiffOptions() & ~$humanDiffOption;
36 }
37 public static function getHumanDiffOptions()
38 {
39 return static::$humanDiffOptions;
40 }
41 public static function getTranslator()
42 {
43 return static::translator();
44 }
45 public static function setTranslator(TranslatorInterface $translator)
46 {
47 static::$translator = $translator;
48 }
49 public function hasLocalTranslator()
50 {
51 return isset($this->localTranslator);
52 }
53 public function getLocalTranslator()
54 {
55 return $this->localTranslator ?: static::translator();
56 }
57 public function setLocalTranslator(TranslatorInterface $translator)
58 {
59 $this->localTranslator = $translator;
60 return $this;
61 }
62 public static function getTranslationMessageWith($translator, string $key, ?string $locale = null, ?string $default = null)
63 {
64 if (!($translator instanceof TranslatorBagInterface && $translator instanceof TranslatorInterface)) {
65 throw new InvalidTypeException('Translator does not implement ' . TranslatorInterface::class . ' and ' . TranslatorBagInterface::class . '. ' . (\is_object($translator) ? \get_class($translator) : \gettype($translator)) . ' has been given.');
66 }
67 if (!$locale && $translator instanceof LocaleAwareInterface) {
68 $locale = $translator->getLocale();
69 }
70 $result = self::getFromCatalogue($translator, $translator->getCatalogue($locale), $key);
71 return $result === $key ? $default : $result;
72 }
73 public function getTranslationMessage(string $key, ?string $locale = null, ?string $default = null, $translator = null)
74 {
75 return static::getTranslationMessageWith($translator ?: $this->getLocalTranslator(), $key, $locale, $default);
76 }
77 public static function translateWith(TranslatorInterface $translator, string $key, array $parameters = [], $number = null) : string
78 {
79 $message = static::getTranslationMessageWith($translator, $key, null, $key);
80 if ($message instanceof Closure) {
81 return (string) $message(...\array_values($parameters));
82 }
83 if ($number !== null) {
84 $parameters['%count%'] = $number;
85 }
86 if (isset($parameters['%count%'])) {
87 $parameters[':count'] = $parameters['%count%'];
88 }
89 // @codeCoverageIgnoreStart
90 $choice = $translator instanceof ContractsTranslatorInterface ? $translator->trans($key, $parameters) : $translator->transChoice($key, $number, $parameters);
91 // @codeCoverageIgnoreEnd
92 return (string) $choice;
93 }
94 public function translate(string $key, array $parameters = [], $number = null, ?TranslatorInterface $translator = null, bool $altNumbers = \false) : string
95 {
96 $translation = static::translateWith($translator ?: $this->getLocalTranslator(), $key, $parameters, $number);
97 if ($number !== null && $altNumbers) {
98 return \str_replace($number, $this->translateNumber($number), $translation);
99 }
100 return $translation;
101 }
102 public function translateNumber(int $number) : string
103 {
104 $translateKey = "alt_numbers.{$number}";
105 $symbol = $this->translate($translateKey);
106 if ($symbol !== $translateKey) {
107 return $symbol;
108 }
109 if ($number > 99 && $this->translate('alt_numbers.99') !== 'alt_numbers.99') {
110 $start = '';
111 foreach ([10000, 1000, 100] as $exp) {
112 $key = "alt_numbers_pow.{$exp}";
113 if ($number >= $exp && $number < $exp * 10 && ($pow = $this->translate($key)) !== $key) {
114 $unit = \floor($number / $exp);
115 $number -= $unit * $exp;
116 $start .= ($unit > 1 ? $this->translate("alt_numbers.{$unit}") : '') . $pow;
117 }
118 }
119 $result = '';
120 while ($number) {
121 $chunk = $number % 100;
122 $result = $this->translate("alt_numbers.{$chunk}") . $result;
123 $number = \floor($number / 100);
124 }
125 return "{$start}{$result}";
126 }
127 if ($number > 9 && $this->translate('alt_numbers.9') !== 'alt_numbers.9') {
128 $result = '';
129 while ($number) {
130 $chunk = $number % 10;
131 $result = $this->translate("alt_numbers.{$chunk}") . $result;
132 $number = \floor($number / 10);
133 }
134 return $result;
135 }
136 return (string) $number;
137 }
138 public static function translateTimeString($timeString, $from = null, $to = null, $mode = CarbonInterface::TRANSLATE_ALL)
139 {
140 // Fallback source and destination locales
141 $from = $from ?: static::getLocale();
142 $to = $to ?: 'en';
143 if ($from === $to) {
144 return $timeString;
145 }
146 // Standardize apostrophe
147 $timeString = \strtr($timeString, ['' => "'"]);
148 $fromTranslations = [];
149 $toTranslations = [];
150 foreach (['from', 'to'] as $key) {
151 $language = ${$key};
152 $translator = Translator::get($language);
153 $translations = $translator->getMessages();
154 if (!isset($translations[$language])) {
155 return $timeString;
156 }
157 $translationKey = $key . 'Translations';
158 $messages = $translations[$language];
159 $months = $messages['months'] ?? [];
160 $weekdays = $messages['weekdays'] ?? [];
161 $meridiem = $messages['meridiem'] ?? ['AM', 'PM'];
162 if (isset($messages['ordinal_words'])) {
163 $timeString = self::replaceOrdinalWords($timeString, $key === 'from' ? \array_flip($messages['ordinal_words']) : $messages['ordinal_words']);
164 }
165 if ($key === 'from') {
166 foreach (['months', 'weekdays'] as $variable) {
167 $list = $messages[$variable . '_standalone'] ?? null;
168 if ($list) {
169 foreach (${$variable} as $index => &$name) {
170 $name .= '|' . $messages[$variable . '_standalone'][$index];
171 }
172 }
173 }
174 }
175 ${$translationKey} = \array_merge($mode & CarbonInterface::TRANSLATE_MONTHS ? static::getTranslationArray($months, 12, $timeString) : [], $mode & CarbonInterface::TRANSLATE_MONTHS ? static::getTranslationArray($messages['months_short'] ?? [], 12, $timeString) : [], $mode & CarbonInterface::TRANSLATE_DAYS ? static::getTranslationArray($weekdays, 7, $timeString) : [], $mode & CarbonInterface::TRANSLATE_DAYS ? static::getTranslationArray($messages['weekdays_short'] ?? [], 7, $timeString) : [], $mode & CarbonInterface::TRANSLATE_DIFF ? static::translateWordsByKeys(['diff_now', 'diff_today', 'diff_yesterday', 'diff_tomorrow', 'diff_before_yesterday', 'diff_after_tomorrow'], $messages, $key) : [], $mode & CarbonInterface::TRANSLATE_UNITS ? static::translateWordsByKeys(['year', 'month', 'week', 'day', 'hour', 'minute', 'second'], $messages, $key) : [], $mode & CarbonInterface::TRANSLATE_MERIDIEM ? \array_map(function ($hour) use($meridiem) {
176 if (\is_array($meridiem)) {
177 return $meridiem[$hour < 12 ? 0 : 1];
178 }
179 return $meridiem($hour, 0, \false);
180 }, \range(0, 23)) : []);
181 }
182 return \substr(\preg_replace_callback('/(?<=[\\d\\s+.\\/,_-])(' . \implode('|', $fromTranslations) . ')(?=[\\d\\s+.\\/,_-])/iu', function ($match) use($fromTranslations, $toTranslations) {
183 [$chunk] = $match;
184 foreach ($fromTranslations as $index => $word) {
185 if (\preg_match("/^{$word}\$/iu", $chunk)) {
186 return $toTranslations[$index] ?? '';
187 }
188 }
189 return $chunk;
190 // @codeCoverageIgnore
191 }, " {$timeString} "), 1, -1);
192 }
193 public function translateTimeStringTo($timeString, $to = null)
194 {
195 return static::translateTimeString($timeString, $this->getTranslatorLocale(), $to);
196 }
197 public function locale(?string $locale = null, ...$fallbackLocales)
198 {
199 if ($locale === null) {
200 return $this->getTranslatorLocale();
201 }
202 if (!$this->localTranslator || $this->getTranslatorLocale($this->localTranslator) !== $locale) {
203 $translator = Translator::get($locale);
204 if (!empty($fallbackLocales)) {
205 $translator->setFallbackLocales($fallbackLocales);
206 foreach ($fallbackLocales as $fallbackLocale) {
207 $messages = Translator::get($fallbackLocale)->getMessages();
208 if (isset($messages[$fallbackLocale])) {
209 $translator->setMessages($fallbackLocale, $messages[$fallbackLocale]);
210 }
211 }
212 }
213 $this->localTranslator = $translator;
214 }
215 return $this;
216 }
217 public static function getLocale()
218 {
219 return static::getLocaleAwareTranslator()->getLocale();
220 }
221 public static function setLocale($locale)
222 {
223 return static::getLocaleAwareTranslator()->setLocale($locale) !== \false;
224 }
225 public static function setFallbackLocale($locale)
226 {
227 $translator = static::getTranslator();
228 if (\method_exists($translator, 'setFallbackLocales')) {
229 $translator->setFallbackLocales([$locale]);
230 if ($translator instanceof Translator) {
231 $preferredLocale = $translator->getLocale();
232 $translator->setMessages($preferredLocale, \array_replace_recursive($translator->getMessages()[$locale] ?? [], Translator::get($locale)->getMessages()[$locale] ?? [], $translator->getMessages($preferredLocale)));
233 }
234 }
235 }
236 public static function getFallbackLocale()
237 {
238 $translator = static::getTranslator();
239 if (\method_exists($translator, 'getFallbackLocales')) {
240 return $translator->getFallbackLocales()[0] ?? null;
241 }
242 return null;
243 }
244 public static function executeWithLocale($locale, $func)
245 {
246 $currentLocale = static::getLocale();
247 $result = $func(static::setLocale($locale) ? static::getLocale() : \false, static::translator());
248 static::setLocale($currentLocale);
249 return $result;
250 }
251 public static function localeHasShortUnits($locale)
252 {
253 return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) {
254 return $newLocale && (($y = static::translateWith($translator, 'y')) !== 'y' && $y !== static::translateWith($translator, 'year')) || ($y = static::translateWith($translator, 'd')) !== 'd' && $y !== static::translateWith($translator, 'day') || ($y = static::translateWith($translator, 'h')) !== 'h' && $y !== static::translateWith($translator, 'hour');
255 });
256 }
257 public static function localeHasDiffSyntax($locale)
258 {
259 return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) {
260 if (!$newLocale) {
261 return \false;
262 }
263 foreach (['ago', 'from_now', 'before', 'after'] as $key) {
264 if ($translator instanceof TranslatorBagInterface && self::getFromCatalogue($translator, $translator->getCatalogue($newLocale), $key) instanceof Closure) {
265 continue;
266 }
267 if ($translator->trans($key) === $key) {
268 return \false;
269 }
270 }
271 return \true;
272 });
273 }
274 public static function localeHasDiffOneDayWords($locale)
275 {
276 return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) {
277 return $newLocale && $translator->trans('diff_now') !== 'diff_now' && $translator->trans('diff_yesterday') !== 'diff_yesterday' && $translator->trans('diff_tomorrow') !== 'diff_tomorrow';
278 });
279 }
280 public static function localeHasDiffTwoDayWords($locale)
281 {
282 return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) {
283 return $newLocale && $translator->trans('diff_before_yesterday') !== 'diff_before_yesterday' && $translator->trans('diff_after_tomorrow') !== 'diff_after_tomorrow';
284 });
285 }
286 public static function localeHasPeriodSyntax($locale)
287 {
288 return static::executeWithLocale($locale, function ($newLocale, TranslatorInterface $translator) {
289 return $newLocale && $translator->trans('period_recurrences') !== 'period_recurrences' && $translator->trans('period_interval') !== 'period_interval' && $translator->trans('period_start_date') !== 'period_start_date' && $translator->trans('period_end_date') !== 'period_end_date';
290 });
291 }
292 public static function getAvailableLocales()
293 {
294 $translator = static::getLocaleAwareTranslator();
295 return $translator instanceof Translator ? $translator->getAvailableLocales() : [$translator->getLocale()];
296 }
297 public static function getAvailableLocalesInfo()
298 {
299 $languages = [];
300 foreach (static::getAvailableLocales() as $id) {
301 $languages[$id] = new Language($id);
302 }
303 return $languages;
304 }
305 protected static function translator()
306 {
307 if (static::$translator === null) {
308 static::$translator = Translator::get();
309 }
310 return static::$translator;
311 }
312 protected function getTranslatorLocale($translator = null) : ?string
313 {
314 if (\func_num_args() === 0) {
315 $translator = $this->getLocalTranslator();
316 }
317 $translator = static::getLocaleAwareTranslator($translator);
318 return $translator ? $translator->getLocale() : null;
319 }
320 protected static function getLocaleAwareTranslator($translator = null)
321 {
322 if (\func_num_args() === 0) {
323 $translator = static::translator();
324 }
325 if ($translator && !($translator instanceof LocaleAwareInterface || \method_exists($translator, 'getLocale'))) {
326 throw new NotLocaleAwareException($translator);
327 // @codeCoverageIgnore
328 }
329 return $translator;
330 }
331 private static function getFromCatalogue($translator, $catalogue, string $id, string $domain = 'messages')
332 {
333 return $translator instanceof TranslatorStrongTypeInterface ? $translator->getFromCatalogue($catalogue, $id, $domain) : $catalogue->get($id, $domain);
334 }
335 private static function cleanWordFromTranslationString($word)
336 {
337 $word = \str_replace([':count', '%count', ':time'], '', $word);
338 $word = \strtr($word, ['' => "'"]);
339 $word = \preg_replace('/({\\d+(,(\\d+|Inf))?}|[\\[\\]]\\d+(,(\\d+|Inf))?[\\[\\]])/', '', $word);
340 return \trim($word);
341 }
342 private static function translateWordsByKeys($keys, $messages, $key) : array
343 {
344 return \array_map(function ($wordKey) use($messages, $key) {
345 $message = $key === 'from' && isset($messages[$wordKey . '_regexp']) ? $messages[$wordKey . '_regexp'] : $messages[$wordKey] ?? null;
346 if (!$message) {
347 return '>>DO NOT REPLACE<<';
348 }
349 $parts = \explode('|', $message);
350 return $key === 'to' ? self::cleanWordFromTranslationString(\end($parts)) : '(?:' . \implode('|', \array_map([static::class, 'cleanWordFromTranslationString'], $parts)) . ')';
351 }, $keys);
352 }
353 private static function getTranslationArray($translation, $length, $timeString) : array
354 {
355 $filler = '>>DO NOT REPLACE<<';
356 if (\is_array($translation)) {
357 return \array_pad($translation, $length, $filler);
358 }
359 $list = [];
360 $date = static::now();
361 for ($i = 0; $i < $length; $i++) {
362 $list[] = $translation($date, $timeString, $i) ?? $filler;
363 }
364 return $list;
365 }
366 private static function replaceOrdinalWords(string $timeString, array $ordinalWords) : string
367 {
368 return \preg_replace_callback('/(?<![a-z])[a-z]+(?![a-z])/i', function (array $match) use($ordinalWords) {
369 return $ordinalWords[\mb_strtolower($match[0])] ?? $match[0];
370 }, $timeString);
371 }
372 }
373