{@parentDoc}.
15 {
16 $array = array();
17 $headers = '';
18
19 foreach ($translations->getHeaders() as $headerName => $headerValue) {
20 $headers .= "$headerName: $headerValue\n";
21 }
22
23 if ($headers !== '') {
24 $array[''] = $headers;
25 }
26
27 foreach ($translations as $translation) {
28 if (!$translation->hasTranslation() && !static::$includeEmptyTranslations) {
29 continue;
30 }
31
32 if ($translation->hasContext()) {
33 $originalString = $translation->getContext()."\x04".$translation->getOriginal();
34 } else {
35 $originalString = $translation->getOriginal();
36 }
37
38 $array[$originalString] = $translation;
39 }
40
41 ksort($array);
42 $numEntries = count($array);
43 $originalsTable = '';
44 $translationsTable = '';
45 $originalsIndex = array();
46 $translationsIndex = array();
47
48 foreach ($array as $originalString => $translation) {
49 if (is_string($translation)) {
50
51 $translationString = $translation;
52 } else {
53
54 if ($translation->hasPlural()) {
55 $originalString .= "\x00".$translation->getPlural();
56 }
57 $translationString = $translation->getTranslation();
58
59 if ($translation->hasPluralTranslation()) {
60 $translationString .= "\x00".implode("\x00", $translation->getPluralTranslation());
61 }
62 }
63
64 $originalsIndex[] = array('relativeOffset' => strlen($originalsTable), 'length' => strlen($originalString));
65 $originalsTable .= $originalString."\x00";
66 $translationsIndex[] = array('relativeOffset' => strlen($translationsTable), 'length' => strlen($translationString));
67 $translationsTable .= $translationString."\x00";
68 }
69
70
71 $originalsIndexOffset = 7 * 4;
72
73
74 $originalsIndexSize = $numEntries * (4 + 4);
75
76
77 $translationsIndexOffset = $originalsIndexOffset + $originalsIndexSize;
78
79
80 $translationsIndexSize = $numEntries * (4 + 4);
81
82
83 $originalsStringsOffset = $translationsIndexOffset + $translationsIndexSize;
84
85
86 $translationsStringsOffset = $originalsStringsOffset + strlen($originalsTable);
87
88
89 $mo = '';
90
91
92 $mo .= pack('L', 0x950412de);
93
94
95 $mo .= pack('L', 0);
96
97
98 $mo .= pack('L', $numEntries);
99
100
101 $mo .= pack('L', $originalsIndexOffset);
102
103
104 $mo .= pack('L', $translationsIndexOffset);
105
106
107 $mo .= pack('L', 0);
108
109
110 $mo .= pack('L', $translationsIndexOffset + $translationsIndexSize);
111
112
113 foreach ($originalsIndex as
$info) {
114 $mo .= pack(
'L',
$info[
'length']);
115 $mo .= pack(
'L', $originalsStringsOffset +
$info[
'relativeOffset']);
116 }
117
118
119 foreach ($translationsIndex as
$info) {
120 $mo .= pack(
'L',
$info[
'length']);
121 $mo .= pack(
'L', $translationsStringsOffset +
$info[
'relativeOffset']);
122 }
123
124
125 $mo .= $originalsTable;
126
127
128 $mo .= $translationsTable;
129
130 return $mo;
131 }