aboutsummaryrefslogtreecommitdiff
path: root/includes/vendor/pomo/pomo/src/Translations/GettextTranslations.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/vendor/pomo/pomo/src/Translations/GettextTranslations.php')
-rw-r--r--includes/vendor/pomo/pomo/src/Translations/GettextTranslations.php148
1 files changed, 148 insertions, 0 deletions
diff --git a/includes/vendor/pomo/pomo/src/Translations/GettextTranslations.php b/includes/vendor/pomo/pomo/src/Translations/GettextTranslations.php
new file mode 100644
index 0000000..11b2a79
--- /dev/null
+++ b/includes/vendor/pomo/pomo/src/Translations/GettextTranslations.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * This file is part of the POMO package.
+ *
+ * @copyright 2014 POMO
+ * @license GPL
+ */
+
+namespace POMO\Translations;
+
+use POMO\Parser\PluralForms;
+
+/**
+ * Class for a set of entries for translation and their associated headers.
+ *
+ * @property mixed $_nplurals
+ * @property callable $_gettext_select_plural_form
+ */
+class GettextTranslations extends Translations implements TranslationsInterface
+{
+ /**
+ * The gettext implementation of select_plural_form.
+ *
+ * It lives in this class, because there are more than one descendand,
+ * which will use it and they can't share it effectively.
+ *
+ * @param int $count Items count
+ *
+ * @return mixed
+ */
+ public function gettext_select_plural_form($count)
+ {
+ if (!isset($this->_gettext_select_plural_form)
+ || is_null($this->_gettext_select_plural_form)) {
+ list($nplurals, $expression) = $this->nplurals_and_expression_from_header($this->get_header('Plural-Forms'));
+ $this->_nplurals = $nplurals;
+ $this->_gettext_select_plural_form = $this->make_plural_form_function($nplurals, $expression);
+ }
+
+ return call_user_func($this->_gettext_select_plural_form, $count);
+ }
+
+ /**
+ * @param $header
+ *
+ * @return array
+ */
+ public function nplurals_and_expression_from_header($header)
+ {
+ if (preg_match('/^\s*nplurals\s*=\s*(\d+)\s*;\s+plural\s*=\s*(.+)$/', $header, $matches)) {
+ $nplurals = (int) $matches[1];
+ $expression = trim($matches[2]);
+
+ return array($nplurals, $expression);
+ } else {
+ return array(2, 'n != 1');
+ }
+ }
+
+ /**
+ * Makes a function, which will return the right translation index,
+ * according to the plural forms header.
+ *
+ * @param int $nplurals
+ * @param string $expression
+ *
+ * @return callable The right translation index
+ */
+ public function make_plural_form_function($nplurals, $expression)
+ {
+ try {
+ $handler = new PluralForms(rtrim($expression, ';'));
+
+ return array($handler, 'get');
+ } catch (\Exception $e) {
+ // Fall back to default plural-form function.
+ return $this->make_plural_form_function(2, 'n != 1');
+ }
+ }
+
+ /**
+ * Adds parentheses to the inner parts of ternary operators in
+ * plural expressions, because PHP evaluates ternary operators
+ * from left to right.
+ *
+ * @param string $expression the expression without parentheses
+ *
+ * @return string the expression with parentheses added
+ */
+ public function parenthesize_plural_exression($expression)
+ {
+ $expression .= ';';
+ $res = '';
+ $depth = 0;
+ for ($i = 0; $i < strlen($expression); ++$i) {
+ $char = $expression[$i];
+ switch ($char) {
+ case '?':
+ $res .= ' ? (';
+ $depth++;
+ break;
+ case ':':
+ $res .= ') : (';
+ break;
+ case ';':
+ $res .= str_repeat(')', $depth).';';
+ $depth = 0;
+ break;
+ default:
+ $res .= $char;
+ }
+ }
+
+ return rtrim($res, ';');
+ }
+
+ /**
+ * @param string $translation
+ *
+ * @return array
+ */
+ public function make_headers($translation)
+ {
+ $headers = array();
+ // sometimes \ns are used instead of real new lines
+ $translation = str_replace('\n', "\n", $translation);
+ $lines = explode("\n", $translation);
+ foreach ($lines as $line) {
+ $parts = explode(':', $line, 2);
+ if (!isset($parts[1])) {
+ continue;
+ }
+ $headers[trim($parts[0])] = trim($parts[1]);
+ }
+
+ return $headers;
+ }
+
+ public function set_header($header, $value)
+ {
+ parent::set_header($header, $value);
+ if ('Plural-Forms' == $header) {
+ list($nplurals, $expression) = $this->nplurals_and_expression_from_header($this->get_header('Plural-Forms'));
+ $this->_nplurals = $nplurals;
+ $this->_gettext_select_plural_form = $this->make_plural_form_function($nplurals, $expression);
+ }
+ }
+}