
Rails i18n: комплетан водич за Ruby on Rails интернационализацију
Од прве датотеке локала до продукције: подесите Rails I18n, користите помоћну функцију t(), обрадите CLDR множину, исправите уобичајене замке и додајте паметне ланце резервних локала.
Разумите архитектуру система Rails I18n
Rails садржи уграђени I18n gem. Датотеке превода налазе се у config/locales/ као YAML (подразумевано) или Ruby датотеке. Радни оквир пружа помоћну функцију t() (псеудоним за I18n.translate) у приказима, контролерима, моделима и mailer компонентама. Rails I18n је намерно једноставан — одмах обрађује основно превођење, интерполацију и множину.
# 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
endПодесите поставке локала
Поставите default_locale, available_locales и понашање резерве у config/application.rb или initializer датотеци. Подесите откривање локала у ApplicationController помоћу before_action да поставите локал из URL адресе, сесије, колачића или 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"Користите помоћну функцију t()
Помоћна функција t() доступна је свуда у Rails систему — у приказима, контролерима, моделима, mailer компонентама и задацима. Прихвата кључ, необавезне променљиве интерполације и опције као што су подразумеване вредности и опсег. У приказима Rails подржава лење претраге које аутоматски ограничавају кључеве на тренутни контролер и радњу.
# 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')) %>Обрадите множину
Rails I18n користи CLDR категорије множине: zero, one, two, few, many, other. Енглеском су потребни само one и other, али другим језицима је потребно више облика. Дефинишите преводе множине као угнежђене YAML кључеве под категоријама броја које су потребне циљним језицима.
# 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) %>Додајте ланце резервних локала
Уграђени Rails I18n.fallbacks пружа само основну резерву од регионалног до подразумеваног локала. Корисник локала pt-BR са недостајућим кључем види енглески уместо pt-PT. rails-locale-chain додаје подесиве ланце са дубинским спајањем како би регионални корисници увек видели најближи доступан превод.
# 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"Аутоматизујте преводе
Када подесите Rails I18n, преведите YAML датотеке локала помоћу AI технологије. i18n Agent изворно подржава YAML — усмерите га на датотеку изворног локала и генерисаће све циљне језике уз очување угнежђених кључева, променљивих интерполације и облика множине.
# 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 enУобичајене замке
Грешке InvalidPluralizationData
Лење претраге изван приказа
Грешке YAML синтаксе нарушавају све преводе
Испробајте i18n Agent сада
Пустите датотеку за превођење овде
JSON, YAML, PO, XML, CSV, Markdown, Properties
или кликните за избор
Циљни језици