Vinova tuyển lập trình viên Mobile & Web ở Hà Nội, lương $300-1000

Article: Giao diện đa ngôn ngữ với Ruby-GetText 1822

ngocdaothanh.myopenid.com 172
Updated 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.

Thao khảo

1  ... 5 6 7 

Editors
ngocdaothanh.myopenid.com 172
tnd.myopenid.com 17
jishin.myopenid.com 18
phananhvu.myopenid.com 125

Comments

ngocdaothanh.myopenid.com 172
over 3 years ago

Rails 2.2 trở đi sẽ tích hợp tính năng i18n, hi vọng sẽ thuận tiện hơn Ruby-GetText.

ngocdaothanh.myopenid.com 172
Updated over 3 years ago

Bài hướng dẫn xuất sắc về breadcrumb sử dụng được với Ruby-Gettext: Easy and flexible breadcrumbs for Rails I, II. Hệ quả thú vị của cách làm này là tiêu đề của trang có thể được suy ra tự động từ biến @breadcrumbs: @breadcrumbs.last.first.

me.yahoo.com/hongphuongit 1
Updated over 3 years ago

Đã có bao giờ bạn gặp lỗi sau: chạy upatepo, makemo ngon lành hết, các tập tin .po .mo tạo ra đầy đủ, tập tin .po đã dịch xong hết, chương trình cũng chẳng có lỗ gì, thế mà vẫn không hiện ra thứ tiếng như ý muốn?

Nguyên nhân có thể do các chuỗi kí tự bạn dịch trong tập tin .po vẫn là fuzzy. Bạn đánh dấu các chuỗi này không phải là fuzzy nữa, rồi makemo lại là xong.

ndgiang84.myopenid.com 2
Updated over 3 years ago

Hiện Ruby-gettext đã đến version 1.93.0

Ở version 1.93.0 này:

  •  bổ sung tiếng Bungari, cập nhật các ngôn ngữ Estonia, Pháp, Nhật.
  •  fix 1 số bugs của ver 1.92.0
  •  thêm tính năng nhận biết charset trên POSIX OS.
  •  updatepo hoạt động trở lại trên Windows
  •  gỡ BOM khỏi po-files trước khi GNU msgmerge được thực thi.
  •  làm việc với "xx library" và library sử dụng "xx library" chẳng hạn: rcov.
  •  fix bug expire_fragment của Rails < 2.1

Tuy nhiên chưa hỗ trợ cho Rails 2.2

Nguồn: http://rubyforge.org/forum/forum.php?forum_id=27196

You must login to be able to comment

Uploaded files

No file uploaded yet

You must login to be able to upload

Nhà tài trợ:

Mọi người đều tự do viết bài, sửa bài của người khác, và bình luận ở trang web này. Bạn muốn chủ động tạo bài mới để chia sẻ kinh nghiệm với mọi người? Xin click link ở dưới.

Create new content