ILIAS  release_5-3 Revision v5.3.23-19-g915713cf615
Po.php
Go to the documentation of this file.
1 <?php
2 
3 namespace Gettext\Extractors;
4 
7 
11 class 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 }
static parseHeaders($headers, Translations $translations)
Parse the po headers.
Definition: Po.php:160
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 convertString($value)
Convert a string from its PO representation.
Definition: Po.php:212
Class to manage a translation string.
Definition: Translation.php:8
getHeader($name)
Returns a header value.
setHeader($name, $value)
Set a new header.
static isHeaderDefinition($line)
Checks if it is a header definition line.
Definition: Po.php:149
Class to manage a collection of translations.
$n
Definition: RandomTest.php:85
Create styles array
The data for the language used.
static fixMultiLines($line, array $lines, &$i)
Gets one string from multiline strings.
Definition: Po.php:188
Class to get gettext strings from php files returning arrays.
Definition: Po.php:11
$i
Definition: disco.tpl.php:19
if(!file_exists("$old.txt")) if($old===$new) if(file_exists("$new.txt")) $file
$key
Definition: croninfo.php:18