- Statut
- En attente de l’auteur
- Extension/thème associé
- Pro
- Étiquettes de sujet
- Compatibility
Aperçu de l’anomalie
Lorsque vous utilisez le thème Pro avec WPML, les modèles de mise en page tels que les mises en page uniques et d’archives créés dans le constructeur Cornerstone ne sont pas traduisibles via l’Éditeur de traduction WPML. Cela est dû à la manière dont Cornerstone gère le rendu des mises en page, qui diffère des types de publication standards.
Solution de contournement
Option 1 – Traduisez vos modèles manuellement
Utilisez le sélecteur de traduction intégré de Cornerstone en haut de l’éditeur Cornerstone. Cela vous permet de dupliquer la mise en page dans la langue secondaire et de la traduire manuellement.
- Modifiez votre mise en page à l’aide du constructeur Cornerstone.
- En haut de l’interface du constructeur, repérez le sélecteur de langue.
- Sélectionnez la langue dans laquelle vous souhaitez traduire.
- Saisissez manuellement le texte traduit dans l’éditeur de mise en page.
Réf. : https://theme.co/forum/t/not-possible-is-it-possible-to-translate-wc-single-layouts-with-wpml/112916/7
Option 2 – Code personnalisé dans functions.php
Assurez-vous d’avoir une sauvegarde complète de votre site avant de continuer.
- Ajoutez le code suivant au fichier functions.php de votre thème.
/** * 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, '' ); }
- Enregistrez à nouveau votre mise en page dans l’éditeur Cornerstone.
- Accédez à WPML > Traduction de chaînes et recherchez le domaine cornerstone-layout.
- Traduisez les chaînes.
- Accédez à Cornerstone > Paramètres et videz le cache.
Selon les widgets utilisés dans votre mise en page, vous devrez peut-être développer la liste des clés dans les deux fonctions
'cs_wpml_cs_collect_text_content' et 'cs_wpml_cs_translate_text_content' (pour ajouter des clés telles que 'toggle_anchor_text_primary_content', 'card_front_text_content', 'card_back_text_content', etc.).