Backup of db before drupal security update
[yaffs-website] / web / core / modules / locale / src / PoDatabaseReader.php
1 <?php
2
3 namespace Drupal\locale;
4
5 use Drupal\Component\Gettext\PoHeader;
6 use Drupal\Component\Gettext\PoItem;
7 use Drupal\Component\Gettext\PoReaderInterface;
8
9 /**
10  * Gettext PO reader working with the locale module database.
11  */
12 class PoDatabaseReader implements PoReaderInterface {
13
14   /**
15    * An associative array indicating which type of strings should be read.
16    *
17    * Elements of the array:
18    *  - not_customized: boolean indicating if not customized strings should be
19    *    read.
20    *  - customized: boolean indicating if customized strings should be read.
21    *  - no_translated: boolean indicating if non-translated should be read.
22    *
23    * The three options define three distinct sets of strings, which combined
24    * cover all strings.
25    *
26    * @var array
27    */
28   private $options;
29
30   /**
31    * Language code of the language being read from the database.
32    *
33    * @var string
34    */
35   private $langcode;
36
37   /**
38    * Store the result of the query so it can be iterated later.
39    *
40    * @var resource
41    */
42   private $result;
43
44   /**
45    * Constructor, initializes with default options.
46    */
47   public function __construct() {
48     $this->setOptions([]);
49   }
50
51   /**
52    * {@inheritdoc}
53    */
54   public function getLangcode() {
55     return $this->langcode;
56   }
57
58   /**
59    * {@inheritdoc}
60    */
61   public function setLangcode($langcode) {
62     $this->langcode = $langcode;
63   }
64
65   /**
66    * Get the options used by the reader.
67    */
68   public function getOptions() {
69     return $this->options;
70   }
71
72   /**
73    * Set the options for the current reader.
74    */
75   public function setOptions(array $options) {
76     $options += [
77       'customized' => FALSE,
78       'not_customized' => FALSE,
79       'not_translated' => FALSE,
80     ];
81     $this->options = $options;
82   }
83
84   /**
85    * {@inheritdoc}
86    */
87   public function getHeader() {
88     return new PoHeader($this->getLangcode());
89   }
90
91   /**
92    * Implements Drupal\Component\Gettext\PoMetadataInterface::setHeader().
93    *
94    * @throws Exception
95    *   Always, because you cannot set the PO header of a reader.
96    */
97   public function setHeader(PoHeader $header) {
98     throw new \Exception('You cannot set the PO header in a reader.');
99   }
100
101   /**
102    * Builds and executes a database query based on options set earlier.
103    */
104   private function loadStrings() {
105     $langcode = $this->langcode;
106     $options = $this->options;
107     $conditions = [];
108
109     if (array_sum($options) == 0) {
110       // If user asked to not include anything in the translation files,
111       // that would not make sense, so just fall back on providing a template.
112       $langcode = NULL;
113       // Force option to get both translated and untranslated strings.
114       $options['not_translated'] = TRUE;
115     }
116     // Build and execute query to collect source strings and translations.
117     if (!empty($langcode)) {
118       $conditions['language'] = $langcode;
119       // Translate some options into field conditions.
120       if ($options['customized']) {
121         if (!$options['not_customized']) {
122           // Filter for customized strings only.
123           $conditions['customized'] = LOCALE_CUSTOMIZED;
124         }
125         // Else no filtering needed in this case.
126       }
127       else {
128         if ($options['not_customized']) {
129           // Filter for non-customized strings only.
130           $conditions['customized'] = LOCALE_NOT_CUSTOMIZED;
131         }
132         else {
133           // Filter for strings without translation.
134           $conditions['translated'] = FALSE;
135         }
136       }
137       if (!$options['not_translated']) {
138         // Filter for string with translation.
139         $conditions['translated'] = TRUE;
140       }
141       return \Drupal::service('locale.storage')->getTranslations($conditions);
142     }
143     else {
144       // If no language, we don't need any of the target fields.
145       return \Drupal::service('locale.storage')->getStrings($conditions);
146     }
147   }
148
149   /**
150    * Get the database result resource for the given language and options.
151    */
152   private function readString() {
153     if (!isset($this->result)) {
154       $this->result = $this->loadStrings();
155     }
156     return array_shift($this->result);
157   }
158
159   /**
160    * {@inheritdoc}
161    */
162   public function readItem() {
163     if ($string = $this->readString()) {
164       $values = (array) $string;
165       $po_item = new PoItem();
166       $po_item->setFromArray($values);
167       return $po_item;
168     }
169   }
170
171 }