first commit
This commit is contained in:
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
class WPML_TM_Translation_Batch_Element {
|
||||
/** @var int */
|
||||
private $element_id;
|
||||
|
||||
/** @var string */
|
||||
private $element_type;
|
||||
|
||||
/** @var string */
|
||||
private $source_lang;
|
||||
|
||||
/** @var array */
|
||||
private $target_langs;
|
||||
|
||||
/** @var $media_to_translations */
|
||||
private $media_to_translations;
|
||||
|
||||
/**
|
||||
* @param int $element_id
|
||||
* @param string $element_type
|
||||
* @param string $source_lang
|
||||
* @param array $target_languages
|
||||
* @param array $media_to_translations
|
||||
*/
|
||||
public function __construct(
|
||||
$element_id,
|
||||
$element_type,
|
||||
$source_lang,
|
||||
array $target_languages,
|
||||
array $media_to_translations = array()
|
||||
) {
|
||||
if ( ! $element_id ) {
|
||||
throw new InvalidArgumentException( 'Element id has to be defined' );
|
||||
}
|
||||
|
||||
if ( empty( $element_type ) ) {
|
||||
throw new InvalidArgumentException( 'Element type has to be defined' );
|
||||
}
|
||||
|
||||
if ( ! is_string( $source_lang ) || empty( $source_lang ) ) {
|
||||
throw new InvalidArgumentException( 'Source lang has to be not empty string' );
|
||||
}
|
||||
|
||||
if ( empty( $target_languages ) ) {
|
||||
throw new InvalidArgumentException( 'Target languages array cannot be empty' );
|
||||
}
|
||||
|
||||
$possible_actions = array(
|
||||
TranslationManagement::TRANSLATE_ELEMENT_ACTION,
|
||||
TranslationManagement::DUPLICATE_ELEMENT_ACTION,
|
||||
);
|
||||
foreach ( $target_languages as $lang => $action ) {
|
||||
if ( ! is_string( $lang ) || ! in_array( $action, $possible_actions, true ) ) {
|
||||
throw new InvalidArgumentException( 'Target languages must be an associative array with the language code as a key and the action as a numeric value.' );
|
||||
}
|
||||
}
|
||||
|
||||
$this->element_id = $element_id;
|
||||
$this->element_type = $element_type;
|
||||
$this->source_lang = $source_lang;
|
||||
$this->target_langs = $target_languages;
|
||||
$this->media_to_translations = $media_to_translations;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
public function get_element_id() {
|
||||
return $this->element_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function get_element_type() {
|
||||
return $this->element_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function get_source_lang() {
|
||||
return $this->source_lang;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function get_target_langs() {
|
||||
return $this->target_langs;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return mixed
|
||||
*/
|
||||
public function get_media_to_translations() {
|
||||
return $this->media_to_translations;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
|
||||
class WPML_TM_Translation_Batch_Factory {
|
||||
|
||||
/** @var WPML_Translation_Basket $basket */
|
||||
private $basket;
|
||||
|
||||
/**
|
||||
* @param WPML_Translation_Basket $basket
|
||||
*/
|
||||
public function __construct( WPML_Translation_Basket $basket ) {
|
||||
$this->basket = $basket;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param array $batch_data
|
||||
*
|
||||
* @return WPML_TM_Translation_Batch
|
||||
*/
|
||||
public function create( array $batch_data ) {
|
||||
$translators = isset( $batch_data['translators'] ) ? $batch_data['translators'] : array();
|
||||
$basket_name = isset( $batch_data['basket_name'] ) ? filter_var(
|
||||
$batch_data['basket_name'],
|
||||
FILTER_SANITIZE_STRING
|
||||
) : '';
|
||||
$elements = apply_filters(
|
||||
'wpml_tm_batch_factory_elements',
|
||||
$this->get_elements( $batch_data, array_keys( $translators ) ),
|
||||
$basket_name
|
||||
);
|
||||
|
||||
$deadline_date = null;
|
||||
if ( isset( $batch_data['deadline_date'] ) && $this->validate_deadline( $batch_data['deadline_date'] ) ) {
|
||||
$deadline_date = new DateTime( $batch_data['deadline_date'] );
|
||||
}
|
||||
|
||||
return new WPML_TM_Translation_Batch(
|
||||
$elements,
|
||||
$basket_name,
|
||||
$translators,
|
||||
$deadline_date
|
||||
);
|
||||
}
|
||||
|
||||
private function get_elements( array $batch_data, array $translators_target_languages ) {
|
||||
if ( ! isset( $batch_data['batch'] ) || empty( $batch_data['batch'] ) ) {
|
||||
return array();
|
||||
}
|
||||
|
||||
$basket = $this->basket->get_basket();
|
||||
|
||||
if ( ! isset( $basket['post'] ) ) {
|
||||
$basket['post'] = array();
|
||||
}
|
||||
if ( ! isset( $basket['string'] ) ) {
|
||||
$basket['string'] = array();
|
||||
}
|
||||
|
||||
$basket_items_types = array_keys( $this->basket->get_item_types() );
|
||||
|
||||
$result = array();
|
||||
foreach ( $batch_data['batch'] as $item ) {
|
||||
$element_id = $item['post_id'];
|
||||
$element_type = $item['type'];
|
||||
|
||||
if ( ! in_array( $element_type, $basket_items_types, true ) ) {
|
||||
continue;
|
||||
}
|
||||
if ( ! isset( $basket[ $element_type ][ $element_id ] ) ) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$basket_item = $basket[ $element_type ][ $element_id ];
|
||||
|
||||
$target_languages = array_intersect_key(
|
||||
$basket_item['to_langs'],
|
||||
array_combine( $translators_target_languages, $translators_target_languages )
|
||||
);
|
||||
if ( empty( $target_languages ) ) {
|
||||
throw new InvalidArgumentException( 'Element\'s target languages do not match to batch list' );
|
||||
}
|
||||
|
||||
$media_to_translations = isset( $basket_item['media-translation'] ) ? $basket_item['media-translation'] : array();
|
||||
|
||||
$result[] = new WPML_TM_Translation_Batch_Element(
|
||||
$element_id,
|
||||
$element_type,
|
||||
$basket[ $element_type ][ $element_id ]['from_lang'],
|
||||
$target_languages,
|
||||
$media_to_translations
|
||||
);
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* The expected format is "2017-09-28"
|
||||
*
|
||||
* @param string $date
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
private function validate_deadline( $date ) {
|
||||
$date_parts = explode( '-', $date );
|
||||
|
||||
return is_array( $date_parts ) &&
|
||||
count( $date_parts ) === 3 &&
|
||||
checkdate( $date_parts[1], $date_parts[2], $date_parts[0] );
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,133 @@
|
||||
<?php
|
||||
|
||||
class WPML_TM_Translation_Batch {
|
||||
/** @var WPML_TM_Translation_Batch_Element[] */
|
||||
private $elements;
|
||||
|
||||
/** @var string */
|
||||
private $basket_name;
|
||||
|
||||
/** @var array */
|
||||
private $translators;
|
||||
|
||||
/** @var DateTime */
|
||||
private $deadline;
|
||||
|
||||
/**
|
||||
* @param WPML_TM_Translation_Batch_Element[] $elements
|
||||
* @param string $basket_name
|
||||
* @param array $translators
|
||||
* @param DateTime $deadline
|
||||
*/
|
||||
public function __construct( array $elements, $basket_name, array $translators, DateTime $deadline = null ) {
|
||||
if ( empty( $elements ) ) {
|
||||
throw new InvalidArgumentException( 'Batch elements cannot be empty' );
|
||||
}
|
||||
|
||||
if ( empty( $basket_name ) ) {
|
||||
throw new InvalidArgumentException( 'Basket name cannot be empty' );
|
||||
}
|
||||
|
||||
if ( empty( $translators ) ) {
|
||||
throw new InvalidArgumentException( 'Translators array cannot be empty' );
|
||||
}
|
||||
|
||||
$this->elements = $elements;
|
||||
$this->basket_name = (string) $basket_name;
|
||||
$this->translators = $translators;
|
||||
$this->deadline = $deadline;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return WPML_TM_Translation_Batch_Element[]
|
||||
*/
|
||||
public function get_elements() {
|
||||
return $this->elements;
|
||||
}
|
||||
|
||||
public function add_element( WPML_TM_Translation_Batch_Element $element ) {
|
||||
$this->elements[] = $element;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $type
|
||||
*
|
||||
* @return WPML_TM_Translation_Batch_Element[]
|
||||
*/
|
||||
public function get_elements_by_type( $type ) {
|
||||
$result = array();
|
||||
foreach ( $this->get_elements() as $element ) {
|
||||
if ( $element->get_element_type() === $type ) {
|
||||
$result[] = $element;
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function get_basket_name() {
|
||||
return $this->basket_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function get_translators() {
|
||||
return $this->translators;
|
||||
}
|
||||
|
||||
public function get_translator( $lang ) {
|
||||
return $this->translators[ $lang ];
|
||||
}
|
||||
|
||||
/**
|
||||
* @return DateTime
|
||||
*/
|
||||
public function get_deadline() {
|
||||
return $this->deadline;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function get_target_languages() {
|
||||
$result = array();
|
||||
foreach ( $this->get_elements() as $element ) {
|
||||
$result[] = array_keys( $element->get_target_langs() );
|
||||
}
|
||||
|
||||
return array_values( array_unique( call_user_func_array( 'array_merge', $result ) ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function get_remote_target_languages() {
|
||||
return array_values(
|
||||
array_filter(
|
||||
$this->get_target_languages(),
|
||||
array(
|
||||
$this,
|
||||
'is_remote_target_language',
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
private function is_remote_target_language( $lang ) {
|
||||
return isset( $this->translators[ $lang ] ) && ! is_numeric( $this->translators[ $lang ] );
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function get_batch_options() {
|
||||
return array(
|
||||
'basket_name' => $this->get_basket_name(),
|
||||
'deadline_date' => $this->get_deadline() ? $this->get_deadline()->format( 'Y-m-d' ) : '',
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user