123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171 |
- <?php
- namespace Drupal\locale;
- use Drupal\Component\Gettext\PoHeader;
- use Drupal\Component\Gettext\PoItem;
- use Drupal\Component\Gettext\PoReaderInterface;
- /**
- * Gettext PO reader working with the locale module database.
- */
- class PoDatabaseReader implements PoReaderInterface {
- /**
- * An associative array indicating which type of strings should be read.
- *
- * Elements of the array:
- * - not_customized: boolean indicating if not customized strings should be
- * read.
- * - customized: boolean indicating if customized strings should be read.
- * - no_translated: boolean indicating if non-translated should be read.
- *
- * The three options define three distinct sets of strings, which combined
- * cover all strings.
- *
- * @var array
- */
- private $options;
- /**
- * Language code of the language being read from the database.
- *
- * @var string
- */
- private $langcode;
- /**
- * Store the result of the query so it can be iterated later.
- *
- * @var resource
- */
- private $result;
- /**
- * Constructor, initializes with default options.
- */
- public function __construct() {
- $this->setOptions([]);
- }
- /**
- * {@inheritdoc}
- */
- public function getLangcode() {
- return $this->langcode;
- }
- /**
- * {@inheritdoc}
- */
- public function setLangcode($langcode) {
- $this->langcode = $langcode;
- }
- /**
- * Get the options used by the reader.
- */
- public function getOptions() {
- return $this->options;
- }
- /**
- * Set the options for the current reader.
- */
- public function setOptions(array $options) {
- $options += [
- 'customized' => FALSE,
- 'not_customized' => FALSE,
- 'not_translated' => FALSE,
- ];
- $this->options = $options;
- }
- /**
- * {@inheritdoc}
- */
- public function getHeader() {
- return new PoHeader($this->getLangcode());
- }
- /**
- * Implements Drupal\Component\Gettext\PoMetadataInterface::setHeader().
- *
- * @throws Exception
- * Always, because you cannot set the PO header of a reader.
- */
- public function setHeader(PoHeader $header) {
- throw new \Exception('You cannot set the PO header in a reader.');
- }
- /**
- * Builds and executes a database query based on options set earlier.
- */
- private function loadStrings() {
- $langcode = $this->langcode;
- $options = $this->options;
- $conditions = [];
- if (array_sum($options) == 0) {
- // If user asked to not include anything in the translation files,
- // that would not make sense, so just fall back on providing a template.
- $langcode = NULL;
- // Force option to get both translated and untranslated strings.
- $options['not_translated'] = TRUE;
- }
- // Build and execute query to collect source strings and translations.
- if (!empty($langcode)) {
- $conditions['language'] = $langcode;
- // Translate some options into field conditions.
- if ($options['customized']) {
- if (!$options['not_customized']) {
- // Filter for customized strings only.
- $conditions['customized'] = LOCALE_CUSTOMIZED;
- }
- // Else no filtering needed in this case.
- }
- else {
- if ($options['not_customized']) {
- // Filter for non-customized strings only.
- $conditions['customized'] = LOCALE_NOT_CUSTOMIZED;
- }
- else {
- // Filter for strings without translation.
- $conditions['translated'] = FALSE;
- }
- }
- if (!$options['not_translated']) {
- // Filter for string with translation.
- $conditions['translated'] = TRUE;
- }
- return \Drupal::service('locale.storage')->getTranslations($conditions);
- }
- else {
- // If no language, we don't need any of the target fields.
- return \Drupal::service('locale.storage')->getStrings($conditions);
- }
- }
- /**
- * Get the database result resource for the given language and options.
- */
- private function readString() {
- if (!isset($this->result)) {
- $this->result = $this->loadStrings();
- }
- return array_shift($this->result);
- }
- /**
- * {@inheritdoc}
- */
- public function readItem() {
- if ($string = $this->readString()) {
- $values = (array) $string;
- $po_item = new PoItem();
- $po_item->setFromArray($values);
- return $po_item;
- }
- }
- }
|