WPML

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ỏ yêu cầu dịch từng chuỗi một.

Ví dụ: dưới đây là cách người dùng dịch các trường người dùng tùy chỉnh, khi có và không có gói chuỗi:

Không có gói chuỗi

The four fields as separate strings, on WPML → Translations → Strings
The four fields as separate strings, on WPML → Translations → Strings

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.

Có gói chuỗi

The same four fields as one package, on the Translation Dashboard
The same four fields as one package, on the Translation Dashboard

Người dùng có thể dịch nhiều chuỗi cùng lúc, với tùy chọn dịch tự động.

Như bạn có thể thấy, gói chuỗi đơn giản hóa quá trình dịch 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 một 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 bên dưới để tạo các 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 bên dưới, hãy xem kho lưu trữ GitHub này có chứa plugin thử nghiệm mà chúng tôi đã sử dụng.

1. Xác định nội dung có thể dịch

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.

2. Khai báo loại gói

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 các 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:

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;

} );
Định nghĩa đối số

title – tiêu đề của loại, phải giống với kind đối với 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 đối với các gói.

3. Tạo gói và đăng ký chuỗ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:

$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' );

}
Định nghĩa đối số

$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 “kind”.
$name – mã đị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 tế.

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.

4. Truy xuất bản dịch

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:

$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 );

}

Cập nhật và xóa chuỗi

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ư các 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:

$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 );

Xóa gói chuỗi

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 của nó. Đ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 luôn hoạt động hiệu quả mà không có bất kỳ 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:

$userId = 123;

do_action( 'wpml_delete_package', $userId, FOO_USER_FIELD_PACKAGE_KIND_TITLE );

Tài nguyên bổ sung

  • Tệp cấu hình ngôn ngữ WPML – hướng dẫn về cách sử dụng wpml-config.xml, tệp chỉ định các văn bản nào WPML nên dịch trong các plugin và giao diện.
  • Multilingual Tools – một công cụ để kiểm tra thiết lập cấu hình của bạn và xác nhận khả năng tương thích với WPML.

Được viết bởi Amir · Cập nhật lần cuối vào 24 tháng 3 năm 2025