Article:
Giao diện đa ngôn ngữ với Ruby-GetText
1822
ngocdaothanh.myopenid.com 172Updated over 3 years ago |

Ruby có nhiều cách để tạo trang web có giao diện đa ngôn ngữ. Cách được sử dụng nhiều nhất có lẽ là dùng Ruby-GetText vì gettext là cách phổ biến nhất trong cộng đồng mã nguồn mở để tạo chương trình đa ngôn ngữ, dùng ké gettext là “đứng trên vai người khổng lồ”.
Ngoài ra đối với các dự án outsourcing, nó còn giúp các lập trình viên không biết ngoại ngữ có thể tham gia với năng suất làm việc không thua kém lập trình viên biết ngoại ngữ.
Cài đặt
(sudo) gem install gettext
Ngoài ra, trên máy cần có các công cụ trong bộ gettext như msgmerge. Nếu sử dụng Windows, bạn nên cài poEdit, ngoài lí do là dùng nó có thể dễ dàng edit tập tin .po (xem phần dưới), còn có lí do là nó đã tích hợp sẵn các công cụ cần thiết trong bộ gettext. Sau khi cài poEdit, nhớ thêm vào biến môi trường PATH đường dẫn đến thư mục bin của nó. Lý do cần thiết phải làm như vậy để có thể chạy lệnh msgmerge, giúp cho việc nối các câu dịch khi phải cập nhật tập tin dịch po mà chúng ta sẽ nói chi tiết trong phần sau.
Cách sử dụng
Dưới đây là ví dụ về cách sử dụng trong chương trình Rails.
Tạo tập tin .po:
- Tạo thư mục “po” trong thư mục gốc của project, sau đó tạo thư mục con cho mỗi ngôn ngữ. Vì ngôn ngữ mặc định là tiếng Anh, nên nếu muốn project hỗ trợ tiếng Nhật và Việt, cần tạo 2 thư mục con “ja” và “vi” trong thư mục “po”.
- Đoạn mã sau sẽ trích tất cả các message trong các tập tin .rb và .rhtml trong project. Thêm đoạn mã sau vào Rakefile:
desc "Update pot/po files to match new version."
task :updatepo do
TEXT_DOMAIN = "myapp"
APP_VERSION = "myapp 1.1.0"
GetText.update_pofiles(TEXT_DOMAIN,
Dir.glob("{app,lib}/**/*.{rb,rhtml}"),
APP_VERSION)
end
- Gõ lệnh: rake updatepo. Lệnh này sẽ thực thi đoạn mã trên, rồi tạo các tập tin .pot và .po trong thư mục po. Tập tin .pot là template, muốn dịch message cho ngôn ngữ nào, thì copy nó vào thư mục tương ứng với ngôn ngữ đó, rồi đổi tên thành .po. Chú ý: nếu đường dẫn đến lệnh msgmerge không có trong biến PATH, việc chạy rake updatepo sẽ khiến cho tập tin po không thể kết nối các chuỗi đã dịch trước vào tập tin mới được cập nhật. Như vậy sẽ dẫn đến khả năng mất đi những chuỗi đã được dịch.
Biên dịch .po thành .mo:
- Tập tin .po là tập tin văn bản, có thể dùng chương trình soạn văn bản hay chương trình poEdit để biên soạn. Nhưng để máy hiểu, cần biên dịch .po thành .mo. Thêm đọan mã sau vào Rakefile:
desc "Create mo-files for L10n"
task :makemo do
GetText.create_mofiles(true, "po", "locale")
end
- Gõ lệnh: rake makemo. Lệnh này sẽ thực thi đoạn mã trên. Tập tin .mo được tạo ra nằm trong thư mục locale.
Cấu hình ngôn ngữ:
- Giả sử muốn dùng tiếng Việt cho cả chương trình, sửa tập tin application.rb như sau:
class ApplicationController < ActionController::Base
set_locale 'vi_VN'
init_gettext "myapp"
end
poEdit
poEdit dùng để dịch các chuỗi trong tập tin po một cách dễ dàng. Khi sử dụng gettext, cũng như poEdit chúng ta cần phải biết khái niệm sau:
- Fuzzy translation (dịch kiểu fuzzy): Kiểu dịch này do gettext tự động dịch dựa trên cơ sở xem xét sự đồng nhất giữa các chuỗi dịch. Điều này xảy ra khi chúng ta chạy lệnh msgmerge để cập nhật bản dịch. Kiểu dịch fuzzy này thường là không chính xác, do đó chúng ta cần kiểm tra lại các chuỗi fuzzy này. Trong poEdit, chuỗi fuzzy được đánh dấu bằng nền màu nâu đậm. Sau khi đã hiệu chỉnh xong chuỗi fuzzy, chúng ta nên đánh bỏ chọn chuỗi fuzzy đi bằng cách: Edit—> Translation is fuzzy.
- Deleted translation.
Để biết chuỗi dịch ấy ở trong những files nào trong chương trình chúng ta có thể Right-click lên chuỗi ấy và xem trong phần References:
Sau khi dịch xong tất cả các chuỗi, chúng ta cần thiết phải loại bỏ đi các chuỗi không còn tồn tại trong tập tin dịch, nhằm mục đích dọn sạch sẽ tập tin dịch. Điều này được thực hiện bằng cách: Catalog—> Purge deleted translations
Coding style
Nên thống nhất cách viết, nhất là khi làm việc theo nhóm. Nên dùng cách viết sau:
- Chỉ viết hoa kí tự đầu câu (để tránh cùng 1 từ nhưng lại có 2 cách viết). Ví dụ: nên viết “My app”, không nên viết “My App”
- Chỉ dùng dấu chấm khi cần thiết
- Nếu là chuỗi kí tự Latin (tiếng Anh, tiếng Việt…), thì trước dấu câu dùng 0 và sau dấu câu dùng 1 khoảng trắng
Hiển thị error message của ActiveRecord bằng tiếng Việt
RubyGettext có thể hiển thị error message của ActiveRecord. Để biết RubyGettext hiển thị được error message của những ngôn ngữ gì, xin xem thư mục data/locale của RubyGettext. Từ phiên bản 1.10.0, tiếng Việt đã chính thức có mặt trong RubyGettext.
Trang web hỗ trợ việc dịch thuật
poEdit vẫn còn hơi bất tiện. Có nhiều trang web giúp việc dịch thuật dễ dàng hơn, ví dụ 99translation. Nó có công cụ giúp cập nhật (upload) tự động tập tin .pot lên trang web.
172
over 3 years ago
Updated over 3 years ago
Updated over 3 years ago
Updated over 3 years ago