Skip to main content
Drupal API
User account menu
  • Log in

Breadcrumb

  1. Drupal Core 11.1.x

PoDatabaseReader.php

Namespace

Drupal\locale

File

core/modules/locale/src/PoDatabaseReader.php

View source
<?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;
        }
    }

}

Classes

Title Deprecated Summary
PoDatabaseReader Gettext PO reader working with the locale module database.

API Navigation

  • Drupal Core 11.1.x
  • Topics
  • Classes
  • Functions
  • Constants
  • Globals
  • Files
  • Namespaces
  • Deprecated
  • Services
RSS feed
Powered by Drupal