Không có gói chuỗi

Người dùng cần dịch từng chuỗi một, không có tùy chọn dịch tự động.
Tìm hiểu cách tạo gói chuỗi cho plugin và giao diện của bạn để giúp người dùng dễ dàng dịch nội dung bằng WPML.
Gói chuỗi là các nhóm chuỗi được “đóng gói” cùng nhau trong một ngữ cảnh cụ thể. Mục đích của chúng là giúp người dùng cuối dịch nội dung hiệu quả hơn bằng cách loại bỏ nhu cầu dịch từng chuỗi riêng lẻ.
Ví dụ: dưới đây là cách người dùng sẽ dịch các trường người dùng tùy chỉnh, khi có và không có gói chuỗi:
Như bạn có thể thấy, các gói chuỗi đơn giản hóa quá trình dịch thuật bằng cách cho phép người dùng dịch nhiều trường người dùng tùy chỉnh cùng lúc. Để cung cấp cho người dùng của bạn trải nghiệm dịch thuật tốt nhất, hãy làm theo các bước dưới đây để tạo gói chuỗi của riêng bạn.
Nếu bạn muốn xem toàn bộ quá trình triển khai gói chuỗi mà chúng tôi đề cập trong các bước dưới đây, hãy xem kho lưu trữ GitHub (mở trong tab mới) này chứa plugin thử nghiệm mà chúng tôi đã sử dụng.
Bước đầu tiên là xác định nội dung mà người dùng sẽ muốn dịch, chẳng hạn như tiêu đề, nhãn và nội dung do người dùng tạo.
Tiếp theo, bạn cần khai báo loại gói của mình. Bước này giúp WPML phát hiện gói chuỗi nào được kết nối với các plugin đang hoạt động và chỉ dịch các gói đó.
Để so sánh, bộ lọc này hoạt động đối với các gói chuỗi giống như cách bộ lọc register_post_types hoạt động đối với các loại bài viết.
Để khai báo một loại gói, hãy sử dụng bộ lọc wpml_active_string_package_kinds (mở trong tab mới):
define( 'FOO_USER_FIELD_PACKAGE_KIND_TITLE', 'OTGS Foo User Fields' );
define( 'FOO_USER_FIELD_PACKAGE_KIND_SLUG', 'otgs-foo-user-fields' );
add_filter( 'wpml_active_string_package_kinds', function( $kinds ) {
$kinds[ FOO_USER_FIELD_PACKAGE_KIND_SLUG ] = [
'title' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,
'slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG,
'plural' => FOO_USER_FIELD_PACKAGE_KIND_TITLE,
];
return $kinds;
} );
title – tiêu đề của loại, phải giống với loại dành cho các gói.plural – dạng số nhiều của tiêu đề.slug – slug của loại, phải giống với kind_slug dành cho các gói.
Tiếp theo, bạn cần tạo một gói và đăng ký các chuỗi mà nó sẽ nhóm lại bằng cách sử dụng hook wpml_register_string (mở trong tab mới):
$userId = 123;
$user = get_user_by( 'id', $userId );
$package = [
'kind' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".
'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.
'name' => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.
'title' => $user->display_name, // The title for the package entity inside the "kind" namespace.
];
$fooUserFields = get_option( 'otgs_foo_user_fields' );
foreach ( $fooUserFields as $fooUserField ) {
$fieldValue = get_user_meta( $userId, $fooUserField, true );
do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );
}
$kind – nhãn không gian tên của thực thể (ví dụ: Gravity Form).$kind_slug – slug không gian tên của thực thể (ví dụ: gravity-form). Nếu thiếu, nó sẽ là phiên bản slug của “loại”.$name – định danh duy nhất của thực thể bên trong loại, có thể là chuỗi (ví dụ: slug) hoặc số nguyên (ví dụ: ID).$title – tiêu đề của thực thể bên trong loại. Bạn nên sử dụng tiêu đề của thực thể thực.
Mặc dù không bắt buộc, bạn cũng có thể bao gồm hai đối số bổ sung:$edit_link – một URL để chỉnh sửa đối tượng.$view_link – một URL để xem đối tượng.
Cuối cùng, để hiển thị các bản dịch trên giao diện người dùng, bạn cần sử dụng hook wpml_translate_string (mở trong tab mới):
$userId = 123;
$user = get_user_by( 'id', $userId );
$package = [
'kind' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".
'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.
'name' => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.
'title' => $user->display_name, // The title for the package entity inside the "kind" namespace.
];
$fooUserFields = get_option( 'otgs_foo_user_fields' );
$translatedFieldValues = [];
foreach ( $fooUserFields as $fooUserField ) {
$fieldValue = get_user_meta( $userId, $fooUserField, true );
$translatedFieldValues[ $fooUserField ] = apply_filters( 'wpml_translate_string', $fieldValue, sanitize_key( $fooUserField ), $package );
}
Bất cứ khi nào người dùng cập nhật nội dung, WPML cần có khả năng xác định các chuỗi mới, cũng như những chuỗi đã bị xóa. Để thông báo cho WPML về những thay đổi này, hãy bọc mã đăng ký của bạn bằng hai hàm:
wpml_start_string_package_registration (mở trong tab mới)wpml_delete_unused_package_strings (mở trong tab mới)
$userId = 123;
$package = [
'kind' => FOO_USER_FIELD_PACKAGE_KIND_TITLE, // The "namespace".
'kind_slug' => FOO_USER_FIELD_PACKAGE_KIND_SLUG, // The "namespace" slug.
'name' => $userId, // Can be a string or an integer, but should be unique inside the "kind" namespace.
// The 'title' key is not not required in the "translate" context.
];
do_action( 'wpml_start_string_package_registration', $package );
$fooUserFields = get_option( 'otgs_foo_user_fields' );
foreach ( $fooUserFields as $fooUserField ) {
$fieldValue = get_user_meta( $userId, $fooUserField, true );
do_action( 'wpml_register_string', $fieldValue, sanitize_key( $fooUserField ), $package, $fooUserField, 'LINE' );
}
do_action( 'wpml_delete_unused_package_strings',$package );
Khi người dùng xóa nội dung, bạn cũng nên xóa gói chuỗi được liên kết với nội dung đó. Điều này bao gồm tất cả các chuỗi, bản dịch và công việc dịch thuật liên quan. Bằng cách dọn dẹp này, bạn đảm bảo trang web vẫn hoạt động hiệu quả mà không có dữ liệu thừa nào làm lộn xộn cơ sở dữ liệu.
Để xóa một gói chuỗi, hãy hook vào một hành động thích hợp trong plugin hoặc giao diện của bạn và gọi hàm wpml_delete_package (mở trong tab mới):
$userId = 123; do_action( 'wpml_delete_package', $userId, FOO_USER_FIELD_PACKAGE_KIND_SLUG );