تخطي إلى المحتوى تخطي إلى الشريط الجانبي

Waiting for author

Topic Tags: Compatibility

Overview of the issue

When using the Pro theme with WPML, layout templates such as single and archive layouts created in the Cornerstone builder are not translatable through the WPML Translation Editor. This is due to how Cornerstone handles layout rendering, which differs from standard post types.

Workaround

Option 1 – Translate your templates manually

Use the built-in Cornerstone translation switcher at the top of the Cornerstone editor. This allows you to duplicate the layout into the secondary language and translate it manually.

  • Edit your layout using the Cornerstone Builder.
  • At the top of the builder interface, locate the language switcher.
  • Select the language you want to translate into.
  • Manually input the translated text within the layout editor.

Ref: https://theme.co/forum/t/not-possible-is-it-possible-to-translate-wc-single-layouts-with-wpml/112916/7

Option 2 – Custom code in functions.php

Please, make sure of having a full site backup of your site before proceeding.

  • Add the following code to your theme’s functions.php file.
    /**
     * WPML Workaround for compsupp-8255 
     */
    
    // 1. Register strings when saving Layout posts.
     
    add_action( 'save_post', function( $post_id, $post, $update ) {
    
    	if ( wp_is_post_revision( $post_id ) || ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE ) ) {
    		return;
    	}
    
    	$pt = get_post_type( $post_id );
    	$post = get_post( $post_id );
    	$slug = $post->post_name;
    
    	$layout_types = [ 'cs_layout_single', 'cs_layout_archive', 'cs_layout_single_wc', 'cs_layout_archive_wc' ];
    
    	// If the site uses other cs_layout_* types, widen this check:
    	// if ( strpos( $pt, 'cs_layout_' ) !== 0 ) return;
    	if ( ! in_array( $pt, $layout_types, true ) ) {
    		return;
    	}
    
    	// Only if WPML String Translation is present.
    	if ( ! has_action( 'wpml_register_single_string' ) ) {
    		return;
    	}
    
    	$data = json_decode( (string) $post->post_content, true );
    	if ( ! is_array( $data ) ) {
    		return;
    	}
    
    	$items   = cs_wpml_cs_collect_text_content( $data ); // [ path => original_text ]
    	$context = 'cornerstone-layout-' . $slug;
    
    	foreach ( $items as $path => $original ) {
    		// Includes a short hash to avoid collisions and keep it semi-readable in ST.
    		$hash = substr( md5( $path . '|' . $original ), 0, 10 );
    		$name = $path . ' #' . $hash;
    
    		do_action( 'wpml_register_single_string', $context, $name, $original );
    	}
    
    }, 10, 3 );
    
    
    // 2. Replace strings on load for Layout documents.
    
    add_filter( 'cs_layout_load_content', function( $post_content ) {
    
    	if ( ! has_filter( 'wpml_translate_single_string' ) ) {
    		return $post_content;
    	}
    
    	$data = json_decode( (string) $post_content, true );
    	if ( ! is_array( $data ) ) {
    		return $post_content;
    	}
    
    	$context = 'cornerstone-layout-' . $slug;
    
    	$data = cs_wpml_cs_translate_text_content( $data, $context );
    
    	return wp_json_encode( $data );
    
    }, 10, 1 );
    
    
    // Collect ONLY 'text_content' strings
    
    function cs_wpml_cs_collect_text_content( array $data ) : array {
    	$out = [];
    
    	$walk = function( $node, $path ) use ( &$walk, &$out ) {
    
    		if ( is_array( $node ) ) {
    			foreach ( $node as $k => $v ) {
    
    				$new_path = ( $path === '' ) ? (string) $k : $path . '.' . $k;
    
    				if ( in_array( $k, [ 'text_content', 'counter_before_content', 'counter_after_content' ], true ) && is_string( $v ) ) {
    
    					// Skip Dynamic Content tokens like {{dc:...}} or {{ acf... }}
    					if ( strpos( $v, '{{' ) === false ) {
    						$out[ $new_path ] = $v;
    					}
    					continue;
    				}
    
    				if ( is_array( $v ) ) {
    					$walk( $v, $new_path );
    				}
    			}
    		}
    	};
    
    	$walk( $data, '' );
    	return $out;
    }
    
    
    // Translate ONLY 'text_content' strings.
    
    function cs_wpml_cs_translate_text_content( array $data, string $context ) : array {
    
    	$walk = function( $node, $path ) use ( &$walk, $context ) {
    
    		if ( is_array( $node ) ) {
    			foreach ( $node as $k => $v ) {
    
    				$new_path = ( $path === '' ) ? (string) $k : $path . '.' . $k;
    
    				if ( in_array( $k, [ 'text_content', 'counter_before_content', 'counter_after_content' ], true ) && is_string( $v ) ) {
    
    					// Skip Dynamic Content tokens like {{...}}
    					if ( strpos( $v, '{{' ) === false ) {
    
    						$hash = substr( md5( $new_path . '|' . $v ), 0, 10 );
    						$name = $new_path . ' #' . $hash;
    
    						$node[ $k ] = apply_filters( 'wpml_translate_single_string', $v, $context, $name );
    					}
    
    					continue;
    				}
    
    				if ( is_array( $v ) ) {
    					$node[ $k ] = $walk( $v, $new_path );
    				}
    			}
    		}
    
    		return $node;
    	};
    
    	return $walk( $data, '' );
    }
            
  • Re-save your layout in the Cornerstone editor.
  • Go to WPML > String Translation and search for the domain cornerstone-layout.
  • Translate the strings.
  • Go to Cornerstone > Settings and clear the cache.

Note:
Depending on the widgets used in your layout, you might need to expand the list of keys in both functions 'cs_wpml_cs_collect_text_content' and 'cs_wpml_cs_translate_text_content' (to add keys such as ‘toggle_anchor_text_primary_content‘, ‘card_front_text_content‘, ‘card_back_text_content‘, etc.).

اترك ردًا

الرجاء البقاء في الموضوع واحترام الآخرين. إذا كنت بحاجة إلى مساعدة في مشكلات غير متعلقة بهذا المنشور، استخدم منتدى الدعم الخاص بنا لبدء محادثة أو تقديم تذكرة.

يمكنك استخدام هذه الوسوم:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>