Code Coverage |
||||||||||
Classes and Traits |
Functions and Methods |
Lines |
||||||||
Total | |
0.00% |
0 / 1 |
|
0.00% |
0 / 12 |
CRAP | |
0.00% |
0 / 123 |
PoDatabaseWriter | |
0.00% |
0 / 1 |
|
0.00% |
0 / 12 |
1190 | |
0.00% |
0 / 123 |
__construct | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getLangcode | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setLangcode | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
getReport | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setReport | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 9 |
|||
getOptions | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setOptions | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 12 |
|||
getHeader | |
0.00% |
0 / 1 |
2 | |
0.00% |
0 / 2 |
|||
setHeader | |
0.00% |
0 / 1 |
72 | |
0.00% |
0 / 19 |
|||
writeItem | |
0.00% |
0 / 1 |
6 | |
0.00% |
0 / 6 |
|||
writeItems | |
0.00% |
0 / 1 |
20 | |
0.00% |
0 / 5 |
|||
importString | |
0.00% |
0 / 1 |
132 | |
0.00% |
0 / 60 |
<?php | |
/** | |
* @file | |
* Contains \Drupal\locale\PoDatabaseWriter. | |
*/ | |
namespace Drupal\locale; | |
use Drupal\Component\Gettext\PoHeader; | |
use Drupal\Component\Gettext\PoItem; | |
use Drupal\Component\Gettext\PoReaderInterface; | |
use Drupal\Component\Gettext\PoWriterInterface; | |
/** | |
* Gettext PO writer working with the locale module database. | |
*/ | |
class PoDatabaseWriter implements PoWriterInterface { | |
/** | |
* An associative array indicating what data should be overwritten, if any. | |
* | |
* Elements of the array: | |
* - override_options | |
* - not_customized: boolean indicating that not customized strings should | |
* be overwritten. | |
* - customized: boolean indicating that customized strings should be | |
* overwritten. | |
* - customized: the strings being imported should be saved as customized. | |
* One of LOCALE_CUSTOMIZED or LOCALE_NOT_CUSTOMIZED. | |
* | |
* @var array | |
*/ | |
private $options; | |
/** | |
* Language code of the language being written to the database. | |
* | |
* @var string | |
*/ | |
private $langcode; | |
/** | |
* Header of the po file written to the database. | |
* | |
* @var \Drupal\Component\Gettext\PoHeader | |
*/ | |
private $header; | |
/** | |
* Associative array summarizing the number of changes done. | |
* | |
* Keys for the array: | |
* - additions: number of source strings newly added | |
* - updates: number of translations updated | |
* - deletes: number of translations deleted | |
* - skips: number of strings skipped due to disallowed HTML | |
* | |
* @var array | |
*/ | |
private $report; | |
/** | |
* Constructor, initialize reporting array. | |
*/ | |
public function __construct() { | |
$this->setReport(); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getLangcode() { | |
return $this->langcode; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function setLangcode($langcode) { | |
$this->langcode = $langcode; | |
} | |
/** | |
* Get the report of the write operations. | |
*/ | |
public function getReport() { | |
return $this->report; | |
} | |
/** | |
* Set the report array of write operations. | |
* | |
* @param array $report | |
* Associative array with result information. | |
*/ | |
public function setReport($report = array()) { | |
$report += array( | |
'additions' => 0, | |
'updates' => 0, | |
'deletes' => 0, | |
'skips' => 0, | |
'strings' => array(), | |
); | |
$this->report = $report; | |
} | |
/** | |
* Get the options used by the writer. | |
*/ | |
public function getOptions() { | |
return $this->options; | |
} | |
/** | |
* Set the options for the current writer. | |
*/ | |
public function setOptions(array $options) { | |
if (!isset($options['overwrite_options'])) { | |
$options['overwrite_options'] = array(); | |
} | |
$options['overwrite_options'] += array( | |
'not_customized' => FALSE, | |
'customized' => FALSE, | |
); | |
$options += array( | |
'customized' => LOCALE_NOT_CUSTOMIZED, | |
); | |
$this->options = $options; | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function getHeader() { | |
return $this->header; | |
} | |
/** | |
* Implements Drupal\Component\Gettext\PoMetadataInterface::setHeader(). | |
* | |
* Sets the header and configure Drupal accordingly. | |
* | |
* Before being able to process the given header we need to know in what | |
* context this database write is done. For this the options must be set. | |
* | |
* A langcode is required to set the current header's PluralForm. | |
* | |
* @param \Drupal\Component\Gettext\PoHeader $header | |
* Header metadata. | |
* | |
* @throws Exception | |
*/ | |
public function setHeader(PoHeader $header) { | |
$this->header = $header; | |
$locale_plurals = \Drupal::state()->get('locale.translation.plurals') ?: array(); | |
// Check for options. | |
$options = $this->getOptions(); | |
if (empty($options)) { | |
throw new \Exception('Options should be set before assigning a PoHeader.'); | |
} | |
$overwrite_options = $options['overwrite_options']; | |
// Check for langcode. | |
$langcode = $this->langcode; | |
if (empty($langcode)) { | |
throw new \Exception('Langcode should be set before assigning a PoHeader.'); | |
} | |
if (array_sum($overwrite_options) || empty($locale_plurals[$langcode]['plurals'])) { | |
// Get and store the plural formula if available. | |
$plural = $header->getPluralForms(); | |
if (isset($plural) && $p = $header->parsePluralForms($plural)) { | |
list($nplurals, $formula) = $p; | |
\Drupal::service('locale.plural.formula')->setPluralFormula($langcode, $nplurals, $formula); | |
} | |
} | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function writeItem(PoItem $item) { | |
if ($item->isPlural()) { | |
$item->setSource(implode(LOCALE_PLURAL_DELIMITER, $item->getSource())); | |
$item->setTranslation(implode(LOCALE_PLURAL_DELIMITER, $item->getTranslation())); | |
} | |
$this->importString($item); | |
} | |
/** | |
* {@inheritdoc} | |
*/ | |
public function writeItems(PoReaderInterface $reader, $count = -1) { | |
$forever = $count == -1; | |
while (($count-- > 0 || $forever) && ($item = $reader->readItem())) { | |
$this->writeItem($item); | |
} | |
} | |
/** | |
* Imports one string into the database. | |
* | |
* @param \Drupal\Component\Gettext\PoItem $item | |
* The item being imported. | |
* | |
* @return int | |
* The string ID of the existing string modified or the new string added. | |
*/ | |
private function importString(PoItem $item) { | |
// Initialize overwrite options if not set. | |
$this->options['overwrite_options'] += array( | |
'not_customized' => FALSE, | |
'customized' => FALSE, | |
); | |
$overwrite_options = $this->options['overwrite_options']; | |
$customized = $this->options['customized']; | |
$context = $item->getContext(); | |
$source = $item->getSource(); | |
$translation = $item->getTranslation(); | |
// Look up the source string and any existing translation. | |
$strings = \Drupal::service('locale.storage')->getTranslations(array( | |
'language' => $this->langcode, | |
'source' => $source, | |
'context' => $context, | |
)); | |
$string = reset($strings); | |
if (!empty($translation)) { | |
// Skip this string unless it passes a check for dangerous code. | |
if (!locale_string_is_safe($translation)) { | |
\Drupal::logger('locale')->error('Import of string "%string" was skipped because of disallowed or malformed HTML.', array('%string' => $translation)); | |
$this->report['skips']++; | |
return 0; | |
} | |
elseif ($string) { | |
$string->setString($translation); | |
if ($string->isNew()) { | |
// No translation in this language. | |
$string->setValues(array( | |
'language' => $this->langcode, | |
'customized' => $customized, | |
)); | |
$string->save(); | |
$this->report['additions']++; | |
} | |
elseif ($overwrite_options[$string->customized ? 'customized' : 'not_customized']) { | |
// Translation exists, only overwrite if instructed. | |
$string->customized = $customized; | |
$string->save(); | |
$this->report['updates']++; | |
} | |
$this->report['strings'][] = $string->getId(); | |
return $string->lid; | |
} | |
else { | |
// No such source string in the database yet. | |
$string = \Drupal::service('locale.storage')->createString(array('source' => $source, 'context' => $context)) | |
->save(); | |
\Drupal::service('locale.storage')->createTranslation(array( | |
'lid' => $string->getId(), | |
'language' => $this->langcode, | |
'translation' => $translation, | |
'customized' => $customized, | |
))->save(); | |
$this->report['additions']++; | |
$this->report['strings'][] = $string->getId(); | |
return $string->lid; | |
} | |
} | |
elseif ($string && !$string->isNew() && $overwrite_options[$string->customized ? 'customized' : 'not_customized']) { | |
// Empty translation, remove existing if instructed. | |
$string->delete(); | |
$this->report['deletes']++; | |
$this->report['strings'][] = $string->lid; | |
return $string->lid; | |
} | |
} | |
} |