@param string $block_name * * @return array */ public function updateStringsRecursively( array $attrs, array $config_keys, array $translations, $lang, $block_name ) { foreach ( $attrs as $attr_key => $attr_value ) { $matching_key = $this->getMatchingConfigKey( $attr_key, $config_keys ); if ( ! $matching_key ) { continue; } if ( $this->hasJsonEncoding( $attr_key, $config_keys ) ) { $attr_value = json_decode( urldecode( $attr_value ), true ); } if ( is_array( $attr_value ) ) { $children_config_keys = $this->getChildrenConfigKeys( $config_keys, $matching_key ); $attrs[ $attr_key ] = $this->updateStringsRecursively( $attr_value, $children_config_keys, $translations, $lang, $block_name ); } else { $string_id = $this->get_string_id( $block_name, $attr_value ); if ( isset( $translations[ $string_id ][ $lang ] ) && ICL_TM_COMPLETE === (int) $translations[ $string_id ][ $lang ]['status'] ) { $attrs[ $attr_key ] = $translations[ $string_id ][ $lang ]['value']; } } if ( $this->hasJsonEncoding( $attr_key, $config_keys ) ) { $attrs[ $attr_key ] = rawurlencode( wp_json_encode( $attrs[ $attr_key ] ) ); } } return $attrs; } /** * @param array $attr_key * @param array $config_keys * * @retrun bool */ private function hasJsonEncoding( $attr_key, $config_keys ) { return 'json' === Obj::path( [ $attr_key, 'encoding' ], $config_keys ); } /** * @param \WP_Block_Parser_Block $block * * @return array */ private function getAttributes( \WP_Block_Parser_Block $block ) { return is_array( $block->attrs ) && $block->blockName ? $block->attrs : []; } /** * @param \WP_Block_Parser_Block $block * * @return array */ private function getKeyConfig( \WP_Block_Parser_Block $block ) { $config = $this->get_block_config( $block, 'key' ); return $config ? $config : []; } /** * @return array */ private function getMatchAllKey() { return [ '*' => [ 'search-method' => \WPML_Gutenberg_Config_Option::SEARCH_METHOD_WILDCARD, ], ]; } }