Seditio Source
Root |
./othercms/xenForo 2.2.8/src/XF/Service/Language/Export.php
<?php

namespace XF\Service\Language;

use
XF\Entity\Language;

class
Export extends \XF\Service\AbstractService
{
    const
EXPORT_VERSION_ID = 2;

   
/**
     * @var Language
     */
   
protected $language;

   
/**
     * @var \XF\Entity\AddOn|null
     */
   
protected $addOn;

    protected
$includeUntranslated = false;

    public function
__construct(\XF\App $app, Language $language)
    {
       
parent::__construct($app);
       
$this->setLanguage($language);
    }

    public function
setLanguage(Language $language)
    {
       
$this->language = $language;
    }

    public function
getLanguage()
    {
        return
$this->language;
    }

    public function
setAddOn(\XF\Entity\AddOn $addOn = null)
    {
       
$this->addOn = $addOn;
    }

    public function
getAddOn()
    {
       
$this->addOn;
    }

    public function
setIncludeUntranslated($includeUntranslated)
    {
       
$this->includeUntranslated = (bool)$includeUntranslated;
    }

    public function
getIncludeUntranslated()
    {
        return
$this->includeUntranslated;
    }

    public function
exportToXml()
    {
       
$document = $this->createXml();
       
$languageNode = $this->getLanguageNode($document);
       
$document->appendChild($languageNode);

        foreach (
$this->getExportablePhrases() AS $phrase)
        {
           
$phraseNode = $this->getPhraseNode($document, $phrase);
           
$languageNode->appendChild($phraseNode);
        }

        return
$document;
    }

    public function
getExportFileName()
    {
       
$title = str_replace(' ', '-', utf8_romanize(utf8_deaccent($this->language->title)));
       
$addOnLimit = $this->addOn ? '-' . $this->addOn->addon_id_url : '';

        return
"language-{$title}{$addOnLimit}.xml";
    }

   
/**
     * @return \DOMDocument
     */
   
protected function createXml()
    {
       
$document = new \DOMDocument('1.0', 'utf-8');
       
$document->formatOutput = true;

        return
$document;
    }

   
/**
     * @param \DOMDocument $document
     * @return \DOMElement
     */
   
protected function getLanguageNode(\DOMDocument $document)
    {
       
$language = $this->language;

       
$languageNode = $document->createElement('language');
       
$languageNode->setAttribute('title', $language->title);
       
$languageNode->setAttribute('date_format', $language->date_format);
       
$languageNode->setAttribute('time_format', $language->time_format);
       
$languageNode->setAttribute('currency_format', $language->currency_format);
       
$languageNode->setAttribute('week_start', $language->week_start);
       
$languageNode->setAttribute('decimal_point', $language->decimal_point);
       
$languageNode->setAttribute('thousands_separator', $language->thousands_separator);
       
$languageNode->setAttribute('label_separator', $language->label_separator);
       
$languageNode->setAttribute('comma_separator', $language->comma_separator);
       
$languageNode->setAttribute('ellipsis', $language->ellipsis);
       
$languageNode->setAttribute('parenthesis_open', $language->parenthesis_open);
       
$languageNode->setAttribute('parenthesis_close', $language->parenthesis_close);
       
$languageNode->setAttribute('language_code', $language->language_code);
       
$languageNode->setAttribute('text_direction', $language->text_direction);
       
$languageNode->setAttribute('user_selectable', $language->user_selectable);
        if (
$this->addOn)
        {
           
$languageNode->setAttribute('addon_id', $this->addOn->addon_id);
           
$languageNode->setAttribute('base_version_id', $this->addOn->version_id);
        }
        else
        {
           
$languageNode->setAttribute('base_version_id', \XF::$versionId);
        }
       
$languageNode->setAttribute('export_version', self::EXPORT_VERSION_ID);
       
$document->appendChild($languageNode);

        return
$languageNode;
    }

    protected function
getPhraseNode(\DOMDocument $document, array $phrase)
    {
       
$phraseNode = $document->createElement('phrase');
       
$phraseNode->setAttribute('title', $phrase['title']);
       
$phraseNode->setAttribute('addon_id', $phrase['addon_id']);
        if (
$phrase['global_cache'])
        {
           
$phraseNode->setAttribute('global_cache', $phrase['global_cache']);
        }
       
$phraseNode->setAttribute('version_id', $phrase['version_id']);
       
$phraseNode->setAttribute('version_string', $phrase['version_string']);
       
$phraseNode->appendChild(
            \
XF\Util\Xml::createDomCdataSection($document, $phrase['phrase_text'])
        );

        return
$phraseNode;
    }

   
/**
     * @return array
     */
   
protected function getExportablePhrases()
    {
       
$language = $this->language;

       
$db = $this->db();

       
$addonLimitSql = ($this->addOn ? " AND master.addon_id = " . $db->quote($this->addOn->addon_id) : '');

        if (
$this->includeUntranslated)
        {
            return
$db->fetchAll("
                SELECT phrase.*,
                    IF(master.phrase_id IS NOT NULL, master.addon_id, phrase.addon_id) AS addon_id
                FROM xf_phrase_map AS map
                INNER JOIN xf_phrase AS phrase ON (map.phrase_id = phrase.phrase_id)
                LEFT JOIN xf_phrase AS master ON (master.title = phrase.title AND master.language_id = 0)
                WHERE map.language_id = ?
                   
$addonLimitSql
                ORDER BY map.title
            "
, $language->language_id);
        }
        else
        {
            return
$db->fetchAll("
                SELECT phrase.*,
                    IF(master.phrase_id, master.addon_id, phrase.addon_id) AS addon_id
                FROM xf_phrase AS phrase
                LEFT JOIN xf_phrase AS master ON (master.title = phrase.title AND master.language_id = 0)
                WHERE phrase.language_id = ?
                   
$addonLimitSql
                ORDER BY phrase.title
            "
, $language->language_id);
        }
    }
}