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 / PseudoLocalizationTranslator.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
PseudoLocalizationTranslator.php
164 lines
1 <?php
2 namespace MailPoetVendor\Symfony\Component\Translation;
3 if (!defined('ABSPATH')) exit;
4 use MailPoetVendor\Symfony\Contracts\Translation\TranslatorInterface;
5 final class PseudoLocalizationTranslator implements TranslatorInterface
6 {
7 private const EXPANSION_CHARACTER = '~';
8 private $translator;
9 private $accents;
10 private $expansionFactor;
11 private $brackets;
12 private $parseHTML;
13 private $localizableHTMLAttributes;
14 public function __construct(TranslatorInterface $translator, array $options = [])
15 {
16 $this->translator = $translator;
17 $this->accents = $options['accents'] ?? \true;
18 if (1.0 > ($this->expansionFactor = $options['expansion_factor'] ?? 1.0)) {
19 throw new \InvalidArgumentException('The expansion factor must be greater than or equal to 1.');
20 }
21 $this->brackets = $options['brackets'] ?? \true;
22 $this->parseHTML = $options['parse_html'] ?? \false;
23 if ($this->parseHTML && !$this->accents && 1.0 === $this->expansionFactor) {
24 $this->parseHTML = \false;
25 }
26 $this->localizableHTMLAttributes = $options['localizable_html_attributes'] ?? [];
27 }
28 public function trans(string $id, array $parameters = [], ?string $domain = null, ?string $locale = null) : string
29 {
30 $trans = '';
31 $visibleText = '';
32 foreach ($this->getParts($this->translator->trans($id, $parameters, $domain, $locale)) as [$visible, $localizable, $text]) {
33 if ($visible) {
34 $visibleText .= $text;
35 }
36 if (!$localizable) {
37 $trans .= $text;
38 continue;
39 }
40 $this->addAccents($trans, $text);
41 }
42 $this->expand($trans, $visibleText);
43 $this->addBrackets($trans);
44 return $trans;
45 }
46 public function getLocale() : string
47 {
48 return $this->translator->getLocale();
49 }
50 private function getParts(string $originalTrans) : array
51 {
52 if (!$this->parseHTML) {
53 return [[\true, \true, $originalTrans]];
54 }
55 $html = \mb_encode_numericentity($originalTrans, [0x80, 0x10ffff, 0, 0x1fffff], \mb_detect_encoding($originalTrans, null, \true) ?: 'UTF-8');
56 $useInternalErrors = \libxml_use_internal_errors(\true);
57 $dom = new \DOMDocument();
58 $dom->loadHTML('<trans>' . $html . '</trans>');
59 \libxml_clear_errors();
60 \libxml_use_internal_errors($useInternalErrors);
61 return $this->parseNode($dom->childNodes->item(1)->childNodes->item(0)->childNodes->item(0));
62 }
63 private function parseNode(\DOMNode $node) : array
64 {
65 $parts = [];
66 foreach ($node->childNodes as $childNode) {
67 if (!$childNode instanceof \DOMElement) {
68 $parts[] = [\true, \true, $childNode->nodeValue];
69 continue;
70 }
71 $parts[] = [\false, \false, '<' . $childNode->tagName];
72 foreach ($childNode->attributes as $attribute) {
73 $parts[] = [\false, \false, ' ' . $attribute->nodeName . '="'];
74 $localizableAttribute = \in_array($attribute->nodeName, $this->localizableHTMLAttributes, \true);
75 foreach (\preg_split('/(&(?:amp|quot|#039|lt|gt);+)/', \htmlspecialchars($attribute->nodeValue, \ENT_QUOTES, 'UTF-8'), -1, \PREG_SPLIT_DELIM_CAPTURE) as $i => $match) {
76 if ('' === $match) {
77 continue;
78 }
79 $parts[] = [\false, $localizableAttribute && 0 === $i % 2, $match];
80 }
81 $parts[] = [\false, \false, '"'];
82 }
83 $parts[] = [\false, \false, '>'];
84 $parts = \array_merge($parts, $this->parseNode($childNode, $parts));
85 $parts[] = [\false, \false, '</' . $childNode->tagName . '>'];
86 }
87 return $parts;
88 }
89 private function addAccents(string &$trans, string $text) : void
90 {
91 $trans .= $this->accents ? \strtr($text, [' ' => ' ', '!' => '¡', '"' => '″', '#' => '♯', '$' => '€', '%' => '‰', '&' => '�
92 �', '\'' => '´', '(' => '{', ')' => '}', '*' => '⁎', '+' => '⁺', ',' => '،', '-' => '‐', '.' => '·', '/' => '⁄', '0' => '⓪', '1' => '①', '2' => '②', '3' => '③', '4' => '④', '5' => '⑤', '6' => '⑥', '7' => '⑦', '8' => '⑧', '9' => '⑨', ':' => '∶', ';' => '⁏', '<' => '≤', '=' => '≂', '>' => '≥', '?' => '¿', '@' => '՞', 'A' => '�
93 ', 'B' => 'Ɓ', 'C' => 'Ç', 'D' => 'Ð', 'E' => 'É', 'F' => 'Ƒ', 'G' => 'Ĝ', 'H' => 'Ĥ', 'I' => 'Î', 'J' => 'Ĵ', 'K' => 'Ķ', 'L' => 'Ļ', 'M' => 'Ṁ', 'N' => 'Ñ', 'O' => 'Ö', 'P' => 'Þ', 'Q' => 'Ǫ', 'R' => 'Ŕ', 'S' => 'Š', 'T' => 'Ţ', 'U' => 'Û', 'V' => 'Ṽ', 'W' => 'Ŵ', 'X' => 'Ẋ', 'Y' => 'Ý', 'Z' => 'Ž', '[' => '�
94 ', '\\' => '', ']' => '', '^' => '˄', '_' => '', '`' => '‵', 'a' => 'å', 'b' => 'ƀ', 'c' => 'ç', 'd' => 'ð', 'e' => 'é', 'f' => 'ƒ', 'g' => 'ĝ', 'h' => 'ĥ', 'i' => 'î', 'j' => 'ĵ', 'k' => 'ķ', 'l' => 'ļ', 'm' => 'ɱ', 'n' => 'ñ', 'o' => 'ö', 'p' => 'þ', 'q' => 'ǫ', 'r' => 'ŕ', 's' => 'š', 't' => 'ţ', 'u' => 'û', 'v' => 'ṽ', 'w' => 'ŵ', 'x' => 'ẋ', 'y' => 'ý', 'z' => 'ž', '{' => '(', '|' => '¦', '}' => ')', '~' => '˞']) : $text;
95 }
96 private function expand(string &$trans, string $visibleText) : void
97 {
98 if (1.0 >= $this->expansionFactor) {
99 return;
100 }
101 $visibleLength = $this->strlen($visibleText);
102 $missingLength = (int) \ceil($visibleLength * $this->expansionFactor) - $visibleLength;
103 if ($this->brackets) {
104 $missingLength -= 2;
105 }
106 if (0 >= $missingLength) {
107 return;
108 }
109 $words = [];
110 $wordsCount = 0;
111 foreach (\preg_split('/ +/', $visibleText, -1, \PREG_SPLIT_NO_EMPTY) as $word) {
112 $wordLength = $this->strlen($word);
113 if ($wordLength >= $missingLength) {
114 continue;
115 }
116 if (!isset($words[$wordLength])) {
117 $words[$wordLength] = 0;
118 }
119 ++$words[$wordLength];
120 ++$wordsCount;
121 }
122 if (!$words) {
123 $trans .= 1 === $missingLength ? self::EXPANSION_CHARACTER : ' ' . \str_repeat(self::EXPANSION_CHARACTER, $missingLength - 1);
124 return;
125 }
126 \arsort($words, \SORT_NUMERIC);
127 $longestWordLength = \max(\array_keys($words));
128 while (\true) {
129 $r = \mt_rand(1, $wordsCount);
130 foreach ($words as $length => $count) {
131 $r -= $count;
132 if ($r <= 0) {
133 break;
134 }
135 }
136 $trans .= ' ' . \str_repeat(self::EXPANSION_CHARACTER, $length);
137 $missingLength -= $length + 1;
138 if (0 === $missingLength) {
139 return;
140 }
141 while ($longestWordLength >= $missingLength) {
142 $wordsCount -= $words[$longestWordLength];
143 unset($words[$longestWordLength]);
144 if (!$words) {
145 $trans .= 1 === $missingLength ? self::EXPANSION_CHARACTER : ' ' . \str_repeat(self::EXPANSION_CHARACTER, $missingLength - 1);
146 return;
147 }
148 $longestWordLength = \max(\array_keys($words));
149 }
150 }
151 }
152 private function addBrackets(string &$trans) : void
153 {
154 if (!$this->brackets) {
155 return;
156 }
157 $trans = '[' . $trans . ']';
158 }
159 private function strlen(string $s) : int
160 {
161 return \false === ($encoding = \mb_detect_encoding($s, null, \true)) ? \strlen($s) : \mb_strlen($s, $encoding);
162 }
163 }
164