Công nghệ Gettext và cách sử dụng PoEdit

Chào các bạn, cũng khá lâu rồi mình không viết thêm tut nào, cũng một phần vì bận công việc, học hành và đi đây đó do đó có chút chểnh mảng và không sắp xếp được thời gian hợp lý để có thể viết bài trên Thế giới mã nguồn. Thành thật xin lỗi các bạn đã quan tâm và ghé thăm blog Thế giới mã nguồn :).

Ok trong loạt bài lần này mình sẽ giới thiệu với các bạn công nghệ gettext được sử dụng trong các mã nguồn như wordpress đòi hỏi tính năng đa ngôn ngữ cho core, các plugin và giao diện.

Như các bạn cũng biết để có thể đáp ứng nhu cầu sử dụng của người dùng thì mã nguồn của bạn phải đáp ứng một trong những tiêu chí quan trọng đó là tính đa ngôn ngữ. Đa ngôn ngữ ở đây nghĩa là ngoài ngôn ngữ chuẩn là English thì mã nguồn vẫn có thể cho phép thêm các ngôn ngữ khác theo yêu cầu của người dùng.

Các mã nguồn hiện nay đa số sử dụng file ngôn ngữ riêng và gán giá trị ngôn ngữ thành mảng vào biến. Ngoài ra như mã nguồn của một số forum thông dụng thì họ lưu trực tiếp vào CSDL.

Mỗi cái có một ưu điểm riêng ví dụ nếu dùng file tức là file vật lý. Thì khi site của bạn không thể kết nối đến CSDL bạn vẫn có thể hiển thị language cơ bản chứa trong các file vật lý. Còn trường hợp language được lưu trong CSDL thì việc bạn không kết nối được đến CSDL sẽ dẫn đến trang trắng chính vì thế bạn sẽ phải có thao tác đó là lưu mẫu template báo lỗi kết nối CSDL vào một file.

Xét ở wordpress thì cơ bản vẫn lưu ngôn ngữ vào file nhưng ở đây, thay vì chúng ta sẽ gán các biến phù hợp vào trong khi lập trình thì bạn có thể gán language tùy ý vào trong khi lập trình. Cơ chế sử dụng các marked function để kiểm tra đối chiếu xem có chuỗi nào tương ứng và nếu có chúng sẽ được thay thế.

WordPress dùng 2 function là __(‘message’) sẽ chỉ trả về giá trị và _e(‘message’) sẽ xuất ngay lập tức giá trị

Quy trình đa ngôn ngữ sẽ có 3 file:

- POT (Portable Object Template) files: bước đầu tiên file này được tạo ra khi bạn dùng phần mềm hay script để quét mã nguồn dựa vào các marked function bên trên. Mục đích chính là lấy ra các language mặc định trong mã nguồn.
- PO (Portable Object) files: đây là bước bạn sẽ dịch toàn bộ language đã quét được ở bước 1 sang ngôn ngữ mà bạn muốn.
- MO (Machine Object) files: bước cuối cùng là dịch file PO sang mã máy để tối ưu cho việc sử dụng.

Các phần mềm sử dụng để tạo file:

Các bạn có thể sử dụng GlotPress (hiện tại mình thấy StudioPress đang dùng để dịch Theme Framework của họ), Launchpad (ai dùng Ubuntu sẽ thấy khá quen), Pootle, Poedit (mình hay dùng phần mềm này chạy trên Win và Mac), KBabel, GNU Gettext.

Trong bài này mình sẽ hướng dẫn các bạn sử dụng PoEdit:

Sau khi bạn đã download và cài đặt Poedit. Bạn tiến hành mở chương trình lên và nhấn vào File -> New Catalog. Bây giờ bạn đang ở tab Project info. Ở phần Project name and version bạn nên đặt tên là tên project của bạn. Phần Charset và Source code charset nên đặt là Utf-8. Bạn chuyển qua tab Paths và chọn thêm 1 item mới như hình bên dưới:

Add a new path

