ILIAS  release_5-4 Revision v5.4.26-12-gabc799a52e6
Po.php
Go to the documentation of this file.
1<?php
2
3namespace Gettext\Extractors;
4
7
11class Po extends Extractor implements ExtractorInterface
12{
18 public static function fromString($string, Translations $translations = null, $file = '')
19 {
20 if ($translations === null) {
21 $translations = new Translations();
22 }
23
24 $lines = explode("\n", $string);
25 $i = 0;
26
27 $translation = new Translation('', '');
28
29 for ($n = count($lines); $i < $n; ++$i) {
30 $line = trim($lines[$i]);
31
32 $line = self::fixMultiLines($line, $lines, $i);
33
34 if ($line === '') {
35 if ($translation->is('', '')) {
36 self::parseHeaders($translation->getTranslation(), $translations);
37 } elseif ($translation->hasOriginal()) {
38 $translations[] = $translation;
39 }
40
41 $translation = new Translation('', '');
42 continue;
43 }
44
45 $splitLine = preg_split('/\s+/', $line, 2);
46 $key = $splitLine[0];
47 $data = isset($splitLine[1]) ? $splitLine[1] : '';
48
49 switch ($key) {
50 case '#':
51 $translation->addComment($data);
52 $append = null;
53 break;
54
55 case '#.':
56 $translation->addExtractedComment($data);
57 $append = null;
58 break;
59
60 case '#,':
61 foreach (array_map('trim', explode(',', trim($data))) as $value) {
62 $translation->addFlag($value);
63 }
64 $append = null;
65 break;
66
67 case '#:':
68 foreach (preg_split('/\s+/', trim($data)) as $value) {
69 if (preg_match('/^(.+)(:(\d*))?$/U', $value, $matches)) {
70 $translation->addReference($matches[1], isset($matches[3]) ? $matches[3] : null);
71 }
72 }
73 $append = null;
74 break;
75
76 case 'msgctxt':
77 $translation = $translation->getClone(self::convertString($data));
78 $append = 'Context';
79 break;
80
81 case 'msgid':
82 $translation = $translation->getClone(null, self::convertString($data));
83 $append = 'Original';
84 break;
85
86 case 'msgid_plural':
87 $translation->setPlural(self::convertString($data));
88 $append = 'Plural';
89 break;
90
91 case 'msgstr':
92 case 'msgstr[0]':
93 $translation->setTranslation(self::convertString($data));
94 $append = 'Translation';
95 break;
96
97 case 'msgstr[1]':
98 $translation->setPluralTranslation(self::convertString($data), 0);
99 $append = 'PluralTranslation';
100 break;
101
102 default:
103 if (strpos($key, 'msgstr[') === 0) {
104 $translation->setPluralTranslation(self::convertString($data), intval(substr($key, 7, -1)) - 1);
105 $append = 'PluralTranslation';
106 break;
107 }
108
109 if (isset($append)) {
110 if ($append === 'Context') {
111 $translation = $translation->getClone($translation->getContext()."\n".self::convertString($data));
112 break;
113 }
114
115 if ($append === 'Original') {
116 $translation = $translation->getClone(null, $translation->getOriginal()."\n".self::convertString($data));
117 break;
118 }
119
120 if ($append === 'PluralTranslation') {
121 $key = count($translation->getPluralTranslation()) - 1;
122 $translation->setPluralTranslation($translation->getPluralTranslation($key)."\n".self::convertString($data), $key);
123 break;
124 }
125
126 $getMethod = 'get'.$append;
127 $setMethod = 'set'.$append;
128 $translation->$setMethod($translation->$getMethod()."\n".self::convertString($data));
129 }
130 break;
131 }
132 }
133
134 if ($translation->hasOriginal() && !in_array($translation, iterator_to_array($translations))) {
135 $translations[] = $translation;
136 }
137
138 return $translations;
139 }
140
149 private static function isHeaderDefinition($line)
150 {
151 return (bool) preg_match('/^[\w-]+:/', $line);
152 }
153
160 private static function parseHeaders($headers, Translations $translations)
161 {
162 $headers = explode("\n", $headers);
163 $currentHeader = null;
164
165 foreach ($headers as $line) {
166 $line = self::convertString($line);
167
168 if (self::isHeaderDefinition($line)) {
169 $header = array_map('trim', explode(':', $line, 2));
170 $currentHeader = $header[0];
171 $translations->setHeader($currentHeader, $header[1]);
172 } else {
173 $entry = $translations->getHeader($currentHeader);
174 $translations->setHeader($currentHeader, $entry.$line);
175 }
176 }
177 }
178
188 private static function fixMultiLines($line, array $lines, &$i)
189 {
190 for ($j = $i, $t = count($lines); $j < $t; ++$j) {
191 if (substr($line, -1, 1) == '"'
192 && isset($lines[$j + 1])
193 && substr(trim($lines[$j + 1]), 0, 1) == '"'
194 ) {
195 $line = substr($line, 0, -1).substr(trim($lines[$j + 1]), 1);
196 } else {
197 $i = $j;
198 break;
199 }
200 }
201
202 return $line;
203 }
204
212 public static function convertString($value)
213 {
214 if (!$value) {
215 return '';
216 }
217
218 if ($value[0] === '"') {
219 $value = substr($value, 1, -1);
220 }
221
222 return strtr(
223 $value,
224 array(
225 '\\\\' => '\\',
226 '\\a' => "\x07",
227 '\\b' => "\x08",
228 '\\t' => "\t",
229 '\\n' => "\n",
230 '\\v' => "\x0b",
231 '\\f' => "\x0c",
232 '\\r' => "\r",
233 '\\"' => '"',
234 )
235 );
236 }
237}
$n
Definition: RandomTest.php:85
An exception for terminatinating execution or to throw for unit testing.
Class to get gettext strings from php files returning arrays.
Definition: Po.php:12
static fixMultiLines($line, array $lines, &$i)
Gets one string from multiline strings.
Definition: Po.php:188
static fromString($string, Translations $translations=null, $file='')
Parses a .po file and append the translations found in the Translations instance.
Definition: Po.php:18
static isHeaderDefinition($line)
Checks if it is a header definition line.
Definition: Po.php:149
static parseHeaders($headers, Translations $translations)
Parse the po headers.
Definition: Po.php:160
static convertString($value)
Convert a string from its PO representation.
Definition: Po.php:212
Class to manage a translation string.
Definition: Translation.php:9
Class to manage a collection of translations.
getHeader($name)
Returns a header value.
setHeader($name, $value)
Set a new header.
$key
Definition: croninfo.php:18
$i
Definition: disco.tpl.php:19
$data
Definition: bench.php:6