Skip to main content

Rails i18n: kompletan vodič za Ruby on Rails internacionalizaciju

Od prve datoteke lokala do produkcije: podesite Rails I18n, koristite pomoćnu funkciju t(), obradite CLDR množinu, ispravite uobičajene zamke i dodajte pametne lance rezervnih lokala.

1

Razumite arhitekturu sistema Rails I18n

Rails sadrži ugrađeni I18n gem. Datoteke prevoda nalaze se u config/locales/ kao YAML (podrazumevano) ili Ruby datoteke. Radni okvir pruža pomoćnu funkciju t() (pseudonim za I18n.translate) u prikazima, kontrolerima, modelima i mailer komponentama. Rails I18n je namerno jednostavan — odmah obrađuje osnovno prevođenje, interpolaciju i množinu.

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 automatski učitava sve .yml i .rb datoteke iz config/locales/. Možete da ih organizujete kako želite — po jeziku (en.yml, de.yml), funkcionalnosti (en/users.yml, en/orders.yml) ili na oba načina (en/users.yml, de/users.yml). Rails spaja sve datoteke pri pokretanju.
2

Podesite postavke lokala

Postavite default_locale, available_locales i ponašanje rezerve u config/application.rb ili initializer datoteci. Podesite otkrivanje lokala u ApplicationController pomoću before_action da postavite lokal iz URL adrese, sesije, kolačića ili Accept-Language zaglavlja.

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"
Postavljanje I18n.locale u before_action bezbedno je za pojedinačni zahtev, ali postavljanje I18n.default_locale tokom izvršavanja je globalno i utiče na sve niti. Za promene lokala ograničene na zahtev uvek koristite I18n.locale (lokalno za nit), a nikada I18n.default_locale.
3

Koristite pomoćnu funkciju t()

Pomoćna funkcija t() dostupna je svuda u Rails sistemu — u prikazima, kontrolerima, modelima, mailer komponentama i zadacima. Prihvata ključ, neobavezne promenljive interpolacije i opcije kao što su podrazumevane vrednosti i opseg. U prikazima Rails podržava lenje pretrage koje automatski ograničavaju ključeve na trenutni kontroler i radnju.

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

Obradite množinu

Rails I18n koristi CLDR kategorije množine: zero, one, two, few, many, other. Engleskom su potrebni samo one i other, ali drugim jezicima je potrebno više oblika. Definišite prevode množine kao ugnežđene YAML ključeve pod kategorijama broja koje su potrebne ciljnim jezicima.

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 baca I18n::InvalidPluralizationData ako potrebna kategorija množine nedostaje aktivnom lokalu. Ako ruski lokal definiše samo one i other (kopirano iz engleskog), brojevi kao što su 2, 3 i 4 izazvaće pad jer ruski zahteva kategoriju few. Uvek definišite sve CLDR kategorije svakog jezika.
5

Dodajte lance rezervnih lokala

Ugrađeni Rails I18n.fallbacks pruža samo osnovnu rezervu od regionalnog do podrazumevanog lokala. Korisnik lokala pt-BR sa nedostajućim ključem vidi engleski umesto pt-PT. rails-locale-chain dodaje podesive lance sa dubinskim spajanjem kako bi regionalni korisnici uvek videli najbliži dostupan prevod.

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 sadrži više od 75 ugrađenih lanaca rezerve koji obuhvataju 11 jezičkih porodica. Dodajte ga u Gemfile, podesite u initializer datoteci i regionalni korisnici odmah će videti prevode nadređenog lokala umesto praznina na engleskom.
6

Automatizujte prevode

Kada podesite Rails I18n, prevedite YAML datoteke lokala pomoću AI tehnologije. i18n Agent izvorno podržava YAML — usmerite ga na datoteku izvornog lokala i generisaće sve ciljne jezike uz očuvanje ugnežđenih ključeva, promenljivih interpolacije i oblika množine.

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
Prevodite postepeno — kada dodate nove ključeve, prevedite samo razliku. Time se čuvaju postojeći prevodi i izbegava ponovno generisanje nepromenjenih tekstova.

Uobičajene zamke

Greške InvalidPluralizationData

Rails pada sa I18n::InvalidPluralizationData kada potrebna CLDR kategorija množine nedostaje. To se najčešće dešava kada se engleski oblici množine (one/other) kopiraju u jezike kojima je potrebno više kategorija (ruskom je potreban few, arapskom zero/two/few/many). Instalirajte rails-i18n za ispravna CLDR pravila i definišite sve kategorije.

Lenje pretrage izvan prikaza

Lenje pretrage (t('.key')) rade samo u prikazima u kojima Rails poznaje kontroler i radnju. Upotreba t('.key') u modelu, mailer komponenti ili servisnom objektu vraća grešku nedostajućeg prevoda. Izvan prikaza koristite pune ključeve (t('users.show.key')).

Greške YAML sintakse narušavaju sve prevode

Jedna greška YAML sintakse (loše uvlačenje, specijalni znakovi bez navodnika, tabulator umesto razmaka) sprečava učitavanje cele datoteke lokala. Svi prevodi u toj datoteci vraćaju greške nedostajućeg ključa. Proveravajte YAML datoteke lint alatkom u CI sistemu i stavite pod navodnike tekstove koji sadrže dvotačke, zagrade ili vodeće specijalne znakove.

Isprobajte i18n Agent sada

Pustite datoteku za prevođenje ovde

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

ili kliknite za izbor

Ciljni jezici

Registracija nije potrebnaTrenutna procena

Česta pitanja o Rails i18n sistemu