Rails – Đa ngôn ngữ – Phần 3


Được đăng vào ngày 14/12/2016 | 0 bình luận
Đánh giá bài viết

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!







Trả lời


Lưu ý: bọc code trong cặp thẻ [code language="x"][/code] để highlight code.


Ví dụ:


[code language="cpp"]


    std::cout << "Hello world";


[/code]



Các ngôn ngữ được hỗ trợ gồm: actionscript3, bash, clojure, coldfusion, cpp, csharp, css, delphi, diff, erlang, fsharp, go, groovy, html, java, javafx, javascript, latex, matlab, objc, perl, php, powershell, python, r, ruby, scala, sql, text, vb, xml.

Thư điện tử của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *