Chúng ta sẽ dịch lỗi trên model.
Đầu tiên chúng ta “dịch” form nhập thông tin thanh toán, trước tiên là file new.html.erb
trong thư mục app/views/orders
:
<div class="depot_form"> <fieldset> <legend><%= t('.legend') %></legend> <%= render 'form' %> </fieldset> </div>
Tiếp theo là file _form.html.erb
:
<%= form_for(@order) do |f| %> <% if @order.errors.any? %> <div id="error_explanation"> <h2><%= pluralize(@order.errors.count, "error") %> prohibited this order from being saved:</h2> <ul> <% @order.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> <div class="field"> <%= f.label t('.name') %><br> <%= f.text_field :name, :size => 40 %> </div> <div class="field"> <%= f.label :address, t('.address') %><br> <%= f.text_area :address, :rows => 3, :cols => 40 %> </div> <div class="field"> <%= f.label :email %><br> <%= f.text_field :email, :size => 40 %> </div> <div class="field"> <%= f.label t('.pay_type') %><br> <%= f.select :pay_type, Order::PAYMENT_TYPES, :prompt => t('.pay_type_combo') %> </div> <div class="actions"> <%= f.submit t('.submit') %> </div> <% end %>
Kế tiếp là file ngôn ngữ:
English:
en: . . . orders: new: legend: "Enter your information" form: name: "Name" address: "Address" pay_type: "Payment Type" pay_type_combo: "Select a payment method" submit: "Checkout"
Tiếng Việt:
vi: . . . orders: new: legend: "Thông tin thanh toán" form: name: "Tên" address: "Địa chỉ" pay_type: "Thanh toán" pay_type_combo: "Chọn phương thức thanh toán" submit: "Đặt hàng"
Bây giờ chúng ta có thể đặt hàng với giao diện tiếng Việt, và khi bấm nút “Đặt hàng” mà không điền cái gì vào thì chúng ta sẽ được trang thông báo lỗi như sau:
Do đó bây giờ chúng ta cần khai báo bản dịch cho phần báo lỗi.
Để dịch thì chúng ta sẽ dịch trên đối tượng ActiveRecord
chứ không phải là các chuỗi do chúng ta tự khai báo trong view nữa, do đó chúng ta phải khai báo các khóa do Rails quy định.
Chúng ta chỉ cần chỉnh sửa phần tiếng Việt thôi, không cần khai báo phần ngôn ngữ tiếng Anh. Chúng ta sửa lại file vi.yml
như sau:
vi: . . . activerecord: models: order: "Đơn hàng" attributes: order: name: "Tên" address: "Địa chỉ" email: "Email" pay_type: "Phương thức thanh toán" errors: messages: blank: "không được để trống" inclusion: "không thuộc danh sách cho trước" template: body: "Lỗi xảy ra ở các trường sau:" header: one: "1 lỗi xảy ra" other: "%{count} lỗi xảy ra"
Để dịch các tên model thì chúng ta truyền theo cấu trúc activerecord → models → <tên_model>.
Dịch tên các thuộc tính/trường thì theo cấu trúc activerecord
→
attributes
→
<tên_model>
→
<tên_thuộc_tính>
Dịch các dòng báo lỗi thì theo cấu trúc: activerecord
→ errors → messages → <tên_loại_lỗi>.
Ở đây tên loại lỗi là blank
, tức là lỗi thuộc tính không được để trống, inclusion
là thuộc tính không thuộc một tập giá trị cho trước. Ngoài ra còn có các lỗi như confirmation
, accepted
, present
…v.v Bạn có thể xem tại đây.
Ngoài ra còn có một số khóa khác như template, header, body, one, other
. Trong đó one
là hiển thị câu thông báo có 1 lỗi và other
là thông báo có nhiều lỗi. Lý do phải chia ra 2 loại là vì có một số ngôn ngữ hiển thị số ít và số nhiều khác nhau, như tiếng Anh thì phải thêm kí tự ‘s’ sau cùng. Ở đây khóa other
nhận vào giá trị từ biến count
, chúng ta phải truyền biến này vào khi gọi hàm t()
.
Do đó bây giờ chúng ta sửa lại file _form.html.erb
như sau:
<%= form_for(@order) do |f| %> <% if @order.errors.any? %> <div id="error_explanation"> <h2><%= t('activerecord.errors.template.header', :count => @order.errors.size) %>.</h2> <p><%= t('activerecord.errors.template.body') %></p> <ul> <% @order.errors.full_messages.each do |message| %> <li><%= message %></li> <% end %> </ul> </div> <% end %> . . . <% end %>
Vậy là các câu thông báo lỗi đã được dịch xong:
Chúng ta dịch thêm một thứ nữa là câu thông báo đặt hàng thành công:
Đầu tiên chúng ta sửa lại phương thức create
trong lớp OrdersController
như sau:
class OrdersController < ApplicationController . . . # POST /orders # POST /orders.json def create @order = Order.new(order_params) @order.add_line_items_from_cart(current_cart) respond_to do |format| if @order.save Cart.destroy(session[:cart_id]) session[:cart_id] = nil Notifier.order_received(@order).deliver format.html { redirect_to '/', notice: I18n.t('.thanks') } format.json { render :show, status: :created, location: @order } else format.html { render :new } format.json { render json: @order.errors, status: :unprocessable_entity } end end end . . . end
Ở đây chúng ta phải ghi rõ ra phương thức t()
của module I18n
.
Tiếp theo là các file ngôn ngữ:
English:
en: . . . thanks: "Thank you for your order"
Tiếng Việt:
vi: . . . thanks: "Cám ơn bạn đã đặt hàng"
Vậy là xong!