Một số mẹo khi sử dụng I18n trong rails

Cách đây 2, 3 tuần, mình có thu lượm được một số mẹo khi sử dụng I18n trong Rails nên hôm nay mình muốn chia sẻ cho mọi người để có thể tiết kiệm thời gian hơn khi làm việc 😄

1. Sử dụng message báo lỗi chung cho nhiều trường, nhiều model

Giả sử trong ứng dụng của bạn có nhiều trường thuộc cùng một model, hoặc nhiều trường thuộc nhiều model khác nhau cần đưa ra cùng một thông báo lỗi cho một lỗi nào đó (chẳng hạn blank). Thay vì khai báo lặp đi lặp lại như sau:

  activerecord:
    errors:
      models:
        book:
          attributes:
            title:
              blank: *cant_be_blank
            description:
              blank: *cant_be_blank
        author:
          attributes:
            name:
              blank: *cant_be_blank
  ...

thì ta có thể khai báo như sau:

  activerecord:
    errors:
      messages:
        blank: *cant_be_blank

Do việc tìm kiếm error message trong I18n được thực hiện lần lượt theo thứ tự:

activerecord.errors.models.book.attributes.title.blank
activerecord.errors.models.book.blank
activerecord.errors.models.author.attributes.name.blank
activerecord.errors.models.author.blank
activerecord.errors.messages.blank
errors.attributes.name.blank
errors.messages.blank

nếu không tìm thấy error message ở scope phía trên, các error message ở scope phía dưới (nếu có) sẽ được sử dụng, vậy nên bạn có thể khai báo các error message ở các scope tổng quát để dùng chung cho các thuộc tính thuộc cùng model hoặc khác model.

2. Hiển thị số nhiều, số ít

Trường hợp bạn có một thuộc tính mà giá trị của nó là một số nguyên và cần hiển thị nó dưới dạng số nhiều - số ít, ví dụ:

This computer has 1 monitor
This computer has 2 monitors

Bạn có thể sử dụng cách dưới đây:

This computer has
<% if computer.num_of_monitors == 1 %>
  <%= t ".one_monitor" %>
<% else %>
  <%= t ".other_monitor_count", count: computer.num_of_monitors %>
<% end %>

Nhưng cách này khá là dài dòng, có một cách khác tiện hơn nhiều là bạn định nghĩa trong file locale như sau:

...
    monitors_count:
      one: 1 monitor
      other: "%{count} monitors"

Và trong view:

This computer has <%= t ".monitors_count", count: computer.num_of_monitors %>

3. Tự động escape HTML

Bạn có một xâu có chứa thẻ HTML được định nghĩa trong file locale và muốn escape nó trên view để hiển thị thành thẻ HTML thì thay vì khai báo và sử dụng như này:

...
    sample:
      need_escape: "<b>Need escape</b>"
<%= raw t("sample.need_escape") %>

bạn có thể khai báo và sử dụng như này:

...
    sample:
      need_escape_html: "<b>Need escape</b>"
<%= t "sample.need_escape_html" %>

là xâu "<b>Need escape</b>" có thể được hiển thị thành thẻ HTML.

Kết luận

Trên đây là một số mẹo về I18n trong khi làm việc mình đã học được, hy vọng nó sẽ có ích cho mọi người. Cảm ơn mọi người đã theo dõi (bow)