19 {
20 if ($translations === null) {
21 $translations = new Translations();
22 }
23
24 $lines = explode("\n", $string);
26
27 $translation = new Translation('', '');
28
29 for (
$n = count($lines);
$i <
$n; ++
$i) {
30 $line = trim($lines[
$i]);
31
33
34 if ($line === '') {
35 if ($translation->is('', '')) {
37 } elseif ($translation->hasOriginal()) {
38 $translations[] = $translation;
39 }
40
41 $translation = new Translation('', '');
42 continue;
43 }
44
45 $splitLine = preg_split('/\s+/', $line, 2);
47 $data = isset($splitLine[1]) ? $splitLine[1] :
'';
48
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 }