1f05bbd59dd64f3f659f71e8fff7446a3670ce9e
[yaffs-website] / web / core / lib / Drupal / Component / Gettext / PoItem.php
1 <?php
2
3 namespace Drupal\Component\Gettext;
4
5 /**
6  * PoItem handles one translation.
7  *
8  * @todo: This class contains some really old legacy code.
9  * @see https://www.drupal.org/node/1637662
10  */
11 class PoItem {
12
13   /**
14    * The language code this translation is in.
15    *
16    * @car string
17    */
18   private $_langcode;
19
20   /**
21    * The context this translation belongs to.
22    *
23    * @var string
24    */
25   private $_context = '';
26
27   /**
28    * The source string or array of strings if it has plurals.
29    *
30    * @var string or array
31    * @see $_plural
32    */
33   private $_source;
34
35   /**
36    * Flag indicating if this translation has plurals.
37    *
38    * @var bool
39    */
40   private $_plural;
41
42   /**
43    * The comment of this translation.
44    *
45    * @var string
46    */
47   private $_comment;
48
49   /**
50    * The translation string or array of strings if it has plurals.
51    *
52    * @var string or array
53    * @see $_plural
54    */
55   private $_translation;
56
57   /**
58    * Gets the language code of the currently used language.
59    *
60    * @return string with langcode
61    */
62   public function getLangcode() {
63     return $this->_langcode;
64   }
65
66   /**
67    * Set the language code of the current language.
68    *
69    * @param string $langcode
70    */
71   public function setLangcode($langcode) {
72     $this->_langcode = $langcode;
73   }
74
75   /**
76    * Gets the context this translation belongs to.
77    *
78    * @return string $context
79    */
80   public function getContext() {
81     return $this->_context;
82   }
83
84   /**
85    * Set the context this translation belongs to.
86    *
87    * @param string $context
88    */
89   public function setContext($context) {
90     $this->_context = $context;
91   }
92
93   /**
94    * Gets the source string or the array of strings if the translation has
95    * plurals.
96    *
97    * @return string or array $translation
98    */
99   public function getSource() {
100     return $this->_source;
101   }
102
103   /**
104    * Set the source string or the array of strings if the translation has
105    * plurals.
106    *
107    * @param string or array $source
108    */
109   public function setSource($source) {
110     $this->_source = $source;
111   }
112
113   /**
114    * Gets the translation string or the array of strings if the translation has
115    * plurals.
116    *
117    * @return string or array $translation
118    */
119   public function getTranslation() {
120     return $this->_translation;
121   }
122
123   /**
124    * Set the translation string or the array of strings if the translation has
125    * plurals.
126    *
127    * @param string or array $translation
128    */
129   public function setTranslation($translation) {
130     $this->_translation = $translation;
131   }
132
133   /**
134    * Set if the translation has plural values.
135    *
136    * @param bool $plural
137    */
138   public function setPlural($plural) {
139     $this->_plural = $plural;
140   }
141
142   /**
143    * Get if the translation has plural values.
144    *
145    * @return bool
146    */
147   public function isPlural() {
148     return $this->_plural;
149   }
150
151   /**
152    * Gets the comment of this translation.
153    *
154    * @return String $comment
155    */
156   public function getComment() {
157     return $this->_comment;
158   }
159
160   /**
161    * Set the comment of this translation.
162    *
163    * @param string $comment
164    */
165   public function setComment($comment) {
166     $this->_comment = $comment;
167   }
168
169   /**
170    * Create the PoItem from a structured array.
171    *
172    * @param array $values
173    */
174   public function setFromArray(array $values = []) {
175     if (isset($values['context'])) {
176       $this->setContext($values['context']);
177     }
178     if (isset($values['source'])) {
179       $this->setSource($values['source']);
180     }
181     if (isset($values['translation'])) {
182       $this->setTranslation($values['translation']);
183     }
184     if (isset($values['comment'])) {
185       $this->setComment($values['comment']);
186     }
187     if (isset($this->_source) &&
188         strpos($this->_source, LOCALE_PLURAL_DELIMITER) !== FALSE) {
189       $this->setSource(explode(LOCALE_PLURAL_DELIMITER, $this->_source));
190       $this->setTranslation(explode(LOCALE_PLURAL_DELIMITER, $this->_translation));
191       $this->setPlural(count($this->_source) > 1);
192     }
193   }
194
195   /**
196    * Output the PoItem as a string.
197    */
198   public function __toString() {
199     return $this->formatItem();
200   }
201
202   /**
203    * Format the POItem as a string.
204    */
205   private function formatItem() {
206     $output = '';
207
208     // Format string context.
209     if (!empty($this->_context)) {
210       $output .= 'msgctxt ' . $this->formatString($this->_context);
211     }
212
213     // Format translation.
214     if ($this->_plural) {
215       $output .= $this->formatPlural();
216     }
217     else {
218       $output .= $this->formatSingular();
219     }
220
221     // Add one empty line to separate the translations.
222     $output .= "\n";
223
224     return $output;
225   }
226
227   /**
228    * Formats a plural translation.
229    */
230   private function formatPlural() {
231     $output = '';
232
233     // Format source strings.
234     $output .= 'msgid ' . $this->formatString($this->_source[0]);
235     $output .= 'msgid_plural ' . $this->formatString($this->_source[1]);
236
237     foreach ($this->_translation as $i => $trans) {
238       if (isset($this->_translation[$i])) {
239         $output .= 'msgstr[' . $i . '] ' . $this->formatString($trans);
240       }
241       else {
242         $output .= 'msgstr[' . $i . '] ""' . "\n";
243       }
244     }
245
246     return $output;
247   }
248
249   /**
250    * Formats a singular translation.
251    */
252   private function formatSingular() {
253     $output = '';
254     $output .= 'msgid ' . $this->formatString($this->_source);
255     $output .= 'msgstr ' . (isset($this->_translation) ? $this->formatString($this->_translation) : '""');
256     return $output;
257   }
258
259   /**
260    * Formats a string for output on multiple lines.
261    */
262   private function formatString($string) {
263     // Escape characters for processing.
264     $string = addcslashes($string, "\0..\37\\\"");
265
266     // Always include a line break after the explicit \n line breaks from
267     // the source string. Otherwise wrap at 70 chars to accommodate the extra
268     // format overhead too.
269     $parts = explode("\n", wordwrap(str_replace('\n', "\\n\n", $string), 70, " \n"));
270
271     // Multiline string should be exported starting with a "" and newline to
272     // have all lines aligned on the same column.
273     if (count($parts) > 1) {
274       return "\"\"\n\"" . implode("\"\n\"", $parts) . "\"\n";
275     }
276     // Single line strings are output on the same line.
277     else {
278       return "\"$parts[0]\"\n";
279     }
280   }
281
282 }