Gửi email cho người dùng trang web của bạn bằng ngôn ngữ họ ưa thích là điều quan trọng. Vì mục đích này, WPML cung cấp một API để lưu trữ ngôn ngữ ưa thích của người dùng trong khi họ đang sử dụng trang web và sau đó áp dụng tùy chọn này khi gửi email cho họ.
Tài liệu này giải thích cho các nhà phát triển giao diện và plugin cách tích hợp sản phẩm của họ với hàm wp_mail() tiêu chuẩn của WordPress trong ngữ cảnh ngôn ngữ ưa thích.
Khi nào bạn cần gửi email được bản địa hóa cho từng người dùng?
Dưới đây là các ví dụ minh họa một số trường hợp điển hình mà bạn cần gửi email bằng ngôn ngữ ưa thích của người dùng:
- Bạn là quản trị viên trang web gửi bản tin cho người đăng ký: quản trị viên trang web là người Pháp và anh ấy hiển thị giao diện bản tin bằng tiếng Pháp. Kết quả: tất cả email sẽ được gửi bằng tiếng Pháp. Vì những người đăng ký của bạn đến từ khắp nơi trên thế giới, nhiều người sẽ không hiểu email này.
- Bạn đang điều hành một trang web mạng xã hội: các thành viên của trang web này có thể xuất bản ảnh của họ. Các thành viên khác có thể thích và gắn dấu sao cho những bức ảnh đó – khi họ thích, tác giả hình ảnh sẽ được thông báo qua email. Bây giờ hãy xem xét tình huống này:
- Mathias, người Đức, đã xuất bản bức ảnh của mình.
- Bạn của anh ấy là Pierre, người Pháp, tình cờ thấy bức ảnh của Mathias và nhấp vào nút Thích.
- Bởi vì trong quá trình thực hiện hành động này, Pierre đang hiển thị trang bằng tiếng Pháp, Mathias sẽ nhận được thông báo email bằng tiếng Pháp.
- Bạn đang điều hành một trang web thương mại điện tử: nếu một số sản phẩm tạm thời hết hàng, người dùng có thể để lại email của họ để được thông báo khi sản phẩm có hàng trở lại. Một khách truy cập người Nhật Bản để lại email của mình dưới một số sản phẩm. Sau đó, quản trị viên của trang web, người Tây Ban Nha, cập nhật tình trạng còn hàng. Kết quả: khách hàng người Nhật Bản nhận được email tự động “Sản phẩm x đã có sẵn trở lại” bằng tiếng Tây Ban Nha, không phải tiếng Nhật.
Có nhiều ví dụ tương tự khác, và bạn là người hiểu rõ nhất liệu điều này có gây ra sự cố cho plugin hoặc giao diện của bạn hay không.
Trong tất cả các trường hợp này, chúng ta cần tìm cách lưu trữ ngôn ngữ ưa thích của người nhận và sau đó, chuyển sang ngôn ngữ này trong giây lát khi gửi email.
Bao bọc hàm wp_mail() bằng mã dành riêng cho WPML
Khi bạn đang gửi email, bạn cần thêm ba bước bổ sung vào mã plugin hoặc giao diện của mình:
- Chuyển đổi ngữ cảnh ngôn ngữ sang ngôn ngữ ưa thích của người nhận email.
- Sau đó chạy toàn bộ mã của bạn để thực sự gửi email.
- Chuyển ngôn ngữ trở lại ngôn ngữ của trang web.
Bước thứ hai có thể đã sẵn sàng tại thời điểm này. Điều duy nhất cần làm là thêm hai dòng bổ sung, dành riêng cho WPML – bạn chỉ cần thêm các dòng được in đậm.
$email = get_option('receiver-email');
// Switch language context…
do_action('wpml_switch_language_for_email', $email);
// your code for sending email:
$subject = __('Hello, World!', 'text-domain');
$message = __('This is our newsletter', 'text-domain');
wp_mail($email, $subject, $message);
// switch language back
do_action('wpml_restore_language_from_email');
Như bạn có thể thấy, các thay đổi rất nhỏ nhưng bạn cần nhớ hai điểm quan trọng sau đây.
1. Chuyển đổi ngôn ngữ trước khi nội dung email đầu tiên được truy xuất
Hãy nhớ rằng bạn đang chuyển đổi ngôn ngữ để dịch nội dung email. Đây là lý do tại sao bạn cần nhớ thiết lập ngôn ngữ chính xác trước khi bạn truy xuất bất kỳ nội dung email nào – tiêu đề hoặc nội dung tin nhắn.
Mã sau đây sẽ không hoạt động:
$email = my_func_to_get_receiver_email();
$subject = my_func_to_get_title(); // will come in site’s lang
$message = my_func_to_get_msg_body(); // will come in site’s lang
do_action('wpml_switch_language_for_email', $email);
wp_mail($email, $subject, $message);
do_action('wpml_restore_language_from_email');
Thay vào đó bạn nên sử dụng:
$email = my_func_to_get_receiver_email();
do_action('wpml_switch_language_for_email', $email);
$subject = my_func_to_get_title(); // will come in receiver’s lang
$message = my_func_to_get_msg_body(); // will come in receiver’s lang
wp_mail($email, $subject, $message);
do_action('wpml_reset_language_after_mailing');
2. Không gửi email đến một mảng người nhận
Hàm wp_mail() cho phép truyền $email dưới dạng một mảng tham số chứa các email. Thật không may, điều này bị cấm nếu bạn muốn làm cho nội dung email có thể dịch được.
Vì vậy, nếu bạn có một đoạn mã không hoạt động, như đoạn mã này:
$emails = my_func_get_emails_array(); // array(email1, email2...)
do_action('wpml_switch_language_for_email', $emails); // will not work
$subject = my_func_to_get_title();
$message = my_func_to_get_msg_body();
do_action('wpml_restore_language_from_email');
Bạn nên viết lại thành:
$emails = my_func_get_emails_array(); // array(email1, email2...)
foreach($emails as $email) :
do_action('wpml_switch_language_for_email', $email); // now is ok
$subject = my_func_to_get_title();
$message = my_func_to_get_msg_body();
do_action('wpml_restore_language_from_email');
endforeach;
Lưu trữ ngôn ngữ của người nhận
Thông tin ngôn ngữ cho người dùng WP
Nếu người nhận của bạn được đăng ký là người dùng WordPress tiêu chuẩn, bạn không cần phải lưu thông tin ngôn ngữ và tạo một hook. Bạn có thể chỉ cần thông báo cho người dùng của mình rằng họ có thể thiết lập ngôn ngữ ưa thích của họ trong trang quản trị WordPress tại Hồ sơ->Hồ sơ của bạn.
Thông tin này được lưu trữ trong một trường meta người dùng thông thường, vì vậy nếu vì lý do nào đó bạn muốn truy xuất nó, bạn có thể sử dụng đoạn mã tiện dụng này:
$user = get_user_by( 'email', $email );
if ( $user && isset( $user->ID ) ) {
$lang = get_user_meta( $user->ID, 'icl_admin_language', true );
}
Khi người nhận không phải là người dùng WP thông thường
Mỗi khi plugin hoặc giao diện của bạn đăng ký một địa chỉ email, bạn cũng nên lưu ngôn ngữ ưa thích của người nhận. Bạn không cần bất kỳ vị trí hoặc loại dữ liệu đặc biệt nào cho việc này. Điều duy nhất bạn cần làm là thêm một bộ lọc sẽ trả về thông tin ngôn ngữ. Tên của bộ lọc là wpml_user_language.
Mã ví dụ mà bạn cần triển khai có thể trông như thế này:
add_filter(‘wpml_user_language’, ‘my_recipients_language’, 10, 2);
function my_recipient_language($lang, $email) {
return get_language_from_my_database($email); // implement it in your plugin/theme
}
Widget ngôn ngữ
Nếu bạn cung cấp một số giao diện người dùng với bảng cấu hình cho những người đăng ký của mình, bạn có thể hỏi họ về ngôn ngữ của họ bằng action hook sau:
do_action('wpml_user_language_switcher', array('mail'=>'mail@example.com') );
Xin lưu ý rằng bạn cần thay thế mail@example.com bằng email thực của người đăng ký hiện tại.
Đoạn mã này sẽ hiển thị hộp chọn với các ngôn ngữ có sẵn. Khi một người đăng ký chọn một ngôn ngữ, giá trị này sẽ được gửi thông qua một lệnh gọi AJAX đến máy chủ.
Sau đó, bạn cần lưu dữ liệu này trong các bảng cơ sở dữ liệu của mình. Để thực hiện việc này, hãy thêm một hook cho bộ lọc wpml_user_language_switcher_save, như thế này:
add_filter('wpml_user_language_switcher_save', 'my_func', 10, 3);
function my_func($saved, $email, $language) { // your code to save email - language pair, i.e.:
save_language_in_my_database($email, $language);
// if you saved data correctly, return true
return true;
}
Nếu bộ lọc của bạn không trả về giá trị true, hoặc bạn hoàn toàn không có bộ lọc nào cho việc đó, WPML sẽ cố gắng lưu thông tin ngôn ngữ trong bảng meta người dùng (xem chương tiếp theo).
Gửi email đến các địa chỉ không được lưu trữ
Đôi khi bạn cần gửi email đến các địa chỉ không có trong bất kỳ bảng cơ sở dữ liệu nào. Bởi vì người nhận không có trong cơ sở dữ liệu của bạn, bạn cũng không lưu trữ bất kỳ tùy chọn ngôn ngữ nào của người nhận.
Đối với những trường hợp đó, WPML mong đợi rằng mã ngôn ngữ sẽ có sẵn trong một trong ba biến toàn cục này:
$_POST['wpml_user_email_language']$_GET['wpml_user_email_language']$GLOBALS['wpml_user_email_language']
Cách dịch email
Dịch nội dung email cũng giống như dịch bất kỳ chuỗi văn bản nào khác trên trang web của bạn. Để biết thêm thông tin chi tiết về chủ đề này, vui lòng truy cập trang tài liệu Dịch chuỗi của chúng tôi.
Tóm lại, hãy đảm bảo rằng những điều sau được áp dụng cho tất cả các chuỗi văn bản được sử dụng làm nội dung email (tiêu đề hoặc nội dung thư):
- Nếu chúng là các chuỗi tĩnh, hãy đảm bảo rằng chúng được bản địa hóa bằng các hàm gettext _e() hoặc __()).
- Nếu chúng được lưu trong bảng tùy chọn của WordPress và được truy xuất bằng hàm get_option(), bạn cũng cần “thông báo” cho WPML rằng chúng có thể dịch được. Điều này được thực hiện bằng cách sử dụng Tệp cấu hình ngôn ngữ.
Nếu những điều kiện đó được đáp ứng trong plugin hoặc giao diện của bạn, người dùng sẽ có thể dịch chúng trên trang WPML->Dịch chuỗi.
Ví dụ thực tế
Để xem một ví dụ thực tế hơn về thông tin được trình bày trên trang này, vui lòng truy cập bài viết trên blog của chúng tôi về việc sử dụng Tích hợp API thư WPML với plugin Sensei.