Files
doitinpoland.com/wp-content/plugins/sitepress-multilingual-cms/addons/wpml-page-builders/classes/Integrations/Gutenberg/class-wpml-gutenberg-strings-registration.php
2023-09-12 21:41:04 +02:00

185 lines
6.0 KiB
PHP

<?php
class WPML_Gutenberg_Strings_Registration {
/** @var WPML\PB\Gutenberg\StringsInBlock\StringsInBlock $strings_in_blocks */
private $strings_in_blocks;
/** @var WPML_ST_String_Factory $string_factory */
private $string_factory;
/** @var WPML_PB_Reuse_Translations $reuse_translations */
private $reuse_translations;
/** @var WPML_PB_String_Translation $string_translation */
private $string_translation;
/** @var int $string_location */
private $string_location;
/** @var array $leftover_strings */
private $leftover_strings;
/** @var WPML_Translate_Link_Targets $translate_link_targets */
private $translate_link_targets;
/** @var callable $set_link_translations */
private $set_link_translations;
public function __construct(
WPML\PB\Gutenberg\StringsInBlock\StringsInBlock $strings_in_blocks,
WPML_ST_String_Factory $string_factory,
WPML_PB_Reuse_Translations $reuse_translations,
WPML_PB_String_Translation $string_translation,
WPML_Translate_Link_Targets $translate_link_targets,
callable $set_link_translations
) {
$this->strings_in_blocks = $strings_in_blocks;
$this->string_factory = $string_factory;
$this->reuse_translations = $reuse_translations;
$this->string_translation = $string_translation;
$this->translate_link_targets = $translate_link_targets;
$this->set_link_translations = $set_link_translations;
}
/**
* @param WP_Post $post
* @param array $package_data
*/
public function register_strings( WP_Post $post, $package_data ) {
do_action( 'wpml_start_string_package_registration', $package_data );
do_action( 'wpml_start_GB_register_strings', $post, $package_data );
$this->leftover_strings = $original_strings = $this->string_translation->get_package_strings( $package_data );
$this->string_location = 1;
$this->register_blocks(
WPML_Gutenberg_Integration::parse_blocks( $post->post_content ),
$package_data,
$post->ID
);
$current_strings = $this->string_translation->get_package_strings( $package_data );
$this->reuse_translations->find_and_reuse_translations( $original_strings, $current_strings, $this->leftover_strings );
do_action( 'wpml_end_GB_register_strings', $post, $package_data );
do_action( 'wpml_delete_unused_package_strings', $package_data );
}
/**
* @param array $blocks
* @param array $package_data
*/
public function register_strings_from_widget( array $blocks, array $package_data ) {
do_action( 'wpml_start_string_package_registration', $package_data );
$this->leftover_strings = $original_strings = $this->string_translation->get_package_strings( $package_data );
$this->string_location = 1;
$this->register_blocks( $blocks, $package_data, null );
$current_strings = $this->string_translation->get_package_strings( $package_data );
$this->reuse_translations->find_and_reuse_translations( $original_strings, $current_strings, $this->leftover_strings );
do_action( 'wpml_delete_unused_package_strings', $package_data );
}
/**
* @param array $blocks
* @param array $package_data
*/
private function register_blocks( array $blocks, array $package_data, $post_id ) {
foreach ( $blocks as $block ) {
$block = WPML_Gutenberg_Integration::sanitize_block( $block );
$strings = $this->strings_in_blocks->find( $block );
if ( empty( $strings ) ) {
if ( $post_id ) {
apply_filters( 'wpml_pb_register_strings_in_content', false, $post_id, $block->innerHTML );
}
} else {
foreach ( $strings as $string ) {
if( $post_id && apply_filters( 'wpml_pb_register_strings_in_content', false, $post_id, $string->value ) ) {
continue;
}
if ( 'LINK' === $string->type && ! $this->translate_link_targets->is_internal_url( $string->value ) ) {
$string->type = 'LINE';
}
do_action(
'wpml_register_string',
$string->value,
$string->id,
$package_data,
$string->name,
$string->type
);
$this->update_string_location( $package_data, $string );
// phpcs:disable WordPress.NamingConventions.ValidVariableName.UsedPropertyNotSnakeCase
if ( 'core/heading' === $block->blockName ) {
// phpcs:enable
$wrap_tag = (string) isset( $block->attrs['level'] ) ? $block->attrs['level'] : 2;
$wrap_tag = 'h' . $wrap_tag;
$this->update_wrap_tag( $package_data, $string, $wrap_tag );
}
if ( 'LINK' === $string->type ) {
$string_id = apply_filters( 'wpml_string_id_from_package', 0, $package_data, $string->id, $string->value );
call_user_func( $this->set_link_translations, $string_id );
}
$this->remove_string_from_leftovers( $string->value );
}
}
if ( isset( $block->innerBlocks ) ) {
$this->register_blocks( $block->innerBlocks, $package_data, $post_id );
}
}
}
private function update_string_location( array $package_data, stdClass $string_data ) {
$string_id = apply_filters( 'wpml_string_id_from_package', 0, $package_data, $string_data->id, $string_data->value );
$string = $this->string_factory->find_by_id( $string_id );
if ( $string_id ) {
$string->set_location( $this->string_location );
$this->string_location++;
}
}
/**
* Update string wrap tag.
* Used for SEO, can contain (h1...h6, etc.)
*
* @param array $package_data Package.
* @param stdClass $string_data String in the package.
* @param string $wrap_tag String wrap.
*/
private function update_wrap_tag( $package_data, stdClass $string_data, $wrap_tag ) {
$string_id = apply_filters( 'wpml_string_id_from_package', 0, $package_data, $string_data->id, $string_data->value );
$string = $this->string_factory->find_by_id( $string_id );
if ( $string_id ) {
$string->set_wrap_tag( $wrap_tag );
}
}
/** @var string $string_value */
private function remove_string_from_leftovers( $string_value ) {
$string_hash = $this->string_translation->get_string_hash( $string_value );
if ( isset( $this->leftover_strings[ $string_hash ] ) ) {
unset( $this->leftover_strings[ $string_hash ] );
}
}
}