Sau đó gõ vào dấu chấm (.) để chỉ định rằng chỉ tìm kiếm trong thư mục nằm cùng với file .POT. Tiếp tục chuyển qua tab Keywords và nhấn vào New item và thêm tên của marked function mà bạn quy ước trong lập trình. Như mình đã đề cập bên trên thường thì là 2 function. Sau khi hoàn thành các thiết lập bạn chọn OK. Bây giờ tiếp tục nhấn vào File và lưu file của bạn vào cùng thư mục với plugin mà bạn tạo. Mặc định thì Poedit sẽ lưu file .po nhưng bạn vẫn có thể chọn lưu file thành .pot hoặc .po.

Save the .po file as .pot

Bạn có thể đổi tên file .po sau này nếu bạn muốn. Nhớ là xóa file .mo được tạo với cái project của chúng ta đi vì nó không sử dụng trong script.

Sau khi bạn đã lưu thành công file .pot thì bạn vào Catalog và chọn Update from sources

Update .pot file from sources

Đợi 1 chút để quá trình update thành công. Và sau khi nhấn OK thì màn hình sẽ được hiển thị danh sách các chuỗi bạn cần phải dịch trong toàn bộ project của bạn. Công việc của bạn bây giờ là tiến hành dịch và lưu lại file bạn dịch. Nên nhớ là mỗi lần bạn lưu là file .mo sẽ được tạo lại. Bạn có thể xóa file này đi.

Như vậy là bạn đã có thể dịch mã nguồn dựa vào các marked function. Sau đây mình sẽ hướng dẫn bạn tạo sẵn các file .po để cho các cộng tác viên có thể tham gia dịch mà không phải trải qua thêm các bước bên trên nữa.

Tạo file .po (dành cho cộng tác viên dịch):

Sau khi đã download và cài đặt xong Poedit. Và file .pot đã có phía trên do tác giả tạo ra. Bạn hãy mở file .pot này ra và để ý như trong hình bên dưới

Khung số 1 chính là chuỗi ban đầu gốc của language, khung số 2 chính là phần bạn cần dịch.

Sau khi dịch xong bạn vào File -> Save as

Cập nhật file .po (và .mo)

Trong trường hợp bạn cần phải cập nhật lại vì lý do project đã có sự thay đổi hoặc cần phải thêm các string để dịch. Để cập nhật bạn vào Catalog chọn Update from POT file sau đó chọn file .pot mà bạn muốn cập nhật thêm string. Sau đó công việc giống như bạn tạo file .po và sau khi dịch xong bạn tiến hành lưu lại tất cả thay đổi.

Trong bài này mình chỉ giới thiệu sơ qua cơ bản về cách sử dụng Poedit và cách thức xử lý Gettext của WordPress trong php. Trong loạt bài cùng chủ đề tiếp theo mình sẽ đề cập chi tiết hơn cách thức sử dụng kỹ thuật Gettext trong php và vận dụng nó vào mã nguồn riêng của bạn. Hiện tại thì mình đang làm contributor cho một vài Plugin ví dụ như UpPrevGenesis Framework

Did you like this? Share it:

Tham khảo:

  • Kiên

    cảm ơn bạn nhiều vì bài viết.
    Nếu được bạn hãy viết bài tiếp theo nhé.

    • http://thegioimanguon.com xman

      bận quá bạn ạh, chưa có thời gian rảnh để viết

  • Kiên

    Bạn ơi nếu có thời gian hướng dẫn mình, hay cho mình xin demo của cái “kỹ thuật Gettext trong php và vận dụng nó vào mã nguồn riêng của bạn”. mail của mình GMAIL: tranphucntt hay YH: tranphucntt .cảm ơn bạn nhé

  • Kiên

    thanks you.

  • http://www.taiphanmem.org Ngộ Không

    PoEdit rất hay và tiện dùng. Mình có ghé qua Launchpad nhưng thấy khó hiểu và rắc rối.

    Ko biết ngoài WP thì có mã nguồn nào sử dụng PoEdit nữa nhỉ?

    • http://thegioimanguon.com xman

      hiện tại thì mình chưa thấy mã nguồn nào dùng PO và MO cả, đa số là lưu language ra file hoặc csdl :)