Skip to main content

Rails i18n: celovit vodnik po internacionalizaciji Ruby on Rails

Od prve jezikovne datoteke do produkcije: nastavite Rails I18n, uporabljajte pomožno funkcijo t(), obravnavajte množinske oblike CLDR, odpravite pogoste pasti in dodajte pametne verige nadomestnih jezikovnih različic.

1

Spoznajte arhitekturo Rails I18n

Rails vključuje vgrajeni gem I18n. Prevodi so v config/locales/ kot datoteke YAML (privzeto) ali Ruby. Ogrodje v pogledih, krmilnikih, modelih in pošiljevalnikih e-pošte ponuja pomožno funkcijo t() (drugo ime za I18n.translate). Rails I18n je namerno preprost: že v osnovi obravnava osnovno prevajanje, interpolacijo in množinske oblike.

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 samodejno naloži vse datoteke .yml in .rb iz config/locales/. Razvrstite jih lahko poljubno: po jeziku (en.yml, de.yml), po funkciji (en/users.yml, en/orders.yml) ali oboje (en/users.yml, de/users.yml). Rails ob zagonu združi vse datoteke.
2

Nastavite jezikovne različice

V config/application.rb ali inicializatorju nastavite default_locale, available_locales in vedenje nadomeščanja. V svojem ApplicationController s before_action nastavite zaznavanje jezikovne različice iz naslova URL, seje, piškotka ali glave 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"
Nastavitev I18n.locale v before_action je varna za posamezno zahtevo, nastavitev I18n.default_locale med izvajanjem pa je globalna in vpliva na vse niti. Za spremembe jezikovne različice v okviru zahteve vedno uporabljajte I18n.locale (lokalno za nit), nikoli I18n.default_locale.
3

Uporabljajte pomožno funkcijo t()

Pomožna funkcija t() je na voljo povsod v Railsu: v pogledih, krmilnikih, modelih, pošiljevalnikih e-pošte in opravilih. Sprejme ključ, neobvezne interpolacijske spremenljivke in možnosti, kot sta privzeta vrednost in obseg. Rails v pogledih podpira lena iskanja, ki obseg ključev samodejno prilagodijo trenutnemu krmilniku in dejanju.

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

Obravnavajte množinske oblike

Rails I18n uporablja množinske kategorije CLDR: zero, one, two, few, many in other. Angleščina potrebuje samo one in other, drugi jeziki pa več oblik. Množinske prevode določite kot ugnezdene ključe YAML pod kategorijami števila, ki jih zahtevajo Vaši ciljni jeziki.

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 sproži I18n::InvalidPluralizationData, če za dejavno jezikovno različico manjka zahtevana množinska kategorija. Če Vaša ruska različica vsebuje samo one in other (kopirano iz angleščine), se pri številih 2, 3 in 4 sesuje, ker ruščina zahteva kategorijo few. Za vsak jezik vedno določite vse kategorije CLDR.
5

Dodajte verige nadomestnih jezikovnih različic

Vgrajeni I18n.fallbacks v Railsu omogoča le osnovno nadomeščanje od regionalne do privzete jezikovne različice. Uporabnik različice pt-BR pri manjkajočem ključu namesto pt-PT vidi angleščino. rails-locale-chain doda nastavljive verige z globokim združevanjem, tako da regionalni uporabniki vedno vidijo najbližji razpoložljivi 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 vključuje več kot 75 vgrajenih nadomestnih verig za 11 jezikovnih družin. Dodajte ga v Gemfile in nastavite v inicializatorju, da bodo regionalni uporabniki namesto angleških vrzeli takoj videli prevode nadrejene jezikovne različice.
6

Avtomatizirajte prevode

Ko je nastavitev Rails I18n končana, svoje jezikovne datoteke YAML prevedite z umetno inteligenco. i18n Agent izvorno podpira YAML: pokažite mu izvorno jezikovno datoteko in ustvaril bo vse ciljne jezike, pri tem pa ohranil ugnezdene ključe, interpolacijske spremenljivke in množinske oblike.

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
Prevajajte postopoma: ko dodate nove ključe, prevedite le diff. Tako ohranite obstoječe prevode in ne ustvarjate znova nespremenjenih besedil.

Pogoste pasti

Napake InvalidPluralizationData

Rails se sesuje z I18n::InvalidPluralizationData, kadar manjka zahtevana množinska kategorija CLDR. Najpogosteje se to zgodi, ko so angleške množinske oblike (one/other) kopirane v jezike, ki potrebujejo več kategorij (ruščina zahteva few, arabščina pa zero/two/few/many). Za pravilna pravila CLDR namestite rails-i18n in določite vse kategorije.

Lena iskanja zunaj pogledov

Lena iskanja (t('.key')) delujejo samo v pogledih, kjer Rails pozna krmilnik in dejanje. Uporaba t('.key') v modelu, pošiljevalniku e-pošte ali predmetu storitve vrne napako manjkajočega prevoda. Zunaj pogledov uporabljajte polne ključe (t('users.show.key')).

Napake v skladnji YAML pokvarijo vse prevode

Ena sama napaka v skladnji YAML (napačen zamik, posebni znaki brez narekovajev, tabulator namesto presledkov) prepreči nalaganje celotne jezikovne datoteke. Vsi prevodi v tej datoteki vrnejo napake manjkajočih ključev. Datoteke YAML v CI preverjajte s preverjevalnikom sloga, besedila z dvopičji, oklepaji ali začetnimi posebnimi znaki pa zapišite v narekovajih.

Preizkusite i18n Agent zdaj

Spustite prevajalsko datoteko sem

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

ali kliknite za izbiro

Ciljni jeziki

Registracija ni potrebnaTakojšnja ocena

Pogosta vprašanja o Rails i18n