diff core/lib/Drupal/Component/Gettext/PoItem.php @ 0:4c8ae668cc8c

Initial import (non-working)
author Chris Cannam
date Wed, 29 Nov 2017 16:09:58 +0000
parents
children 7a779792577d
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/lib/Drupal/Component/Gettext/PoItem.php	Wed Nov 29 16:09:58 2017 +0000
@@ -0,0 +1,282 @@
+<?php
+
+namespace Drupal\Component\Gettext;
+
+/**
+ * PoItem handles one translation.
+ *
+ * @todo: This class contains some really old legacy code.
+ * @see https://www.drupal.org/node/1637662
+ */
+class PoItem {
+
+  /**
+   * The language code this translation is in.
+   *
+   * @car string
+   */
+  private $_langcode;
+
+  /**
+   * The context this translation belongs to.
+   *
+   * @var string
+   */
+  private $_context = '';
+
+  /**
+   * The source string or array of strings if it has plurals.
+   *
+   * @var string or array
+   * @see $_plural
+   */
+  private $_source;
+
+  /**
+   * Flag indicating if this translation has plurals.
+   *
+   * @var bool
+   */
+  private $_plural;
+
+  /**
+   * The comment of this translation.
+   *
+   * @var string
+   */
+  private $_comment;
+
+  /**
+   * The translation string or array of strings if it has plurals.
+   *
+   * @var string or array
+   * @see $_plural
+   */
+  private $_translation;
+
+  /**
+   * Gets the language code of the currently used language.
+   *
+   * @return string with langcode
+   */
+  public function getLangcode() {
+    return $this->_langcode;
+  }
+
+  /**
+   * Set the language code of the current language.
+   *
+   * @param string $langcode
+   */
+  public function setLangcode($langcode) {
+    $this->_langcode = $langcode;
+  }
+
+  /**
+   * Gets the context this translation belongs to.
+   *
+   * @return string $context
+   */
+  public function getContext() {
+    return $this->_context;
+  }
+
+  /**
+   * Set the context this translation belongs to.
+   *
+   * @param string $context
+   */
+  public function setContext($context) {
+    $this->_context = $context;
+  }
+
+  /**
+   * Gets the source string or the array of strings if the translation has
+   * plurals.
+   *
+   * @return string or array $translation
+   */
+  public function getSource() {
+    return $this->_source;
+  }
+
+  /**
+   * Set the source string or the array of strings if the translation has
+   * plurals.
+   *
+   * @param string|array $source
+   */
+  public function setSource($source) {
+    $this->_source = $source;
+  }
+
+  /**
+   * Gets the translation string or the array of strings if the translation has
+   * plurals.
+   *
+   * @return string or array $translation
+   */
+  public function getTranslation() {
+    return $this->_translation;
+  }
+
+  /**
+   * Set the translation string or the array of strings if the translation has
+   * plurals.
+   *
+   * @param string|array $translation
+   */
+  public function setTranslation($translation) {
+    $this->_translation = $translation;
+  }
+
+  /**
+   * Set if the translation has plural values.
+   *
+   * @param bool $plural
+   */
+  public function setPlural($plural) {
+    $this->_plural = $plural;
+  }
+
+  /**
+   * Get if the translation has plural values.
+   *
+   * @return bool
+   */
+  public function isPlural() {
+    return $this->_plural;
+  }
+
+  /**
+   * Gets the comment of this translation.
+   *
+   * @return String $comment
+   */
+  public function getComment() {
+    return $this->_comment;
+  }
+
+  /**
+   * Set the comment of this translation.
+   *
+   * @param string $comment
+   */
+  public function setComment($comment) {
+    $this->_comment = $comment;
+  }
+
+  /**
+   * Create the PoItem from a structured array.
+   *
+   * @param array $values
+   */
+  public function setFromArray(array $values = []) {
+    if (isset($values['context'])) {
+      $this->setContext($values['context']);
+    }
+    if (isset($values['source'])) {
+      $this->setSource($values['source']);
+    }
+    if (isset($values['translation'])) {
+      $this->setTranslation($values['translation']);
+    }
+    if (isset($values['comment'])) {
+      $this->setComment($values['comment']);
+    }
+    if (isset($this->_source) &&
+        strpos($this->_source, LOCALE_PLURAL_DELIMITER) !== FALSE) {
+      $this->setSource(explode(LOCALE_PLURAL_DELIMITER, $this->_source));
+      $this->setTranslation(explode(LOCALE_PLURAL_DELIMITER, $this->_translation));
+      $this->setPlural(count($this->_source) > 1);
+    }
+  }
+
+  /**
+   * Output the PoItem as a string.
+   */
+  public function __toString() {
+    return $this->formatItem();
+  }
+
+  /**
+   * Format the POItem as a string.
+   */
+  private function formatItem() {
+    $output = '';
+
+    // Format string context.
+    if (!empty($this->_context)) {
+      $output .= 'msgctxt ' . $this->formatString($this->_context);
+    }
+
+    // Format translation.
+    if ($this->_plural) {
+      $output .= $this->formatPlural();
+    }
+    else {
+      $output .= $this->formatSingular();
+    }
+
+    // Add one empty line to separate the translations.
+    $output .= "\n";
+
+    return $output;
+  }
+
+  /**
+   * Formats a plural translation.
+   */
+  private function formatPlural() {
+    $output = '';
+
+    // Format source strings.
+    $output .= 'msgid ' . $this->formatString($this->_source[0]);
+    $output .= 'msgid_plural ' . $this->formatString($this->_source[1]);
+
+    foreach ($this->_translation as $i => $trans) {
+      if (isset($this->_translation[$i])) {
+        $output .= 'msgstr[' . $i . '] ' . $this->formatString($trans);
+      }
+      else {
+        $output .= 'msgstr[' . $i . '] ""' . "\n";
+      }
+    }
+
+    return $output;
+  }
+
+  /**
+   * Formats a singular translation.
+   */
+  private function formatSingular() {
+    $output = '';
+    $output .= 'msgid ' . $this->formatString($this->_source);
+    $output .= 'msgstr ' . (isset($this->_translation) ? $this->formatString($this->_translation) : '""');
+    return $output;
+  }
+
+  /**
+   * Formats a string for output on multiple lines.
+   */
+  private function formatString($string) {
+    // Escape characters for processing.
+    $string = addcslashes($string, "\0..\37\\\"");
+
+    // Always include a line break after the explicit \n line breaks from
+    // the source string. Otherwise wrap at 70 chars to accommodate the extra
+    // format overhead too.
+    $parts = explode("\n", wordwrap(str_replace('\n', "\\n\n", $string), 70, " \n"));
+
+    // Multiline string should be exported starting with a "" and newline to
+    // have all lines aligned on the same column.
+    if (count($parts) > 1) {
+      return "\"\"\n\"" . implode("\"\n\"", $parts) . "\"\n";
+    }
+    // Single line strings are output on the same line.
+    else {
+      return "\"$parts[0]\"\n";
+    }
+  }
+
+}