- shares
- Facebook Messenger
- Gmail
- Viber
- Skype
Bạn muốn tạo nhiều ngôn ngữ cho wordpress theme và plugin hiển thị trên website, vậy thì làm thế nào? Mặc dù English là ngôn ngữ phổ biến nhất trên internet sử dụng trên toàn cầu và những sản phẩm công nghệ có thường có ngôn ngữ tiếng anh làm mặc định.
Trong bài hôm nay mình sẽ hướng dẫn các bạn tạo wordpress theme có hỗ trợ đa ngôn ngữ.
Nếu bạn đã làm quen với cách viết template tag của theme wordpress thì kiến thức mình trình bày trong bài sẽ thân thuộc. Chúng ta sử dụng hàm tạo chuỗi của wordpress ví dụ _e(
, _(
, __(
và chỉ định tên nhóm ngôn ngữ bạn đã thiết lập cho theme bởi hàm load_theme_textdomain
.
Nạp ngôn ngữ chuyển đổi
Thêm những dòng sau vào theme functions.php
load_theme_textdomain( 'Cats Who Code', TEMPLATEPATH.'/languages' ); $locale = get_locale(); $locale_file = TEMPLATEPATH."/languages/$locale.php"; if ( is_readable($locale_file) ) require_once($locale_file);
Đoạn code sau hàm load_theme_textdomain
sử dụng thêm cho wordpress phiên bản cũ, phiên bản mới là không cần thiết có thể bỏ qua. Để kiểm tra tên file ngôn ngữ tương ứng với ngôn ngữ bạn đang thiết lập sử dụng cho wordpress có tồn tại trong thư mục nạp ngôn ngữ gọi bởi hàm load_theme_textdomain
hay không, bạn có thể sử dụng đoạn code sau đây, để chắc chắn không bị mất file .mo này. Ví dụ:
$result=load_theme_textdomain( 'twentytwelve', get_template_directory() . '/languages' ); if(!$result){ $locale = apply_filters( 'theme_locale', get_locale(), 'twentytwelve' ); echo ( "Could not find $path/$locale.mo." ); }
Hàm load_theme_textdomain cho phép tạo nhóm languages (text domain) và nạp dữ liệu các files ngôn ngữ khai báo trong thư mục vào wordpress. Mỗi một nhóm ngôn ngữ có một tên xác định, các bạn sẽ dùng nó trong hàm chuyển đổi ngôn ngữ. Bạn có thể tải nhiều nội dung cho ngôn ngữ và có thể thay đổi sử dụng nhiều nhóm ngôn ngữ khác cùng một lúc cho theme hiện tại đang sử dụng.
Ví dụ: giả sử chúng ta đã tạo 3 textdomain là: textdomain1, textdomain2, textdomain3 . Trong 3 nhóm translations này chứa chuỗi chuyển đổi cho một hoặc nhiều ngôn ngữ.
__("string1","textdomain1"); _e("string1","textdomain2"); _("string1","textdomain3");
Chú ý: bạn có thể chọn mọi tên cho textdomain, cho phép mọi ký tự cả dấu cách. Tên textdomain là duy nhất, không được trùng với textdomain khác, thường lấy tên theme.
Mỗi textdomain chứa nhiều files ngôn ngữ .mo tìm trong folder đăng ký bởi load_theme_textdomain. Lưu ý: File .mo được tạo ra từ .po bạn có thể sử dụng phần mềm sửa ngôn ngữ là “PoEdit“, khác với nạp languages cho plugin, file ngôn ngữ .mo cho theme có tên là mã local code của ngôn ngữ tương ứng sử dụng trong .po. Ví dụ:
vi-VI.mo
, en_US.mo
,…
Lưu ý: khi tải plugin trong folder chứa languages, bạn thường thấy có 2 file đi cùng nhau .po và .mo thực ra file .po tác giả để cho bạn sinh ra file .mo mà thôi, chứ wordpress không đọc file .po nhé.
Cách chuyển đổi
Để dịch chuỗi nội dung hiển thị trên website wordpress, chúng ta sử dụng hàm lấy chuỗi: _e
và __
.
* Hàm _e trả về giá trị chuỗi được chuyển đổi với textdomain bạn truyền vào tham số 2. Ví dụ:
<?php _e("The page you're looking for doesn't exist", "Cats Who Code"); ?> <?php the_content(__('Read more...', "Cats Who Code")); ?>
* Và hàm __ sử dụng khi bạn muốn in chuỗi, thay vì trả về giá trị.
Nên nhớ tên “Cats Who Code” phải khớp với khai báo trong functions.php và với mỗi chuỗi bạn muốn chuyển đổi đều thông qua các hàm này.
Bạn có thể thiết lập mặc định textdomain sử dụng trong suốt theme bằng cách khai báo vào thuộc tính Text Domain
trong phần mô tả theme style.css, giống như sau:
/* Theme Name: Twenty Twelve Theme URI: http://wordpress.org/themes/twentytwelve Author: the WordPress team Author URI: http://wordpress.org/ Description: The 2012 theme for WordPress is a fully responsive theme that looks great on any device. Features include a front page template with its own widgets, an optional display font, styling for post formats on both index and single views, and an optional no-sidebar page template. Make it yours with a custom menu, header image, and background. Version: 1.4 License: GNU General Public License v2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html Tags: light, gray, white, one-column, two-columns, right-sidebar, fluid-layout, responsive-layout, custom-background, custom-header, custom-menu, editor-style, featured-images, flexible-header, full-width-template, microformats, post-formats, rtl-language-support, sticky-post, theme-options, translation-ready Text Domain: twentytwelve This theme, like WordPress, is licensed under the GPL. Use it to make something cool, have fun, and share what you've learned with others. */
Việc thiết lập mặc định textdomain như trên, bạn không cần chỉ định tên textdomain ở tham số thứ 2 của hàm chuyển đổi chuỗi nữa. vd:
__("abcde");
Tạo ngôn ngữ dịch
Nội dung chuỗi được dịch chứa trong file .mo, dựa vào những file này mà wordpress có thể chuyển đổi sang mọi ngôn ngữ nhưng là những văn bản bạn đã thêm trong file .po
PO viết tắt bởi Portable Object. Về cơ bản đó là những files chứa chuỗi và nội dung dịch của chuỗi với ngôn ngữ được quy định mã ngôn ngữ bởi tên file .po đó.
Cho ví dụ:
fr_FR.po
chứa các ngôn ngữ chuyển đổi sang tiếng pháp, tên file nhận dạng ngôn ngữ chứa local code bao gồm 2 ký tự thể hiện: country code và language code. Như vậy ở đây “fr” là country code và “FR” là language code. Nói dễ hiểu hơn thì language code là ngôn ngữ sử dụng cho một vùng nhất định trong quốc gia đó nếu có.
Cấu trúc của file .po có dạng:
msgid "" msgstr "" "Project-Id-Version: WordPress Notification Bar\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2012-12-12 12:25-0500\n" "PO-Revision-Date: 2013-05-27 21:03+0100\n" "Last-Translator: Daniel Hoffmann <[email protected]>\n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "X-Poedit-KeywordsList: __;_e\n" "X-Poedit-Basepath: ../\n" "X-Generator: Poedit 1.5.5\n" "Language: de\n" "X-Poedit-SearchPath-0: .\n" #: wordpress-notification-bar.php:27 msgid "WordPress Notification Bar" msgstr "WordPress Notification Bar" ....
Nội dung của .po có 2 phần, phần đầu lưu thông tin cho ngôn ngữ và liệt kê các chuỗi có sử dụng trong website bởi msgid, được dịch tương ứng vào tên biến msgstr ngay bên dưới. Có thể viết chú thích cho dòng chuyển đổi ví dụ như sử dụng trong file template/plugin nào.
#: wordpress-notification-bar.php:27 msgid "WordPress Notification Bar" msgstr "WordPress Notification Bar modified 1"
Ngoài ra, còn hỗ trợ kiểu format string phức tạp hơn cho phép bạn dịch 2 hay nhiều chuỗi con trong chuỗi gốc. Xem ví dụ sử dụng tham số printf trong .po sau đây:
#: comments.php:31 msgid "One thought on “%2$s”" msgid_plural "%1$s thoughts on “%2$s”" msgstr[0] "" msgstr[1] ""
Bạn có thể tự học thêm cách viết cấu trúc file po ở trên mạng. Mình không đề cập chi tiết trong bài học thiết kế web wordpress này.
Nếu tên file .po không chứa mã ngôn ngữ thì mọi ngôn ngữ bạn thiết lập cho site wordpress sử dụng nguyên chuỗi msgstr tìm thấy trong msgid của file.
Nhưng giả định nếu bạn muốn sử dụng nhiều textdomain khác nhau cho một ngôn ngữ chuyển đổi , thì cần tạo file .po có thêm tên textdomain vào trước mã ngôn ngữ ngăn bởi dấu “-“, vd: seed_wnb-de_DE.po
. Sử dụng ký tự “-” trong file .PO để ngăn cách giữa tên textdomain và local code.
Nhắc lại:: Như mình vừa đính chính lại ở trên, tên file ngôn ngữ cho plugin và theme phân biệt bởi textdomain. File .mo của theme không chứa tên textdomain đằng trước đâu nhé, xem cách tạo plugin language ở dưới.
Ví dụ Có thể tạo thêm file textdomain khác với cùng loại ngôn ngữ textdomain1-de_DE.po
.
Sử dụng nhiều textdomain, dịch cho một chuỗi.
_e("WordPress Notification Bar","seeed_wnb"); _e("WordPress Notification Bar","textdomain1");
Công cụ tạo .po file
Để tạo file .po chúng ta có thể sử dụng công cụ online icanlocalize.com cho phép bạn trích xuất các văn bản gốc và văn bản dịch lấy từ hàm __ và _e được tìm thấy khi quét file PHP và tạo thành file .po cho bạn. Đặt chuỗi trong dấu ” hoặc ‘ tùy ý không bắt buộc (insensive case).
Hoặc sau đó có thể sửa lại từng chuỗi dịch bằng phần mềm PoEdit.
Sau khi sửa xong chuỗi nhớ lưu file .po lại rồi up lên host. PoEdit cũng sẽ tạo file .mo , đây là binary file phiên bản phát sinh từ .po file.
Nạp ngôn ngữ cho plugin (Plugin languages)
Khác với các file ngôn ngữ sử dụng cho theme, file .mo thiết kế cho plugin có tên gồm textdomain và ký tự mã ngôn ngữ ngăn cách bởi dấu ‘-‘. Cách cài đặt và sử dụng giống như theme, tuy nhiên thay vì tải các file ngôn ngữ sử dụng cho theme với hàm load_theme_textdomain
bạn khai báo files *.mo cho plugin bởi hàm load_plugin_textdomain
giống như sau:
/** * Load Translation */ function seed_wnb_load_textdomain() { load_plugin_textdomain( 'seed_wnb', false, dirname( plugin_basename( __FILE__ ) ) . '/languages/' ); } add_action('plugins_loaded', 'seed_wnb_load_textdomain');
Trong thư mục languages/ có thể chứa các file *.mo: seed_wnb-vi_VI.mo, seed_wnb-fr_FR.mo,…
Thiết lập ngôn ngữ wordpress
Cuối cùng để sử dụng file ngôn ngữ nào của theme/plugin bạn tiến hành thiết lập ngôn ngữ sử dụng cho wordpress admin và hiển thị trên fronted sau này. Xem bài hướng dẫn việt hóa wordpress để hiểu thêm.
Xác định mã ngôn ngữ và mã quốc gia sẽ chuyển đổi, ví dụ language code “French” và “France” là country code. Xem tài liệu của GNU gettext có hướng dẫn chung về country code và language code.
Sau khi xác định tên ngôn ngữ chuyển đổi, bạn mở wp-config.php
và tìm hằng “WPLANG”, bằng cách thay local code này với tên ngôn ngữ của bạn. Chẳng hạn:
//tiếng pháp define ('WPLANG', 'fr_FR'); //tiếng việt define ('WPLANG', 'vi_VI');
Sửa nội dung ngôn ngữ
Sau khi dịch cố định chuỗi hiển thị trong file .mo textdomain , bạn cũng có thể thay đổi hiển thị bất kỳ chuỗi nào cho toàn bộ các textdomain đang sử dụng trên web. Bằng cách thêm gettext
như sau:
function graphene_filter_readmore( $translated, $original, $domain ) { $strings = array( 'Continue reading »' => 'CONTINUE READING!!', 'Read the rest of this entry »' => 'CONTINUE READING!!', ); //_print($original); if ( ! empty( $strings[$original] ) ) { $translations = &get_translations_for_domain( $domain ); $translated = $translations->translate( $strings[$original] ); } return $translated; } add_filter( 'gettext', 'graphene_filter_readmore', 10, 3 );
Chúc bạn thành công!
Nếu bạn thấy bài viết này hữu ích, hãy chia sẻ với bạn bè bằng cách nhấn nút chia sẻ ở bên dưới. Theo dõi chúng tôi trên Twitter và Facebook
- shares
- Facebook Messenger
- Gmail
- Viber
- Skype