Một số thứ hoạt động khác biệt trên một trang web đa ngôn ngữ theo thiết kế: một hàm WordPress dựa trên khóa là một thuật ngữ của ngôn ngữ mặc định, một hậu tố ngày tháng mà WordPress không thể bản địa hóa, một slug mà Trình biên tập dịch thuật nâng cao không tự tạo ra. Các câu hỏi hỗ trợ thường coi chúng là lỗi; nhưng thực tế không phải vậy. Trang này giải thích điều gì xảy ra, tại sao và bạn cần làm gì để thay thế.
has_category() và các thẻ điều kiện khác trên các bài viết đã dịch
has_category() của lõi WordPress cố tình không được WPML lọc. Trên một bản dịch, chuyên mục là thuật ngữ đã được dịch, có slug riêng, vì vậy has_category('news') trả về false trên bài viết tiếng Pháp mặc dù bài viết tiếng Pháp đó nằm trong chuyên mục “news” tiếng Pháp. Điều tương tự cũng áp dụng cho has_term(), in_category() và bất kỳ mã nào so sánh slug hoặc ID thuật ngữ của ngôn ngữ mặc định. Hãy gọi hàm điều kiện với slug đã dịch, hoặc phân giải ID thuật ngữ thông qua bộ lọc wpml_object_id trước.
Điều bạn thấy
Hàm WordPress nguyên bản has_category không hoạt động đối với các bài viết đã dịch.
Dưới đây là một ví dụ về điều này:
- Chúng ta có một chuyên mục với slug tiếng Anh là “test” và bản dịch tiếng Pháp của nó là “test-fr”.
- Chuyên mục này được gán cho các bài viết.
- Khi bạn gọi
has_category("test")bên trong một vòng lặp trong tệp single.php của giao diện, nó trả về true cho ngôn ngữ mặc định nhưng trả về false cho bản dịch.
Việc cần làm
Xác định một bộ lọc mới trong tệp functions.php của giao diện của bạn:
function wp_has_category ($category) {
$category = get_term_by('name', $category, 'category');
return has_category($category);
}
add_filter('wp_has_category', 'wp_has_category', 10, 1);Thay thế hàm has_category bằng bộ lọc mới này:
apply_filters( 'wp_has_category', 'test' )
Bộ lọc này lấy chuyên mục đã dịch dựa trên tên của chuyên mục gốc và kiểm tra xem chuyên mục đã dịch có được gán cho một bài viết hay không.
Tham khảo: wpmlcore-3024.
Hậu tố ngày tháng (1st, 2nd, 3rd) không thể dịch được
Đây là hạn chế của lõi WordPress, không phải của WPML: hậu tố đến từ định dạng ngày tháng của PHP và không bao giờ đi qua hàm dịch.
Điều bạn thấy
Một số giao diện hoặc plugin sử dụng các hàm WordPress wp_date() hoặc date_i18n() để hiển thị ngày tháng. Các ngày này có thể sử dụng hậu tố như 1st hoặc 26th, tùy thuộc vào các tham số được chọn.
Hiện tại, không thể dịch các hậu tố ngày tháng do một hạn chế đã biết từ lâu trong lõi WordPress.
Việc cần làm
Như một giải pháp tạm thời, bạn có thể sử dụng bộ lọc wp_date để lấy ngày, sau đó sửa đổi hậu tố trước khi nó được hiển thị trên trang. Vui lòng sao lưu toàn bộ trang web của bạn trước khi tiến hành và làm theo các bước dưới đây:
- Thêm một bộ lọc
wp_datenhỏ vào tệp functions.php của giao diện của bạn để đăng ký mỗi hậu tố dưới dạng một chuỗi văn bản (icl_register_string) và trả về bản dịch của nó (icl_t) thay cho hậu tố tiếng Anh: - Mở trang nơi ngày tháng được hiển thị. Điều này sẽ thực thi bộ lọc đã thêm.
- Truy cập WPML → Dịch chuỗi và dịch ngày tháng.
- Bạn sẽ cần dịch từng hậu tố một cách riêng biệt (ví dụ: 1st, 2nd…) vì nó có thể thay đổi tùy thuộc vào ngôn ngữ.
Tham khảo: compsupp-5773.
Trình biên tập dịch thuật nâng cao không tự tạo ra slug
Trình biên tập sẽ dịch trường slug khi bạn điền vào đó và giữ nguyên slug gốc khi bạn để trống. Nó không bao giờ tự động tạo ra một slug từ tiêu đề đã dịch.
Điều bạn thấy
Nếu bạn dịch một bài viết bằng Trình biên tập dịch thuật nâng cao của chúng tôi, trường slug sẽ không được điền tự động. Nếu sau đó bạn quyết định để trống trường slug, nó sẽ tải slug của ngôn ngữ gốc trong bài viết đã dịch.
Tham khảo: wpmlsupp-8574.
Các shortcode của trình tạo trang trong mô tả ngắn của sản phẩm WooCommerce
Mô tả ngắn là đoạn trích của bài viết, một trường văn bản thuần túy theo định nghĩa của WordPress, vì vậy WPML không phân tích cú pháp các shortcode của trình tạo trang trong đó theo cách nó làm trong nội dung. WooCommerce tình cờ hiển thị chúng, đó là lý do tại sao sự không nhất quán này làm mọi người ngạc nhiên.
Điều bạn thấy
Mô tả ngắn của sản phẩm WooCommerce dựa trên trường đoạn trích của bài viết, và đó thường là một trường văn bản đơn giản không xử lý các shortcode. Do đó, không có gì đáng ngạc nhiên khi bạn dán các shortcode của trình tạo trang vào đoạn trích của bài viết thì chúng sẽ không hoạt động, và khi dịch các đoạn trích của bài viết, WPML không cố gắng xử lý các shortcode như vậy.
Nhưng WooCommerce xử lý các “đoạn trích” này hơi khác một chút, và các shortcode có hoạt động, nhưng WPML vẫn hoạt động như thể chúng không hoạt động, và nếu shortcode bao gồm các thuộc tính cần dịch hoặc các liên kết nội bộ cần được xử lý tự động thì điều đó không thể thực hiện dễ dàng.
Việc cần làm
Chúng tôi đã chuẩn bị mã có thể được thêm dưới dạng một plugin để cung cấp chức năng này. Sao chép và dán mã dưới đây vào một tệp mà bạn có thể đặt tên là wpmlpb-excerpts.php và lưu trong thư mục wp-content/plugins/ của bạn, sau đó kích hoạt plugin.
<?php
/**
* Plugin Name: WPML Page Builders - Proces Excerpts
* Description: Parses shortcode strings in exceprts.
* Version: 1.0
*/
namespace WPMLPB686;
( new Excerpts() )->add_hooks();
class Excerpts {
const SEPARATOR_START = '<!--WPML_EXCERPT_START-->';
const SEPARATOR_END = '<!--WPML_EXCERPT_END-->';
public function add_hooks() {
add_filter( 'wpml_pb_shortcode_content_for_translation', [ $this, 'joinWithContent' ], 10, 2 );
add_filter( 'wpml_tm_translation_job_data', [ $this, 'excludeFromJob' ], 10, 2 );
add_action( 'wpml_pro_translation_completed', [ $this, 'splitFromContent' ], 999 );
}
public function joinWithContent( $content, $id ) {
$post = get_post( $id );
if ( $post && $post->post_excerpt ) {
$content .= self::SEPARATOR_START . $post->post_excerpt . self::SEPARATOR_END;
}
return $content;
}
public function excludeFromJob( $package, $post ) {
if ( preg_match( '/[[^]]+]/', $post->post_excerpt ) ) {
$package['contents']['excerpt']['translate'] = 0;
$package['contents']['excerpt']['data'] = '';
}
return $package;
}
public function splitFromContent( $post_id ) {
$post = get_post( $post_id );
if ( $post && false !== strpos( $post->post_content, self::SEPARATOR_START ) ) {
$start_pos = strpos( $post->post_content, self::SEPARATOR_START );
$end_pos = strpos( $post->post_content, self::SEPARATOR_END, $start_pos );
if ( false !== $end_pos ) {
$content = substr( $post->post_content, 0, $start_pos );
$excerpt = substr( $post->post_content, $start_pos + strlen( self::SEPARATOR_START ), $end_pos - $start_pos - strlen( self::SEPARATOR_START ) );
if ( $excerpt ) {
wp_update_post(
[
'ID' => $post_id,
'post_content' => $content,
'post_excerpt' => $excerpt,
]
);
}
}
}
}
}
Tham khảo: wpmlpb-686.
Các tên miền khác nhau cho mỗi ngôn ngữ trên dịch vụ lưu trữ WordPress.com
WordPress.com ánh xạ một tên miền tới một trang web; định dạng URL "một tên miền khác nhau cho mỗi ngôn ngữ" cần mọi tên miền ngôn ngữ trỏ đến cùng một cài đặt WordPress, điều mà dịch vụ lưu trữ đó không cung cấp.
Điều bạn thấy
Do những hạn chế về cách hoạt động của việc ánh xạ tên miền với WordPress.com, bạn không thể chọn cài đặt URL ngôn ngữ để sử dụng một tên miền khác nhau cho mỗi ngôn ngữ khi các trang web được lưu trữ tại đó.
Việc cần làm
Bạn có thể sử dụng một trong các tùy chọn URL ngôn ngữ khác, với các ngôn ngữ khác nhau trong thư mục hoặc tên ngôn ngữ được thêm làm tham số, thay cho một tên miền khác nhau cho mỗi ngôn ngữ.
Bạn sẽ cần một máy chủ lưu trữ khác nếu một tên miền khác nhau cho mỗi ngôn ngữ là yêu cầu bắt buộc.
Tham khảo: wpmltriage-2045.
Các bản dịch được nhập và các trình biên tập dịch thuật
Việc nhập dữ liệu sẽ ghi các bản dịch đã hoàn thành; nó không tạo ra các công việc dịch thuật, và các trình biên tập hoạt động dựa trên các công việc này. Các bản dịch đã hoàn thành trên giao diện người dùng và đơn giản là không thể chỉnh sửa được trong Trình biên tập dịch thuật nâng cao hoặc Cổ điển.
Điều bạn thấy
Bất cứ khi nào bạn nhập nội dung bằng WP All Import và tiện ích bổ sung WPML All Import, bạn sẽ thấy các bản dịch bài viết được nhập hiển thị hoàn hảo trên giao diện người dùng. Tuy nhiên, bạn sẽ gặp sự cố nếu cố gắng cập nhật chúng bằng các trình biên tập dịch thuật của WPML:
- Trình biên tập dịch thuật cổ điển hiển thị nội dung bằng ngôn ngữ mặc định thay vì các bản dịch được nhập
- Trình biên tập dịch thuật nâng cao hiển thị các bản dịch trống
Điều này là do khi bạn nhập nội dung đa ngôn ngữ, WPML không tạo ra các công việc dịch thuật, vốn cần thiết cho việc phân đoạn chuỗi văn bản.
Việc cần làm
Để chỉnh sửa hoặc cập nhật các bản dịch được nhập của bạn, vui lòng chuyển sang trình soạn thảo WordPress nguyên bản và sử dụng phương pháp dịch thủ công.
Tham khảo: WPMLAI-168.