Trong quá trình phát triển ứng dụng web, đặc biệt là các ứng dụng phục vụ nhiều người dùng trên toàn thế giới, việc hỗ trợ đa ngôn ngữ là yếu tố quan trọng giúp người dùng dễ dàng tương tác và sử dụng dịch vụ. Ruby on Rails cung cấp cơ chế mạnh mẽ để quản lý đa ngôn ngữ thông qua I18n (Internationalization). Bài viết này sẽ hướng dẫn cách áp dụng I18n trong ứng dụng Ruby on Rails.

I18n là gì trong Ruby on Rails?

I18n (viết tắt của “Internationalization”, với 18 ký tự giữa chữ “I” và “n”) là một cơ chế giúp các ứng dụng hỗ trợ nhiều ngôn ngữ khác nhau mà không cần thay đổi mã nguồn chính. Trong Rails, I18n được tích hợp sẵn để cho phép chuyển đổi ngôn ngữ trong các thành phần như views, models và controllers, giúp việc dịch thuật trở nên dễ dàng và thống nhất.

I18n hoạt động dựa trên các tệp YAML chứa các chuỗi ngôn ngữ được ánh xạ với các từ khóa (keys). Rails sẽ sử dụng những từ khóa này để thay thế bằng chuỗi tương ứng tùy theo ngôn ngữ được chọn trong ứng dụng.

Cách cấu hình I18n trong ứng dụng Rails

Khởi tạo các tệp ngôn ngữ cho I18n

Để bắt đầu sử dụng I18n, bạn cần tạo các tệp YAML chứa các chuỗi ngôn ngữ. Thông thường, các tệp này sẽ nằm trong thư mục config/locales/. Rails tạo sẵn cho bạn tệp config/locales/en.yml chứa các chuỗi mặc định cho tiếng Anh.

Ví dụ một tệp ngôn ngữ cho tiếng Anh (en.yml):

en:
  hello: "Hello, world!"
  welcome_message: "Welcome to our site!"

Để thêm hỗ trợ tiếng Việt, bạn có thể tạo một tệp vi.yml:

vi:
  hello: "Xin chào, thế giới!"
  welcome_message: "Chào mừng bạn đến với trang web của chúng tôi!"

Sử dụng tệp ngôn ngữ trong ứng dụng

Sau khi cấu hình các tệp ngôn ngữ, bạn cần cấu hình ngôn ngữ mặc định trong file config/application.rb:

# config/application.rb
config.i18n.default_locale = :en

Nếu muốn ngôn ngữ mặc định là tiếng Việt, bạn có thể thay đổi thành:

config.i18n.default_locale = :vi

Rails sẽ sử dụng ngôn ngữ này cho toàn bộ ứng dụng trừ khi người dùng chọn một ngôn ngữ khác.

Cách sử dụng I18n trong các file view và controller

Hiển thị chuỗi dịch trong view

Trong các file view, bạn có thể sử dụng hàm t để hiển thị các chuỗi đã được dịch dựa trên từ khóa (key):

<h1><%= t('hello') %></h1>
<p><%= t('welcome_message') %></p>

Kết quả hiển thị sẽ phụ thuộc vào ngôn ngữ hiện tại. Nếu ngôn ngữ là tiếng Anh, bạn sẽ thấy “Hello, world!”. Nếu là tiếng Việt, nó sẽ hiển thị “Xin chào, thế giới!”.

Sử dụng I18n trong controller

Trong controller, bạn cũng có thể sử dụng I18n để dịch các chuỗi thông báo hoặc tiêu đề động:

class WelcomeController < ApplicationController
  def index
    flash[:notice] = t('welcome_message')
  end
end

Thông báo này sẽ thay đổi dựa vào ngôn ngữ hiện tại của ứng dụng.

Quản lý và cập nhật tệp ngôn ngữ

Tạo thêm các tệp ngôn ngữ mới

Nếu bạn cần hỗ trợ nhiều ngôn ngữ khác nhau, chỉ cần tạo thêm các tệp YAML tương ứng trong thư mục config/locales/, ví dụ như fr.yml cho tiếng Pháp, ja.yml cho tiếng Nhật, và định nghĩa các chuỗi dịch tương ứng.

Ví dụ cho tiếng Pháp (fr.yml):

fr:
  hello: "Bonjour, monde!"
  welcome_message: "Bienvenue sur notre site!"

Cập nhật nội dung dịch trong các tệp ngôn ngữ

Khi cần cập nhật chuỗi dịch, bạn chỉ cần chỉnh sửa tệp YAML tương ứng. Chẳng hạn, nếu muốn thay đổi thông điệp chào mừng cho tiếng Việt, bạn chỉ cần chỉnh sửa tệp vi.yml:

vi:
  welcome_message: "Chào mừng bạn đến với dịch vụ của chúng tôi!"

Cách chuyển đổi ngôn ngữ trong ứng dụng

Để người dùng có thể thay đổi ngôn ngữ khi sử dụng ứng dụng, bạn cần triển khai cơ chế chuyển đổi ngôn ngữ trong controller. Một cách phổ biến là thông qua query params hoặc session.

Ví dụ, bạn có thể thêm đoạn mã vào ApplicationController để thay đổi ngôn ngữ:

class ApplicationController < ActionController::Base
  before_action :set_locale

  def set_locale
    I18n.locale = params[:locale] || I18n.default_locale
  end
end

Ngoài ra, bạn có thể cung cấp một liên kết để thay đổi ngôn ngữ cho người dùng:

<%= link_to 'Tiếng Việt', locale: 'vi' %> | <%= link_to 'English', locale: 'en' %>

Khi người dùng nhấp vào các liên kết này, ngôn ngữ của ứng dụng sẽ thay đổi tương ứng.

Tối ưu hoá và kiểm tra I18n trong Rails

I18n giúp đơn giản hóa quá trình quốc tế hóa ứng dụng, nhưng điều quan trọng là bạn phải kiểm tra kỹ các tệp dịch để đảm bảo chúng không có lỗi cú pháp và tất cả các chuỗi dịch đều được cung cấp.

Bạn có thể sử dụng gem i18n-tasks để giúp quản lý và kiểm tra các chuỗi dịch. Gem này cung cấp các công cụ để tìm các từ khóa bị thiếu, sắp xếp lại các tệp YAML và kiểm tra sự nhất quán giữa các tệp ngôn ngữ.

Cài đặt gem:

gem 'i18n-tasks'

Sau khi cài đặt, bạn có thể chạy các lệnh kiểm tra:

i18n-tasks missing
i18n-tasks unused

Lợi ích và lưu ý khi áp dụng I18n

Việc áp dụng I18n trong Ruby on Rails giúp ứng dụng của bạn dễ dàng hỗ trợ đa ngôn ngữ, nâng cao trải nghiệm người dùng và mở rộng thị trường quốc tế. Tuy nhiên, để quản lý tốt hệ thống I18n, bạn cần chú ý đến việc cập nhật các tệp ngôn ngữ kịp thời và đảm bảo các chuỗi dịch được kiểm tra cẩn thận. Với sự hỗ trợ của Rails và các công cụ liên quan, quá trình triển khai và quản lý I18n sẽ trở nên dễ dàng và hiệu quả.