first commit

This commit is contained in:
2023-09-12 21:41:04 +02:00
commit 3361a7f053
13284 changed files with 2116755 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
<?php
class WPML_TM_Translation_Basket_Hooks_Factory implements IWPML_Backend_Action_Loader {
public function create() {
global $wpdb, $sitepress;
$hooks = array();
if ( $sitepress->get_wp_api()->is_tm_page( 'basket' ) ) {
$template_service_loader = new WPML_Twig_Template_Loader( array( WPML_TM_PATH . '/templates/translation-basket' ) );
$template_service = $template_service_loader->get_template();
$basket = new WPML_Translation_Basket( $wpdb );
$hooks['validation'] = new WPML_TM_Translation_Basket_Validation_Notice(
$template_service,
new WPML_Translation_Basket_Validation(
$basket,
new WPML_Encoding_Validation(),
new WPML_Element_Translation_Package()
),
new WPML_Translation_Basket( $wpdb )
);
$dialog_view = new WPML_TM_Translation_Basket_Dialog_View( $template_service, $sitepress->get_wp_api() );
$hooks['dialog'] = new WPML_TM_Translation_Basket_Dialog_Hooks( $dialog_view, $sitepress->get_wp_api() );
}
return $hooks;
}
}

View File

@@ -0,0 +1,72 @@
<?php
class WPML_TM_Translation_Basket_Validation_Notice {
const TEMPLATE_FILE = 'validation-notice.twig';
private $template_service;
private $basket_validation;
private $basket;
public function __construct(
IWPML_Template_Service $template_service,
WPML_Translation_Basket_Validation $basket_validation,
WPML_Translation_Basket $basket
) {
$this->template_service = $template_service;
$this->basket_validation = $basket_validation;
$this->basket = $basket;
}
public function add_hooks() {
add_action( 'wpml_tm_before_basket_items_display', array( $this, 'render' ) );
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ) );
}
public function enqueue_scripts() {
wp_enqueue_script( 'wpml-tm-invalid-fields-dialog', WPML_TM_URL . '/res/js/translation-basket/invalid-fields-dialog.js', array( 'jquery-ui-dialog' ) );
}
public function render() {
if ( $this->basket_validation->get_invalid_documents() ) {
echo $this->template_service->show( $this->get_model(), self::TEMPLATE_FILE );
foreach ( $this->basket_validation->get_invalid_documents() as $document ) {
$this->basket->remove_item( $document['id'], $document['type'] );
}
}
}
private function get_model() {
return array(
'strings' => array(
'title' => __( 'WPML cannot send some of the content to translation', 'wpml-translation-management' ),
'message' => __( 'Some of the content that you selected for translation includes fields that are encoded. Translators will not be able to work on this kind of content, so we removed it from the job.', 'wpml-translation-management' ),
'message_bottom' => __( 'To fix this problem, you need to tell WPML how these fields are encoded, so that WPML can decode them before sending for translation.', 'wpml-translation-management' ),
'show_fields' => __( 'show fields', 'wpml-translation-management' ),
'documentation' => array(
'link' => 'https://wpml.org/documentation/translating-your-contents/page-builders/how-to-fix-encoding-of-fields/?utm_source=wpmlplugin&utm_campaign=content-translation&utm_medium=translation-basket&utm_term=how-to-fix-encoding-of-fields',
'text' => 'How to indicate to WPML that it needs to decode fields',
),
),
'documents' => $this->get_formatted_documents(),
);
}
/**
* @return array
*/
private function get_formatted_documents() {
$invalid_documents = $this->basket_validation->get_invalid_documents();
foreach ( $invalid_documents as $id => $invalid_document ) {
if ( array_key_exists( 'fields', $invalid_document ) ) {
$invalid_documents[ $id ]['fields'] = json_encode(
array_map( 'json_encode', $invalid_documents[ $id ]['fields'] )
);
}
}
return $invalid_documents;
}
}

View File

