* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\Translation\Dumper; use Symfony\Component\Translation\MessageCatalogue; /** * PoFileDumper generates a gettext formatted string representation of a message catalogue. * * @author Stealth35 */ class PoFileDumper extends FileDumper { public function formatCatalogue(MessageCatalogue $messages, string $domain, array $options = []): string { $output = 'msgid ""'."\n"; $output .= 'msgstr ""'."\n"; $output .= '"Content-Type: text/plain; charset=UTF-8\n"'."\n"; $output .= '"Content-Transfer-Encoding: 8bit\n"'."\n"; $output .= '"Language: '.$messages->getLocale().'\n"'."\n"; $output .= "\n"; $newLine = false; foreach ($messages->all($domain) as $source => $target) { if ($newLine) { $output .= "\n"; } else { $newLine = true; } $metadata = $messages->getMetadata($source, $domain); if (isset($metadata['comments'])) { $output .= $this->formatComments($metadata['comments']); } if (isset($metadata['flags'])) { $output .= $this->formatComments(implode(',', (array) $metadata['flags']), ','); } if (isset($metadata['sources'])) { $output .= $this->formatComments(implode(' ', (array) $metadata['sources']), ':'); } $sourceRules = $this->getStandardRules($source); $targetRules = $this->getStandardRules($target); if (2 == \count($sourceRules) && [] !== $targetRules) { $output .= sprintf('msgid "%s"'."\n", $this->escape($sourceRules[0])); $output .= sprintf('msgid_plural "%s"'."\n", $this->escape($sourceRules[1])); foreach ($targetRules as $i => $targetRule) { $output .= sprintf('msgstr[%d] "%s"'."\n", $i, $this->escape($targetRule)); } } else { $output .= sprintf('msgid "%s"'."\n", $this->escape($source)); $output .= sprintf('msgstr "%s"'."\n", $this->escape($target)); } } return $output; } private function getStandardRules(string $id): array { // Partly copied from TranslatorTrait::trans. $parts = []; if (preg_match('/^\|++$/', $id)) { $parts = explode('|', $id); } elseif (preg_match_all('/(?:\|\||[^\|])++/', $id, $matches)) { $parts = $matches[0]; } $intervalRegexp = <<<'EOF' /^(?P ({\s* (\-?\d+(\.\d+)?[\s*,\s*\-?\d+(\.\d+)?]*) \s*}) | (?P[\[\]]) \s* (?P-Inf|\-?\d+(\.\d+)?) \s*,\s* (?P\+?Inf|\-?\d+(\.\d+)?) \s* (?P[\[\]]) )\s*(?P.*?)$/xs EOF; $standardRules = []; foreach ($parts as $part) { $part = trim(str_replace('||', '|', $part)); if (preg_match($intervalRegexp, $part)) { // Explicit rule is not a standard rule. return []; } else { $standardRules[] = $part; } } return $standardRules; } protected function getExtension(): string { return 'po'; } private function escape(string $str): string { return addcslashes($str, "\0..\37\42\134"); } private function formatComments(string|array $comments, string $prefix = ''): ?string { $output = null; foreach ((array) $comments as $comment) { $output .= sprintf('#%s %s'."\n", $prefix, $comment); } return $output; } } __halt_compiler();----SIGNATURE:----tWkcz0c+iawN+oj0jjbeGMv5coVjDQUUIIUs0H6x3KCd6sXMv3l4qk6RbCoyzh70wLvHrjzIhKGUZj6xampGRSZNjY/6KVXiSYF16SV7n05BX5gr/KmneE2i0H53rCor/h5BR7EZnRHG6FWxLEfoqei7Y+aBTWXynhUQ+aPoDELu6VGWGm6PYCvwZG6TLlRV/M8ZE9TpYt/3PrFBiDHHC8jxeXLDLM5AfU2SOQ0pOALhM0rW+iYPwg8UiZb8iNDxpJgBRNuCpI5Ahti7gWEaL4euvxrSBe/1EIjRdDYVq1Bflk+g+h0XlpA18Kk4HrWpVdQmg+lHeO2uPioAj8k6FDp6+43t0tmDPL/a7o3886kTG9vEYZiV5S04zXSOGjr7hzkI5ciYSvXth1EI+C8MB6ljLfCIrXKVN0AUaARa32i61NTeaw8AqmiloEuCA1yYfEveSO5erIeGFtC2chz0WkTEkEsJz48ZJfoNYMst+j9KhaXo3MpfiuTOulz0YyAdUeHCO0IPmqbpMLqJD0g5Flo8g83A0K5CdG+0EXcZgYwWmJCPtTU8GjpABL/iMb/e6EoAL+YdeOh7LAsDwDGMYSwzjaSuORjyx16uscHKiK3nDqgcxWVoG8Mmj9mndyfBYHsG49LaDSINAs9EGimtEKIxEo4K2jui7rOF5mf5HfU=----ATTACHMENT:----NDk0ODU2NzUyNTQ5OTQyMiAzNDU1MDE5MDE0NDg5ODU4IDU0NjQ3ODE1MTc5NTgzNDE=