- Trạng thái
- Đang chờ nhà phát triển
- Plugin/giao diện liên quan
- Pro
- Thẻ chủ đề
- Compatibility
Tổng quan về lỗi
Khi sử dụng giao diện Pro với WPML, các mẫu bố cục như bố cục trang đơn và trang lưu trữ được tạo trong trình dựng trang Cornerstone không thể dịch được thông qua Trình biên tập dịch thuật WPML. Điều này là do cách Cornerstone xử lý việc hiển thị bố cục, khác với các loại bài viết tiêu chuẩn.
Giải pháp tạm thời
Tùy chọn 1 – Dịch thủ công các template của bạn
Sử dụng bộ chuyển đổi dịch thuật Cornerstone được tích hợp sẵn ở đầu trình chỉnh sửa Cornerstone. Điều này cho phép bạn nhân bản bố cục sang ngôn ngữ phụ và dịch thủ công.
- Chỉnh sửa bố cục của bạn bằng Cornerstone Builder.
- Ở đầu giao diện của builder, hãy tìm bộ chuyển đổi ngôn ngữ.
- Chọn ngôn ngữ bạn muốn dịch sang.
- Nhập thủ công văn bản đã dịch trong trình chỉnh sửa bố cục.
Tham khảo: https://theme.co/forum/t/not-possible-is-it-possible-to-translate-wc-single-layouts-with-wpml/112916/7
Tùy chọn 2 – Mã tùy chỉnh trong functions.php
Vui lòng đảm bảo có một bản sao lưu toàn bộ trang web của bạn trước khi tiếp tục.
- Thêm mã sau vào tệp functions.php trong giao diện của bạn.
/** * 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, '' ); }
- Lưu lại bố cục của bạn trong trình chỉnh sửa Cornerstone.
- Đi tới WPML > Dịch chuỗi và tìm kiếm miền cornerstone-layout.
- Dịch các chuỗi.
- Đi tới Cornerstone > Cài đặt và xóa cache.
Tùy thuộc vào các widget được sử dụng trong bố cục của bạn, bạn có thể cần mở rộng danh sách các khóa trong cả hai hàm
'cs_wpml_cs_collect_text_content' và 'cs_wpml_cs_translate_text_content' (để thêm các khóa như 'toggle_anchor_text_primary_content', 'card_front_text_content', 'card_back_text_content', v.v.).