
Rails i18n: Hướng dẫn quốc tế hóa Ruby on Rails toàn diện
Từ tệp ngôn ngữ đầu tiên đến môi trường sản xuất: cấu hình Rails I18n, dùng trình trợ giúp t(), xử lý dạng số nhiều CLDR, khắc phục các lỗi thường gặp và thêm chuỗi dự phòng ngôn ngữ thông minh.
Tìm hiểu kiến trúc Rails I18n
Rails tích hợp sẵn gem I18n. Các tệp bản dịch nằm trong config/locales/ dưới dạng tệp YAML (mặc định) hoặc Ruby. Framework cung cấp trình trợ giúp t() (bí danh của I18n.translate) trong khung nhìn, trình điều khiển, mô hình và trình gửi thư. Rails I18n được thiết kế đơn giản — hỗ trợ sẵn bản dịch cơ bản, phép nội suy và dạng số nhiều.
# Rails includes i18n out of the box via the i18n gem
# config/application.rb
module MyApp
class Application < Rails::Application
# Default locale
config.i18n.default_locale = :en
# Available locales
config.i18n.available_locales = [:en, :de, :ja, :es, :fr, :'pt-BR']
# Fallback to default locale when translation is missing
config.i18n.fallbacks = true
# Load translations from nested directories
config.i18n.load_path += Dir[Rails.root.join('config', 'locales', '**', '*.{rb,yml}')]
end
end# config/routes.rb
Rails.application.routes.draw do
scope "/:locale", locale: /en|de|ja|es|fr|pt-BR/ do
root "home#index"
resources :products
end
root "home#index"
end
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
around_action :switch_locale
private
def switch_locale(&action)
locale = params[:locale] || I18n.default_locale
I18n.with_locale(locale, &action)
end
def default_url_options
{ locale: I18n.locale }
end
endCấu hình cài đặt ngôn ngữ
Đặt default_locale, available_locales và hành vi dự phòng trong config/application.rb hoặc trình khởi tạo. Cấu hình tính năng phát hiện ngôn ngữ trong ApplicationController bằng before_action để đặt ngôn ngữ từ URL, phiên, cookie hoặc tiêu đề Accept-Language.
# config/locales/en.yml
en:
nav:
home: "Home"
about: "About"
settings: "Settings"
greeting: "Hello, %{name}!"
cart:
item_count:
one: "%{count} item"
other: "%{count} items"
# config/locales/de.yml
de:
nav:
home: "Startseite"
about: "Über uns"
settings: "Einstellungen"
greeting: "Hallo, %{name}!"
cart:
item_count:
one: "%{count} Artikel"
other: "%{count} Artikel"Dùng trình trợ giúp t()
Trình trợ giúp t() có sẵn ở mọi nơi trong Rails — khung nhìn, trình điều khiển, mô hình, trình gửi thư và tác vụ. Hàm nhận một khóa, các biến nội suy tùy chọn và những tùy chọn như giá trị mặc định cùng phạm vi. Trong khung nhìn, Rails hỗ trợ truy vấn lười để tự động xác định phạm vi khóa theo trình điều khiển và hành động hiện tại.
# In views (ERB)
<h1><%= t('nav.home') %></h1>
<p><%= t('greeting', name: @user.name) %></p>
# In controllers
flash[:notice] = t('flash.product_created')
# In models
validates :name, presence: { message: I18n.t('errors.blank') }
# With HTML (safe)
<%= t('terms_html', link: link_to(t('terms_link'), '/terms')) %>Xử lý dạng số nhiều
Rails I18n dùng các nhóm số nhiều CLDR: zero, one, two, few, many, other. Tiếng Anh chỉ cần one và other nhưng các ngôn ngữ khác cần nhiều dạng hơn. Hãy định nghĩa bản dịch số nhiều dưới dạng khóa YAML lồng nhau trong những nhóm số đếm mà ngôn ngữ đích yêu cầu.
# In YAML:
en:
cart:
item_count:
zero: "No items"
one: "%{count} item"
other: "%{count} items"
# Arabic (6 forms):
ar:
cart:
item_count:
zero: "لا عناصر"
one: "عنصر واحد"
two: "عنصران"
few: "%{count} عناصر"
many: "%{count} عنصرًا"
other: "%{count} عنصر"
# Usage in views:
<%= t('cart.item_count', count: @cart.items.size) %>Thêm chuỗi dự phòng ngôn ngữ
I18n.fallbacks tích hợp trong Rails chỉ cung cấp cơ chế dự phòng cơ bản từ ngôn ngữ vùng miền sang ngôn ngữ mặc định. Người dùng pt-BR gặp khóa bị thiếu sẽ thấy tiếng Anh thay vì pt-PT. rails-locale-chain bổ sung chuỗi hợp nhất sâu có thể cấu hình để người dùng từng vùng luôn thấy bản dịch gần nhất hiện có.
# Lazy lookups use the controller/action as scope
# app/views/products/index.html.erb
# Instead of t('products.index.title'), just use:
<h1><%= t('.title') %></h1>
<p><%= t('.description') %></p>
# Rails looks up: products.index.title and products.index.description
# config/locales/en.yml
en:
products:
index:
title: "All Products"
description: "Browse our catalog"Tự động hóa bản dịch
Sau khi hoàn tất thiết lập Rails I18n, hãy dùng AI để dịch các tệp ngôn ngữ YAML. i18n Agent hỗ trợ trực tiếp YAML — trỏ công cụ đến tệp ngôn ngữ nguồn để tạo mọi ngôn ngữ đích mà vẫn giữ nguyên khóa lồng nhau, biến nội suy và dạng số nhiều.
# Gemfile
gem 'rails-locale-chain'
# config/initializers/locale_chain.rb
Rails.application.config.i18n.fallbacks = {
'pt-BR': ['pt', 'en'],
'zh-Hant-TW': ['zh-Hant', 'zh', 'en'],
'es-419': ['es', 'en'],
}
# The gem deep-merges translations across the chain
# pt-BR -> pt -> en
# Missing keys in pt-BR are filled from pt, then enCác lỗi thường gặp
Lỗi InvalidPluralizationData
Truy vấn lười bên ngoài khung nhìn
Lỗi cú pháp YAML làm hỏng mọi bản dịch
Dùng thử i18n Agent ngay
Thả tệp bản dịch của bạn vào đây
JSON, YAML, PO, XML, CSV, Markdown, Properties
hoặc nhấp để duyệt
Ngôn ngữ đích