Tạo đa ngôn ngữ cho theme và plugin wordpress

Quảng cáo
Ads_ngang
Website dinhthuanit.com có bài Tạo đa ngôn ngữ cho theme và plugin wordpress

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 làm sao? Mặc dù English là ngôn ngữ phổ biến nhất trên internet sử dụng trên ngoài nước và những mặt hàng công nghệ có thường sẽ có ngôn ngữ tiếng anh làm mặc định.
Trong bài hôm nay mình sẽ chỉ dẫn các bạn tạo wordpress theme có bổ trợ đa ngôn ngữ.
đa ngôn ngữ

Nếu bạn đã thích nghi 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 tỉ 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ó hiện diện 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 vẫn tồn tại 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 cấp 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 ngày nay đ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 1 hoặc nhiều ngôn ngữ.

 __("string1","textdomain1"); _e("string1","textdomain2"); _("string1","textdomain3");  

Chú ý: bạn cũng có thể chọn mọi kẻ cho textdomain, cấp phép mọi ký tự cả dấu cách. Tên textdomain là duy nhất, chưa đượ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 mang 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 hay 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 __ .
* 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ụ:

        

* 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 mong muốn chuyển đổi đều thông qua các hàm này.

Bạn cũng đều có thể thiết lập mặc định textdomain sử dụng trong suốt theme bằng phương pháp khai báo vào tính chất 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 chẳng cần chỉ định tên textdomain ở tham số thứ hai 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 đó 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 Barn" "Report-Msgid-Bugs-To: n" "POT-Creation-Date: 2012-12-12 12:25-0500n" "PO-Revision-Date: 2013-05-27 21:03+0100n" "Last-Translator: Daniel Hoffmann  <  [email protected]  > n" "Language-Team: n" "MIME-Version: 1.0n" "Content-Type: text/plain; charset=UTF-8n" "Content-Transfer-Encoding: 8bitn" "X-Poedit-KeywordsList: __;_en" "X-Poedit-Basepath: /n" "X-Generator: Poedit 1.5.5n" "Language: den" "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ú giải 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 bổ trợ kiểu format string phức tạp hơn cấp 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 nhắc đến 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ả thiết nếu bạn mong muốn sử dụng nhiều textdomain không giống 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 1 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ũng có thể sử dụng công cụ online icanlocalize.com cấp 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à hình 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).
icanlocalize[1]

Hoặc sau đó có thể sửa lại từng chuỗi dịch bằng ứng dụng PoEdit.
poedit[1]

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 mang 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 vậy 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ư 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 phương pháp 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ũ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ích bài viết này, hãy ủng hộ chúng tôi bằng phương pháp đăng ký nhận bài viết mới ở bên dưới và hãy nhớ chia sẻ kiến thức này với bạn bè của bạn nhé. Bạn cũng cũng đều có thể theo dấu blog này trên Twitter và Facebook

Bài viết Tạo đa ngôn ngữ cho theme và plugin wordpress được tổng hợp và biên tập bởi: dinhthuanit.com. Mọi ý kiến đóng góp và phản hồi vui lòng gửi Liên Hệ cho dinhthuanit.com để điều chỉnh. dinhthuanit.com xin cảm ơn.

Bài Viết Liên Quan


Bài Viết Khác


Quảng cáo
Ads_ngang