PluginProbe ʕ •ᴥ•ʔ
MailPoet – Newsletters, Email Marketing, and Automation / 5.36.0
MailPoet – Newsletters, Email Marketing, and Automation v5.36.0
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 / symfony / translation / Translator.php
mailpoet / vendor-prefixed / symfony / translation Last commit date
Exception 1 year ago Provider 1 year ago Test 1 year ago Util 1 year ago DataCollectorTranslator.php 1 year ago IdentityTranslator.php 1 year ago LoggingTranslator.php 1 year ago MessageCatalogue.php 1 year ago MessageCatalogueInterface.php 1 year ago MetadataAwareInterface.php 1 year ago PseudoLocalizationTranslator.php 1 year ago TranslatableMessage.php 1 year ago Translator.php 1 year ago TranslatorBag.php 1 year ago TranslatorBagInterface.php 1 year ago index.php 3 years ago
Translator.php
297 lines
1 <?php
2 namespace MailPoetVendor\Symfony\Component\Translation;
3 if (!defined('ABSPATH')) exit;
4 use MailPoetVendor\Symfony\Component\Config\ConfigCacheFactory;
5 use MailPoetVendor\Symfony\Component\Config\ConfigCacheFactoryInterface;
6 use MailPoetVendor\Symfony\Component\Config\ConfigCacheInterface;
7 use MailPoetVendor\Symfony\Component\Translation\Exception\InvalidArgumentException;
8 use MailPoetVendor\Symfony\Component\Translation\Exception\NotFoundResourceException;
9 use MailPoetVendor\Symfony\Component\Translation\Exception\RuntimeException;
10 use MailPoetVendor\Symfony\Component\Translation\Formatter\IntlFormatterInterface;
11 use MailPoetVendor\Symfony\Component\Translation\Formatter\MessageFormatter;
12 use MailPoetVendor\Symfony\Component\Translation\Formatter\MessageFormatterInterface;
13 use MailPoetVendor\Symfony\Component\Translation\Loader\LoaderInterface;
14 use MailPoetVendor\Symfony\Contracts\Translation\LocaleAwareInterface;
15 use MailPoetVendor\Symfony\Contracts\Translation\TranslatorInterface;
16 // Help opcache.preload discover always-needed symbols
17 \class_exists(MessageCatalogue::class);
18 class Translator implements TranslatorInterface, TranslatorBagInterface, LocaleAwareInterface
19 {
20 protected $catalogues = [];
21 private $locale;
22 private $fallbackLocales = [];
23 private $loaders = [];
24 private $resources = [];
25 private $formatter;
26 private $cacheDir;
27 private $debug;
28 private $cacheVary;
29 private $configCacheFactory;
30 private $parentLocales;
31 private $hasIntlFormatter;
32 public function __construct(string $locale, ?MessageFormatterInterface $formatter = null, ?string $cacheDir = null, bool $debug = \false, array $cacheVary = [])
33 {
34 $this->setLocale($locale);
35 if (null === $formatter) {
36 $formatter = new MessageFormatter();
37 }
38 $this->formatter = $formatter;
39 $this->cacheDir = $cacheDir;
40 $this->debug = $debug;
41 $this->cacheVary = $cacheVary;
42 $this->hasIntlFormatter = $formatter instanceof IntlFormatterInterface;
43 }
44 public function setConfigCacheFactory(ConfigCacheFactoryInterface $configCacheFactory)
45 {
46 $this->configCacheFactory = $configCacheFactory;
47 }
48 public function addLoader(string $format, LoaderInterface $loader)
49 {
50 $this->loaders[$format] = $loader;
51 }
52 public function addResource(string $format, $resource, string $locale, ?string $domain = null)
53 {
54 if (null === $domain) {
55 $domain = 'messages';
56 }
57 $this->assertValidLocale($locale);
58 $locale ?: ($locale = \class_exists(\Locale::class) ? \Locale::getDefault() : 'en');
59 $this->resources[$locale][] = [$format, $resource, $domain];
60 if (\in_array($locale, $this->fallbackLocales)) {
61 $this->catalogues = [];
62 } else {
63 unset($this->catalogues[$locale]);
64 }
65 }
66 public function setLocale(string $locale)
67 {
68 $this->assertValidLocale($locale);
69 $this->locale = $locale;
70 }
71 public function getLocale()
72 {
73 return $this->locale ?: (\class_exists(\Locale::class) ? \Locale::getDefault() : 'en');
74 }
75 public function setFallbackLocales(array $locales)
76 {
77 // needed as the fallback locales are linked to the already loaded catalogues
78 $this->catalogues = [];
79 foreach ($locales as $locale) {
80 $this->assertValidLocale($locale);
81 }
82 $this->fallbackLocales = $this->cacheVary['fallback_locales'] = $locales;
83 }
84 public function getFallbackLocales() : array
85 {
86 return $this->fallbackLocales;
87 }
88 public function trans(?string $id, array $parameters = [], ?string $domain = null, ?string $locale = null)
89 {
90 if (null === $id || '' === $id) {
91 return '';
92 }
93 if (null === $domain) {
94 $domain = 'messages';
95 }
96 $catalogue = $this->getCatalogue($locale);
97 $locale = $catalogue->getLocale();
98 while (!$catalogue->defines($id, $domain)) {
99 if ($cat = $catalogue->getFallbackCatalogue()) {
100 $catalogue = $cat;
101 $locale = $catalogue->getLocale();
102 } else {
103 break;
104 }
105 }
106 $len = \strlen(MessageCatalogue::INTL_DOMAIN_SUFFIX);
107 if ($this->hasIntlFormatter && ($catalogue->defines($id, $domain . MessageCatalogue::INTL_DOMAIN_SUFFIX) || \strlen($domain) > $len && 0 === \substr_compare($domain, MessageCatalogue::INTL_DOMAIN_SUFFIX, -$len, $len))) {
108 return $this->formatter->formatIntl($catalogue->get($id, $domain), $locale, $parameters);
109 }
110 return $this->formatter->format($catalogue->get($id, $domain), $locale, $parameters);
111 }
112 public function getCatalogue(?string $locale = null)
113 {
114 if (!$locale) {
115 $locale = $this->getLocale();
116 } else {
117 $this->assertValidLocale($locale);
118 }
119 if (!isset($this->catalogues[$locale])) {
120 $this->loadCatalogue($locale);
121 }
122 return $this->catalogues[$locale];
123 }
124 public function getCatalogues() : array
125 {
126 return \array_values($this->catalogues);
127 }
128 protected function getLoaders()
129 {
130 return $this->loaders;
131 }
132 protected function loadCatalogue(string $locale)
133 {
134 if (null === $this->cacheDir) {
135 $this->initializeCatalogue($locale);
136 } else {
137 $this->initializeCacheCatalogue($locale);
138 }
139 }
140 protected function initializeCatalogue(string $locale)
141 {
142 $this->assertValidLocale($locale);
143 try {
144 $this->doLoadCatalogue($locale);
145 } catch (NotFoundResourceException $e) {
146 if (!$this->computeFallbackLocales($locale)) {
147 throw $e;
148 }
149 }
150 $this->loadFallbackCatalogues($locale);
151 }
152 private function initializeCacheCatalogue(string $locale) : void
153 {
154 if (isset($this->catalogues[$locale])) {
155 return;
156 }
157 $this->assertValidLocale($locale);
158 $cache = $this->getConfigCacheFactory()->cache($this->getCatalogueCachePath($locale), function (ConfigCacheInterface $cache) use($locale) {
159 $this->dumpCatalogue($locale, $cache);
160 });
161 if (isset($this->catalogues[$locale])) {
162 return;
163 }
164 $this->catalogues[$locale] = (include $cache->getPath());
165 }
166 private function dumpCatalogue(string $locale, ConfigCacheInterface $cache) : void
167 {
168 $this->initializeCatalogue($locale);
169 $fallbackContent = $this->getFallbackContent($this->catalogues[$locale]);
170 $content = \sprintf(<<<EOF
171 <?php
172 use Symfony\\Component\\Translation\\MessageCatalogue;
173 \$catalogue = new MessageCatalogue('%s', %s);
174 %s
175 return \$catalogue;
176 EOF
177 , $locale, \var_export($this->getAllMessages($this->catalogues[$locale]), \true), $fallbackContent);
178 $cache->write($content, $this->catalogues[$locale]->getResources());
179 }
180 private function getFallbackContent(MessageCatalogue $catalogue) : string
181 {
182 $fallbackContent = '';
183 $current = '';
184 $replacementPattern = '/[^a-z0-9_]/i';
185 $fallbackCatalogue = $catalogue->getFallbackCatalogue();
186 while ($fallbackCatalogue) {
187 $fallback = $fallbackCatalogue->getLocale();
188 $fallbackSuffix = \ucfirst(\preg_replace($replacementPattern, '_', $fallback));
189 $currentSuffix = \ucfirst(\preg_replace($replacementPattern, '_', $current));
190 $fallbackContent .= \sprintf(<<<'EOF'
191 $catalogue%s = new MessageCatalogue('%s', %s);
192 $catalogue%s->addFallbackCatalogue($catalogue%s);
193 EOF
194 , $fallbackSuffix, $fallback, \var_export($this->getAllMessages($fallbackCatalogue), \true), $currentSuffix, $fallbackSuffix);
195 $current = $fallbackCatalogue->getLocale();
196 $fallbackCatalogue = $fallbackCatalogue->getFallbackCatalogue();
197 }
198 return $fallbackContent;
199 }
200 private function getCatalogueCachePath(string $locale) : string
201 {
202 return $this->cacheDir . '/catalogue.' . $locale . '.' . \strtr(\substr(\base64_encode(\hash('sha256', \serialize($this->cacheVary), \true)), 0, 7), '/', '_') . '.php';
203 }
204 protected function doLoadCatalogue(string $locale) : void
205 {
206 $this->catalogues[$locale] = new MessageCatalogue($locale);
207 if (isset($this->resources[$locale])) {
208 foreach ($this->resources[$locale] as $resource) {
209 if (!isset($this->loaders[$resource[0]])) {
210 if (\is_string($resource[1])) {
211 throw new RuntimeException(\sprintf('No loader is registered for the "%s" format when loading the "%s" resource.', $resource[0], $resource[1]));
212 }
213 throw new RuntimeException(\sprintf('No loader is registered for the "%s" format.', $resource[0]));
214 }
215 $this->catalogues[$locale]->addCatalogue($this->loaders[$resource[0]]->load($resource[1], $locale, $resource[2]));
216 }
217 }
218 }
219 private function loadFallbackCatalogues(string $locale) : void
220 {
221 $current = $this->catalogues[$locale];
222 foreach ($this->computeFallbackLocales($locale) as $fallback) {
223 if (!isset($this->catalogues[$fallback])) {
224 $this->initializeCatalogue($fallback);
225 }
226 $fallbackCatalogue = new MessageCatalogue($fallback, $this->getAllMessages($this->catalogues[$fallback]));
227 foreach ($this->catalogues[$fallback]->getResources() as $resource) {
228 $fallbackCatalogue->addResource($resource);
229 }
230 $current->addFallbackCatalogue($fallbackCatalogue);
231 $current = $fallbackCatalogue;
232 }
233 }
234 protected function computeFallbackLocales(string $locale)
235 {
236 if (null === $this->parentLocales) {
237 $this->parentLocales = \json_decode(\file_get_contents(__DIR__ . '/Resources/data/parents.json'), \true);
238 }
239 $originLocale = $locale;
240 $locales = [];
241 while ($locale) {
242 $parent = $this->parentLocales[$locale] ?? null;
243 if ($parent) {
244 $locale = 'root' !== $parent ? $parent : null;
245 } elseif (\function_exists('locale_parse')) {
246 $localeSubTags = \locale_parse($locale);
247 $locale = null;
248 if (1 < \count($localeSubTags)) {
249 \array_pop($localeSubTags);
250 $locale = \locale_compose($localeSubTags) ?: null;
251 }
252 } elseif ($i = \strrpos($locale, '_') ?: \strrpos($locale, '-')) {
253 $locale = \substr($locale, 0, $i);
254 } else {
255 $locale = null;
256 }
257 if (null !== $locale) {
258 $locales[] = $locale;
259 }
260 }
261 foreach ($this->fallbackLocales as $fallback) {
262 if ($fallback === $originLocale) {
263 continue;
264 }
265 $locales[] = $fallback;
266 }
267 return \array_unique($locales);
268 }
269 protected function assertValidLocale(string $locale)
270 {
271 if (!\preg_match('/^[a-z0-9@_\\.\\-]*$/i', $locale)) {
272 throw new InvalidArgumentException(\sprintf('Invalid "%s" locale.', $locale));
273 }
274 }
275 private function getConfigCacheFactory() : ConfigCacheFactoryInterface
276 {
277 if (!$this->configCacheFactory) {
278 $this->configCacheFactory = new ConfigCacheFactory($this->debug);
279 }
280 return $this->configCacheFactory;
281 }
282 private function getAllMessages(MessageCatalogueInterface $catalogue) : array
283 {
284 $allMessages = [];
285 foreach ($catalogue->all() as $domain => $messages) {
286 if ($intlMessages = $catalogue->all($domain . MessageCatalogue::INTL_DOMAIN_SUFFIX)) {
287 $allMessages[$domain . MessageCatalogue::INTL_DOMAIN_SUFFIX] = $intlMessages;
288 $messages = \array_diff_key($messages, $intlMessages);
289 }
290 if ($messages) {
291 $allMessages[$domain] = $messages;
292 }
293 }
294 return $allMessages;
295 }
296 }
297