Skip to main content

Rails i18n: cjelovit vodič za internacionalizaciju Ruby on Railsa

Od prve datoteke lokalnih postavki do produkcije: konfigurirajte Rails I18n, rabite pomoćnu funkciju t(), obradite množinu prema CLDR-u, riješite česte zamke i dodajte pametne zamjenske lance.

1

Upoznajte arhitekturu sustava Rails I18n

Rails sadržava ugrađeni paket I18n. Datoteke prijevoda nalaze se u config/locales/ kao YAML (zadano) ili Ruby datoteke. Razvojni okvir nudi pomoćnu funkciju t() (alias za I18n.translate) u prikazima, kontrolerima, modelima i modulima za e-poštu. Rails I18n namjerno je jednostavan te odmah podržava osnovni prijevod, 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 ih organizirati prema jeziku (en.yml, de.yml), značajci (en/users.yml, en/orders.yml) ili oboje (en/users.yml, de/users.yml). Rails pri pokretanju objedinjuje sve datoteke.
2

Konfiguriranje lokalnih postavki

U config/application.rb ili datoteci initializer postavite default_locale, available_locales i ponašanje zamjene. U ApplicationControlleru pomoću before_action prepoznajte lokalne postavke iz URL-a, sesije, kolačića ili zaglavlja 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"
Postavljanje I18n.locale u before_action sigurno je za pojedinačni zahtjev, ali I18n.default_locale tijekom izvođenja globalan je i utječe na sve dretve. Za promjene ograničene na zahtjev uvijek rabite I18n.locale, koji je lokalan za dretvu, a nikada I18n.default_locale.
3

Uporaba pomoćne funkcije t()

Pomoćna funkcija t() dostupna je posvuda u Railsu — u prikazima, kontrolerima, modelima, modulima za e-poštu i poslovima. Prihvaća ključ, neobavezne interpolacijske varijable te opcije poput zadanih vrijednosti i opsega. U prikazima Rails podržava lijena traženja koja ključeve automatski ograničavaju na trenutačni 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 rabi kategorije množine CLDR: zero, one, two, few, many, other. Engleskom trebaju samo one i other, ali drugi jezici zahtijevaju više oblika. Množinske prijevode definirajte kao ugniježđene YAML ključeve pod brojčanim kategorijama koje zahtijevaju ciljni jezici.

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 prijavljuje I18n::InvalidPluralizationData ako aktivnim lokalnim postavkama nedostaje potrebna kategorija množine. Ako ruski prijevod definira samo one i other, brojevi 2, 3 i 4 srušit će obradu jer ruski zahtijeva few. Za svaki jezik uvijek definirajte sve kategorije CLDR.
5

Dodavanje lanaca zamjenskih lokalnih postavki

Ugrađeni Railsov I18n.fallbacks pruža samo osnovni prijelaz s regionalnih na zadane lokalne postavke. Korisnik s pt-BR kojem nedostaje ključ vidi engleski umjesto pt-PT. rails-locale-chain dodaje prilagodljive lance s dubinskim objedinjavanjem kako bi regionalni korisnici uvijek vidjeli najbliži dostupan prijevod.

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žava više od 75 ugrađenih zamjenskih lanaca za 11 jezičnih obitelji. Dodajte ga u Gemfile, konfigurirajte u datoteci initializer i regionalni će korisnici odmah vidjeti prijevode nadređenih lokalnih postavki umjesto praznina na engleskom.
6

Automatiziranje prijevoda

Nakon što postavite Rails I18n, prevedite YAML datoteke lokalnih postavki uz pomoć AI-ja. i18n Agent izvorno podržava YAML: usmjerite ga na datoteku izvornog jezika i stvorit će sve ciljne jezike uz očuvanje ugniježđenih ključeva, interpolacijskih varijabli i množinskih oblika.

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 postupno: kada dodate nove ključeve, prevedite samo razliku. Tako čuvate postojeće prijevode i izbjegavate ponovno stvaranje nepromijenjenih nizova.

Uobičajene zamke

Pogreške InvalidPluralizationData

Rails se ruši uz I18n::InvalidPluralizationData kada nedostaje potrebna kategorija množine CLDR. To se najčešće događa kada se engleski oblici (one/other) kopiraju u jezike kojima treba više kategorija (ruskom few, arapskom zero/two/few/many). Instalirajte rails-i18n radi ispravnih pravila CLDR i definirajte sve kategorije.

Lijena traženja izvan prikaza

Lijena traženja (t('.key')) rade samo u prikazima u kojima Rails poznaje kontroler i radnju. Uporaba t('.key') u modelu, modulu za e-poštu ili uslužnom objektu vraća pogrešku prijevoda koji nedostaje. Izvan prikaza rabite potpune ključeve (t('users.show.key')).

Sintaktičke pogreške u YAML-u prekidaju sve prijevode

Jedna sintaktička pogreška u YAML-u (pogrešno uvlačenje, posebni znakovi bez navodnika ili tabulator umjesto razmaka) sprječava učitavanje cijele datoteke lokalnih postavki. Svi prijevodi iz nje tada vraćaju pogrešku ključa koji nedostaje. YAML provjeravajte linterom u CI sustavu, a nizove s dvotočkama, zagradama ili početnim posebnim znakovima stavite u navodnike.

Isprobajte i18n Agent odmah

Povucite datoteku za prijevod ovdje

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

ili kliknite za odabir

Ciljni jezici

Registracija nije potrebnaProcjena odmah

Česta pitanja o Railsovu i18n sustavu