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


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

Trong phần này chúng ta sẽ “dịch” một số chuỗi ra ngôn ngữ tiếng Việt.

Bây giờ chúng ta sửa lại file layout chính như sau:

<!DOCTYPE html>
<html>
<head>
<title>Books Store</title> 
    <script src="https://code.jquery.com/jquery-3.1.1.min.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.min.js"></script>
    <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %>
    <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %>
    <%= csrf_meta_tags %>
</head>
<body id="store">
    <div id="banner">
        <%= image_tag("logo.png") %>
        <%= @page_title || t('.title') %>
    </div>
    <div id="columns">
        <div id="side">
            <div id="cart"> 
                <%= hide_cart_if(current_cart.line_items.empty?, :id => "cart") do %>
                    <%= render current_cart %> 
                <% end %>
            </div>
 
            <a href="#"><%= t('.home') %></a><br />
            <a href="#"><%= t('.faq') %></a><br />
            <a href="#"><%= t('.news') %></a><br />
            <a href="#"><%= t('.contact') %></a><br />
 
            <% if session[:user_id] %>
                <br/>
                <%= link_to 'Orders', '/orders' %><br />
                <%= link_to 'Products', '/products' %><br />
                <%= link_to 'Users', '/users' %><br />
                <%= button_to 'Logout', '/logout', :method => :delete %>
                <br/>
            <% else %>
                <br/>
                <%= link_to 'Log In', login_path %><br />
            <% end %>
        </div>
        <div id="main">
            <%= yield %>
        </div>
    </div> 
</body>
</html>

Ở đây chúng ta gọi hàm t() thay vì ghi các chuỗi cụ thể ra luôn. Hàm t() là hàm của module i18n, đây là tên viết tắt của hàm translate(), hàm này nhận vào tên khóa và lấy giá trị tương ứng trong file .yml ra để hiển thị.

 

Bây giờ chúng ta phải tạo các khóa đó, chúng ta có thể đặt các file .yml trong cùng thư mục với từng View, tức là các thư mục views/admin, views/cartsv.v hoặc đặt trong thư mục mặc định của Rails là config/locales, ở đây chúng ta sẽ dùng thư mục mặc định cho dễ tìm, chúng ta sửa lại file en.yml trong thư mục config/locales như sau:

en: 
  layouts:
    application:
      home: "Home" 
      title: "Books Store"
      faq: "FAQ" 
      news: "News" 
      contact: "Contact"

Chúng ta phải khai báo khóa layout:application: rồi mới tới các khóa kia.

Lưu ý là chúng ta dùng 2 kí tự cách để thụt đầu dòng chứ không dùng dấu Tab. Đây là cú pháp của ngôn ngữ YAML (.yml).

Với tiếng Việt thì chúng ta cũng làm tương tự là tạo file vi.yml trong thư mục config/locales như sau:

vi:
  layouts:
    application:
      home: "Trang chủ" 
      title: "Books Store"
      faq: "Hỏi đáp" 
      news: "Tin tức" 
      contact: "Liên hệ"

Bây giờ chúng ta có thể dùng URL http://localhost:3000/vi được rồi.

Bây giờ chúng ta sẽ “dịch” trang store/index và trang hiển thị giỏ hàng. Đầu tiên chúng ta định nghĩa các đoạn text như sau:

English:

en: 
  layouts:
    application: 
      home: "Home" 
      title: "Books Store"
      faq: "FAQ" 
      news: "News" 
      contact: "Contact"
 
  store:
    index:
      title: "Products List" 
      add: "Add to Cart"
  carts:
    cart:
      title: "Your cart" 
      empty_cart: "Empty cart" 
      checkout: "Checkout"

Tiếng Việt:

vi:
  layouts:
    application:
      home: "Trang chủ" 
      title: "Books Store"
      faq: "Hỏi đáp" 
      news: "Tin tức" 
      contact: "Liên hệ"

  store:
    index:
      title: "Sản phẩm"
      add: "Thêm vào giỏ hàng"
 
  carts:
    cart:
      title: "Giỏ hàng"
      empty_cart: "Xóa giỏ hàng"
      checkout: "Thanh toán"

Tiếp theo chúng ta sửa file view index.html.erb trong thư mục app/views/store như sau:

<% if notice %>
    <p id="notice"><%= notice %></p>
<% end %>
 
<h1><%= t('.title') %></h1>
 
<% @products.each do |product| %>
    <div class="entry">
        <%= image_tag(product.image_url) %>
        <h3><%= product.title %></h3> 
        <%= sanitize(product.description) %>
        <div class="price_line">
            <span class="price"><%= number_to_currency(product.price) %></span>
            <%= button_to t('.add'), line_items_path(:product_id => product),
                :remote => true %>
        </div>
    </div>
<% end %>

Kế tiếp là file _cart.html.erb trong thư mục app/views/carts:

<h2><%= t('.title') %></h2>
<table>
    <%= render cart.line_items %>
    <tr class="total_line">
        <td colspan="2">Total</td>
        <td class="total_cell"><%= number_to_currency(cart.total_price) %></td>
    </tr>
</table>
 
<%= button_to t('.checkout'), new_order_path, :method => :get %><br>
<%= button_to t('.empty_cart'), 
    cart, 
    :method => :delete,
    data: {:confirm => 'Are you sure?' } %>

Bây giờ chúng ta sẽ “dịch” chuỗi hiển thị tiền từ USD sang VNĐ. Ở đây chúng ta chỉ hiển thị cho khác đi thôi chứ không chuyển đổi tỉ giá. Nếu muốn bạn có thể tự chuyển.

Để chuyển đổi tiền tệ thì chúng ta khai báo trong file .yml như sau:

English:

en:
  .
  .
  .
  number:
    currency:
      format:
        unit: "$"
        precision: 2
        separator: "."
        delimiter: ","
        format: "%u%n" 

Một số lưu ý như format là %u%n, thì trong đó %u là hiển thị kí tự tiền tệ, %n là số tiền, precision là số lượng chữ số sau phần thập phân, separator là kí tự ngăn cách giữa phần thập phân và phần đơn vị, delimiter là kí tự ngăn cách phần ngàn.

Tiếng Việt:

vi:
  .
  .
  .
  number:
    currency:
      format:
        unit: đồng
        precision: 3
        separator: ","
        delimiter: "."
        format: "%n %u"

Hàm number_to_currency() sẽ tự động tìm các giá trị trong file .yml để hiển thị cho đúng.







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 *