@@ -0,0 +1,74 @@
<?php
class WPML_Translation_Basket_Validation {
private $basket;
private $encoding_validation;
private $package_helper;
public function __construct(
WPML_Translation_Basket $basket,
WPML_Encoding_Validation $encoding_validation,
WPML_Element_Translation_Package $package_helper
) {
$this->basket = $basket;
$this->encoding_validation = $encoding_validation;
$this->package_helper = $package_helper;
}
/**
* @return array
*/
public function get_invalid_documents() {
$basket = $this->basket->get_basket();
$invalid_documents = array();
$invalid_documents = $this->get_base64_encoded_documents( $invalid_documents, $basket, 'post' );
$invalid_documents = $this->get_base64_encoded_documents( $invalid_documents, $basket, 'package' );
return $invalid_documents;
}
/**
* @param array $invalid_documents
* @param array $basket
* @param string $kind
*
* @return array
*/
private function get_base64_encoded_documents( $invalid_documents, $basket, $kind ) {
if ( array_key_exists( $kind, $basket ) ) {
foreach ( $basket[ $kind ] as $id => $document ) {
if ( ! get_post( $id ) ) {
continue;
}
$package = $this->package_helper->create_translation_package( $id );
foreach ( $package['contents'] as $slug => $field ) {
if ( array_key_exists( 'format', $field )
&& 'base64' === $field['format']
&& $this->encoding_validation->is_base64( base64_decode( $field['data'] ) )
) {
if ( ! array_key_exists( $id, $invalid_documents ) ) {
$invalid_documents[ $id ] = array(
'error_type' => 'base64',
'error_message' => __( 'There are base64 encoded fields in this document', 'wpml-translation-management' ),
'id' => $id,
'title' => $package['title'],
'type' => $kind,
);
}
$string_slug = new WPML_TM_Page_Builders_Field_Wrapper( $slug );
$invalid_documents[ $id ]['fields'][] = array(
'title' => $string_slug->get_string_title(),
'content' => base64_decode( $field['data'] ),
);
}
}
}
}
return $invalid_documents;
}
}

View File

@@ -0,0 +1,46 @@
<?php
class WPML_TM_Translation_Basket_Dialog_Hooks implements IWPML_Action {
const PRIORITY_GREATER_THAN_MEDIA_DIALOG = 5;
/** @var WPML_TM_Translation_Basket_Dialog_View $dialog_view */
private $dialog_view;
private $wp_api;
public function __construct( WPML_TM_Translation_Basket_Dialog_View $dialog_view, WPML_WP_API $wp_api ) {
$this->dialog_view = $dialog_view;
$this->wp_api = $wp_api;
}
public function add_hooks() {
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_scripts' ), self::PRIORITY_GREATER_THAN_MEDIA_DIALOG );
add_action( 'wpml_translation_basket_page_after', array( $this, 'display_dialog_markup' ) );
}
public function enqueue_scripts() {
$handler = 'wpml-tm-translation-basket-dialog';
wp_register_script(
$handler,
WPML_TM_URL . '/res/js/translation-basket/dialog.js',
array( 'jquery-ui-dialog' )
);
wp_localize_script(
$handler,
'wpmlTMBasket',
array(
'dialogs' => array(),
'redirection' => $this->wp_api->get_tm_url(),
)
);
wp_enqueue_script( $handler );
}
public function display_dialog_markup() {
echo $this->dialog_view->render();
}
}

View File

@@ -0,0 +1,37 @@
<?php
class WPML_TM_Translation_Basket_Dialog_View {
const TEMPLATE_FILE = 'dialog.twig';
/** @var IWPML_Template_Service $template_service */
private $template_service;
/** @var WPML_WP_API $wp_api */
private $wp_api;
public function __construct( IWPML_Template_Service $template_service, WPML_WP_API $wp_api ) {
$this->template_service = $template_service;
$this->wp_api = $wp_api;
}
/**
* @return string
*/
public function render() {
$model = array(
'strings' => self::get_strings(),
'redirect_url' => $this->wp_api->get_tm_url(),
);
return $this->template_service->show( $model, self::TEMPLATE_FILE );
}
public static function get_strings() {
return array(
'title' => __( 'Sending for translation', 'wpml-translation-management' ),
'sent_to_translation' => __( 'Items sent for translation!', 'wpml-translation-management' ),
'button_done' => __( 'Done', 'wpml-translation-management' ),
);
}
}