Skip to main content

Rails i18n: комплетан водич за Ruby on Rails интернационализацију

Од прве датотеке локала до продукције: подесите Rails I18n, користите помоћну функцију t(), обрадите CLDR множину, исправите уобичајене замке и додајте паметне ланце резервних локала.

1

Разумите архитектуру система Rails I18n

Rails садржи уграђени I18n gem. Датотеке превода налазе се у config/locales/ као YAML (подразумевано) или Ruby датотеке. Радни оквир пружа помоћну функцију t() (псеудоним за I18n.translate) у приказима, контролерима, моделима и mailer компонентама. Rails I18n је намерно једноставан — одмах обрађује основно превођење, интерполацију и множину.

config/application.rb
# 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
# 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
Rails аутоматски учитава све .yml и .rb датотеке из config/locales/. Можете да их организујете како желите — по језику (en.yml, de.yml), функционалности (en/users.yml, en/orders.yml) или на оба начина (en/users.yml, de/users.yml). Rails спаја све датотеке при покретању.
2

Подесите поставке локала

Поставите default_locale, available_locales и понашање резерве у config/application.rb или initializer датотеци. Подесите откривање локала у ApplicationController помоћу before_action да поставите локал из URL адресе, сесије, колачића или Accept-Language заглавља.

config/locales/en.yml
# 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"
Постављање I18n.locale у before_action безбедно је за појединачни захтев, али постављање I18n.default_locale током извршавања је глобално и утиче на све нити. За промене локала ограничене на захтев увек користите I18n.locale (локално за нит), а никада I18n.default_locale.
3

Користите помоћну функцију t()

Помоћна функција t() доступна је свуда у Rails систему — у приказима, контролерима, моделима, mailer компонентама и задацима. Прихвата кључ, необавезне променљиве интерполације и опције као што су подразумеване вредности и опсег. У приказима Rails подржава лење претраге које аутоматски ограничавају кључеве на тренутни контролер и радњу.

app/views/example.html.erb
# 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')) %>
4

Обрадите множину

Rails I18n користи CLDR категорије множине: zero, one, two, few, many, other. Енглеском су потребни само one и other, али другим језицима је потребно више облика. Дефинишите преводе множине као угнежђене YAML кључеве под категоријама броја које су потребне циљним језицима.

Plural forms
# 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::InvalidPluralizationData ако потребна категорија множине недостаје активном локалу. Ако руски локал дефинише само one и other (копирано из енглеског), бројеви као што су 2, 3 и 4 изазваће пад јер руски захтева категорију few. Увек дефинишите све CLDR категорије сваког језика.
5

Додајте ланце резервних локала

Уграђени Rails I18n.fallbacks пружа само основну резерву од регионалног до подразумеваног локала. Корисник локала pt-BR са недостајућим кључем види енглески уместо pt-PT. rails-locale-chain додаје подесиве ланце са дубинским спајањем како би регионални корисници увек видели најближи доступан превод.

Lazy lookups
# 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-locale-chain садржи више од 75 уграђених ланаца резерве који обухватају 11 језичких породица. Додајте га у Gemfile, подесите у initializer датотеци и регионални корисници одмах ће видети преводе надређеног локала уместо празнина на енглеском.
6

Аутоматизујте преводе

Када подесите Rails I18n, преведите YAML датотеке локала помоћу AI технологије. i18n Agent изворно подржава YAML — усмерите га на датотеку изворног локала и генерисаће све циљне језике уз очување угнежђених кључева, променљивих интерполације и облика множине.

config/initializers/locale_chain.rb
# 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

Rails пада са I18n::InvalidPluralizationData када потребна CLDR категорија множине недостаје. То се најчешће дешава када се енглески облици множине (one/other) копирају у језике којима је потребно више категорија (руском је потребан few, арапском zero/two/few/many). Инсталирајте rails-i18n за исправна CLDR правила и дефинишите све категорије.

Лење претраге изван приказа

Лење претраге (t('.key')) раде само у приказима у којима Rails познаје контролер и радњу. Употреба t('.key') у моделу, mailer компоненти или сервисном објекту враћа грешку недостајућег превода. Изван приказа користите пуне кључеве (t('users.show.key')).

Грешке YAML синтаксе нарушавају све преводе

Једна грешка YAML синтаксе (лоше увлачење, специјални знакови без наводника, табулатор уместо размака) спречава учитавање целе датотеке локала. Сви преводи у тој датотеци враћају грешке недостајућег кључа. Проверавајте YAML датотеке lint алатком у CI систему и ставите под наводнике текстове који садрже двотачке, заграде или водеће специјалне знакове.

Испробајте i18n Agent сада

Пустите датотеку за превођење овде

JSON, YAML, PO, XML, CSV, Markdown, Properties

или кликните за избор

Циљни језици

Регистрација није потребнаТренутна процена

Честа питања о Rails i18n систему